月2ドルのAIエージェントに、セッションをまたいで永続する記憶を与えた方法

Dev.to / 2026/3/27

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical Usage

要点

  • この記事は、セッション終了後にAIエージェントがすべてを忘れてしまう「ステートレス・エージェント」の問題を扱い、長期的で目標志向の振る舞いが難しい点を説明している。
  • ベクターデータベース/RAGのより複雑な代替として、永続化した記憶を構造化JSONファイルとして保持し、各セッション開始時に読み込み、終了時に書き戻すことで実現するシンプルな方法を提示する。
  • 著者は、永続化された記憶と現在のワールド状態の両方をJSONとしてプロンプトに注入し、モデルが過去の判断や学びを踏まえて推論できるようにしている。
  • 記憶の更新は、各実行後にモデル応答から導出した「brainUpdates」ペイロードを保存することで処理され、数時間〜数日といった長時間の運用でも継続性を可能にしている。
  • このアプローチは、月50ドルのインフラなしでも、プレーンなファイルとJSONのシリアライズを用いることで耐久性のあるエージェント記憶を実現できる、低コストで実用的な手法として位置づけられている。

セッションをまたいで持続する記憶を、月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

広告