FastAPI + OpenAIで質問できるAPIを作る
ChatGPTに質問を投げる
Qiitaで書いた記事と内容は同じになっております。OpenAIを使用してAIと対話するWebAPIを作成して見たことを過去に記事にしました。
対象者
- FastAPIを使ったことがある
- 使ったことないがPythonの経験がある
- OpenAIを使用したことがある
OpenAIのアカウントが必要なので作成して、api keyを作成しておいて下さい!
FastAPIとは何か?
FastAPI は、Pythonの標準である型ヒントに基づいてPython 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。
主な特徴:
-
高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです.
-
高速なコーディング: 開発速度を約 200%~300%向上させます。 *
-
少ないバグ: 開発者起因のヒューマンエラーを約 40%削減します。 *
-
直感的: 素晴らしいエディタのサポートや オートコンプリート。 デバッグ時間を削減します。
-
簡単: 簡単に利用、習得できるようにデザインされています。ドキュメントを読む時間を削減します。
0- 短い: コードの重複を最小限にしています。各パラメータからの複数の機能。少ないバグ。 -
堅牢性: 自動対話ドキュメントを使用して、本番環境で使用できるコードを取得します。
-
Standards-based: API のオープンスタンダードに基づいており、完全に互換性があります
ではでは、やっていきましょう!
操作は、SwaggerUIで行います。プロジェクトは有料版のPyCharmで作成したので私はボタン押すだけで、FastAPIの環境構築をしてくれますが、VScodeを使っている人は仮想環境の作成と自分でインストールして環境を作る必要があるのでやってください。
こちらをpip installすれば使えます。
annotated-types==0.7.0
anyio==4.9.0
certifi==2025.1.31
click==8.1.8
distro==1.9.0
fastapi==0.115.11
h11==0.14.0
httpcore==1.0.7
httptools==0.6.4
httpx==0.28.1
idna==3.10
jiter==0.9.0
openai==1.66.5
pydantic==2.10.6
pydantic_core==2.27.2
python-dotenv==1.0.1
PyYAML==6.0.2
sniffio==1.3.1
starlette==0.46.1
tqdm==4.67.1
typing_extensions==4.12.2
uvicorn==0.34.0
uvloop==0.21.0
watchfiles==1.0.4
websockets==15.0.1
モジュールは最新版でも問題なかった。FastAPIをPyCharmの有料版で作成した人は、OpenAIのライブラリだけで問題ないと思われます。GUIでも追加できます。こちらが楽ですね。バージョンを指定するなら、ターミナルを使います。
当時のバージョン👇
openai==1.66.5
pip install openai==1.66.5
こちらがサンプルコード
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from openai import OpenAI
# APIクライアントを初期化
client = OpenAI(
api_key="my-api-key"
)
app = FastAPI()
class Question(BaseModel):
question: str
def ask_openai(question: str) -> str:
# チャット完了リクエストを送信
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": question}
]
)
# レスポンスを返す
return response.choices[0].message.content
@app.post("/ask")
async def ask_question(question: Question):
try:
answer = ask_openai(question.question)
return {"answer": answer}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)
ローカルサーバーを起動して、エンドポイントにアクセスする。PyCharm使ってる人は、RUNボタンを押せば簡単に起動できる。
VSCodeの人の場合だとコマンドで起動になりそうなので、公式のコマンドを実行してローカルサーバーを起動して下さい!
uvicorn main:app --reload
SwaggerUIを使用して質問を投げてみる!
リクエストを送ってレスポンスが返ってくれば成功!
最後に
今回はFastAPIを使用してブラウザからプロンプトを入力して、ChatGPTに質問を投げかけてみました。フロントエンドは、Next.js/Reactで作成すれば質問返してくれる質問箱が作れるかも?
Discussion