# AIエージェントをソフトウェアに組み込むプラクティス
# 階層化メモリ
🎯 「全部コンテキストに詰め込む」設計は、ウィンドウ溢れとハルシネーションの永続化を同時に引き起こします。
メモリを3層に分けるだけで、コンテキスト効率と記憶の信頼性を両立できます。
🔥 解決する課題
エージェントが複数ターンに跨がるタスクを扱うとき、すべての情報をコンテキストウィンドウに詰め込む「フラット記憶」では2つの問題が同時に起きます。会話履歴・ユーザ属性・中間結果・外部知識が混在するとウィンドウが溢れ、古い情報から押し出されて文脈が断絶します。さらにLLMが生成した推測をそのまま永続化すると、ハルシネーションが長期記憶に定着し、以降のセッションを汚染し続けます。
💡 提案パターン
メモリを作業記憶(ターン内の中間状態)・短期記憶(セッションストア、TTL付き)・長期記憶(ベクトルDB/KVS)の3層に分離します。作業記憶は自由に読み書きし、コンテキストリセットで消えます。短期記憶には信頼度タグを付与し、ユーザ発話由来は高信頼、LLM推測由来は低信頼とマークします。長期記憶への昇格には反復確認やユーザ承認を要求し、ハルシネーションの永続化を防ぎます。failure_costが高い領域ほど昇格閾値を厳しくし、TTLを長めにとって安全側に寄せます。
✅ 選定条件
使うとき:
- 複数セッションにわたって情報を引き継ぐ必要がある
- 中間結果の量がコンテキストウィンドウの30%を超える見込みがある
- 確定事実と推測の区別が必要で、誤った記憶の波及影響が大きい
使わないとき:
- 1ショットで完結しセッション間の引継ぎが不要な場合
- コンテキストウィンドウに全情報が収まる場合
- メモリの書込制御だけが課題で、階層分離自体は不要な場合
⚠️ 落とし穴
- 作業記憶と短期記憶の境界が曖昧になりがちです。外部ストアへの書込を境界線にし、LLMの内部状態に頼らないでください
- 長期記憶のエントリ数が増えると無関係な記憶がコンテキストに混入し、ハルシネーションの原因になります
- マルチエージェント構成で各Workerが直接長期記憶に書き込むと整合性が崩れます。長期記憶はSupervisorが一元管理しましょう
🔧 実装方針
- 作業記憶(dict/インメモリ)・短期記憶(Redis等TTL付きセッションストア)・長期記憶(ベクトルDB)の3層を明確に分離し、外部ストアへの書込を境界線とします
- recall時はコンテキスト予算内で3層から関連情報を想起し、関連度と信頼度でランク付けして注入量を制御します
- 短期→長期への昇格には信頼度スコアの閾値チェックと承認状態の検査を設け、未検証情報の永続化を防ぎます
- 記憶種別ごとにTTLを設計し(リアルタイムデータは分単位、ユーザ嗜好は週単位、不変属性は無期限)、failure_costが高いほど短めに設定します
#
AIエージェント# #
ソフトウェアアーキテクチャ#