2026/4/3 20:05:08
网站建设
项目流程
建设网站号码是多少,wordpress查看,做网站实名认证有什么用,中英文自助网站建设1. 概述与核心概念
1.1 什么是短期内存
短期内存是LangChain框架中的核心组件#xff0c;用于记住单次会话或线程内的先前交互。对于AI智能体而言#xff0c;内存系统至关重要#xff0c;它使智能体能够记住之前的交互、从反馈中学习并适应用户偏好。
当智能体处理需要大量用…1. 概述与核心概念1.1 什么是短期内存短期内存是LangChain框架中的核心组件用于记住单次会话或线程内的先前交互。对于AI智能体而言内存系统至关重要它使智能体能够记住之前的交互、从反馈中学习并适应用户偏好。当智能体处理需要大量用户交互的复杂任务时这种记忆能力对于效率提升和用户体验优化都不可或缺。短期内存特别关注线程级别的会话历史管理确保每个独立对话都能保持连贯性。1.2 上下文挑战与解决方案当今大型语言模型面临一个重要挑战长对话处理。当完整的历史记录超出LLM的上下文窗口限制时会导致上下文丢失或生成错误。即使模型理论上支持更长的上下文多数LLM在长上下文场景下仍存在性能问题——它们容易受到陈旧或无关内容的干扰同时伴随着响应时间变慢和成本增加的问题。聊天模型通过消息列表包含系统指令和用户输入接受上下文。在聊天应用中人类输入和模型响应交替出现导致消息列表随时间不断增长。由于上下文窗口有限许多应用需要使用特殊技术来移除或遗忘陈旧信息。2. 基本使用与配置2.1 核心配置检查点机制要为智能体添加短期内存线程级持久化您需要在创建智能体时指定检查点器(checkpointer)。LangChain通过智能体状态图来管理短期内存并将其存储在智能体状态中使智能体能访问完整对话上下文同时保持不同线程的隔离性。基础内存实现示例fromlangchain.agentsimportcreate_agentfromlanggraph.checkpoint.memoryimportInMemorySaver agentcreate_agent(gpt-5,# 模型名称tools[get_user_info],# 可用工具checkpointerInMemorySaver(),# 内存检查点器)agent.invoke({messages:[{role:user,content:Hi! My name is Bob.}]},{configurable:{thread_id:1}},# 线程标识)状态更新发生在智能体调用或步骤如工具调用完成时状态读取则发生在每个步骤开始时。2.2 生产环境配置在生产环境中应使用数据库支持的检查点器以确保持久化和可扩展性pip install langgraph-checkpoint-postgresfromlangchain.agentsimportcreate_agentfromlanggraph.checkpoint.postgresimportPostgresSaver DB_URIpostgresql://postgres:postgreslocalhost:5442/postgres?sslmodedisablewithPostgresSaver.from_conn_string(DB_URI)ascheckpointer:checkpointer.setup()# 自动在PostgreSQL中创建表agentcreate_agent(gpt-5,tools[get_user_info],checkpointercheckpointer,)3. 自定义智能体内存3.1 扩展AgentState默认情况下智能体使用AgentState管理短期内存特别是通过messages键管理对话历史。您可以扩展AgentState以添加额外字段自定义状态模式通过state_schema参数传递给create_agentfromlangchain.agentsimportcreate_agent,AgentStatefromlanggraph.checkpoint.memoryimportInMemorySaverclassCustomAgentState(AgentState):user_id:strpreferences:dictagentcreate_agent(gpt-5,tools[get_user_info],state_schemaCustomAgentState,checkpointerInMemorySaver(),)# 可以在invoke中传递自定义状态resultagent.invoke({messages:[{role:user,content:Hello}],user_id:user_123,preferences:{theme:dark}},{configurable:{thread_id:1}})4. 内存管理策略4.1 消息修剪策略当长对话超过LLM的上下文窗口时最常见的解决方案之一是修剪消息。LLM通常有最大支持的上下文窗口以令牌数计算。决定何时截断消息的一种方法是统计消息历史中的令牌数并在接近限制时截断。使用before_model中间件装饰器修剪消息历史fromlangchain.messagesimportRemoveMessagefromlanggraph.graph.messageimportREMOVE_ALL_MESSAGESfromlanggraph.checkpoint.memoryimportInMemorySaverfromlangchain.agentsimportcreate_agent,AgentStatefromlangchain.agents.middlewareimportbefore_modelfromlanggraph.runtimeimportRuntimefromlangchain_core.runnablesimportRunnableConfigfromtypingimportAnybefore_modeldeftrim_messages(state:AgentState,runtime:Runtime)-dict[str,Any]|None:仅保留最近几条消息以适应上下文窗口messagesstate[messages]iflen(messages)3:returnNone# 无需更改first_msgmessages[0]recent_messagesmessages[-3:]iflen(messages)%20elsemessages[-4:]new_messages[first_msg]recent_messagesreturn{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES),*new_messages]}agentcreate_agent(your_model_here,toolsyour_tools_here,middleware[trim_messages],checkpointerInMemorySaver(),)4.2 消息删除策略您可以从图状态中删除消息来管理消息历史。这对于想要移除特定消息或清除整个消息历史的情况很有用。要删除消息需要使用具有add_messages减速器的状态键。删除特定消息fromlangchain.messagesimportRemoveMessagedefdelete_messages(state):messagesstate[messages]iflen(messages)2:# 移除最早的两条消息return{messages:[RemoveMessage(idm.id)forminmessages[:2]]}删除所有消息fromlanggraph.graph.messageimportREMOVE_ALL_MESSAGESdefdelete_messages(state):return{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES)]}4.3 消息摘要策略修剪或删除消息可能导致信息丢失因此某些应用受益于使用聊天模型总结消息历史的更复杂方法fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportSummarizationMiddlewarefromlanggraph.checkpoint.memoryimportInMemorySaverfromlangchain_core.runnablesimportRunnableConfig checkpointerInMemorySaver()agentcreate_agent(modelgpt-4o,tools[],middleware[SummarizationMiddleware(modelgpt-4o-mini,# 用于摘要的模型trigger(tokens,4000),# 触发条件keep(messages,20)# 保留的消息数)],checkpointercheckpointer,)5. 访问与修改内存5.1 工具中访问短期内存通过runtime参数类型为ToolRuntime在工具中访问短期内存状态。该参数对工具签名隐藏因此模型看不到它但工具可以通过它访问状态fromlangchain.agentsimportcreate_agent,AgentStatefromlangchain.toolsimporttool,ToolRuntimeclassCustomState(AgentState):user_id:strtooldefget_user_info(runtime:ToolRuntime)-str:查找用户信息user_idruntime.state[user_id]returnUser is John Smithifuser_iduser_123elseUnknown user5.2 从工具写入短期内存要在执行过程中修改智能体的短期内存状态可以直接从工具返回状态更新。这对于持久化中间结果或使信息对后续工具或提示可用非常有用fromlangchain.toolsimporttool,ToolRuntimefromlangchain_core.runnablesimportRunnableConfigfromlangchain.messagesimportToolMessagefromlangchain.agentsimportcreate_agent,AgentStatefromlanggraph.typesimportCommandfrompydanticimportBaseModelclassCustomState(AgentState):user_name:strclassCustomContext(BaseModel):user_id:strtooldefupdate_user_info(runtime:ToolRuntime[CustomContext,CustomState],)-Command:查找并更新用户信息user_idruntime.context.user_id nameJohn Smithifuser_iduser_123elseUnknown userreturnCommand(update{user_name:name,# 更新消息历史messages:[ToolMessage(成功查找用户信息,tool_call_idruntime.tool_call_id)]})6. 最佳实践与注意事项6.1 消息历史有效性检查删除消息时请确保结果消息历史是有效的。检查您使用的LLM提供程序的限制例如某些提供程序期望消息历史以用户消息开始大多数提供程序要求包含工具调用的助手消息后必须跟随相应的工具结果消息6.2 生产环境建议选择合适的检查点器开发环境可使用内存检查点器生产环境应选择PostgreSQL或其他数据库支持的检查点器监控内存使用情况定期检查消息历史长度防止超过模型上下文限制实现适当的清理策略根据应用需求选择修剪、删除或摘要策略线程隔离确保不同线程间的状态完全隔离避免数据混淆错误恢复机制检查点系统应支持异常情况下的状态恢复6.3 性能优化建议批量操作尽量减少状态更新频率使用批量更新提高性能异步处理长时间运行的操作应使用异步机制缓存策略对频繁访问的状态数据实现缓存机制定期归档将历史对话归档到长期存储减少活动状态数据量结论LangChain的短期内存系统为构建持久化、可扩展的对话应用提供了强大基础。通过合理的配置和策略选择您可以克服LLM上下文限制创建出真正具有记忆能力和连贯性的智能体应用。关键成功因素包括正确的检查点器选择、合适的内存管理策略、有效的状态访问模式以及生产环境下的监控和维护机制。随着应用复杂性增加这些短期内存管理技术将变得更加重要。