1. AIエージェント構築チュートリアルの概要とデモンストレーション [0]

  1. チュートリアルの目標: PythonでAIエージェントをゼロから構築する方法を、初心者にもわかりやすく数分で解説するものであり、LangChainなどの人気フレームワークを用いた興味深い成果物の作成を目指すものである [0]。

  2. エージェントの機能:

    1. LangChainなどのフレームワークを使用し、ClaudeやGPTなどの多様なLLM (大規模言語モデル)を使用する方法を習得する [3]。
    2. エージェントに多様なツール(Wikipedia、Google検索、カスタムPython関数など)へのアクセスを許可する方法を習得する [3]。
    3. エージェントの出力をコードで利用できるように構造化する方法を習得する [3]。
  3. 完成プロジェクトのデモ:

    1. リサーチアシスタントというAIエージェントを構築する [5]。
    2. ユーザーが「LangChainとそのアプリケーションについて教えて」というクエリを入力し、その内容をファイルに保存するように指示する [8]。
    3. エージェントはWikipediaとGoogle Search (DuckDuckGo Search)のツールにアクセスする [10]。
    4. 処理中に思考プロセス (Thought Process)をターミナルに表示し、これは必要に応じて無効にできる [12]。
    5. 構造化された出力結果には、Topic (トピック)、Summary (要約)、Sources (ソース)、Tools Used (使用したツール)が含まれる [13]。
    6. 実行後、研究出力の内容とタイムスタンプを含むテキストファイルが生成されていることを確認する [15]。
    7. このアプローチは、より多くのツールへのアクセスを可能にし、より高度な機能を実現するための基礎となる [16]。

2. 開発環境の準備と依存関係のインストール [21]

  1. 前提条件 (Prerequisites):

    1. Pythonのインストール: 理想的にはPythonバージョン3.10以上が必要であるが、バージョンはあまり重要ではない [22]。
    2. コードエディタ: Visual Studio Code (VS Code)のようなエディタの使用が推奨される [23]。
    3. フォルダの作成と開放: 新しいフォルダ(例: AI agent tutorial)を作成し、VS Codeで開く必要がある [26]。
  2. Pythonの依存関係の設定:

    1. requirements.txtの作成: 必要なパッケージを記載したrequirements.txtファイルを作成する [32]。
    2. パッケージの記載: エージェントの動作に必要な7行のパッケージリストをファイル内にペーストする(コードはGitHubリンクからコピー可能) [36]。
  3. 仮想環境の設定 (推奨):

    1. 仮想環境の定義: 仮想環境は、依存関係をインストールするための隔離された場所であり、プロジェクトごとに環境を分離できる [40]。
    2. 仮想環境の作成コマンド:
    3. python -m venv venv を実行する (Mac/Linuxではpython3に調整可能) [45]。
    4. これにより、現在のディレクトリにvenvという新しいディレクトリが作成される [46]。
    5. 仮想環境のアクティブ化コマンド:
    6. MacまたはLinuxの場合: source ./venv/bin/activate [51]。
    7. Windowsの場合: .\venv\Scripts\activate [54]。
    8. ターミナルにvenvというプレフィックスが表示されればアクティブ化が完了である [56]。
    9. 依存関係のインストール: 仮想環境がアクティブな状態で、pip install -r requirements.txt (またはpip3 install -r requirements.txt) を実行し、すべての依存関係を仮想環境にインストールする [42]。
  4. GitHub Copilotに関するスポンサーシップ情報:

    1. GitHub Copilotの紹介: VS Codeで使用されているオートコンプリート機能はGitHub Copilotによるものであり、生成AIコーディングツールがソフトウェア開発を変革している事例である [59]。
    2. #CodingWithCopilotキャンペーン: Microsoftは、開発者がGitHub Copilotをクリエイティブに使用した事例を学ぶ機会を提供するために、#CodingWithCopilotキャンペーンを実施している [65]。
    3. 開発者は、Instagram、X、YouTube、LinkedInなどでハッシュタグ #CodingWithCopilot を付けて自分のストーリーを共有できる [68]。

3. 基本的なエージェントのセットアップとLLMの選択 [74]

  1. 必要なファイルの作成:

    1. main.py: 主なロジックを記述するファイル [75]。
    2. tools.py: ツール関連の機能を分離して記述するファイル [77]。
    3. .env: APIキーなどの認証情報を保存するための環境変数ファイル [79]。
  2. メインファイルの初期設定 (main.py):

    1. 必要なライブラリのインポート:
    2. .envからload_dotenvをインポートする [84]。
    3. pydanticからBaseModelをインポートする [85]。
    4. langchain_openaiからChatOpenAIをインポートする [86]。
    5. オプションとして、langchain_anthropicからChatAnthropicをインポートする(OpenAIまたはClaudeのどちらかを選択できるようにするため) [86]。
    6. load_dotenv()の実行: .envファイルに保存されている認証情報をロードする [87]。
  3. LLM (大規模言語モデル) の設定:

    1. LLMの選択肢: ChatOpenAI (GPTモデルを使用) または ChatAnthropic (Claudeモデルを使用) のどちらかを選択できる [92]。
    2. モデルの指定:
    3. OpenAIの場合: modelパラメータにGPT-4o MiniやGPT-4などのモデル名を指定する [96]。
    4. Anthropicの場合: Claude 3.5 Sonnetなどのモデル名を指定する [101]。
    5. LLMの初期化: LLMという変数に選択したLLMを代入する [91]。
  4. APIキーの設定と取得:

    1. 環境変数への設定: .envファイルに必要なAPIキーを変数として保存する必要がある [108]。
    2. OpenAIを使用する場合: OPENAI_API_KEY = (APIキー) [109]。
    3. Anthropicを使用する場合: ANTHROPIC_API_KEY = (APIキー) [111]。
    4. APIキーの取得:
    5. OpenAI: platform.openai.com/api-keys にアクセスし、新しいキーを生成してコピーする [116]。
    6. Anthropic (Claude): console.anthropic.com/settings/keys にアクセスし、キーを作成してコピーする [118]。
    7. 注意: APIキーを共有してはならない [120]。
  5. LLMの基本テスト (動作確認):

    1. テストコードの実行: LLMが正しくロードされているかテストするため、LLM.invoke("What is the meaning of life?")を実行し、その結果をプリントする [123]。
    2. 実行環境: Pythonコードを実行する際は、VS Codeなどのターミナルで仮想環境内からpython main.pyを実行する必要がある [128]。
    3. 結果の確認: LLMからの応答(コンテンツおよびメタデータ)が返されれば、LLMのセットアップは成功である [130]。

4. 構造化された出力のためのプロンプトとパーサーの定義 [135]

  1. プロンプトテンプレートとパーサーのインポート:

    1. langchain_core.promptsからChatPromptTemplateをインポートする [138]。
    2. langchain_core.output_parsersからPydanticOutputParserをインポートする [139]。
  2. 出力スキーマ (Pydanticモデル) の定義:

    1. LLMに生成させたいコンテンツのタイプを指定するPythonクラスを定義する [140]。
    2. ResearchResponseというクラスを作成し、BaseModelを継承させる [143]。
    3. 必要なフィールドの定義:
    4. topic: 型はstr [148]。
    5. summary: 型はstr [150]。
    6. sources: 型はlist[str] [152]。
    7. tools_used: 型はlist[str] [154]。
    8. 重要: 入れ子になったオブジェクトを含めることも可能であり、すべてのクラスがPydanticのBaseModelを継承している必要がある [157]。
  3. Pydanticパーサーの設定:

    1. LLMの出力を上記で定義したモデルに解析するためにパーサーを作成する [160]。
    2. parser = PydanticOutputParser(pydantic_object=ResearchResponse)とする [161]。
    3. このパーサーは、LLMの出力を通常のPythonオブジェクトとしてコード内で予測可能に利用できるようにする [163]。
  4. チャットプロンプトテンプレートの作成:

    1. プロンプトの定義: ChatPromptTemplate.from_messagesを使用してプロンプトを作成する [166]。
    2. システムメッセージ: LLMに役割(リサーチアシスタント)とタスク(研究論文の生成、ユーザーの質問への回答、必要なツールの使用)を伝える [168]。
    3. 出力形式の指示: 「出力をこの形式でラップし、他のテキストは提供しない」という指示と、パーサーから得られたformat_instructionsを渡す [169]。
    4. プレースホルダーの指定: chat_history、query (ユーザーからの入力)、agent_scratchpad (エージェントの作業領域) の3つのフィールドを追加する [173]。
    5. パーシャル適用: partialメソッドを使用して、パーサーによって生成されたformat_instructionsをプロンプトに部分的に埋め込む [177]。

5. エージェントの作成と実行 [185]

  1. エージェントのインポートと作成:

    1. langchain.agentsからcreate_tool_calling_agentをインポートする [186]。
    2. エージェントの初期化: agent = create_tool_calling_agent(LLM=LLM, prompt=prompt, tools=[])として初期化する [190]。
    3. 初期段階ではtoolsは空のリストとしておく [193]。
  2. エージェントエグゼキュータのインポートと設定:

    1. エグゼキュータのインポート: LangChain agentsからAgentExecutorをインポートする [197]。
    2. エグゼキュータの初期化: AgentExecutorを作成する [199]。
    3. agent: 作成したエージェントを渡す [200]。
    4. tools: 空のリストを渡す [201]。
    5. verbose: エージェントの思考プロセスを確認するためにTrueに設定する(不要な場合はFalseまたは省略可能) [202]。
  3. エージェントの実行 (Invoke):

    1. 実行: raw_response = agent_executor.invoke({"query": "What is the capital of France"})を実行する [205]。
    2. Invokeパラメータ: queryはプロンプトテンプレートで指定された変数であり、複数のプロンプト変数を渡すことも可能である [206]。
    3. テスト実行: python main.pyを実行すると、エージェントエグゼキュータチェーンが開始され、LLMからの応答が得られる [217]。
  4. 構造化された出力の解析と利用:

    1. 出力の解析: 生の応答から構造化された応答を得るために、parser.parse()を使用する [226]。
    2. テキストの抽出: 生の応答は辞書形式であるため、raw_response.get("output")[0].textを使用して、LLMが生成した構造化されたテキスト部分を抽出する [229]。
    3. 構造化された応答: structured_responseには、Pydanticモデルで定義されたフィールド(topic、summary、tools_used、sources)を持つPythonオブジェクトとして格納される [235]。
    4. Pythonオブジェクトとしての利用: structured_response.topicのように、特定のコンポーネントに予測可能にアクセスし、コード内で利用できる [245]。
  5. エラー処理の追加:

    1. モデルが正しい応答タイプを提供しない可能性があるため、try...exceptブロックを追加してエラーを処理する [249]。
    2. エラー発生時に、エラーメッセージと生応答をプリントするように設定する [252]。

6. ツールの追加とカスタムツールの作成 [256]

  1. ツールの概念:
    1. 定義: ツールは、LLMまたはエージェントが使用できる機能であり、自作することも、LangChain Community Hubからインポートすることもできる [257]。
    2. 今回作成するツール: Wikipedia検索、DuckDuckGo検索、そしてカスタムPython関数(ファイル保存)の3種類である [259]。

6.1. ツール関連のインポートとDuckDuckGo検索ツールの作成 [260]

  1. tools.pyへのインポート:

    1. langchain_community.toolsからWikipediaQueryRunとDuckDuckGoSearchRunをインポートする [260]。
    2. langchain_community.utilitiesからWikipediaAPIWrapperをインポートする [261]。
    3. langchain.toolsからToolをインポートする(カスタムツール作成のため) [266]。
    4. datetimeからdatetimeをインポートする [269]。
  2. DuckDuckGo検索ツールの作成 (Google検索の代替):

    1. SearchRunの初期化: search = DuckDuckGoSearchRun()とする [277]。
    2. Toolへのラッピング: my_search_toolをToolクラスで初期化する [279]。
    3. name: searchとする(スペースを含んではならない) [281]。
    4. func: search.runを渡す [283]。
    5. description: "search the web for information" を渡す(エージェントがツールを使用すべき時を判断するための説明) [285]。
  3. main.pyでの検索ツールの組み込みとテスト:

    1. ツールのインポート: from tools import my_search_tool as SearchTool (原文のコードと合致するように修正) [294]。
    2. ツールリストの作成: tools = [SearchTool]を作成する [296]。
    3. エージェントへの渡す: create_tool_calling_agentとAgentExecutorにこのtoolsリストを渡す [297]。
    4. ユーザー入力の取得: クエリをユーザーからのインプットinput("What can I help you research?")から受け取るように変更する [301]。
    5. テスト実行: I want to know about sharksというクエリを実行すると、エージェントがsearchツールを使用し、構造化された応答が得られることを確認する [315]。
    6. 注意: 実行前にduckduckgo-searchパッケージがインストールされている必要がある [306]。

6.2. Wikipediaツールの追加 [323]

  1. Wikipedia APIラッパーの設定:

    1. api_wrapper = WikipediaAPIWrapper()として初期化する [326]。
    2. パラメータ設定:
    3. top_k_results = 1: Wikipediaから返される結果の数を1に制限する [328]。
    4. doc_content_chars_max = 100: 返されるドキュメントコンテンツの最大文字数を100に制限する(より多くのコンテンツが必要な場合は値を増やす) [330]。
    5. 他のパラメータ(言語、メタデータなど)も設定可能である [334]。
  2. Wikipedia Query Runによるツールの作成:

    1. wiki_tool = WikipediaQueryRun(api_wrapper=api_wrapper)とする [336]。
    2. このツールはカスタムToolでラップする必要はなく、LangChainに直接渡すことができる [338]。
  3. ツールの組み込みとテスト:

    1. main.pyでインポート: wiki_toolをインポートする [340]。
    2. ツールリストに追加: toolsリストにwiki_toolを追加する [340]。
    3. テスト実行: hammerhead sharksというクエリを実行すると、エージェントがWikipediaとsearchの両方のツールを使用し、応答が生成されることを確認する [342]。

6.3. カスタムツール (ファイル保存) の作成 [346]

  1. カスタムPython関数の定義:

    1. 目的: 構造化された研究データをテキストファイルに保存するための関数を作成する [346]。
    2. 関数: save_to_txt(data: str, file_name: str)を定義する [353]。
    3. 型ヒントの重要性: モデルが関数を呼び出す方法を知るために、パラメータに型(この場合はstr)を指定することが重要である [355]。
    4. 関数ロジック: ファイルに研究出力、タイムスタンプ、および受け取ったデータを書き込む [359]。
  2. カスタムツールとしてのラッピング:

    1. Toolへのラッピング: save_toolをToolクラスで初期化する [362]。
    2. func: save_to_txt関数の名前を渡す(呼び出しはしない) [365]。
    3. name: save_text_to_fileとする(スペースなし) [367]。
    4. description: "Save structured research data to a text file"を渡す [369]。
    5. 汎用性: この方法により、API呼び出しなど、任意のPython関数をカスタムツールとしてエージェントに渡すことができる [371]。
  3. ツールの組み込みと最終テスト:

    1. main.pyでインポート: save_toolをインポートする [375]。
    2. ツールリストに追加: toolsリストにsave_toolを追加する [377]。
    3. モデルへの指示: クエリに「ファイルに保存して (save to a file)」という指示を含める必要がある [379]。
    4. 最終実行: Southeast Asia population, save to a fileというクエリを実行する [381]。
    5. 結果の確認: エージェントがWikipedia、search、そしてsave_text_to_fileツールを使用し、実行後にresearch_output.txtファイルが生成され、その中にタイムスタンプ、トピック、および研究の詳細情報が構造化された形式で含まれていることを確認する [385]。

7. 結論 [393]

  1. プロジェクトの完了: 複数のツールにアクセスできるAIエージェントをPythonでゼロから構築することが完了した [392]。
  2. 学習内容の重要性: このチュートリアルは、AIアプリケーションの約80%を構成する主要なコンポーネントとトピックを網羅しており、クールな成果物を構築するための基盤となる [394]。
  3. リソース: すべてのコードはGitHubにあり、説明欄のリンクからアクセス可能である [397]。