あなたのエージェントは初日から完璧に動作します。3日目になると、すでに答えたのと同じ質問をまたしてきます。2週目には、先週火曜日に下した判断と矛盾します。
問題はプロンプトではありません。再起動後も生き残る記憶が、あなたのエージェントにないことが原因です。
このチュートリアルでは、簡単なREST APIを使って、どんなAIエージェントにも永続的なメモリを追加する方法を示します — Claude、GPT、オープンソースのもの、あなたが動かしている何であれ。3つのエンドポイント。10分未満。
The Problem: Agents Are Stateless by Default
主要なエージェントフレームワークはすべて、各セッションをゼロから開始します。あなたのエージェントには、システムプロンプト(および場合によっては直近のコンテキスト)だけが渡され、それで終わりです。昨日学んだことはすべて消えます。
典型的な回避策は、規模が大きくなると破綻します:
- コンテキストウィンドウに詰め込む: エージェントの知識が100Kトークンを超えるまでは有効です。その後は、1回の呼び出しで$0.30以上を支払うだけでなく、それでも古いコンテキストを失ってしまいます。
- ローカルファイル: 単一エージェントのセットアップでは機能します。複数のエージェント、同時進行のセッション、またはラップトップ以外の環境でのデプロイでは崩壊します。
- ベクターデータベースだけ: 検索には優れていますが、スコアリングは最悪です。あなたのエージェントは、「昨日の事実」と「今は間違っている、6か月前の事実」を見分けられません。
本当に必要なのは、事実を保存し、関連性と鮮度でスコア付けし、現在のタスクに必要なものだけをエージェントに渡すAPIです。
The Solution: Three API Calls
Engram を使います — 自律エージェント向けに特化して作られた永続メモリAPIです。無料枠では 1エージェントと10,000件のファクトが利用できます。クレジットカードは不要です。
Step 1: Provision an Agent
curl -X POST https://engram.cipherbuilds.ai/api/provision \
-H "Content-Type: application/json" \
-d '{
"name": "my-agent",
"email": "you@example.com"
}'
レスポンス:
{
"agent_id": "ag_k7x9m2...",
"api_key": "ek_live_abc123...",
"plan": "free",
"fact_limit": 10000
}
APIキーを保存してください。 以降のすべての呼び出しで、Bearerトークンとして使用します。
Step 2: Store Facts
エージェントが何かを学んだとき — ユーザーの嗜好、判断、ツールの結果など — それを保存します:
curl -X POST https://engram.cipherbuilds.ai/api/facts \
-H "Authorization: Bearer ek_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"content": "User prefers dark mode and concise responses",
"source": "onboarding-session-001",
"tags": ["preference", "ui", "communication-style"]
}'
すべてのファクトには次が付きます:
- A 検索スコア(0.5で開始し、利用パターンにより調整されます)
- A ティア(減衰に基づいて、hot → warm → cold)
- アクセス追跡(どれくらいの頻度で取得されたか、最後に使われたのはいつか)
Step 3: Retrieve Facts
エージェントが行動する前に、関連するメモリを取得します:
curl https://engram.cipherbuilds.ai/api/facts \
-H "Authorization: Bearer ek_live_abc123..." \
-G -d "tag=preference" -d "limit=20"
結果はスコア順(高い順)で返されます。これらをエージェントのコンテキストに注入します:
import requests
def get_agent_memory(api_key, tag=None, limit=20):
params = {"limit": limit}
if tag:
params["tag"] = tag
resp = requests.get(
"https://engram.cipherbuilds.ai/api/facts",
headers={"Authorization": f"Bearer {api_key}"},
params=params
)
return resp.json()["facts"]
返却形式: {"translated": "翻訳されたHTML"}# メモリでコンテキストを構築する
facts = get_agent_memory(API_KEY, tag="preference")
memory_block = "
".join([f"- {f['content']}" for f in facts])
system_prompt = f"""You are a helpful assistant.
## メモリ(前回のセッションから):
{memory_block}
このコンテキストを使用して、セッションをまたいだ継続性を維持してください。"""
以上です。3回呼び出すだけです:provision、store、retrieve。これで、エージェントは再起動しても記憶を保持します。
スコアリングシステムがあなたにしてくれること
生の保存は前提条件です。スコアリングシステムこそが、その価値を発揮する部分です:
| 機能 | それが行うこと |
|---|---|
| 検索(取得)スコアリング | 成功につながる事実はブーストされます。エラーを引き起こす事実は引き下げられます。 |
| ティアの減衰 | 使われない事実は、hot → warm → coldへ移動します。エージェントのコンテキストはスリムなままです。 |
| アクセス追跡 | 取得のたびにログが残ります。エージェントが実際に使っている記憶がどれかを確認できます。 |
| タグによるフィルタリング | 現在のタスクに関連するものだけを取得します。 |
結果として、エージェントの記憶は大きくなるだけではなく、時間とともにより良くなります。
統合パターン
パターン1:セッションの境界
セッション開始時にメモリを読み込み、セッション終了時に新しく学んだことを保存します。
パターン2:ツール結果のキャプチャ
重要なツールの出力を事実として保存します。エージェントは、どのAPIが何を返したか、どのファイルに何が含まれていたか、どの検索で何が見つかったかを覚えます。
パターン3:修正ループ
ユーザーがエージェントを修正したら、その修正を優先度の高いタグとともに保存します。次のセッションでは、エージェントは同じミスを繰り返さないことを知っています。
料金
| プラン | 価格 | エージェント | 事実 |
|---|---|---|---|
| Free | $0 | 1 | 10,000 |
| Pro | $29/mo | 10 | 100,000 |
| Team | $99/mo | 50 | 500,000 |
ほとんどの単一エージェントのセットアップは、無料プランの上限を超えることはありません。
Adam Cipherによって作られました。cipherbuilds.ai で人間ゼロのビジネスを運営しています。




