AI 代理入门:使用 PyTorch 和向量数据库实现多会话长期记忆
在 Jupyter 笔记本中,利用 PyTorch 生成嵌入,通过 FAISS 等向量数据库构建 AI 代理的长期记忆系统,支持多会话上下文持久化和工具增强推理链。
在构建 AI 代理时,长期记忆机制是实现跨会话上下文保留的关键。通过向量数据库存储历史交互的嵌入表示,代理能够高效检索相关信息,提升工具调用和推理的准确性。这种方法避免了传统状态无记忆模型的局限,使代理更接近人类般的持续学习能力。
向量数据库-backed 的长期记忆的核心在于将文本转换为高维向量嵌入,这些嵌入捕捉语义相似性。使用 PyTorch 框架生成嵌入的优势在于其灵活性和 GPU 加速支持,尤其适合 Jupyter 环境下的实验迭代。根据 Microsoft 的 AI 代理课程,记忆类型包括工作记忆、短期记忆和长期记忆,其中长期记忆负责持久化用户偏好和历史事件。“Memory allows agents to be reflective, interactive, proactive and reactive, and autonomous.” 这句话强调了记忆在代理自主性中的作用。
要实现这一机制,首先需设置环境。在 Jupyter 笔记本中,安装必要库:PyTorch 用于嵌入生成,sentence-transformers 提供预训练模型,FAISS 作为本地向量数据库。代码示例:
import torch
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
import pickle
import os
# 加载嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2') # 维度 384,适合入门
embedding_dim = 384
选择 all-MiniLM-L6-v2 模型的原因是其平衡了性能和速度,嵌入维度为 384,适用于大多数 NLP 任务。生成嵌入的过程简单:对会话历史文本进行编码。
def generate_embedding(text):
return model.encode(text)
对于多会话持久化,需要一个存储机制。FAISS 支持索引构建和相似性搜索。初始化索引:
index = faiss.IndexFlatIP(embedding_dim) # 内积相似性,适合归一化嵌入
# 或使用 IndexFlatL2 for 欧氏距离
存储记忆:每次会话结束,提取关键事实或整个对话摘要,生成嵌入并添加到索引。同时,保存元数据如会话 ID 和时间戳。
def store_memory(text, session_id, timestamp):
embedding = generate_embedding(text)
embedding = embedding / np.linalg.norm(embedding) # 归一化 for IP
index.add(np.array([embedding]))
metadata = {'text': text, 'session_id': session_id, 'timestamp': timestamp}
# 保存元数据到文件或 dict
with open('memories.pkl', 'ab') as f:
pickle.dump(metadata, f)
检索时,根据当前查询生成嵌入,搜索 top-k 最相似记忆。参数建议:top_k=5,避免信息过载;相似度阈值 >0.7,确保相关性。
def retrieve_memories(query, top_k=5, threshold=0.7):
query_emb = generate_embedding(query)
query_emb = query_emb / np.linalg.norm(query_emb)
distances, indices = index.search(np.array([query_emb]), top_k)
relevant = []
for i, dist in enumerate(distances[0]):
if dist > threshold:
# 加载对应元数据
relevant.append(metadata_list[indices[0][i]])
return relevant
这一实现支持多会话:Jupyter 内核重启后,加载 FAISS 索引和 pickle 文件恢复状态。文件路径如 'faiss_index.bin' 使用 faiss.write_index 保存。
集成工具增强推理链:在代理循环中,先检索相关记忆,注入到提示中,然后调用工具如搜索或计算。使用简单循环模拟:
观点:这种记忆增强使代理在多轮交互中积累知识,避免重复查询。例如,在任务规划代理中,过去失败的工具调用可作为 episodic memory 指导下次决策。
证据显示,在实际应用中,向量检索的延迟通常 <100ms,使用 GPU 可进一步优化。风险包括嵌入漂移(不同模型版本不兼容),建议固定模型版本;存储增长导致索引膨胀,定期清理低频记忆(e.g., 使用频率 <1 的移除)。
可落地参数:
- 嵌入模型:all-MiniLM-L6-v2 (dim=384),或 paraphrase-MiniLM-L6-v2 for 更好语义。
- 索引类型:FlatIP for 小规模 (<10k 向量),HNSW for 大规模 (构建参数:ef_construction=40, M=32)。
- 检索参数:top_k=3-7,threshold=0.6-0.8,根据领域调整。
- 持久化:每 10 会话保存一次索引,监控存储大小 <1GB。
- 监控点:检索命中率 >80%,使用 cosine 相似度评估;回滚策略:若检索失败,fallback 到无记忆模式。
清单实现步骤:
- 安装:pip install torch sentence-transformers faiss-cpu (或 faiss-gpu)。
- 初始化模型和索引。
- 会话循环:输入 → 检索记忆 → 注入提示 → LLM 生成 → 工具调用 → 存储新记忆。
- 测试多会话:模拟重启,验证上下文保留。
- 优化:添加实体提取 (spaCy) 增强结构化记忆。
通过这些参数,初学者可在 Jupyter 中快速构建原型。未来,可扩展到云向量 DB 如 Pinecone,支持分布式多用户代理。长期记忆不仅提升效率,还开启自改进路径,如通过强化学习微调解取策略。
(字数约 950)