本記事では、PythonのLangChainとLangGraphを用いてAIエージェントを構築し、最終的にREST APIとして提供する方法を解説します。全3回の連載形式(頑張ってみる予定…)で、今回は第1回として、REST APIサーバーの構築について解説します。初めての方でも理解できるように、丁寧に説明していきます。
なぜREST APIとして提供するのか?
AIエージェントをREST APIとして提供することで、様々なメリットがあります。
- 汎用性: APIを通じて、様々なプラットフォーム(Web、モバイルアプリ、デスクトップアプリなど)からAIエージェントを利用できます。
- 柔軟性: AIエージェントのロジックと、それを呼び出すクライアントアプリケーションを分離できるため、それぞれの開発・変更が容易になります。
- 拡張性: APIサーバーをスケールアウトすることで、大量のリクエストに対応できます。
- 再利用性: 構築したAIエージェントを、複数のプロジェクトで再利用できます。
1. 開発環境の準備
まず、開発に必要な環境を準備します。
-
Pythonのインストール: Python 3.7以上が推奨です。 Python公式サイト からダウンロードしてインストールしてください。
-
仮想環境の作成: プロジェクトごとに仮想環境を作成することで、依存関係を管理しやすくなります。以下のコマンドで仮想環境を作成・有効化します。
python3 -m venv venv source venv/bin/activate # Linux/macOS .\venv\Scripts\activate # Windows -
必要なライブラリのインストール: 以下のライブラリをpipでインストールします。
pip install fastapi uvicorn langchain langgraph pydantic python-dotenvfastapi: 高速なAPIフレームワークuvicorn: ASGIサーバー (FastAPIアプリケーションを実行)langchain: LLMを利用したアプリケーションを構築するためのフレームワークlanggraph: LangChainのグラフ構造を扱うためのフレームワークpydantic: データ検証とシリアライズのためのライブラリpython-dotenv: 環境変数を.envファイルからロードするためのライブラリ
2. FastAPIによるREST APIサーバーの構築
FastAPIを使用して、シンプルなREST APIサーバーを構築します。
-
main.pyファイルの作成: プロジェクトのルートディレクトリにmain.pyというファイルを作成し、以下のコードを記述します。from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional app = FastAPI() class Query(BaseModel): text: str max_length: Optional[int] = 50 # デフォルト値 @app.post("/generate") async def generate_text(query: Query): """ テキスト生成エンドポイント。 """ try: # ここにLangChain/LangGraphの処理を記述(詳細は次回) # 例: result = generate_text_with_langchain(query.text, query.max_length) result = f"あなたは「{query.text}」と入力しました。最大長は{query.max_length}です。" # ダミーの処理 return {"result": result} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/health") async def health_check(): """ ヘルスチェックエンドポイント。 """ return {"status": "ok"}コードの説明:
from fastapi import FastAPI, HTTPException: FastAPIのコア機能と、エラーハンドリングのためのHTTPExceptionをインポートします。from pydantic import BaseModel: リクエストのデータ構造を定義するためにBaseModelをインポートします。from typing import Optional: オプションのフィールドを定義するためにOptionalをインポートします。app = FastAPI(): FastAPIアプリケーションのインスタンスを作成します。class Query(BaseModel): リクエストボディのデータ構造を定義します。textは必須の文字列、max_lengthはオプションの整数(デフォルト値は50)です。@app.post("/generate"):/generateエンドポイントを定義します。POSTメソッドでリクエストを受け付けます。async def generate_text(query: Query):/generateエンドポイントの処理を記述します。query引数でリクエストボディを受け取ります。try...except: エラーハンドリングを行います。エラーが発生した場合は、HTTPステータスコード500とエラーメッセージを返します。return {"result": result}: 処理結果をJSON形式で返します。@app.get("/health"):/healthエンドポイントを定義します。GETメソッドでリクエストを受け付けます。async def health_check():/healthエンドポイントの処理を記述します。return {"status": "ok"}: サーバーが正常に動作していることを示すJSONを返します。
-
APIサーバーの起動: ターミナルで以下のコマンドを実行し、APIサーバーを起動します。
uvicorn main:app --reloadmain:main.pyファイルを指定します。app:main.pyファイル内で定義されたFastAPIアプリケーションのインスタンス名(app = FastAPI())を指定します。--reload: ファイルが変更された際にサーバーを自動的に再起動します(開発時のみ推奨)。
サーバーが正常に起動すると、
http://127.0.0.1:8000(またはhttp://localhost:8000)でアクセスできるようになります。
3. APIのテスト
APIが正常に動作するかテストします。
-
/healthエンドポイントのテスト: ブラウザでhttp://127.0.0.1:8000/healthにアクセスします。以下のようなJSONが表示されれば、正常に動作しています。{"status": "ok"} -
/generateエンドポイントのテスト:curlコマンドやPostmanなどのツールを使用して、POSTリクエストを送信します。curlコマンドの例:
curl -X POST -H "Content-Type: application/json" -d '{"text": "今日の天気", "max_length": 100}' http://127.0.0.1:8000/generatePostmanの例:
- Method:
POST - URL:
http://127.0.0.1:8000/generate - Headers:
Content-Type: application/json -
Body:
rawを選択し、JSON形式で以下のように記述します。{ "text": "今日の天気", "max_length": 100 }
正常にリクエストが処理されると、以下のようなJSONが返されます。
{"result": "あなたは「今日の天気」と入力しました。最大長は100です。"} - Method:
4. 環境変数の設定 (オプション)
APIキーなどの機密情報をコードに直接記述するのは避けるべきです。環境変数を使用して、安全に管理しましょう。
-
.envファイルの作成: プロジェクトのルートディレクトリに.envファイルを作成し、環境変数を記述します。OPENAI_API_KEY=YOUR_OPENAI_API_KEYYOUR_OPENAI_API_KEYは、OpenAI APIのキーに置き換えてください。 -
環境変数のロード:
main.pyを修正し、.envファイルから環境変数をロードするようにします。from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional from dotenv import load_dotenv import os load_dotenv() # .envファイルをロード app = FastAPI() class Query(BaseModel): text: str max_length: Optional[int] = 50 # デフォルト値 @app.post("/generate") async def generate_text(query: Query): """ テキスト生成エンドポイント。 """ try: # 環境変数の利用例 api_key = os.environ.get("OPENAI_API_KEY") if not api_key: raise ValueError("OPENAI_API_KEYが設定されていません") # ここにLangChain/LangGraphの処理を記述(詳細は次回) # 例: result = generate_text_with_langchain(query.text, query.max_length, api_key) result = f"あなたは「{query.text}」と入力しました。最大長は{query.max_length}です。APIキーの存在確認:{api_key is not None}。" # ダミーの処理 return {"result": result} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/health") async def health_check(): """ ヘルスチェックエンドポイント。 """ return {"status": "ok"}変更点:
from dotenv import load_dotenv:load_dotenv関数をインポートします。import os:osモジュールをインポートします。load_dotenv():.envファイルをロードします。api_key = os.environ.get("OPENAI_API_KEY"): 環境変数OPENAI_API_KEYを取得します。- APIキーが存在しない場合のエラーハンドリングを追加します。
- ダミーの処理に、APIキーの存在確認を追加しました。
まとめ
今回は、LangChain/LangGraphを利用したAIエージェントをREST APIとして提供するための、APIサーバーの基本的な構築方法について解説しました。
- 開発環境の準備
- FastAPIによるREST APIサーバーの構築
- APIのテスト
- 環境変数の設定(オプション)
次回は、LangChainとLangGraphを使用して、実際にAIエージェントを作成する方法について解説します。お楽しみに! http://rosso.pink/

コメント