予算を忘れたエージェント
エージェントの記憶とは、あるステップや実行から次へ持ち越すもののことです。モデルは自分では何も覚えないので、記憶とは、プログラムがプロンプトに入れ直す文章です。
買い物のエージェントが、予算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文(モデルが答えなければ、記録済みサンプル) |
学生が入力するセルは、このプレビューでは空白です。
覚える価値のあるものを決める
次のステップに必要なものを残します。利用者の依頼、決められた制限、下した判断、ツールが返した事実です。雑談と、ツールの生の出力は捨てます。
重要なメモは、一字一句そのまま残します。要約はモデルが書くので、数字が変わることがあります。雑談は要約し、事実は固定します。
よくある間違い
注意
「記憶が多いほど、よいエージェントになる」と考える人が多くいます。記憶はステップごとに費用がかかり、古いメモは判断を誤らせます。次のステップに必要なものだけを残し、大きさの上限と忘れる方法を決めます。