一句话总结:记忆系统是 Agent 的"大脑硬盘",让模型在对话和任务中保持上下文连贯性和经验积累。
| 层级 | 容量 | 保留时间 | 检索方式 | 类比 |
|---|
| 工作记忆 | 几千 Token | 当前会话 | 直接访问 | 工作台面 |
| 短期记忆 | 几万 Token | 数天/周 | 顺序/最近 | 记事本 |
| 长期记忆 | 无限 | 永久 | 语义检索 | 档案库 |
| 程序记忆 | 模型参数 | 永久 | 内隐 | 肌肉记忆 |
class ShortTermMemory:
def __init__(self, max_tokens=8000, llm=None):
self.messages = []
self.max_tokens = max_tokens
self.llm = llm
def add_message(self, message):
self.messages.append(message)
self._trim_if_needed()
def _trim_if_needed(self):
"""当超出窗口时,使用摘要压缩"""
current_tokens = count_tokens(self.messages)
if current_tokens > self.max_tokens:
recent = self.messages[-6:]
old = self.messages[:-6]
summary = self.llm.generate(
f"请总结以下对话:{''.join(old)}"
)
self.messages = [{"role": "system", "content": f"[对话摘要]: {summary}"}] + recent
importance_score = calculate_importance(message, context)
@dataclass
class Episode:
"""事件记忆:一次完整的交互事件"""
timestamp: str
user_query: str
agent_action: str
outcome: str
metadata: dict
embedding: list
class EpisodicMemory:
def __init__(self, vector_store):
self.store = vector_store
self.indexed = set()
def store_episode(self, episode: Episode):
if episode.timestamp in self.indexed:
return
self.store.add(episode.embedding, {
"episode": episode.__dict__,
"timestamp": episode.timestamp
})
self.indexed.add(episode.timestamp)
def retrieve_relevant(self, query: str, top_k=5):
results = self.store.search(query, top_k=top_k)
return [r["episode"] for r in results]
def extract_semantic_memory(episodes: List[Episode], llm):
"""定期从事件记忆中提炼语义知识"""
prompt = """
分析以下用户交互事件,提取通用的用户偏好、习惯和知识。
事件列表:
{episodes}
请提取:
1. 用户偏好(如编程语言偏好、风格偏好)
2. 用户习惯(如常用工具、工作流程)
3. 领域知识(用户关注的技术方向)
以结构化格式输出。
"""
semantic = llm.generate(prompt.format(episodes=episodes))
return parse_semantic(semantic)
| 数据库 | 特点 | 适用场景 |
|---|
| Chroma | 轻量、嵌入式 | 本地开发、小型项目 |
| Milvus | 高性能、分布式 | 大规模向量检索 |
| Pinecone | 全托管 SaaS | 快速上线、生产环境 |
| Weaviate | 混合搜索 | 向量 + 关键词联合 |
| Qdrant | Rust 实现 | 高性能、日本开发 |
| 方法 | 公式 | 特点 |
|---|
| Cosine | $\cos(\theta) = \frac{A \cdot B}{|A||B|}$ | 最常用,关注方向 |
| L2 | $d = |A - B|_2$ | 关注绝对距离 |
| Dot Product | $A \cdot B$ | 结合大小和方向 |
| 模型 | 维度 | 速度 | 质量 | 推荐场景 |
|---|
| text-embedding-3-small | 1536 | 快 | ⭐⭐⭐ | 通用场景 |
| text-embedding-3-large | 3072 | 中 | ⭐⭐⭐⭐⭐ | 高质量检索 |
| bge-large | 1024 | 快 | ⭐⭐⭐⭐ | 开源方案 |
| nomic-embed | 768 | 快 | ⭐⭐⭐⭐ | 本地部署 |
| 策略 | 描述 | 适用场景 |
|---|
| 时间衰减 | 按时间衰减重要性 | 通用 |
| 重要性衰减 | 基于信息重要性 | 长期记忆 |
| 冗余消除 | 合并相似记忆 | 语义记忆 |
| 主动遗忘 | 定期清理低频记忆 | 资源受限 |
class MemoryRetriever:
def retrieve(self, context, agent_state):
"""多策略记忆检索"""
memories = []
semantic = self.vector_store.search(
query=context, top_k=10
)
memories.extend(semantic)
temporal = self.get_recent_memories(hours=24, top_k=5)
memories.extend(temporal)
related = self.graph_traversal(
seed=context, depth=2, top_k=5
)
memories.extend(related)
return self.rank_and_dedup(memories, context)
| 冲突类型 | 解决方案 |
|---|
| 信息矛盾 | 时间优先(新的覆盖旧的) |
| 信息矛盾 | 置信度优先(高可信度覆盖) |
| 信息矛盾 | 请求用户确认 |
| 信息冗余 | 合并相似条目 |