🌎

FastAPI + OpenAIで質問できるAPIを作る

ChatGPTに質問を投げる

Qiitaで書いた記事と内容は同じになっております。OpenAIを使用してAIと対話するWebAPIを作成して見たことを過去に記事にしました。
https://qiita.com/JunichiHashimoto/items/5983e3cd2fa6c81025c9

対象者

  • FastAPIを使ったことがある
  • 使ったことないがPythonの経験がある
  • OpenAIを使用したことがある

OpenAIのアカウントが必要なので作成して、api keyを作成しておいて下さい!
https://openai.com/index/openai-api/

FastAPIとは何か?

FastAPI は、Pythonの標準である型ヒントに基づいてPython 以降でAPI を構築するための、モダンで、高速(高パフォーマンス)な、Web フレームワークです。

主な特徴:

  • 高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです.

  • 高速なコーディング: 開発速度を約 200%~300%向上させます。 *

  • 少ないバグ: 開発者起因のヒューマンエラーを約 40%削減します。 *

  • 直感的: 素晴らしいエディタのサポートや オートコンプリート。 デバッグ時間を削減します。

  • 簡単: 簡単に利用、習得できるようにデザインされています。ドキュメントを読む時間を削減します。
    0- 短い: コードの重複を最小限にしています。各パラメータからの複数の機能。少ないバグ。

  • 堅牢性: 自動対話ドキュメントを使用して、本番環境で使用できるコードを取得します。

  • Standards-based: API のオープンスタンダードに基づいており、完全に互換性があります

https://fastapi.tiangolo.com/ja/

ではでは、やっていきましょう!

操作は、SwaggerUIで行います。プロジェクトは有料版のPyCharmで作成したので私はボタン押すだけで、FastAPIの環境構築をしてくれますが、VScodeを使っている人は仮想環境の作成と自分でインストールして環境を作る必要があるのでやってください。

こちらをpip installすれば使えます。

requirements.txt
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

こちらがサンプルコード

main.py
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

http://127.0.0.1:8000/docs#/default/ask_question_ask_post

SwaggerUIを使用して質問を投げてみる!

リクエストを送ってレスポンスが返ってくれば成功!

最後に

今回はFastAPIを使用してブラウザからプロンプトを入力して、ChatGPTに質問を投げかけてみました。フロントエンドは、Next.js/Reactで作成すれば質問返してくれる質問箱が作れるかも?

ForgeTechnologyメンバーブログ

Discussion