为 AI 代理添加持久化记忆:使用本地 LLM 提升 90% 召回率
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
在开发自主 AI 代理(Autonomous AI Agents)的过程中,开发者面临的最大挑战之一就是 LLM 的“健忘症”。标准的大语言模型本质上是无状态的,这意味着除非你将整个对话历史重新输入到上下文窗口(Context Window)中,否则模型无法记住之前的交互。然而,随着对话内容的增加,上下文窗口会迅速填满,导致延迟增加、成本飙升。为了解决这个问题,我们需要为 AI 代理构建一套“持久化记忆”系统。
通过结合本地 LLM(如通过 Ollama 运行)和混合存储架构,我们可以实现高达 90% 的信息召回率,同时确保数据隐私。虽然本地环境非常适合原型开发,但在需要高性能推理时,集成像 n1n.ai 这样的 API 聚合平台可以为您的代理提供来自 DeepSeek-V3 或 Claude 3.5 Sonnet 的顶级算力支持。
为什么 AI 代理需要持久化记忆?
人类的记忆分为瞬时记忆、短期记忆和长期记忆。目前的 AI 代理大多只具备“短期记忆”(即当前 Session 的 Context)。持久化记忆(Long-term Memory)允许代理在跨会话的情况下保留以下信息:
- 用户偏好:例如用户喜欢的编程语言或饮食习惯。
- 历史决策:代理在之前任务中采取的步骤和结果。
- 事实性知识库:代理在运行过程中学到的新知识。
实现这一点的关键在于构建一个“混合记忆系统”:使用 SQLite 处理结构化数据(事实),使用 ChromaDB 处理非结构化数据(语义)。
技术栈准备:Ollama 与本地 LLM
Ollama 是目前运行本地开源模型(如 Llama 3.1, DeepSeek-R1)的首选工具。它提供了简单的 REST API,方便我们进行集成。在数据敏感的应用场景中,本地 LLM 可以确保用户的记忆数据不会上传到第三方服务器。但在实际生产中,当本地算力不足以支撑复杂的逻辑推理时,开发者通常会通过 n1n.ai 调用云端的高性能模型作为“主脑”,而将记忆层保留在本地。
第一步:使用 SQLite 构建结构化记忆
结构化记忆用于存储确定的事实,例如“用户的名字是张三”。SQLite 是一个轻量级的数据库,非常适合作为代理的“事实仓库”。
import sqlite3
class PersistentMemory:
def __init__(self):
# 初始化本地数据库文件
self.conn = sqlite3.connect('agent_memory.db')
self.cursor = self.conn.cursor()
self._create_table()
def _create_table(self):
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS memory (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT UNIQUE,
value TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
''')
self.conn.commit()
def store_data(self, key, value):
# 插入或更新记忆条目
self.cursor.execute(
"INSERT OR REPLACE INTO memory (key, value) VALUES (?, ?)",
(key, value)
)
self.conn.commit()
def retrieve_data(self, key):
self.cursor.execute("SELECT value FROM memory WHERE key=?", (key,))
result = self.cursor.fetchone()
return result[0] if result else None
第二步:使用 ChromaDB 构建语义记忆
并非所有的记忆都能通过关键词精确匹配。如果用户之前提到过“我最近在减肥”,当他之后问“晚餐吃什么?”时,我们需要通过语义检索找到“减肥”这个背景。这就是向量数据库(Vector Database)如 ChromaDB 的用武之地。
ChromaDB 将文本转换为向量(Embeddings)。当查询发生时,它会计算查询语句与存储记忆之间的余弦相似度。为了获得最佳效果,建议使用高质量的嵌入模型。如果您对本地嵌入的精度不满意,n1n.ai 提供的专业嵌入 API 可以显著提升检索的准确性。
import chromadb
from chromadb.utils import embedding_functions
class VectorMemory:
def __init__(self):
# 持久化存储向量数据
self.client = chromadb.PersistentClient(path="./chroma_db")
self.ef = embedding_functions.DefaultEmbeddingFunction()
self.collection = self.client.get_or_create_collection(
name="agent_semantics",
embedding_function=self.ef
)
def add_memory(self, text, metadata, doc_id):
self.collection.add(
documents=[text],
metadatas=[metadata],
ids=[doc_id]
)
def query_memory(self, query_text, n_results=3):
results = self.collection.query(
query_texts=[query_text],
n_results=n_results
)
return results['documents']
第三步:混合系统逻辑实现
一个成熟的 AI 代理应该能够根据任务类型自动选择检索方式。我们将 SQLite 和 ChromaDB 封装在一个统一的 HybridSystem 类中:
class HybridAgentMemory:
def __init__(self):
self.structured = PersistentMemory()
self.semantic = VectorMemory()
def remember(self, key, content):
# 同时存储到两个系统
self.structured.store_data(key, content)
self.semantic.add_memory(content, {"source": "user_interaction"}, key)
def recall(self, query):
# 优先尝试精确匹配
fact = self.structured.retrieve_data(query)
# 补充语义背景
context = self.semantic.query_memory(query)
return {"exact_fact": fact, "semantic_context": context}
进阶优化:如何实现 90% 的召回率提升?
仅仅存储和检索是不够的。为了达到生产级的召回率,你需要关注以下三个核心技术:
- 重排序(Re-ranking):向量检索可能会返回不相关的“噪音”。在将结果喂给 LLM 之前,使用一个 Cross-Encoder 模型对检索结果进行二次评分。这一步可以将召回率从 60% 提升到 85% 以上。
- 元数据过滤(Metadata Filtering):在存储记忆时,务必带上时间戳。人类的记忆具有时效性,AI 也应如此。优先检索最近的记忆,或者根据权重过滤掉低价值的信息(例如 Importance Score < 3 的记忆)。
- 上下文压缩:检索到的背景信息可能很长。在调用像 Claude 3.5 这样的大模型之前,先用一个小模型(如本地的 Phi-3)对检索结果进行摘要提取,只保留最关键的语义信息。
结合 n1n.ai 迈向生产环境
在本地构建记忆层可以极大降低数据隐私风险,但当你的代理需要处理高并发请求或极其复杂的逻辑任务时,本地硬件往往会成为瓶颈。此时,最佳实践是:
- 本地端:运行 SQLite 和 ChromaDB 存储用户的私有记忆。
- 云端:通过 n1n.ai 调用最先进的 LLM API。
n1n.ai 的优势在于其极高的稳定性和多模型兼容性。你可以根据任务的复杂度,动态地在 DeepSeek-V3 和 OpenAI o3 之间切换,而无需重写底层的记忆逻辑。这种“本地记忆 + 云端大脑”的架构是目前企业级 AI 代理的主流选择。
总结
持久化记忆是 AI 代理进化的必经之路。通过 SQLite 处理硬事实,通过 ChromaDB 处理软语义,再辅以本地 LLM 的隐私保护和 n1n.ai 的强大推理能力,你可以构建出一个真正能够伴随用户成长、越用越聪明的智能助理。现在就开始尝试为你的代理添加记忆功能,体验 90% 召回率提升带来的质变吧。
Get a free API key at n1n.ai