AIエージェントをREST APIとして提供する:LangChainとLangGraphによる構築入門(第1回:REST APIサーバー構築)

本記事では、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-dotenv
    • fastapi: 高速なAPIフレームワーク
    • uvicorn: ASGIサーバー (FastAPIアプリケーションを実行)
    • langchain: LLMを利用したアプリケーションを構築するためのフレームワーク
    • langgraph: LangChainのグラフ構造を扱うためのフレームワーク
    • pydantic: データ検証とシリアライズのためのライブラリ
    • python-dotenv: 環境変数を.envファイルからロードするためのライブラリ

2. FastAPIによるREST APIサーバーの構築

FastAPIを使用して、シンプルなREST APIサーバーを構築します。

  1. 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を返します。
  1. APIサーバーの起動: ターミナルで以下のコマンドを実行し、APIサーバーを起動します。

    uvicorn main:app --reload
    • main: main.pyファイルを指定します。
    • app: main.pyファイル内で定義されたFastAPIアプリケーションのインスタンス名(app = FastAPI())を指定します。
    • --reload: ファイルが変更された際にサーバーを自動的に再起動します(開発時のみ推奨)。

    サーバーが正常に起動すると、http://127.0.0.1:8000(またはhttp://localhost:8000)でアクセスできるようになります。

3. APIのテスト

APIが正常に動作するかテストします。

  1. /healthエンドポイントのテスト: ブラウザでhttp://127.0.0.1:8000/healthにアクセスします。以下のようなJSONが表示されれば、正常に動作しています。

    {"status": "ok"}
  2. /generateエンドポイントのテスト: curlコマンドやPostmanなどのツールを使用して、POSTリクエストを送信します。

    curlコマンドの例:

    curl -X POST -H "Content-Type: application/json" -d '{"text": "今日の天気", "max_length": 100}' http://127.0.0.1:8000/generate

    Postmanの例:

    • 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です。"}

4. 環境変数の設定 (オプション)

APIキーなどの機密情報をコードに直接記述するのは避けるべきです。環境変数を使用して、安全に管理しましょう。

  1. .envファイルの作成: プロジェクトのルートディレクトリに.envファイルを作成し、環境変数を記述します。

    OPENAI_API_KEY=YOUR_OPENAI_API_KEY

    YOUR_OPENAI_API_KEY は、OpenAI APIのキーに置き換えてください。

  2. 環境変数のロード: 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/

コメント

タイトルとURLをコピーしました