はじめに
業務でLLMを活用していくためには,検索拡張生成(RAG)やAIエージェントといった技術が必要になってくると考えられる。これらの技術の基礎知識と実践経験を積むために,西見公宏・吉田真吾・大嶋勇樹 著「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」を読むことにした。
本記事は,第12章 「LangChain/LangGraphで実装するエージェントデザインパターン」における,パッシブゴールクリエイターとプロンプト/レスポンス最適化の実装例に関する読書メモである。
- 本書の紹介ページ
第12章 LangChain/LangGraphで実装するエージェントデザインパターン
本章では,第11章で紹介したエージェントデザインパターンのうち,7つのパターンを取り上げ,LangChain・LangGraphによる実装方法を紹介している。
12.1 本章で扱うエージェントデザインパターン
本章で扱うパターンは以下の通りである。
- パッシブゴールクリエイター (Passive Goal Creator)
- プロンプト/レスポンス最適化 (Prompt/Response Optimizer)
- シングルパスプランジェネレーター (Single-Path Plan Generator)
- マルチパスプランジェネレーター (Multi-Path Plan Generator)
- セルフリフレクション (Self-Reflection)
- クロスリフレクション (Cross-Reflection)
- 役割ベースの協調 (Role-Based Cooperation)
12.2 環境設定
サンプルコードを動かしながら挙動を確認した。
github.com
サンプルコードを動かすためにはAnthropic のAPIが必要になる。2025年1月現在でAPI Keyを取得するには,AnthropicのAPIのサイト(https://www.anthropic.com/api)から"Start Building"をクリックしてAPI Keyの作成に進む。
12.3 パッシブゴールクリエイター (Passive Goal Creator)
パッシブゴールクリエイターは,ユーザの入力から具体的な目標を抽出するパターンである。
処理用のサンプルコードは以下の通り。
https://github.com/GenerativeAgents/agent-book/blob/main/chapter12/passive_goal_creator/main.py
- 実行用のサンプルコード
!python -m passive_goal_creator.main --task "カレーライスの作り方"
- 出力
カレーライスを作るための具体的な手順を学び、実際に調理する。
入力された内容に比べて,出力は目標がかなり具体化されていることが確認できた。
LangSmithで処理内容を確認した。
短いが,処理内容を具体化するためのプロンプトが記載されていた。またユーザからの入力もプロンプトに含まるような内部処理になっていた。
12.4 プロンプト/レスポンス最適化 (Prompt Response Optimizer)
プロンプト/レスポンス最適化は,生成された目標やユーザ要求を,より効果的なプロンプトに変換し,LLMからより質の高い回答を得るためのパターンである。
このプログラムは,効果的なプロンプトを生成するプロンプト最適化と,最適なレスポンス内容を定義するレスポンス最適化から構成される。
プロンプト最適化
処理用のサンプルコードは以下の通り。
https://github.com/GenerativeAgents/agent-book/blob/main/chapter12/prompt_optimizer/main.py
- 実行用のサンプルコード
!python -m prompt_optimizer.main --task "カレーライスの作り方"
- 出力
インターネットを利用して、カレーライスの作り方に関する情報を調査し、ユーザーのために詳細なレポートを生成する。レポートには以下の項目を含める: 必要な材料のリスト、各材料の分量、調理手順のステップバイステップガイド、調理にかかる時間、美味しく作るための具体的なコツ。(測定基準: 生成したレポートが以下の基準を満たしているかを確認する: 1) 必要な材料が全てリストアップされていること、2) 各材料の分量が明記されていること、3) 調理手順がステップバイステップで詳細に記載されていること、4) 調理にかかる時間が具体的に示されていること、5) 美味しく作るためのコツが具体的に記載されていること。これらの基準を全て満たしている場合、目標は達成されたとみなす。)
このプログラムを実行すると,以下の2種類の処理が実行される。
- 1つ目の処理
1つ目の処理では,パッシブゴールクリエイターのように指示内容を具体化している。
- 2つ目の処理
目標設定の「SMART原則」に沿って,プロンプトを作っている。
この出力は以下のようになる。
出力は,"Description"と"Metrics"の2種類に分かれている。
レスポンス最適化
レスポンス最適化では,ユーザが入力したプロンプトから,そのプロンプトの目標を達成するために必要なレスポンス使用を出力するプロンプトを定義する。
処理用のサンプルコードは以下の通り。
https://github.com/GenerativeAgents/agent-book/blob/main/chapter12/response_optimizer/main.py
- 実行用のサンプルコード
!python -m response_optimizer.main --task "カレーライスの作り方"
- 出力
目標分析: この目標は、ユーザーがカレーライスを作るために必要な情報を詳細に提供することを目的としています。主要な要素は、材料リスト、各材料の分量、調理手順、調理時間、美味しく作るためのコツです。ユーザーがこの情報を基にして、スムーズにカレーライスを調理できるようにすることが意図されています。 レスポンス仕様: レスポンスは、親しみやすく、明確で、実用的なトーンで提供されるべきです。構造としては、まず材料リストを提示し、次に各材料の分量を示し、続いて調理手順をステップバイステップで説明します。調理時間を具体的に示し、最後に美味しく作るためのコツを提供します。内容の焦点は、ユーザーが迷わずに調理を進められるようにすることです。 AIエージェントへの指示: 1. カレーライスの材料リストを作成し、各材料の分量を明記してください。 2. 調理手順をステップバイステップで詳細に記載してください。 3. 調理にかかる時間を具体的に示してください。 4. 美味しく作るための具体的なコツを提供してください。 5. これらの情報を親しみやすく、明確なトーンでまとめてください。 レスポンス例: 材料リスト: - 玉ねぎ: 2個 - 人参: 1本 - じゃがいも: 2個 - 牛肉: 300g - カレールー: 1箱 - 水: 800ml 調理手順: 1. 玉ねぎ、人参、じゃがいもを一口大に切ります。 2. 鍋に油を熱し、牛肉を炒めます。 3. 肉の色が変わったら、玉ねぎ、人参、じゃがいもを加えて炒めます。 4. 水を加え、沸騰したらアクを取り除きます。 5. 弱火で20分煮込みます。 6. 火を止めてカレールーを加え、溶かします。 7. 再び弱火で10分煮込み、完成です。 調理時間: 約40分 美味しく作るためのコツ: - 玉ねぎをしっかり炒めることで甘みが増します。 - ルーを加えた後は、焦げ付かないように時々かき混ぜましょう。 評価基準: 1) 必要な材料が全てリストアップされていること。 2) 各材料の分量が明記されていること。 3) 調理手順がステップバイステップで詳細に記載されていること。 4) 調理時間が具体的に示されていること。 5) 美味しく作るためのコツが具体的に記載されていること。
AIエージェントに入力するクエリの最適化だけでなく,AIエージェントから出力される内容の最適化まで実現できている。
LangSmithで中間処理の状況を確認すると,目標分析やレスポンス仕様のテンプレートを含むインプットが作られていた。
まとめと感想
第11章で紹介されていたAIエージェントのデザインパターンのうち,「パッシブゴールクリエイター」と「プロンプト/レスポンス最適化」の実装例を学んだ。
パッシブゴールクリエイターは,プロンプトを工夫したような実装になっていたが,シンプルながら目標設定が緻密になっていたので,少ない使用料で目標設定を具体化するために有益だと感じた。
プロンプト/レスポンス最適化は,目標設定の「SMART原則」にしたがうなど,通常のプロンプトエンジニアリングでも有益そうなコードが紹介されていた(正直言って,人間よりも良い目的設定をしそうである…)。
またレスポンス最適化においては,出力仕様のテンプレートを指定しており,別のデザインパターンにも応用できそうだった。
本記事を最後まで読んでくださり,どうもありがとうございました。