凌晨两点,我盯着屏幕上的 ConnectionError: timeout after 30000ms 报错发愣。用户刚完成的对话上下文全部丢失,Agent 像失忆一般反复询问相同的信息。这一刻我意识到:记忆模块的设计质量,直接决定了 Agent 的用户体验天花板。
本文将带你从零构建一套生产级的 AI Agent 记忆系统,覆盖 向量存储、滑动窗口、摘要压缩 三大核心模式,并提供可直接复用的 Python 代码。我会把我踩过的坑和解决方案一并分享。
为什么 AI Agent 需要记忆模块?
大语言模型本身是无状态的。每次 API 调用都是独立上下文,没有"记忆"能力。当我们需要 Agent 记住:
- 用户的历史偏好和设置
- 多轮对话的上下文连贯性
- 跨 session 的长期知识积累
就必须自己实现记忆层。这不是可选项,而是构建真正可用 Agent 的必选项。
三大记忆模块设计模式
1. 滑动窗口记忆(Short-term Memory)
这是最简单也是最实用的模式——只保留最近 N 条对话记录。适合单轮会话内的上下文保持。
import os
from openai import OpenAI
HolySheep API 配置(国内直连,延迟 <50ms)
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
class SlidingWindowMemory:
"""滑动窗口记忆:保留最近 N 条对话"""
def __init__(self, window_size: int = 10):
self.window_size = window_size
self.messages = []
def add_message(self, role: str, content: str):
"""添加新消息"""
self.messages.append({"role": role, "content": content})
# 超过窗口大小时,移除最旧的消息
if len(self.messages) > self.window_size:
self.messages.pop(0)
def get_context(self) -> list[dict]:
"""获取完整上下文"""
return self.messages.copy()
def clear(self):
"""清空记忆"""
self.messages = []
使用示例
memory = SlidingWindowMemory(window_size=10)
memory.add_message("user", "我想订明天北京到上海的机票")
memory.add_message("assistant", "好的,请问您偏好哪个航空公司的航班?")
memory.add_message("user", "东航,预算 1000 元以内")
获取上下文发送给 API
context = memory.get_context()
print(f"当前上下文共 {len(context)} 条消息")
2. 向量数据库记忆(Long-term Memory)
滑动窗口只能处理短期记忆。要实现"跨 session 的长期记忆",必须引入向量数据库。我推荐使用 ChromaDB——轻量、纯 Python 实现、零配置。
import chromadb
from chromadb.config import Settings
class VectorMemory:
"""向量数据库记忆:支持语义检索的长期记忆"""
def __init__(self, collection_name: str = "agent_memory"):
# 初始化 ChromaDB 客户端
self.client = chromadb.Client(Settings(
anonymized_telemetry=False,
allow_reset=True
))
self.collection = self.client.get_or_create_collection(
name=collection_name,
metadata={"description": "AI Agent 长期记忆库"}
)
self.message_counter = 0
def add_memory(self, content: str, metadata: dict = None):
"""存储新记忆"""
self.message_counter += 1
self.collection.add(
documents=[content],
ids=[f"memory_{self.message_counter}"],
metadatas=[metadata or {"type": "general"}]
)
def search(self, query: str, top_k: int = 3) -> list[dict]:
"""语义检索最相关的记忆"""
results = self.collection.query(
query_texts=[query],
n_results=top_k
)
memories = []
if results['documents'] and results['documents'][0]:
for i, doc in enumerate(results['documents'][0]):
memories.append({
"content": doc,
"metadata": results['metadatas'][0][i],
"distance": results['distances'][0][i]
})
return memories
def clear_all(self):
"""重置记忆库"""
self.client.delete_collection(self.collection_name)
self.collection = self.client.get_or_create_collection(
name=self.collection_name
)
使用示例
vector_memory = VectorMemory()
存储用户偏好
vector_memory.add_memory(
content="用户偏好东航航班,预算 1000 元以内,常用出发机场是北京首都机场",
metadata={"type": "preference", "user_id": "user_001"}
)
检索相关记忆
relevant = vector_memory.search("用户的航班偏好是什么")
print(f"检索到 {len(relevant)} 条相关记忆")
3. 摘要压缩记忆(Summarized Memory)
当对话历史很长时,直接塞入 context 会浪费 token。更好的策略是:定期将对话压缩成摘要,只保留关键信息。
class SummarizedMemory:
"""摘要压缩记忆:定期将长对话压缩为摘要"""
def __init__(self, summary_threshold: int = 20):
self.messages = []
self.summary = "用户尚未开始对话。"
self.summary_threshold = summary_threshold
self.client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
def _generate_summary(self, messages: list[dict]) -> str:
"""调用 LLM 生成对话摘要"""
prompt = f"""请将以下对话压缩为一段简短摘要(不超过100字),
保留关键信息和用户意图:
{chr(10).join([f"{m['role']}: {m['content']}" for m in messages])}
摘要:"""
response = self.client.chat.completions.create(
model="gpt-4.1",
messages=[{"role": "user", "content": prompt}],
max_tokens=200,
temperature=0.3
)
return response.choices[0].message.content
def add_message(self, role: str, content: str):
"""添加消息,必要时触发摘要压缩"""
self.messages.append({"role": role, "content": content})
# 当消息数量超过阈值时,压缩历史
if len(self.messages) > self.summary_threshold:
# 生成摘要
self.summary = self._generate_summary(self.messages[:-5])
# 保留最近 5 条消息 + 摘要
self.messages = self.messages[-5:]
def get_context(self) -> list[dict]:
"""获取压缩后的上下文"""
return [
{"role": "system", "content": f"对话摘要:{self.summary}"}
] + self.messages[-5:]
使用示例
summary_memory = SummarizedMemory(summary_threshold=20)
for i in range(25):
summary_memory.add_message("user", f"这是第 {i+1} 条用户消息")
context = summary_memory.get_context()
print(f"压缩后上下文:{len(context)} 条消息")
生产级记忆系统架构
将三种模式组合,形成完整的分层记忆架构:
class HybridAgentMemory:
"""三层混合记忆系统:短期 + 长期 + 摘要"""
def __init__(self, user_id: str):
self.user_id = user_id
# 第一层:滑动窗口(最近 10 条)
self.short_term = SlidingWindowMemory(window_size=10)
# 第二层:向量数据库(长期记忆)
self.long_term = VectorMemory(collection_name=f"user_{user_id}")
# 第三层:摘要压缩(超过 20 条时触发)
self.summarizer = SummarizedMemory(summary_threshold=20)
def add_turn(self, user_msg: str, assistant_msg: str):
"""记录一轮对话"""
self.short_term.add_message("user", user_msg)
self.short_term.add_message("assistant", assistant_msg)
self.summarizer.add_message("user", user_msg)
self.summarizer.add_message("assistant", assistant_msg)
# 重要信息自动存入长期记忆
if any(keyword in user_msg for keyword in ["喜欢", "偏好", "不要", "记住"]):
self.long_term.add_memory(
content=f"用户明确表示:{user_msg}",
metadata={"type": "explicit_preference", "user_id": self.user_id}
)
def retrieve(self, query: str) -> list[dict]:
"""检索相关记忆"""
return self.long_term.search(query, top_k=5)
def build_context(self, current_query: str) -> list[dict]:
"""构建完整的上下文"""
context = []
# 1. 添加摘要作为背景
context.extend(self.summarizer.get_context())
# 2. 添加语义检索到的长期记忆
relevant_memories = self.retrieve(current_query)
if relevant_memories:
memory_prompt = "以下是与当前对话相关的历史信息:\n"
for mem in relevant_memories:
memory_prompt += f"- {mem['content']}\n"
context.append({"role": "system", "content": memory_prompt})
# 3. 添加最近的对话
context.extend(self.short_term.get_context())
return context
完整使用示例
agent = HybridAgentMemory(user_id="user_123")
agent.add_turn("我想学 Python", "好的,您是编程初学者吗?")
agent.add_turn("是的,完全零基础", "那我们从变量和数据类型开始吧")
agent.add_turn("我喜欢看视频学习", "了解,我会给您推荐一些优质视频教程")
构建上下文
context = agent.build_context("我之前说过我是什么基础?")
print(f"构建了 {len(context)} 条上下文消息")
实战:连接 HolySheep API 的完整 Agent
现在将记忆系统接入 HolySheep AI API。得益于 HolySheep 的国内直连优化,延迟控制在 50ms 以内,比官方 API 节省 80%+ 成本。
import os
from openai import OpenAI
class MemoryPoweredAgent:
"""基于 HolySheep API 的记忆增强型 Agent"""
def __init__(self, user_id: str):
# HolySheep API 配置
self.client = OpenAI(
api_key=os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY"),
base_url="https://api.holysheep.ai/v1",
timeout=30.0 # 30秒超时
)
self.memory = HybridAgentMemory(user_id)
self.model = "gpt-4.1" # $8/MTok,性价比高
def chat(self, user_message: str) -> str:
"""带记忆的对话接口"""
# 1. 构建上下文
context = self.memory.build_context(user_message)
context.append({"role": "user", "content": user_message})
# 2. 调用 HolySheep API
try:
response = self.client.chat.completions.create(
model=self.model,
messages=context,
temperature=0.7,
max_tokens=1000
)
assistant_message = response.choices[0].message.content
# 3. 更新记忆
self.memory.add_turn(user_message, assistant_message)
return assistant_message
except Exception as e:
raise ConnectionError(f"HolySheep API 调用失败: {str(e)}")
价格对比参考(基于 HolySheep 2026年定价):
- GPT-4.1: $8/MTok input, $8/MTok output
- DeepSeek V3.2: $0.42/MTok (极致性价比)
- Gemini 2.5 Flash: $2.50/MTok (快速响应场景)
使用示例
if __name__ == "__main__":
agent = MemoryPoweredAgent(user_id="demo_user")
response = agent.chat("我叫张三,在上海工作,想学习数据分析")
print(f"Agent: {response}")
response = agent.chat("我叫什么呢?")
print(f"Agent: {response}")
常见报错排查
在生产环境中,我遇到过以下几个高频错误,这里提供完整的解决方案:
错误 1:401 Unauthorized - API Key 无效
# 错误信息
openai.AuthenticationError: 401 Incorrect API Key provided
解决方案 1:检查环境变量
import os
os.environ["HOLYSHEEP_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY" # 替换为你的真实 Key
解决方案 2:直接从 HolySheep 控制台获取
访问 https://www.holysheep.ai/register 获取 API Key
解决方案 3:验证 Key 有效性
from openai import OpenAI
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
try:
client.models.list()
print("API Key 验证成功!")
except Exception as e:
print(f"Key 验证失败: {e}")
错误 2:ConnectionError: timeout after 30000ms
# 错误信息
httpx.ConnectTimeout: Connection timeout after 30000ms
解决方案:增加超时配置 + 使用重试机制
from openai import OpenAI
from tenacity import retry, stop_after_attempt, wait_exponential
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1",
timeout=60.0 # 增加到 60 秒
)
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=10))
def call_with_retry(messages):
"""带指数退避的重试机制"""
return client.chat.completions.create(
model="gpt-4.1",
messages=messages
)
如果仍有问题,检查网络:
1. ping api.holysheep.ai
2. telnet api.holysheep.ai 443
HolySheep 国内节点延迟 <50ms,若超时请检查本地网络
错误 3:RateLimitError - 请求频率超限
# 错误信息
openai.RateLimitError: Rate limit exceeded
解决方案:实现请求限流
import time
from collections import deque
class RateLimiter:
"""令牌桶限流器"""
def __init__(self, max_requests: int = 60, window_seconds: int = 60):
self.max_requests = max_requests
self.window = window_seconds
self.requests = deque()
def acquire(self):
"""获取请求许可"""
now = time.time()
# 清理过期的请求记录
while self.requests and self.requests[0] < now - self.window:
self.requests.popleft()
if len(self.requests) >= self.max_requests:
wait_time = self.requests[0] + self.window - now
print(f"限流中,等待 {wait_time:.1f} 秒...")
time.sleep(wait_time)
return self.acquire()
self.requests.append(now)
return True
使用限流器
limiter = RateLimiter(max_requests=30, window_seconds=60) # 30 RPM
def throttled_chat(messages):
limiter.acquire()
return client.chat.completions.create(model="gpt-4.1", messages=messages)
错误 4:向量检索返回空结果
# 错误信息
ChromaDB 查询返回 documents: [[]]
解决方案:确保 collection 已正确初始化 + 添加默认记忆
def safe_search(memory: VectorMemory, query: str, fallback: str = None):
"""安全的记忆检索"""
results = memory.search(query, top_k=5)
if not results:
# 如果没有检索结果,尝试添加一条默认记忆
if fallback:
memory.add_memory(fallback, metadata={"type": "fallback"})
return memory.search(query, top_k=5)
return []
# 过滤低相关性的结果(distance < 1.5 表示高相关)
return [r for r in results if r['distance'] < 1.5]
使用
relevant = safe_search(
vector_memory,
"用户的编程基础",
fallback="用户是 Python 编程初学者"
)
价格与性能对比
我在多个项目中使用过不同的 API 提供商,以下是 2026 年主流模型的实测价格对比(基于 HolySheep 汇率优势):
| 模型 | Output 价格 | 平均延迟 | 适用场景 |
|---|---|---|---|
| GPT-4.1 | $8/MTok | ~800ms | 复杂推理、代码生成 |
| Claude Sonnet 4.5 | $15/MTok | ~1200ms | 长文本分析、创意写作 |
| Gemini 2.5 Flash | $2.50/MTok | ~400ms | 快速响应、实时对话 |
| DeepSeek V3.2 | $0.42/MTok | ~600ms | 成本敏感、大量调用 |
使用 HolySheep AI 的核心优势:
- 汇率无损:¥1=$1(官方 7.3:1),节省超过 85% 成本
- 国内直连:延迟 <50ms,无需代理
- 充值便捷:微信/支付宝直接充值,即时到账
- 免费额度:注册即送体验额度
我的实战经验总结
在构建记忆模块的过程中,我有几个关键心得:
第一,记忆的召回比精确更重要。 宁可多召回一些无关内容,也不能遗漏关键信息。我在向量检索时会把 top_k 设置得稍大,然后用模型自己判断相关性。
第二,摘要压缩要控制频率。 之前我设置的是每 10 条就压缩,结果摘要质量很差,而且频繁调用 API 成本飙升。现在我会设置 20-30 条才触发一次摘要,并且用便宜的模型(如 DeepSeek V3.2)来做摘要生成。
第三,分层记忆的取舍。 短期记忆用滑动窗口,够用且实现简单;长期记忆必须上向量数据库,否则检索效率太低。摘要压缩是锦上添花,但需要做好质量把控。
第四,国内使用 HolySheep 的体验远超预期。 之前用官方 API,网络抖动导致的 timeout 能把人逼疯。切换到 HolySheep 后,50ms 的延迟让整个系统流畅度提升了一个档次,而且成本只有原来的 15% 左右。
下一步
本文的代码可以直接复制到你的项目中运行。建议从滑动窗口记忆开始,逐步添加向量数据库和摘要压缩功能。
记忆模块只是 Agent 架构的一部分。如果你想进一步提升 Agent 能力,可以探索:
- 工具调用(Function Calling)集成
- 多 Agent 协作架构
- ReAct 推理模式