powered by TechFeed
表示モード
Deep Dive

AIエージェントが「同じ間違いを繰り返す」問題を解決する — LangChainが語るメモリ設計の3ステップ

6月25日、LangChainが「How to Build Memory into AI Agents」と題した記事を公開した。この記事では、AIエージェントにメモリ機能を実装するための設計パターンと、LangSmithを使った具体的な構築手順について詳しく紹介されている。以下に、その内容を紹介する。

6月25日、LangChainが「How to Build Memory into AI Agents」と題した記事を公開した。この記事では、AIエージェントにメモリ機能を実装するための設計パターンと、LangSmithを使った具体的な構築手順について詳しく紹介されている。以下に、その内容を紹介する。


「メモリ」とは何か

エージェントが会話をまたいで情報を保持できない場合、ユーザーは同じ修正を何度も繰り返すことになる。メモリとは、エージェントが複数の実行をまたいで取得・活用できる永続的なコンテキストのことだ。事実、ユーザーの好み、過去のやりとり、スキル、ルールなどが含まれる。

重要な区別として、単なるログやトレース(実行記録)はメモリではない。そこから有用な教訓を抽出し、次回の実行時にエージェントが参照できる形に変換して初めてメモリになる。

短期メモリと長期メモリ

メモリは2つのスコープに分けて考えると整理しやすい。

短期メモリ(ワーキングメモリ)は、現在のタスク処理中に利用できるコンテキストだ。現在のスレッド、直近のメッセージ、ツールの実行結果、取得済みドキュメント、中間推論の成果物などが該当する。

長期メモリは、実行をまたいで保持されるコンテキストだ。事実、ユーザーの好み、ワークフロー、ポリシー、スキルなど、将来の動作に影響を与えるべき情報が含まれる。

この2つの関係は「読み書きサイクル」で表現できる。実行中は長期メモリから必要なコンテキストを読み込み、実行後のトレースを分析して有用なシグナルがあれば長期メモリに書き戻す。

長期メモリの3分類

長期メモリはさらに、認知科学の分類を借用した3種類に分けられる(参考論文)。

  • セマンティックメモリ:エージェントが「知っていること」。事実、好み、一般知識。
  • エピソーディックメモリ:エージェントが「経験したこと」。過去のやりとり、実例、行動とその結果。
  • プロシージャルメモリ:エージェントが「どう振る舞うべきか」。指示、ワークフロー、ポリシー、スキル、ツール使用ルール。

記事が特に強調しているのはプロシージャルメモリだ。エージェントの動作改善として最も目に見えやすい成果の多くは、プロシージャルメモリの改善から生まれる。 回答フォーマットが繰り返し間違う、ツールの呼び出し順序が正しくない、トーンのルールが無視される——これらの修正はほぼ手続き的なルールの整備で解決できる。

メモリループの3ステップ

機能するエージェントメモリの実装は、次の3ステップで構成される。

1. トレースのキャプチャ

トレースとは、エージェントがタスクをどのように処理したかの記録だ。ユーザー入力、モデル呼び出し、ツールの入出力、取得ドキュメント、ルーティング判断、レイテンシ、エラー、ユーザーフィードバックなどが含まれる。

従来の決定論的なソフトウェアと異なり、エージェントは実行軌跡を検査しないとどう動作したかが分からない。プロンプトの弱さ、ツールの欠如、不明確なツールスキーマ、不十分なRAG検索、古いコンテキストなど、問題の原因はトレースを見て初めて特定できる。

2. トレースの分析

キャプチャしたトレースから有用なシグナルを探す。明示的なフィードバックや評価の失敗から見つかる場合もあるが、繰り返し発生するパターン(同じ誤出力、同じ無効なツール呼び出し、同じルーティングミス)にも着目する必要がある。

難しいのは診断だ。同じ症状でも原因は異なる。トーンのルールが無視される場合、ルールが曖昧すぎる、配置場所が悪い、関連スキルに含まれていない、別の指示と矛盾しているなど、複数の原因が考えられる。

3. メモリの更新

シグナルの原因を特定したら、将来のコンテキストを変更すべきかどうかを判断する。指示の明確化やルーティングルールの変更といった問題の修正だけでなく、ユーザーの好みや成功パターンを記憶する「追記」も含まれる。

LangSmithを使った実装

LangChainのツールチェーンを使う場合、この3ステップは以下のコンポーネントに対応する。

ステップ LangSmithのコンポーネント
トレースキャプチャ LangSmith Observability
トレース分析 LangSmith Engine
メモリ更新 LangSmith Context Hub

LangSmith Engine は、トレースを手動で確認する手間を省くバックグラウンドプロセスだ。繰り返し発生する問題を自動分析し、根本原因を診断して、具体的な改善案(ルールの追加、指示の移動、新しいサンプルの作成、スキルの更新など)を提示する。

Context Hub は、エージェントが使用する指示・ツール・スキルをバージョン管理する場所だ。アプリケーションコードにアドホックで埋め込まれたプロンプト編集ではなく、永続的なエージェントコンテキストとして管理できる。

コンテキストが更新されると、次の実行時にそれが読み込まれてループが完結する。

実装上の3つの注意点

記事では、実運用から得られた設計原則として以下の3点が挙げられている。

  1. すべてをメモリ更新にしない。 トレースデータのほとんどは履歴として残すべきで、データセット、評価、コード修正、ツールスキーマの修正として対処すべきものも多い。永続コンテキストにすべきはごく一部だ。
  2. 更新内容が実際に次の実行で読み込まれるか確認する。 ランタイムがプロンプトやスキルをキャッシュしている場合、メモリをコミットしても古いコンテキストで動き続ける可能性がある。更新後のリフレッシュパスを必ず用意すること。
  3. 重要な動作は評価(evals)で保護する。 メモリ更新が将来の動作に影響するほど重要なら、その動作が退行したときに検知できる仕組みを用意しておくべきだ。

詳細はHow to Build Memory into AI Agentsを参照していただきたい。