记忆与检索
一句话
为HelloAgents框架增加记忆系统和检索增强生成(RAG)系统,使智能体具备记住交互历史和从外部知识库检索信息的能力。
什么时候翻这页
- 当智能体需要记住之前的对话内容,实现连续对话能力
- 当智能体需要从历史经验中学习,改进自身表现
- 当智能体需要获取最新或专业领域知识,弥补内置知识局限
- 当需要构建具有个性化服务能力的智能应用
- 当需要处理大量文档并实现智能问答功能
核心概念
记忆系统 (Memory System)
模仿人类记忆的多层次认知系统,分为四种类型:
- 工作记忆 (Working Memory):存储当前对话的临时信息,容量有限,TTL自动清理
- 情景记忆 (Episodic Memory):存储具体交互事件和经历,支持时间序列检索
- 语义记忆 (Semantic Memory):存储抽象知识、概念和规则,形成知识体系
- 感知记忆 (Perceptual Memory):处理图像、音频等多模态信息,支持跨模态检索
检索增强生成 (Retrieval-Augmented Generation, RAG)
在模型生成回答前,从外部知识库检索相关信息作为上下文,解决LLM知识时效性、专业领域知识不足和事实准确性问题。
高级检索策略
- 多查询扩展 (Multi-Query Expansion, MQE):生成语义等价的多样化查询,提高召回率
- 假设文档嵌入 (Hypothetical Document Embeddings, HyDE):生成假设答案文档,桥接查询和文档的语义鸿沟
怎么做
记忆系统实现
-
架构设计:采用四层架构
- 基础设施层:MemoryManager、MemoryItem、MemoryConfig、BaseMemory
- 记忆类型层:WorkingMemory、EpisodicMemory、SemanticMemory、PerceptualMemory
- 存储后端层:QdrantVectorStore、Neo4jGraphStore、SQLiteDocumentStore
- 嵌入服务层:DashScopeEmbedding、LocalTransformerEmbedding、TFIDFEmbedding
-
记忆操作:
- 添加记忆:支持四种类型,设置重要度(0.0-1.0)
- 搜索记忆:混合检索策略,支持按类型筛选
- 遗忘记忆:基于重要性、时间、容量三种策略
- 整合记忆:将短期记忆转化为长期记忆
RAG系统实现
-
文档处理:
- 使用MarkItDown统一转换各种格式为Markdown
- 基于Markdown结构的智能分块策略
- 批量编码和向量化存储
-
检索策略:
- 基础检索:向量相似度搜索
- 扩展检索:MQE + HyDE,提高召回率和精度
- 上下文构建:智能片段合并与截断
智能文档问答助手构建
结合MemoryTool和RAGTool,实现:
- 智能文档处理与索引
- 高级检索问答
- 多层次记忆管理
- 个性化学习支持
命令 / 代码速查
安装HelloAgents框架
# 安装指定版本
pip install "hello-agents[all]==0.2.0"
python -m spacy download zh_core_web_sm
python -m spacy download en_core_web_sm
配置环境变量
# Qdrant 向量数据库配置
QDRANT_URL=https://your-cluster.qdrant.tech:6333
QDRANT_API_KEY=your_qdrant_api_key_here
QDRANT_COLLECTION=hello_agents_vectors
# Neo4j 图数据库配置
NEO4J_URI=neo4j+s://your-instance.databases.neo4j.io
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=your_neo4j_password_here
# 嵌入(Embedding)配置
EMBED_MODEL_TYPE=dashscope
EMBED_MODEL_NAME=
EMBED_API_KEY=
创建具有记忆能力的Agent
from hello_agents import SimpleAgent, HelloAgentsLLM, ToolRegistry
from hello_agents.tools import MemoryTool, RAGTool
# 创建LLM实例
llm = HelloAgentsLLM()
# 创建Agent
agent = SimpleAgent(
name="智能助手",
llm=llm,
system_prompt="你是一个有记忆和知识检索能力的AI助手"
)
# 创建工具注册表
tool_registry = ToolRegistry()
# 添加记忆工具
memory_tool = MemoryTool(user_id="user123")
tool_registry.register_tool(memory_tool)
# 添加RAG工具
rag_tool = RAGTool(knowledge_base_path="./knowledge_base")
tool_registry.register_tool(rag_tool)
# 为Agent配置工具
agent.tool_registry = tool_registry
使用MemoryTool
# 添加记忆
memory_tool.execute("add",
content="用户是一名Python开发者,专注于机器学习",
memory_type="semantic",
importance=0.8
)
# 搜索记忆
memory_tool.execute("search",
query="Python开发",
limit=5,
memory_types=["semantic", "episodic"]
)
# 遗忘记忆
memory_tool.execute("forget",
strategy="importance_based",
threshold=0.2
)
# 整合记忆
memory_tool.execute("consolidate",
from_type="working",
to_type="episodic",
importance_threshold=0.7
)
使用RAGTool
# 添加文档
rag_tool.execute("add_document",
file_path="./document.pdf",
chunk_size=1000,
chunk_overlap=200
)
# 高级检索问答
rag_tool.execute("ask",
question="什么是大语言模型?",
limit=5,
enable_advanced_search=True,
enable_mqe=True,
enable_hyde=True
)
与 Python / Claude Code 手册的联系
- Python手册:本章大量使用Python实现记忆系统和RAG系统,包括类的设计、接口定义、数据处理等
- Claude Code手册:使用Claude Code进行LLM调用、提示词设计,特别是在MQE和HyDE策略中生成多样化查询和假设文档
初学者易错点
-
记忆类型混淆:不清楚何时使用哪种记忆类型,导致数据存储不当
- 工作记忆:临时信息,会话结束后自动清理
- 情景记忆:具体事件,需要长期保存
- 语义记忆:抽象知识,用于推理和决策
- 感知记忆:多模态数据,如图像、音频
-
RAG检索策略选择不当:盲目使用高级检索策略导致性能下降
- 简单查询:基础检索即可
- 专业领域查询:建议使用MQE+HyDE
- 性能敏感场景:可仅使用基础检索或MQE
-
嵌入模型选择不当:未根据实际场景选择合适的嵌入方案
- 百炼API:高质量但需要API密钥
- 本地Transformer:离线部署但资源消耗大
- TF-IDF:轻量级但语义理解能力弱
-
分块参数设置不合理:chunk_size和chunk_overlap设置不当影响检索效果
- 过小:上下文信息不足
- 过大:检索精度下降
- 一般设置:chunk_size=1000, chunk_overlap=200