クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

AI エージェントの記憶

このレッスンのあとで: エージェントがステップの間と実行の間で何を覚えるかを、決められる。

60分のレッスンコマンド6件AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

予算を忘れたエージェント

エージェントの記憶とは、あるステップや実行から次へ持ち越すもののことです。モデルは自分では何も覚えないので、記憶とは、プログラムがプロンプトに入れ直す文章です。

買い物のエージェントが、予算3000円と言った客に、6000円のコートを勧めました。予算は1ステップ目に言われ、9ステップ目には消えていたのです。

このレッスンのゴール

メモ

エージェントがステップの間と実行の間で何を覚えるかを、決められる。

キーワード

ことばいみれい
スクラッチパッド1回の実行の間、エージェントが持つメモ
要約長い文章の代わりになる、短い文章
ストア実行をまたいで残る記憶
記憶の予算記憶に入れてよい文章の最大量120 文字
コンテキストウィンドウモデルが一度に読める文章の最大量

学生が入力するセルは、このプレビューでは空白です。

記憶には3種類ある

スクラッチパッドは、1回の実行の中のメッセージとメモの一覧です。要約は、長い履歴を短い文章に置き換えます。ストアは、ファイルやデータベースの中で、実行をまたいで残ります。

3つとも、最後はプロンプトに入ります。覚えた行は、ステップのたびに送り直され、そのたびに費用がかかります。

例: 3種類の比較

種類続く期間増え方主な危険
スクラッチパッド1回の実行ステップごとコンテキストが埋まる
要約1回以上の実行毎回置き換える大事な細部が消える
ストア実行をまたぐ実行ごと古くて正しくない事実

学生が入力するセルは、このプレビューでは空白です。

モデル用の補助を書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' 'async function ask(messages, sample, max) {' '  try {' '    const res = await fetch(base + \"/v1/chat/completions\", {' '      method: \"POST\",' '      headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' '      body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 200 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"status \" + res.status);' '    return (await res.json()).choices[0].message.content;' > model.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

モデル用の補助を書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' '  } catch (error) {' '    console.log(\"記録済みサンプル: モデルが答えませんでした (\" + error.message + \")。\");' '    const list = [].concat(sample);' '    const turn = messages.filter(function (m) { return m.role === \"assistant\"; }).length;' '    return list[Math.min(turn, list.length - 1)];' '  }' '}' 'module.exports = { ask };' >> model.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

記憶のデモを書く(1)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const notes = [' '  { text: \"客は佐藤さん、弟への贈り物\", important: true },' '  { text: \"今日は雨\", important: false },' '  { text: \"予算は3000円\", important: true },' '  { text: \"手袋は400円\", important: false },' '  { text: \"マフラーは1800円\", important: false },' '  { text: \"佐藤さんは赤が好きではない\", important: true },' '];' 'const BUDGET = 50;' 'const memory = [];' 'function size() { return memory.reduce(function (n, m) { return n + m.text.length; }, 0); }' > memory1.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

記憶のデモを書く(2)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function remember(note) {' '  memory.push(note);' '  while (size() > BUDGET) {' '    const at = memory.findIndex(function (m) { return m.important === false; });' '    if (at === -1) break;' '    console.log(\"  忘れました: \" + memory[at].text);' '    memory.splice(at, 1);' '  }' '  console.log(\"追加: メモ \" + memory.length + \" 件、\" + size() + \" 文字\");' '}' >> memory1.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

記憶のデモを書く(3)

コマンド
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  notes.forEach(remember);' '  const joined = notes.map(function (n) { return n.text; }).join(\"。\");' '  const request = [{ role: \"user\", content: \"仕事を引き継ぐエージェントのために、次のメモを1文で要約してください: \" + joined }];' '  const sample = \"佐藤さんは弟への贈り物を探していて、予算は3000円まで、赤は避けます。\";' '  console.log(\"要約: \" + await ask(request, sample, 80));' '}' 'main();' >> memory1.js"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

実行して忘れるものを見る

コマンド
docker exec -w /home/node/project agent node memory1.js

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

出力の一例

行表示されるかもしれないもの
追加: メモ 1 件、13 文字 から メモ 5 件、42 文字 までメモを足すたびの件数と文字数。予算は 50 文字
忘れました: 今日は雨6つ目のメモを足すと予算を超え、重要でない一番古いメモを忘れる
忘れました: 手袋は400円まだ超えているので、次に古い重要でないメモも忘れる
追加: メモ 4 件、44 文字6つ目のメモを足し、2件忘れて、予算に収まった
要約: ...モデルの1文(モデルが答えなければ、記録済みサンプル)

学生が入力するセルは、このプレビューでは空白です。

覚える価値のあるものを決める

次のステップに必要なものを残します。利用者の依頼、決められた制限、下した判断、ツールが返した事実です。雑談と、ツールの生の出力は捨てます。

重要なメモは、一字一句そのまま残します。要約はモデルが書くので、数字が変わることがあります。雑談は要約し、事実は固定します。

よくある間違い

注意

「記憶が多いほど、よいエージェントになる」と考える人が多くいます。記憶はステップごとに費用がかかり、古いメモは判断を誤らせます。次のステップに必要なものだけを残し、大きさの上限と忘れる方法を決めます。

このラボとソースについて: AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。