如果你已经写过Agent,你一定遇到过这个阶段👇一开始很聪明跑几轮之后开始胡言乱语再跑一会儿就忘了自己是谁根因只有一个:记忆设计是错的。一个残酷现实:LLM没有“记忆”,只有上下文LLM所谓的“记忆”,本质是:你这次request里给了多少token模型不会记得
如果你已经写过 Agent,你一定遇到过这个阶段👇
一开始很聪明 跑几轮之后开始胡言乱语 再跑一会儿就忘了自己是谁
根因只有一个:记忆设计是错的。
LLM 所谓的“记忆”,本质是:
所以很多 Agent 的“记忆方案”是:
👉 把所有历史对话,全塞进 prompt
结果是:
真正可用的 Agent,记忆一定是分层的。
这是我强烈建议你在文章里强调的一张“认知地图”:
┌────────────────────┐
│ Working Memory │ 当前上下文(短期)
│ (Short-Term) │
├────────────────────┤
│ Episodic Memory │ 事件 / 行为记录
│ (Long-Term Raw) │
├────────────────────┤
│ Semantic Memory │ 可检索的知识
│ (Vector / Index) │
└────────────────────┘
我们一层一层来,用 Rust 的方式实现。
因为 LLM 并不会帮你做“信息优先级排序”。
所以 Working Memory 的原则是:
只保留:当前决策真正需要的信息
pub struct WorkingMemory {
messages: Vec<ChatMessage>,
max_tokens: usize,
}
你可以在 push 的时候做三件事:
pub fn compact(&mut self) {
if self.messages.len() > 20 {
let summary = summarize_with_llm(&self.messages[..10]);
self.messages.drain(0..10);
self.messages.insert(0, summary);
}
}
📌 记忆压缩是 Agent 成熟的标志
这是很多教程完全不讲、但生产环境必不可少的部分。
👉 Agent 每一次重要行为的不可变记录
比如:
{
"ts": "2026-01-04T01:21:00Z",
"step": 7,
"action": "tool_call",
"tool": "http_get",
"input": {"url": "..."},
"result": "timeout"
}
pub struct EpisodicMemory {
writer: tokio::fs::File,
}
impl EpisodicMemory {
pub async fn record(&mut self, event: &Value) -> Result<()> {
use tokio::io::AsyncWriteExt;
self.writer.write_all(event.to_string().as_bytes()).await?;
self.writer.write_all(b"\n").await?;
Ok(())
}
}
💡 为什么不用数据库?
Agent 没有 episodic memory,就无法 Debug。
这一步,Agent 才真的“像在学习”。
当遇到相似问题时,能想起“以前发生过什么”
我们不一上来就上 Milvus / Pinecone。
先做一个 可控、可嵌入的本地方案。
pub struct MemoryChunk {
pub id: Uuid,
pub embedding: Vec<f32>,
pub text: String,
}
这是一个很多人踩过的坑。
pub async fn embed(text: &str) -> Result<Vec<f32>> {
// 调用 embedding model
}
原则:
tokio::spawn(async move {
let emb = embed(&text).await?;
semantic_memory.insert(text, emb).await?;
});
天真的写法:
top_k_by_cosine_similarity(query_embedding)
但真正好用的做法是:
相似度 × 时间衰减 × 成功权重
score = similarity * freshness * success_rate
这一步非常适合你在公众号里强调:
Agent 的“记忆质量”,比记忆数量重要 100 倍。
在 每一轮 LLM 调用之前:
1. 取当前 goal
2. embedding
3. 从 semantic memory 检索 top-k
4. 作为“参考资料”拼进 system prompt
示例 Prompt 片段:
Relevant past experiences:
- Previously, HTTP timeout was solved by lowering concurrency.
- Similar error occurred when RPC rate limit exceeded.
📌 注意: 不是当作“对话历史”,而是参考知识
你可以在文章结尾用“总结金句”:
如果你已经跟到第三篇,你的 Agent 现在已经具备:
这已经远远超过 90% 开源 Agent 框架的工程深度。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!