ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于LangChain构建带长时记忆的对话Agent

基于LangChain构建带长时记忆的对话Agent 1. 项目概述构建带长时记忆的对话Agent在对话系统开发中上下文丢失一直是困扰开发者的核心痛点。传统聊天机器人往往只能记住当前会话的有限内容当用户隔天再来咨询时系统就像得了健忘症一样需要用户重复基本信息。这种体验就像每次去常去的咖啡店都要重新自我介绍显然不够智能。本项目基于LangChain生态通过LangGraph实现了一个具备长期记忆能力的对话Agent。它能将关键用户信息如偏好、习惯等持久化存储并在后续对话中智能检索使用。这种机制类似于人类大脑的海马体功能既保留了重要记忆又能在适当时刻唤醒相关上下文。2. 技术架构解析2.1 核心组件设计系统采用分层架构设计主要包含以下关键模块记忆存储层使用向量数据库(InMemoryVectorStore)存储记忆片段支持语义检索工具层save_recall_memory保存文本记忆或结构化三元组search_recall_memories基于相似度搜索相关记忆网络搜索工具(TavilySearch)处理层记忆加载节点在对话开始时检索相关记忆Agent节点基于GPT-4的决策引擎工具执行节点状态管理通过LangGraph的状态机管理对话流程2.2 记忆表示方案系统支持两种记忆表示形式自由文本如用户喜欢披萨结构化三元组(subject, predicate, object)例如(John, 喜欢, 披萨)(Alice, 有朋友, John)结构化表示更适合后续的知识图谱构建而文本形式更灵活。实际项目中可以根据需求混合使用。3. 实现细节与核心代码3.1 环境准备首先安装必要依赖pip install langgraph langchain-openai langchain-tavily tiktoken配置API密钥import os from getpass import getpass def set_env(var): if not os.environ.get(var): os.environ[var] getpass(f{var}: ) set_env(OPENAI_API_KEY) set_env(TAVILY_API_KEY)3.2 记忆存储实现初始化向量存储from langchain_openai.embeddings import OpenAIEmbeddings from langchain_core.vectorstores import InMemoryVectorStore recall_vector_store InMemoryVectorStore(OpenAIEmbeddings())3.3 关键工具定义记忆保存工具import uuid from typing import List from langchain_core.tools import tool from langchain_core.documents import Document tool def save_recall_memory(memory: str, config: dict) - str: 保存记忆到向量库供后续语义检索 user_id config[configurable].get(user_id) document Document( page_contentmemory, idstr(uuid.uuid4()), metadata{user_id: user_id} ) recall_vector_store.add_documents([document]) return memory记忆搜索工具tool def search_recall_memories(query: str, config: dict) - List[str]: 搜索相关记忆 user_id config[configurable].get(user_id) docs recall_vector_store.similarity_search( query, k3, filterlambda doc: doc.metadata.get(user_id) user_id ) return [doc.page_content for doc in docs]3.4 状态图构建定义对话状态from langgraph.graph import StateGraph, END from langgraph.prebuilt import ToolNode from langchain_core.messages import MessagesState class State(MessagesState): recall_memories: List[str] # 上下文记忆 builder StateGraph(State) # 添加节点 builder.add_node(load_memories, load_memories_func) builder.add_node(agent, agent_func) builder.add_node(tools, ToolNode(tools)) # 构建边 builder.add_edge(START, load_memories) builder.add_edge(load_memories, agent) builder.add_conditional_edges(agent, route_tools, {tools: tools, end: END}) builder.add_edge(tools, agent) # 编译图 graph builder.compile()4. 实战演示与效果分析4.1 基础对话流程初始化对话config {configurable: {user_id: 1, thread_id: 1}} response graph.invoke( {messages: [(user, 我叫张三)]}, configconfig )系统会自动调用save_recall_memory工具保存用户名叫张三这一信息。后续对话中提及偏好response graph.invoke( {messages: [(user, 我喜欢吃火锅)]}, configconfig )此时系统会通过search_recall_memories检索用户基本信息保存新的饮食偏好生成个性化回复张三火锅是个不错的选择你最喜欢什么锅底4.2 跨会话记忆测试在新会话中config {configurable: {user_id: 1, thread_id: 2}} response graph.invoke( {messages: [(user, 晚上吃什么好)]}, configconfig )系统会自动联想用户喜欢的食物类型给出建议考虑到你喜欢火锅推荐去尝试XX火锅店的新品麻辣锅。4.3 结构化记忆应用对于更复杂的场景tool def save_structured_memory(triples: List[dict], config: dict) - str: 保存结构化三元组记忆 for triple in triples: doc Document( page_contentf{triple[subject]} {triple[predicate]} {triple[object]}, metadata{ user_id: config[configurable][user_id], **triple } ) recall_vector_store.add_documents([doc]) return 记忆已保存当用户说我朋友李四对海鲜过敏时系统会将其解析为{ subject: 李四, predicate: 对, object: 海鲜过敏 }5. 性能优化技巧5.1 记忆检索优化分级缓存高频记忆缓存在内存低频记忆持久化到数据库时间衰减因子给较旧的记忆添加衰减系数计算公式相关性得分 语义相似度 * e^(-λ*Δt)其中λ是衰减率Δt是记忆存储至今的时间5.2 对话流程优化记忆触发机制设置关键词触发主动记忆检索记忆摘要对长时间对话生成摘要避免信息过载冲突检测当新记忆与旧记忆矛盾时触发确认流程6. 常见问题解决方案6.1 记忆存储问题问题用户信息过多导致存储膨胀方案def cleanup_memories(user_id: str, keep_num: int 50): 保留最近50条核心记忆 all_memories recall_vector_store.get_all(user_id) if len(all_memories) keep_num: # 按重要性排序后截断 sorted_mem sorted(all_memories, keylambda x: x.score, reverseTrue) recall_vector_store.delete([x.id for x in sorted_mem[keep_num:]])6.2 隐私保护实现需求用户要求删除特定记忆实现def delete_memory(memory_id: str, user_id: str): 安全删除记忆 mem recall_vector_store.get(memory_id) if mem and mem.metadata[user_id] user_id: recall_vector_store.delete([memory_id])7. 扩展应用场景7.1 电商客服系统记忆功能可以用于记住用户尺码偏好记录退换货历史学习用户的风格偏好7.2 健康管理助手通过长期记忆跟踪用药记录记录过敏史分析健康趋势提示在实际部署时建议将内存向量库替换为Pinecone等专业服务以获得更好的扩展性和持久性。这个项目的核心价值在于突破了传统对话系统的上下文限制。通过合理设计记忆存储和检索机制我们打造的Agent能够建立真正的长期用户关系就像一位记得老顾客喜好的贴心店员。
返回列表