HelloAgents:Memory――エージェントに記憶を持たせる
「記憶喪失の大規模モデル」から「長期記憶を持つエージェント」へ
シリーズ解説:本記事は、HelloAgents 第8章「記憶と検索」の学習ノート(前編)であり、公式チュートリアルの内容と個人的な理解を基にまとめました。本記事では主に、記憶システム(Memory)の設計思想について紹介します。これには、なぜエージェントに記憶が必要なのか、人間の記憶モデルがエージェントに与える示唆、およびHelloAgentsにおけるMemoryモジュールの全体的なアーキテクチャが含まれます。
はじめに
大規模言語モデル(LLM)の絶え間ない発展に伴い、ますます多くのエージェント(Agent)が、自律的な計画(Planning)、ツールの使用(Tool Use)、内省(Reflection)などの能力を備え始めています。これまでの HelloAgents チュートリアルでも、これらのコア機能が段階的に実装されており、エージェントはすでにユーザーのニーズに応じて自律的にツールを呼び出し、複雑なタスクを完了することができるようになっています。 p>
しかし、こうした能力を備えていても、エージェントには依然として非常に明らかな欠点があります――長期記憶がないということです。
例えば、以下の会話をご覧ください:
ユーザー:
私の名前はシャオミンです。現在、コンピュータ科学専攻の大学院生です。
エージェント:
わかりました。覚えておきます。
......
(数日後に会話を再開)
ユーザー:
私が誰か覚えていますか?
エージェント:
申し訳ありませんが、わかりません。
なぜこのような状況になるのでしょうか?
その理由はそれほど複雑ではありません。
LLM自体には、真の意味での「記憶」はありません。モデルが認識できる情報はすべて、コンテキストウィンドウ(Context Window)から得られています。ある会話が終了すると、新しいセッションでは以前の内容が自動的に引き継がれないため、モデルはユーザーの情報を真に記憶することができません。
つまり、大規模モデルにとって:
忘れたのではなく、そもそも保存されていなかったのです。
だからこそ、ChatGPTやClaudeといったモデルが「記憶喪失のようだ」と感じられるのです。
現在、Memory機能を提供する製品は増えていますが、これは実際にはモデル自体が記憶を持つようになったわけではなく、モデルの外部に別途記憶管理システム(Memory System)が構築されているのです。 p>
『HelloAgents』第8章の目標は、エージェントにこのような長期記憶能力を追加することです。
一、なぜエージェントにMemoryが必要なのか
従来のチャットボットでは、回答は毎回独立して行われることが多いため、長期記憶の有無による影響はそれほど顕著ではありませんでした。
しかし、エージェントにとって、単に質問に答えられるだけでは不十分です。
真に持続的に動作できるエージェントは、異なる時間や異なるタスクの間で経験を保存し、知識を蓄積し、過去の情報に基づいてより合理的な意思決定を行う必要があります。
したがって、Memoryは現代のエージェントにとって不可欠な重要な構成要素となっています。
一般的に、メモリには少なくとも以下のいくつかの役割があります。
1. 連続した対話の実現
最も直感的な役割は、長期にわたる対話をサポートすることです。
例:
ユーザー:
今後、プログラミング言語を推奨する際は、Pythonを優先して推奨してください。
......
数日後
ユーザー:
機械学習に適した言語を一つ推薦してほしい。
エージェントに長期記憶がなければ、ユーザーの現在の問題を改めて分析するしかありません。
しかし、履歴情報が保存されていれば、エージェントは次のことを把握できます:
ユーザーは以前、Pythonを好むと明確に述べていました。
したがって、回答は次のようなものになる可能性があります:
Pythonをおすすめします。以前、Pythonを優先して学びたいとおっしゃっていたこと、またPythonにはPyTorch、TensorFlow、Scikit-Learnなど、豊富な機械学習エコシステムがあるからです。
ご覧の通り、回答にはすでに連続性が生まれています。 p>
2. ユーザープロファイル(User Profile)の構築
長期記憶は、単なる一言を保存するだけでなく、徐々にユーザープロファイルを形成することも可能です。
例えば、何度もやり取りを重ねた結果、次のような情報が得られます:
ユーザーの好み:
✓ Pythonを好む
✓ Markdownを使用している
✓ 中国語での回答を好む
✓ 主な研究分野:多目的最適化
✓ エージェントを学習中
これにより、エージェントが質問に回答する際、ユーザーが自身の背景を繰り返し説明する必要がなくなります。
これが、多くの商用AI製品が「メモリ(Memory)」をますます重視する理由でもあります。
3. 長期タスク(Long-term Task)のサポート
数時間、さらには数日にわたるタスクを実行するエージェントが増えています。例えば:
- Deep Research
- 自動ソフトウェア開発
- 長時間のデータ分析
- 論文の自動読解
もしエージェントが1ステップ完了するたびに、それ以前に何が起きたかを忘れてしまうなら、タスク全体を継続することはほぼ不可能です。
例えば:
1日目:
論文Aを既読
2日目:
論文Bの読解を継続
3日目:
すべての論文を要約
メモリがなければ、3日目には前の2日間で何を行ったか全く分からなくなってしまいます。
したがって、メモリも長期エージェントを実現するための基礎的な能力です。
4. 絶え間ない経験の蓄積
真に知能的なシステムにとって重要なのは、単に質問に答えることだけでなく、学習することである。
例:
1回目:
ユーザー:
この回答は単純すぎる。
2回目:
ユーザー:
コード例を追加してほしい。
3回目:
ユーザー:
Markdownを使うのが望ましい。
エージェントがこうしたフィードバックを継続的に記録できれば、今後コンテンツを生成する際、ユーザーの習慣にますます合致したものになるだろう。
この能力は、本質的に経験の蓄積に他なりません。
二、人間の記憶システムがエージェントに与える示唆
HelloAgentsは、Memoryを紹介する際、直接コードについて説明するのではなく、まず**認知心理学(Cognitive Psychology)**における人間の記憶モデルを紹介しました。 p>
これは、現在多くのエージェントフレームワーク(LangGraph、Mem0、Lettaなど)が、Memoryを設計する際に、人間の脳の記憶の仕組みを参考にしているためです。
一般的に、人間の記憶は3つの階層に分類されると考えられています:
外界からの情報
│
▼
感覚記憶(Sensory Memory)
│
▼
作業記憶(Working Memory)
│
▼
長期記憶(Long-term Memory)
各レベルは異なる機能を担っています。
(一)感覚記憶(Sensory Memory)
感覚記憶は、情報が脳に入った後の最初の段階です。
例:
私たちが絵を見たり、言葉を聞いたり、匂いを嗅いだりしたとき、これらの情報はまず感覚記憶に入ります。
これには2つの特徴があります:
① 容量が非常に大きい
ほぼすべての感覚情報が一時的に保存されます。
② 保存時間が極めて短い
通常、わずか数百ミリ秒から数秒程度です。
さらに注意を向けなければ、これらの情報はすぐに消えてしまいます。
例:
街を歩いていると
↓
多くの広告看板を目にする
↓
その内容のほとんどはすぐに忘れてしまう
エージェントは通常、この層を実装しません。なぜなら、エージェントはすでに推論段階に入った情報に重点を置いているからです。
(二)ワーキングメモリ(Working Memory)
ワーキングメモリは次のように理解できる:
現在考えている問題。
例えば、次の計算を行う場合:
37 × 48
頭の中で絶えず保持されている:
37
48
1776
これらの一時的な情報が、ワーキングメモリである。
ワーキングメモリの容量は非常に限られている。
認知心理学では、有名な 「7±2の法則」が提唱されており、人間が同時に処理できる情報の量は通常、5~9個の対象にとどまるとされています。
エージェントにとって、ワーキングメモリは以下の要素に対応します:
- 現在のプロンプト
- 現在のタスク状態
- ツールからの検索結果
- 推論の中間過程
例:
ユーザーの質問
↓
LLMによる推論
↓
検索ツールの呼び出し
↓
検索結果の取得
↓
推論の継続
このプロセス全体で生成される大量の一時的な情報は、すべてワーキングメモリに属します。
これらの内容は通常、現在のタスク中のみ有効であり、タスク終了後には解放されます。
(三)長期記憶(Long-term Memory)
人間に真の学習能力をもたらすのは、長期記憶である。
ワーキングメモリーと比較して、その容量にほとんど制限がなく、数年、あるいは一生にわたって保存することができる。
長期記憶はさらに2つのカテゴリーに分類できる。
1. 手続き記憶(Procedural Memory)
手続き記憶が保存するのはスキルである。
例:
- 自転車の乗り方
- 水泳
- タイピング
- コードの記述
これらの能力は、数行の文章では説明しづらいものですが、絶え間ない練習を通じて身につけることができます。
エージェントにとっては、これらは様々な能力モジュールとして理解できます。例えば:
- 検索ツールを呼び出す
- コードインタプリタを呼び出す
- 画像を生成する
- SQLを記述する
これらの能力は、エージェントがすでに習得している「スキル」に似ています。
2. 宣言的記憶(Declarative Memory)
宣言的記憶には、言語で記述可能な情報が保存されます。
これはさらに2つの異なるタイプに分類されます:
(1)意味記憶(Semantic Memory)
意味記憶には、主に事実や知識が保存されます。
例:
北京は中国の首都です
Transformerは2017年に提案されました
Pythonはインタプリタ型言語です
これらの知識には明確な時間的属性はありません。
エージェントにとって、意味記憶には通常以下が含まれます:
- ユーザーの好み
- ユーザーの職業
- 一般的な知識
- 事実情報
例:
ユーザーはMarkdownが好きです。
ユーザーの研究分野はエージェントです。
ユーザーは主にPythonを使用している。
これらはすべてセマンティックメモリに属する。
(2)エピソード記憶(Episodic Memory)
セマンティックメモリとは異なり、エピソード記憶が保存するのは経験した出来事である。
例:
昨日の午後
指導教官から実験計画の修正を指示された。
あるいは:
先週、論文の初稿を完成させた。
その最大の特徴は、時間的属性を持つことである。
通常、以下が含まれる:
- 時間
- 場所
- 人物
- 出来事
エージェントにとって、エピソード記憶は非常に重要です。
例えば:
2026-06-01
データクレンジングを完了
↓
2026-06-05
モデルのトレーニングを完了
↓
2026-06-08
実験結果の分析を開始
これらのタスクの記録が、一体となって完全なワークフローを構成しています。
そのため、多くの現代のエージェントフレームワークにおいて、セマンティック・メモリーとエピソード・メモリーは、いずれも長期記憶の重要な構成要素となっています。
続いて第2部に進みます。このパートでは、メモリーとRAGの関係、HelloAgentsのメモリーアーキテクチャ、および4種類のメモリーの設計について重点的に解説します。
3. メモリーとRAGの違いとは?
エージェントを学び始めたばかりの多くの人には、次のような疑問があるでしょう:
RAG(Retrieval-Augmented Generation、検索強化生成)がすでに存在するのに、なぜMemoryが必要なのでしょうか?
実際、これら2つはどちらも「検索」に関わっていますが、解決する問題は全く異なります。
まずは以下の比較図をご覧ください:
エージェント
┌─────────────────┐
│ LLM │
└────────┬────────┘
│
┌──────────┴──────────┐
│ │
▼ ▼
Memory RAGナレッジベース
(過去の記憶) (外部知識の検索)
一言でまとめると:
- Memory:「自分が何を経験したか」を記憶する。
- RAG:「外部にどのような知識があるか」を検索する。
両者が注目する対象は異なります。
Memory:エージェント自身の経験を保存する
Memory が保存するのは、エージェントとユーザーのやり取りの過程で生成された情報です。例えば:
ユーザーは Python が好きです。
ユーザーは現在、エージェントについて学んでいます。
ユーザーは先週、論文の初稿を完成させました。
ユーザーは昨日、コードの修正を手伝ってほしいと頼んできた。
これらはすべてエージェント自身が経験したことです。
それらの最大の特徴は:
- ユーザーと密接に関連している
- やり取りを重ねるごとに増え続ける
- ユーザーごとに異なる
したがって、Memoryは人間の脳に似ています。
RAG:外部の知識世界との接続
一方、RAGは別の種類の問題を対象としています。
例えば:
企業内部のドキュメント
PDF
Word
論文
製品マニュアル
APIドキュメント
社内ナレッジベース
これらの知識モデルは、本来は認識していません。
もし直接次のように尋ねた場合:
「TensorRTの最新機能にはどのようなものがありますか?」
LLMの回答は不完全なものになる可能性が高いでしょう。
しかし、まず企業のナレッジベースから関連ドキュメントを検索し、そのドキュメントをプロンプトに含めれば、モデルは最新の資料に基づいて回答することができます。
この一連のプロセスが RAG です。
したがって、RAG は、素早くページをめくれる百科事典のようなものです。
両者の違いを理解するための例
ユーザーが数ヶ月連続で同じエージェントを使用していると仮定します。
ある日、ユーザーが次のように尋ねたとします:
機械学習の本を1冊おすすめしてください。
エージェントの処理フローは、おそらく以下の通りです:
ステップ1:Memoryの照会
Memoryから以下の情報が判明しました:
ユーザーはPythonを好んでいます。
ユーザーは大学院生です。
主な研究分野は人工知能である。
これらの情報から、
推奨はC++ではなく、Pythonによる実装に重点を置くべきである。
ステップ2:RAGの検索
続いてナレッジベースから以下の情報を検索する:
機械学習の定番教材
最新刊
講義資料
検索結果が見つかったら、LLMに渡します。
最終的な回答は、次のようなものになる可能性があります:
あなたの研究分野を踏まえて、以下の書籍を読むことをお勧めします:
『Hands-On Machine Learning with Scikit-Learn、
Keras and TensorFlow』
理由:
① あなたはこれまでずっとPythonを学んできました;
② この本のコードはすべて Python で書かれています;
③ 大学院生にとって非常に適しています。
ここからわかるように:
Memory は「誰に推薦するか」を決定し;
RAG は「何を推薦するか」を決定します。
この2つが組み合わさって初めて、エージェントは真にパーソナライズされた能力を持つようになります。
4. HelloAgentsのMemoryシステムアーキテクチャ
Memoryの役割を理解した上で、HelloAgentsが記憶システム全体をどのように設計しているかを見てみましょう。
公式では、Memoryを単なるリストとして扱うのではなく、完全な階層型アーキテクチャとして設計しています。
全体としては次のように表すことができます:
Memory System
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
Infrastructure Memory Types Storage
│
▼
Embedding
システム全体は4層構造として理解できます。
第1層:Infrastructure(インフラストラクチャ層)
これはメモリ全体の中心的な入り口です。
すべてのメモリ操作を一元的に管理する役割を担っています。
主に以下の基本コンポーネントで構成されています:
MemoryManager
MemoryItem
MemoryConfig
BaseMemory
これらはそれぞれ異なる役割を担っています。
MemoryItem------記憶の基本単位
すべての記憶は最終的に1つのMemoryItemとして表現されます。
例:
MemoryItem(
content="ユーザーはPythonが好き",
memory_type="semantic",
importance=0.9
)
1つのMemoryItemには通常、以下の要素が含まれます:
content
memory_type
timestamp
importance
embedding
metadata
このうち:
content
実際に保存される情報です。
例:
ユーザーはMarkdownが好きです。
memory_type
どの種類の記憶に属するかを示します。
例:
working
semantic
episodic
種類ごとに異なる管理戦略が採用されます。
importance
重要度を表します。
例:
天気がとても良い
重要度は、せいぜい:
0.2
一方:
ユーザーの長期的な研究分野は人工知能
重要度は、最大で:
0.95
重要な情報は通常、安易に削除されることはありません。
MemoryManager------システム全体の脳
MemoryItemが1つの記憶だとすれば、
MemoryManagerはすべての記憶を管理する存在である。
Agentはデータベースを直接操作しない。
すべての操作はMemoryManagerを経由する。例:
記憶の追加
↓
記憶の更新
↓
記憶の検索
↓
記憶の削除
↓
記憶の要約
一元管理を行うことで、異なるタイプのMemoryのインターフェースが統一され、将来的に新しい記憶タイプを拡張する際にも便利です。
BaseMemory------統一インターフェース
HelloAgents では、異なる Memory タイプがすべて同じ親クラスを継承しています。
例えば:
class BaseMemory:
def add():
pass
def search():
pass
def update():
pass
def delete():
pass
この方式の利点は以下の通りです:
ワーキングメモリであれ、セマンティックメモリであれ、統一されたインターフェースを通じて操作が可能です。
オブジェクト指向設計の思想に合致しています。
第2層:Memory Types(記憶タイプ)
公式では、前述した人間の記憶モデルに基づき、4種類の異なるMemoryを実装しています。
Memory
│
├── Working Memory
├── Semantic Memory
├── Episodic Memory
└── 知覚記憶
以下、それぞれについて説明します。
(一)ワーキングメモリ(Working Memory)
ワーキングメモリは主に、
現在のタスクの実行過程で生成される情報を保持します。
例:
ユーザーの質問
↓
プロンプト
↓
ツールによる返答
↓
LLMの推論プロセス
↓
最終的な回答
この一連のプロセスで生成される大量の一時データは、すべてワーキングメモリに属します。
これにはいくつかの特徴があります:
- ライフサイクルが短い
- 容量に限りがある
- タスク終了と同時に解放される
例:
検索ツールを呼び出し中......
検索完了……
推論を続行……
これらの内容は長期保存する必要はありません。
そのため、ワーキングメモリには通常、TTL(Time To Live)が設定されており、期限が切れると自動的に削除されます。
(二)セマンティックメモリ(意味記憶)
セマンティックメモリは長期的な知識を保存します。
例:
ユーザーはPythonが好きです。
ユーザーはハルビン出身です。
ユーザーの研究分野はエージェントです。
ユーザーは頻繁にMarkdownを使用している。
これらの情報には明確な時間的制限がない。
今日であっても1年後であっても、通常は依然として成り立つ。
したがって、長期保存に適している。
エージェントは回答するたびに、まずセマンティックメモリを参照することで、よりパーソナライズされた返信を生成することができる。
(三)エピソード記憶(Episodic Memory)
エピソード記憶が保存するのは出来事である。
例:
2026-06-01
モデルのトレーニングを開始。
あるいは:
2026-06-03
実験中にCUDAのメモリ不足が発生した。
続行:
2026-06-05
バッチサイズを修正。
トレーニングを無事に完了。
これらの出来事が時系列に沿って並んだものが、一つの完全な経験となります。
したがって、エピソード記憶が重視するのは:
- 時間
- 場所
- 順序
- 文脈
多くの長時間のタスクを処理するエージェントは、実行プロセスを追跡するためにエピソード記憶に依存している。
(4)知覚記憶(Perceptual Memory)
テキスト以外にも、現在ではますます多くのエージェントが以下をサポートし始めている:
- 画像
- 動画
- 音声
これらのマルチモーダル情報も、長期的に保存する必要があります。
例えば:
今日、実験用の画像を1枚アップロードしました。
↓
エージェントが自動的に分析します。
↓
今後、この画像について再び言及された際、
エージェントは議論を継続できます。
この能力こそが「知覚記憶(Perceptual Memory)」です。
これは、エージェントが視覚や聴覚などのマルチモーダル入力に対して持つ長期記憶に対応しています。
現在、マルチモーダルエージェントは、この種の記憶を徐々にサポートし始めています。
4種類のメモリの比較
| メモリの種類 | 保存内容 | ライフサイクル | 例 |
|---|---|---|---|
| ワーキングメモリ | 現在のタスク、中間推論 | 短期 | プロンプト、ツールの出力 |
| セマンティックメモリ | 知識、事実、ユーザーの好み | 長期 | ユーザーはPythonを好む |
| エピソード記憶 | 出来事、経験 | 長期 | 昨日、モデルのトレーニングに成功した |
| 知覚記憶 | 画像、音声などのマルチモーダル情報 | 長期 | アップロードされた実験画像 |
ご覧の通り、これら4種類のメモリは孤立して存在するのではなく、共にエージェントの長期記憶システムを構成しています。
続いて第3部、つまり本ブログの最後の部分に進みます。この部分では、Memoryの保存方法、ライフサイクル、およびHelloAgentsにおけるMemoryの基本的な使用フローについて紹介し、最後にまとめを行います。
5. Memoryはどのように保存されるのか?
これまでMemoryの分類について紹介してきましたが、もう一つ疑問があります:
これらの記憶は最終的にどこに保存されるのでしょうか?
もし単にPython変数に保存されているだけなら、プログラムが終了した瞬間にすべての記憶が消えてしまいます。したがって、完全なMemoryシステムには**永続的ストレージ(Persistent Storage)**機能が不可欠です。
HelloAgents は、Memory の保存を複数の階層に分割し、データの種類に応じて異なる保存方式で管理しています。
全体の流れは以下の通りです:
ユーザー入力
│
▼
MemoryManager
│
┌──────────┴────────── ┐
│ │
▼ ▼
テキスト情報の保存 ベクトル情報の保存
│ │
SQLite Qdrant
ご覧の通り、1つの記憶は1つだけ保存されるわけではなく、用途に応じて異なるデータが保存されます。
SQLite:元のテキストを保存
SQLiteは軽量なリレーショナルデータベースであり、ローカルでの導入に非常に適しています。
例:
content:
ユーザーはPythonが好き
time:
2026-07-04
type:
semantic
これらの構造化情報はすべて、SQLiteに直接保存できます。
SQLiteの利点には、次のようなものがあります:
- 導入が簡単で、追加のサーバーを必要としません;
- SQLクエリに対応しています;
- テキストやメタデータの管理が容易です;
- Memoryの永続化データベースとして適しています。
そのため、HelloAgents では、主に元のコンテンツと関連属性の保存を担当しています。
なぜベクトルデータベースも必要なのでしょうか?
テキストのみを保存する場合、ユーザーが次のように入力したとき:
AI開発に適した言語を1つ推薦してください。
データベースに保存されるのは:
ユーザーはPythonが好きです。
2つの文には完全に同一のキーワードがないため、従来のデータベースでは関連性を判断するのが困難です。
したがって、文字列の一致だけではエージェントの要件を満たすことができません。
これが、現代のエージェントがほぼ例外なくベクトルデータベース(Vector Database)を導入している理由です。
エンベディング:テキストをベクトルに変換する
ベクトルデータベースに格納する前に、まずエンベディング(ベクトル化)を行う必要があります。
Embeddingは次のように理解できます:
自然言語の文を、高次元の数値ベクトルに変換することです。
例えば:
ユーザーはPythonが好き
Embeddingモデルを通すと、次のように変換される可能性があります:
[0.12, -0.37, 0.81, ..., 0.24]
別の例:
機械学習にはPythonをおすすめします。
変換後:
[0.10, -0.35, 0.79, ..., 0.26]
2つの文は全く異なりますが、表現される意味が近いため、2つのベクトル間の距離は比較的近くなります。
これが、セマンティック検索が機能する基礎となります。
Qdrant:セマンティック検索を担当
ベクトルが得られたら、ベクトルデータベースに格納できます。
HelloAgents では、Qdrant をデフォルトのベクトルデータベースとして使用しています。
Qdrant の主な役割は以下の通りです:
- エンベディングの保存;
- ベクトルの類似度に基づく検索;
- 最も関連性の高いMemoryの返却。
例えば、現在のデータベースには以下が保存されています:
Memory A:
ユーザーはPythonが好きです。
Memory B:
ユーザーはJavaが好きです。
Memory C:
ユーザーは C++ を好む。
ユーザー入力:
ディープラーニングに適したプログラミング言語を1つ推薦してください。
エンベディング処理後、システムはこの質問とすべてのMemoryベクトルとの距離を計算します。
「Python」と「ディープラーニング」の意味が最も近いため、Qdrantは以下を優先的に返します:
ユーザーはPythonが好きだ。
これがセマンティック検索(Semantic Retrieval)のプロセスである。
従来のキーワードマッチングと比較して、意味は近いが表現が異なるテキストを理解できるため、検索効果がより優れている。
六、Memoryのライフサイクル
Memoryは、生成から使用に至るまで、単に「保存して取り出す」という単純なプロセスではありません。
HelloAgentsは、人間の記憶形成プロセスを参考にし、Memoryを複数の段階に分けました。
全体の流れは以下の通りです:
ユーザー入力
│
▼
Encoding(符号化)
│
▼
Storage(保存)
│
▼
Retrieval(検索)
│
▼
Consolidation(定着)
│
▼
Forgetting(忘却)
以下、それぞれについて説明します。
1. Encoding(符号化)
これはMemoryの最初のステップです。
ユーザーが文章を入力すると、システムはまず次のように判断します:
この文章は記憶する価値があるか?
例:
今日の天気はいいですね。
通常、長期的な価値はありません。
一方、
今後の質問への回答にはMarkdownを使用してください。
これはユーザーの好みであり、長期保存する価値があります。
保存が必要と判断された場合、システムは以下の処理を行います:
- 重要な情報を抽出;
- Embeddingを計算;
- MemoryItemを構築;
- データベースへの書き込み準備。
このプロセスを「エンコーディング(Encoding)」と呼びます。
2. Storage(保存)
エンコーディングが完了すると、Memoryは実際にデータベースに書き込まれます。
例:
memory.add(
content="ユーザーはMarkdownを好む",
memory_type="semantic",
importance=0.9
)
この時点で、システムは以下の処理を同時に完了します:
- テキストを保存;
- エンベディングを保存;
- 日時を保存;
- タイプを保存;
- 重要度を保存。
このようにして、1つの完全なMemoryが構築されます。
3. Retrieval(検索)
ユーザーが再度質問をした際、システムは直ちにLLMを呼び出しません。
その代わりに、まずMemoryの検索を実行します。
例:
ユーザー:
「ノート形式を一つおすすめしてください。」
Memoryを検索した結果:
ユーザーはMarkdownを好む。
そこで、これをプロンプトに追加する:
ユーザーの好み:
Markdownを好む。
現在の質問:
ノート形式を一つおすすめしてください。
最終的に、LLMはユーザーの習慣により合致した回答を生成します。
これも、Memoryが機能を発揮する上で最も重要なステップです。
4. Consolidation(定着)
すべてのMemoryが同等の重要度を持つわけではありません。
例:
今日、天気を一度検索しました。
価値は低いです。
一方:
ユーザーが数十回連続でMarkdownの使用を要求した場合。
これは、長期的かつ安定した好みであることを示している。
したがって、システムは以下に基づいて:
- 出現頻度;
- ユーザーフィードバック;
- 使用回数;
- 重要度;
特定の「Memory」の重みを継続的に高めていくことができます。
このプロセスは、人間の脳が長期記憶を絶えず強化していくことに似ているため、「Consolidation(定着)」と呼ばれます。
5. Forgetting(忘却)
真に優れたMemoryシステムは、「記憶する」だけでなく、「忘れる」ことも学ぶ必要があります。
もしすべてのコンテンツを永久に保存し続ければ、データベースはますます肥大化し、検索効率も低下し続けます。
例えば:
昨日、天気を調べた。
今日、宅配便を検索した。
一時的に認証コードを生成する。
これらの情報には通常、長期的な価値はありません。
そのため、システムは以下の基準に基づいて:
- TTL(有効期限);
- 重要度;
- 直近のアクセス回数;
無効なMemoryを自動的に削除します。
この仕組みにより、ストレージ容量を節約できるだけでなく、検索効率も向上します。
7. HelloAgents における Memory の基本的な使い方
HelloAgents は Memory を統一されたインターフェースとしてカプセル化しているため、開発者はデータベースを直接操作する必要がありません。
例えば、記憶を1件追加する場合:
result = memory_tool.execute(
「add」,
content="ユーザーは Python が好き",
memory_type="semantic",
importance=0.9
)
ここで:
content:保存する内容;memory_type:記憶のタイプを指定;importance:重要度。後のソートや保持ポリシーに使用されます。
Memory の検索も非常に簡単です:
result = memory_tool.execute(
「search」,
query="機械学習",
limit=3
)
システム内部で自動的に以下の処理が行われます:
クエリ文
│
▼
Embedding
│
▼
Qdrant 類似度検索
│
▼
Top-K Memoryを返す
開発者は検索結果にのみ注目すればよく、ベクトル検索ロジックを独自に実装する必要はありません。
現在のメモリ全体の状況を確認したい場合は、統計を取得することもできます:
result = memory_tool.execute(「summary」)
以下のような結果が得られる可能性があります:
ワーキングメモリ:2件
セマンティックメモリ:15件
エピソード記憶:8件
これにより、開発者は現在のエージェントの記憶状態を把握しやすくなります。
8. まとめ
エージェントの能力が絶えず向上するにつれ、LLMのコンテキストウィンドウのみに頼るだけでは、複雑なタスクの要件を満たせなくなっています。
「Memory」の導入により、エージェントは単なる「即座の質問への回答」にとどまらず、継続的な学習、長期的な蓄積、そしてパーソナライズされたサービスを提供する能力を真に備えるようになりました。
本章の学習を通じて、以下の点をまとめられます:
-
Memoryは、エージェントが長期的に動作するための基盤となる能力です。 これにより、ユーザーの好み、過去の出来事、タスクの経験を保存し、エージェントに連続的な対話や長期的なタスク実行能力を持たせることができます。
-
HelloAgentsのMemoryは、人間の記憶モデルを参考にしています。 情報の特性に応じて、記憶をワーキングメモリ、セマンティックメモリ、エピソードメモリ、知覚メモリに分類し、 各タイプごとに異なる管理戦略を採用しています。
-
MemoryとRAGは対立するものではなく、互いに補完し合います。 Memoryはエージェント自身の経験やユーザー情報を保存する役割を担い、RAGは外部ナレッジベースと連携し、モデルに最新かつ専門的な知識サポートを提供します。
-
エンベディング(Embedding)とベクトルデータベース(Qdrant)は、Memoryが意味検索を実現するための鍵となる。 これらにより、システムはキーワードの一致だけに頼るのではなく、テキストの意味を理解できるようになり、検索品質が大幅に向上する。