记忆与 RAG
短期/长期记忆、向量检索、摘要压缩。
35 分钟
记忆与 RAG
Agent 的「记忆」分 短期(对话上下文) 与 长期(外部存储)。agt-rag 讲了检索流水线;本课讲 何时写记忆、如何压缩、向量检索与摘要如何配合——补全 ai-agents 路线图 的记忆架构节点。
学习目标
- 区分短期记忆、长期记忆、工作记忆(scratchpad)
- 设计摘要压缩与向量检索的触发条件
- 避免「把一切都 embed」导致的 stale 与成本
三层记忆
| 层 | 存什么 | 典型实现 |
|---|---|---|
| 短期 | 当前会话 messages | 滑动窗口、截断 |
| 工作 | 本轮计划、中间结论 | 单独 message / Redis |
| 长期 | 用户偏好、项目事实 | 向量库 + metadata |
def after_turn(user_id, messages, summary_store, vector_store):
if token_count(messages) > 12_000:
summary = llm.summarize(messages[:-4], keep="decisions,tool_results")
summary_store.save(user_id, summary)
messages = [system, {"role":"user","content":summary}] + messages[-4:]
facts = extract_durable_facts(messages[-2:]) # 如「默认用 Python」
if facts:
vector_store.upsert(user_id, facts, metadata={"type":"preference"})
向量检索在 Agent 中的位置
- 知识问答:离线索引文档 → 在线
search_docs(见 agt-vectors) - 会话记忆:仅 embed 可复用事实,不是每句聊天都入库
- Hybrid:关键词过滤 slug + 向量语义,降低错检索
| 策略 | 适用 |
|---|---|
| top_k=5 + rerank | 讲义、长文档 |
| metadata 过滤 | 多租户、按 track/项目隔离 |
| 拒答 | 最高分低于阈值 → 不生成 |
摘要压缩
长调研 Agent 在读多文件后 必须压缩,否则 context 爆掉:
每 N 次 tool_result 后 → 摘要「已确认事实 / 未解决问题 / 下一步」
丢弃原始网页 HTML,只留 citation id
风险:摘要丢细节 → 关键数字错误;重要 observation 可 原文存档 到工作记忆,摘要只留指针。
练习
- 画短期 / 工作 / 长期记忆在一轮 Agent 中的读写时机
- 写一条规则:何种信息进向量库、何种只留 session