こんにちは、CCCMKホールディングス TECH LAB三浦です。
8月ももうすぐ終わりですね。日中はまだまだ暑いですが、夜に洗濯物を取り込んでいたら虫の鳴き声が聞こえてきて、夏の終わりだなぁとしみじみとしてしまいました。
"Autonomous Agent(自律型エージェント)"はLLMの応用事例として研究が進められているテーマだと思います。さらにArtificial General Intelligence(AGI: 汎用人工知能)到達への一歩としても捉えられている印象があります。
現在様々な"Agent"に関するテクニックが存在しているのですが、"Agentってなに?"と聞かれると私の中で色々な要素がこんがらがっていて上手く説明出来ないことに気が付きました。
最近私はある技術について頭の中で整理整頓する時にサーベイ論文を読むようにしているのですが、今回も"Autonomous Agent"についてのサーベイ論文を読んでAgentについて整理してみようと思いました。読んだ論文はこちらです。
- Title
A Survey on Large Language Model based Autonomous Agents - Author
Lei Wang, Chen Ma, Xueyang Feng, Zeyu Zhang, Hao Yang, Jingsen Zhang, Zhiyuan Chen, Jiakai Tang, Xu Chen, Yankai Lin, Wayne Xin Zhao, Zhewei Wei, Ji-Rong Wen - Submit
22 Aug 2023 (v1), last revised 4 Apr 2024 - arXiv
https://arxiv.org/abs/2308.11432
この論文の中で特にAgentのシステム構成に必要な要素についてまとめられている"LLM-based Autonomous Agent Construction"の内容について自分の理解を深めるためにまとめてみたいと思います。
Autonomous Agent
Autonomous Agentは与えられたタスクに対し、自身でプランを作成し、行動を実行し、解決することが出来るシステムです。AgentはLLM以前から研究されてきた領域ですが、LLM以前はタスク特化型の機械学習(強化学習)によるアプローチを取ることが多く、人間のように様々な状況に対して柔軟に複雑なタスクをこなすようなシステムを実現することが出来ませんでした。ところが柔軟な推論能力を持つLLM登場以降はLLMにAgentシステムのコントロール部分を担わせることで人間に近い意思決定が実現出来るようになり、またLLMには自然言語で指示を与えることが出来るため、ユーザーにとってより理解しやすいシステムの構築が可能になりました。
LLM単体でもQ&Aやテキスト要約といったタスクを実行することは出来ますが、Agent化することでさらに複雑なタスクを実行出来るようになります。より高性能なAgentシステムを組むためにはどのような観点が必要になるのでしょうか?論文では"システムのアーキテクチャをどう組むのか"という観点で様々な手法がまとめられています。
Agentのアーキテクチャ
Agentシステムを組むためにはどのような構成要素が必要になるのでしょうか。私が普段Agentを定義する時は「どのようなツールを与えるのか」と「どのように行動を決定させるのか」という観点を考えることが多いです。論文ではシステムを構成する要素(モジュール)を4つに分けて整理しています。"Profiling Module", "Memory Module", "Planning Module", "Action Module"です。
- Profiling Module: Agentの属性や役割を決める
- Memory Module: Agentが存在する環境から取得した情報を記録し将来の行動の決定に使用する
- Planning Module: タスクをよりシンプルで細かいタスクに分解する
- Action Module: Agentが実行を決めた行動を環境に対して行い、その実行結果を取得する
それぞれのモジュールについて、様々な観点でまとめられています。
Profiling Module
Profiling ModuleはAgentに属性や役割を与えるModuleです。たとえば性別や年齢、職業、口調などの人物特性や教師、専門家、開発者といった役割を与えることでタスクに適した行動をAgentに行わせることを目的とします。このModuleはAgentの記憶や計画、行動などに影響を及ぼします。基本的にはLLMに与えるプロンプトにそれらの情報を組み込むことで実現しますが、プロファイリングプロンプトをどう用意するのかについては3つの方針が挙げられます。
人力で作成する
プロファイリングプロンプトを人力で作成する方針です。柔軟に対応が出来る一方で、大量のAgentが必要な場合は全て人手で対応することが難しくなります。
LLMで生成する
LLMにプロファイリングプロンプトを自動生成させる方針です。具体的には人がいくつかの例示となるプロファイリングを作成し、それを種としてLLMに同様のプロファイリングを作成させる、といったアプローチが挙げられます。大量のAgent用のプロファイリングプロンプトが作成できる一方、細かい調整が効かせづらいという側面もあります。
実在の人物のデータを使用する
実在の人物のプロファイリングデータを元に、プロンプトを作成する方針です。
これらの3つの方針は組み合わせて使うことが出来ます。たとえば実在の人物のプロファイリングデータを元に、LLMに複数のプロファイリングプロンプトを生成させる、などです。
Memory Module
Memory ModuleはAgentの過去の行動や環境から得られた情報を記録し、将来の計画を決める際に関係する情報を取り出して使用します。論文ではMemory Structures(記憶をどう表現するのか), Memory Formats(記憶を保存する形式), Memory Operations(記憶に対する操作)について様々な方針がまとめられています。
Memory Structures
人間の記憶には一時的なもの(short-term memory)と長期的なもの(long-term memory)が存在します。Agentにおいてもshort-term memoryだけを使うのか、short-term memoryとlong-term memory両方使うのかで2通りの記憶の表現方針が挙げられます。
short-term memoryはプロンプトの中に過去の情報を組み込むことで実現することが出来ます。たとえば複数のAgentで会話をさせるシステムの場合は会話の履歴をプロンプトの中に保持したり、ゲームをプレイするAgentではこれまでのプレイ内容をプロンプトの中に書き込んだりしてshort-term memoryを表現しています。
一方長期に渡り保存が必要なlong-term memoryまでプロンプトに保持しようとすると、プロンプトのサイズが膨大になってしまいます。long-term memoryの保存には別のストレージが必要で、たとえばVector databaseが使用されます。
short-term memoryは直近の出来事を、long-term memoryは長期に渡って保存すべき重要な情報を格納する用途で使われます。short-term memoryは実装が容易ですが、より人間らしい動作をするAgent実装のためには別途ストレージを用意し、long-term memoryの導入を検討する必要があるといえます。(私はこれまでshort-term memoryだけを使ったAgentを作ったことはありますが、long-term memoryまで使ったAgentはまだ作った経験がありません。)
Memory Formats
記憶を保存する形式は様々なものが考えられます。論文ではその一部として、次の形式が紹介されています。
自然言語(Natural Languages)
Agentの行動や結果などをそのまま自然言語の状態で保存します。自然言語の状態なので、ユーザーにとって理解しやすいメリットがあります。プロンプトに直接書き込むshort-term memoryはこの形式を取ることになると思います。
埋め込み(Embeddings)
テキストを埋め込みモデルで埋め込みベクトルにして格納する形式です。
データベース(Databases)
SQLで操作が可能なデータベースに格納する形式です。この形式で記録された情報にアクセスするためには対応するクエリの作成が必要になるため、クエリ生成用にファインチューニングされたモデルが必要になる可能性があります。
配列(Structured Lists)
配列で情報を格納する形式です。
Memory Operations
記憶領域に対する操作として、Reading, Writing, Reflectionが挙げられます。
Reading
Agentが次の行動を計画する時などに、必要な情報を記憶から取得する操作です。ある行動を決める際に価値がある情報は、より最近のもので(recent)、その行動と関連性が高く(relevance)、そしてより重要な(importance)ものであるべきだと考えられます。この3つの指標のうち、どれを重視するのかは状況に応じて異なります。それぞれの指標を測定するスコアに重みづけをするなどして、どれを重視して情報を取得するのかを表現することが出来ます。
Writing
記憶領域にAgentが受け取った情報を書き込む操作です。書き込み操作では、これから書き込む情報と似た情報がすでに記憶領域に存在する場合の重複を防ぐための対応と記憶領域の容量がオーバーしないように不要な情報を除く対応も必要になります。
Reflection
Agentに記憶領域からより複雑で広い視野に基づいた情報を取得させるための操作がReflectionです。たとえばGenerative AgentというAgentシステムでは最初に直近の記憶から情報を取得し、その情報に基づいて3つの質問を生成、それらの質問に関連する情報をさらに記憶領域から取得する、といったように情報の取得と推論を複数回実行するReflectionを行います。
Planning Module
Agentではタスクをより細かいタスク(サブタスク)に分割し、それぞれを解くことで目標のタスクを解決するというアプローチを取りますが、Planning Moduleではタスクをどのように細かいタスクに分割するのか計画する役割を担います。実装する手法は、計画の際に途中の実行結果をフィードバックとして受け取り、計画の再作成を行うかどうかで2つに分類することが出来ます。
フィードバックを受け取らない
タスクをどう分割するのかで、大きく3つに分類されます。一方向に最終タスクまでに必要なサブタスクを作成する"Single-path Reasoning"、並列もしくはツリー構造にサブタスクを作成する"Multi-Path Reasoning"、サブタスクを別のLLMに生成させる"External Planner"というアプローチです。
フィードバックを受け取る
フィードバックを受け取って計画を見直す処理を行う場合、どこからフィードバックを受け取るのか、という観点が発生します。具体的にはReActなど、行動を実行した時に環境からフィードバックを受け取る(Environmental Feedback)、Agentシステムを利用しているユーザーからフィードバックを受け取る(Human Feedback)、別のLLMに評価をさせ、その結果をフィードバックとして受け取る(Model Feedback)が挙げられます。
Action Module
Action ModuleはAgentの決定を行動として実行しその結果を取得する処理を担います。ここではAgentの行動が何を目的にするのか(Action Goal)、行動が何によって決定されるのか(Action Production)、どのような行動が選べるのか(Action Space)、行動によってどんな結果が引き起こされるのか(Action Impact)という観点でまとめられています。
Action Goal
Agentが行動を起こす目的として、何らかのタスクを完了させる(Task Completion)、他のAgentやユーザーとコミュニケーションを行う(Communication)、環境について不明なことを明らかにする(Environment Exploration)などが例として挙げられています。
Action Production
必要な行動をどの情報を元に作成するのか、という観点です。論文の中では2つ挙げられています。1つはMemory Moduleで記録されたこれまでの情報を使って今必要な行動を作成する方法と、Planning Moduleで作成された計画に基づいて行動を作成する方法です。もしかしたら2つの方法を組み合わせて行動を作成する、というアイデアもあるのかもしれません。
Action Space
Agentが取ることが出来る行動は、外部のツールを呼び出すもの(External Tools)と、LLMの内部的な知識を利用するもの(Internal Knowledge)に分けることが出来ます。
External Tools
外部ツールを呼び出す行動でもっともよく使われるのはAPIを呼び出すことだと思います。たとえば天気などの情報を取得するAPI、別のモデルをAPIで利用するなどが挙げられます。さらにデータベースやナレッジベースにクエリを通じてアクセスする外部ツールもあります。また特定のタスクを解くために特化した別のモデルを呼び出して使う、といった外部ツールも挙げられます。
Internal Knowledge
LLMが獲得済みの知識に依存した行動です。たとえばあるタスクを解くために必要な計画を作成する、自身に与えられた役割や特性に基づいて会話を行う、一般常識に基づいた判断を行う、などが挙げられます。
Action Impact
Agentが起こした行動によって、どのような結果が発生するのでしょうか。まず1つ目が環境の変化です。例えば商品の在庫が変わったり、部屋の中にある家具の位置が変わったり、などが挙げられます。もう一つがAgent自身の状態の変化です。Agentの記憶が変化したり、計画が変更されたり、などが挙げられます。さらに別の行動を引き起こすものも考えられます。連続して実行しなければならない行動があった場合、前の行動の完了が次の行動を引き起こすことが挙げられます。
まとめ
今回は"Autonomous Agents"に関するサーベイ論文"A Survey on Large Language Model based Autonomous Agents"から、特にAgentシステムの構成要素についてまとめてみました。今回調べたことを元にAgentについて自分なりにまとめてみると、
- Agentは与えられたタスクに対して状況を加味しながら最適な行動を計画し実行できるシステム
- 最適な行動を選択するために特定の属性や役割を持たせたりこれまでの観測結果を記憶させるといった工夫が出来る
といったようになります。特にAgentシステムの構成要素が把握出来たことで、今後自分でAgentを組む時の設計の指針として活用していきたいと感じました。