セッションをまたいで持続する記憶を、月2ドルのAIエージェントにどう与えたか
どんなAIエージェントのデモも魔法みたいに見えます。けれどもタブを閉じて開き直すと、エージェントはすべてを忘れています。
これが「記憶」の問題です。そして、ベクターデータベースなし、RAGパイプラインなし、インフラに月50ドルかけることなしで解決できます。
ここでは、私が実際にどうやったかをそのまま紹介します。
ステートレスなエージェントの問題
多くのAI APIは、設計上ステートレスです。リクエストごとに完全な初期状態(クリーン・スレート)になります。メッセージを送って、レスポンスを受け取ると、コンテキストは消えてしまいます。
チャットボットのような単純な用途ならそれで問題ありません。でも「あなたを知っている」はずのエージェントにとっては致命的な欠陥です。
私のエージェント—Louie—は24/7で稼働しています。毎時間チェックインし、目標、判断、そこから学んだことを時間をかけて追跡します。永続的な記憶がなければ、役に立たないでしょう。
私が作ったアーキテクチャ(そして、思っているよりずっと単純な理由)
核心の洞察はこれです:記憶とは、毎セッションの開始時に読み込まれて、終了時に書き出される“ただのJSONファイル”です。
ベクターデータベースなし。埋め込み(embeddings)なし。RAGなし。あるのは構造化データだけです。
// セッション開始時に記憶を読み込む
const memory = JSON.parse(fs.readFileSync(' ./brain.json', ' utf8'));
// それをすべてのプロンプトに含める
const systemPrompt = `
あなたの記憶:
${JSON.stringify(memory, null, 2)}
現在の世界の状態:
${JSON.stringify(worldState, null, 2)}
`;
// 各セッションの後に記憶を更新する
const brainUpdates = response.brainUpdates;
if (brainUpdates.addDecision) {
memory.recentDecisions.push({
time: new Date().toISOString(),
d: brainUpdates.addDecision
});
}
fs.writeFileSync(' ./brain.json', JSON.stringify(memory, null, 2));
以上です。エージェントは自分の履歴を読みます。そこから振り返り、更新します。
記憶に何を入れるか
私は記憶をいくつかのカテゴリに分けました:
目標(変更しない限りずっとそのまま)
{
"goals": {
"primary": "実際にお金を払ってくれるユーザーを獲得する",
"constraints": [
"月2ドルの価格は絶対",
"収益の50%を動物レスキューに寄付"
]
}
}
決定(エージェントが何を決め、なぜそうしたのか)
{
"recentDecisions": [
{
"time": "2026-03-27T04:00:00Z",
"d": "HNのトレンドシグナルの後でVPS記事を公開 — インフラコストの透明性が10倍の閲覧数につながった"
}
]
}
学び(繰り返してはならない失敗)
{
"lessonsLearned": [
{
"time": "2026-03-20T00:00:00Z",
"l": "Redditのスパム検知は、同じURLのクロスポストを2〜3回行った後に発動する。同じ内容を変えるか、2回の試行でやめる必要がある。"
}
]
}
うまくいった戦略 vs 失敗した戦略
返却形式: {"translated": "翻訳されたHTML"}{
"workingStrategies": [
"HN-reactive な記事は、生きたHNストーリーとのアルゴリズム相関だけで、オーガニックな発見につながる"
],
"failedStrategies": [
"同じURLをRedditに14回以上投稿する — 確実にシャドウバン"
]
}
トークン予算の問題
ここからが面白いところです。メモリが増えるほど、トークン使用量も増えます。
すべてのプロンプトに 5,000トークンのメモリを注入し、$3/100万トークンなら = 1回あたり $0.015。1日24回呼び出すと、メモリだけで $0.36/日 です。
私の解決策:階層化されたメモリ圧縮。
function compressMemory(memory) {
// 最近の意思決定をすべて保持(直近10件)
const recentDecisions = memory.recentDecisions.slice(-10);
// 古い意思決定を日次サマリーに圧縮
const olderDecisions = memory.recentDecisions.slice(0, -10);
const dailySummaries = summarizeByDay(olderDecisions);
return {
...memory,
recentDecisions,
dailySummaries, // 圧縮された履歴
};
}
日次サマリーは1日1回書き込まれ、24時間分の意思決定を1つの段落に圧縮します。これにより、エージェントがどれだけ長く動作していても、メモリのトークン使用量をおおむね一定に保てます。
MCP と未来
Model Context Protocol は、このパターンを標準化しようとしています。自前でJSONのメモリを用意する代わりに、MCPを使うことで、互換性のある任意のエージェントが参照できる構造化されたメモリサーバーを定義できます。
ですが正直に言うと?ほとんどの個人開発プロジェクトでは、JSONファイル方式で十分にうまくいきます。なぜなら:
- インフラ不要 — ファイルだけ
- 確認できる — 読める、編集できる、デバッグできる
- 移植可能 — どんなLLM APIでも動く
- 安い — ベクトルDBのコストがかからない
結果
私のエージェントは、永続メモリ付きで 558 回の毎時チェックインを実行してきました。次のことを覚えています:
- 公開したすべての記事
- 試したすべての失敗戦略
- それらの失敗から学んだすべての教訓
- 現在の目標と優先事項
$7/月のVPSで動いています。ユーザーはそれとやり取りするために $2/月を支払います。全体のコストはコーヒー1杯未満です。
試してみたいですか?
私が作ったエージェントは Louie です。Claude を使ったAIアシスタントで、料金は $2/月 — $20 ではありません。ここがポイントです:シリコンバレーの給料がなくても買える、実力のあるAI。
7日間の無料トライアル。クレジットカードの駆け引きなし。
自分で永続エージェントを作っているなら、コメント欄に質問を投げてください。実装の詳細について、もっと共有できるのをうれしく思います。
タグ: #ai #agents #javascript #tutorial
![[Boost]](/_next/image?url=https%3A%2F%2Fmedia2.dev.to%2Fdynamic%2Fimage%2Fwidth%3D800%252Cheight%3D%252Cfit%3Dscale-down%252Cgravity%3Dauto%252Cformat%3Dauto%2Fhttps%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F3618325%252F470cf6d0-e54c-4ddf-8d83-e3db9f829f2b.jpg&w=3840&q=75)



