大模型:临时会话 大模型的临时会话临时会话指的是在一次对话会话Session期间大模型能够记住之前交流过的内容从而理解上下文、进行连贯对话的能力。会话结束后这些记忆通常会被丢弃。核心机制1. 上下文窗口Context Window大模型本身是无状态的每次调用都是独立的。所谓的“记忆”实际上是把历史对话记录拼接在每次请求中一起发送给模型。模型根据上下文窗口内的全部内容进行推理和生成。上下文窗口大小有限如 128K、200K、1M tokens超出部分会被截断或丢失。2. 消息列表Message List每次对话由一组消息组成每条消息包含角色system/user/assistant和内容。新消息不断追加到列表末尾形成对话历史。下次请求时将整个消息列表或截取最近的一部分传给模型。3. Checkpoint / State状态持久化在 Agent 或复杂工作流中临时会话的本质是状态管理每一步执行都会更新状态下一次调用从最新状态继续。状态不仅包含消息列表还包含中间变量、工具调用结果、流程控制信息等。通过将状态保存在内存或外部存储中实现会话的持续和恢复。临时会话的典型实现方式1. 手动维护消息列表最基础messages[{role:system,content:你是一个友好的助手。}]whileTrue:user_inputinput(你: )messages.append({role:user,content:user_input})responsemodel.invoke(messages)messages.append({role:assistant,content:response})print(助手:,response)2. 使用RunnableWithMessageHistoryLangChain 风格自动管理消息历史的存储和注入。通过session_id区分不同会话。支持多种历史存储后端内存、Redis、文件等。fromlangchain_core.runnables.historyimportRunnableWithMessageHistoryfromlangchain_core.chat_historyimportInMemoryChatMessageHistory store{}defget_history(session_id):ifsession_idnotinstore:store[session_id]InMemoryChatMessageHistory()returnstore[session_id]conversationRunnableWithMessageHistory(chain,get_history,input_messages_keyinput,history_messages_keychat_history)resultconversation.invoke({input:你好},{configurable:{session_id:user_001}})3. LangGraph 的 State 管理图Graph的执行过程中State 是全局共享的。每次节点更新 State下一次调用从上次的 State 继续。结合 Checkpointer 可实现会话持久化和恢复。fromlanggraph.graphimportStateGraph,MessagesStatefromlanggraph.checkpoint.memoryimportMemorySaver graphbuilder.compile(checkpointerMemorySaver())# 第一次调用resultgraph.invoke({messages:[HumanMessage(content你好)]},{configurable:{thread_id:session_001}})# 第二次调用同一 thread_id自动恢复历史resultgraph.invoke({messages:[HumanMessage(content我刚才说了什么)]},{configurable:{thread_id:session_001}})临时会话 vs 长期记忆对比维度临时会话长期记忆作用范围单次会话内同一session_id/thread_id跨会话、跨用户存储内容对话历史、当前状态、中间变量用户画像、知识图谱、持久化偏好生命周期会话结束或程序重启后可能丢失永久保存实现方式消息列表、State、Checkpointer外部存储数据库、向量库访问方式自动注入框架管理需手动读写临时会话的局限性上下文窗口限制对话过长时会丢失早期信息。Token 成本每次请求都携带全部历史成本线性增长。信息遗忘模型对长文本中间部分的内容“注意力”会减弱Lost-in-the-Middle 问题。应对策略消息裁剪只保留最近 N 轮对话ConversationBufferWindowMemory。摘要压缩使用 LLM 对旧消息生成摘要ConversationSummaryMemory。向量记忆将历史消息向量化按需检索相关片段VectorStoreRetrieverMemory。状态快照使用 Checkpointer 保存完整状态支持时间旅行和故障恢复。应对策略代码示例下面分别给出四种策略的代码示例帮助你直观理解每种方式如何实现。1. 消息裁剪ConversationBufferWindowMemory适用框架LangChain原理只保留最近 K 轮对话超出部分自动丢弃。fromlangchain.memoryimportConversationBufferWindowMemoryfromlangchain.chainsimportConversationChainfromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelgpt-3.5-turbo)# 只保留最近 2 轮对话即 2 次 user 2 次 assistantmemoryConversationBufferWindowMemory(k2)conversationConversationChain(llmllm,memorymemory,verboseTrue)conversation.predict(input我叫小明我喜欢编程。)conversation.predict(input你还记得我叫什么吗)# 此时 memory 中只包含最近两轮消息之前的“我叫小明”可能被丢弃取决于 k 值print(memory.buffer)# 查看当前存储的对话历史2. 摘要压缩ConversationSummaryMemory适用框架LangChain原理每次调用 LLM 将历史对话压缩成一段摘要保留核心信息节省 Token。fromlangchain.memoryimportConversationSummaryMemoryfromlangchain.chainsimportConversationChainfromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelgpt-3.5-turbo)# 使用 LLM 生成摘要memoryConversationSummaryMemory(llmllm)conversationConversationChain(llmllm,memorymemory,verboseTrue)conversation.predict(input我叫小明我喜欢编程。)conversation.predict(input我还喜欢打篮球。)conversation.predict(input你还记得我的爱好吗)# 查看当前存储的摘要print(memory.load_memory_variables({})[history])# 输出可能类似Human 说他的名字是小明喜欢编程和打篮球。3. 向量记忆VectorStoreRetrieverMemory适用框架LangChain原理将历史消息向量化存入向量库查询时只检索最相关的片段适合超长对话。fromlangchain.memoryimportVectorStoreRetrieverMemoryfromlangchain.vectorstoresimportChromafromlangchain.embeddingsimportOpenAIEmbeddingsfromlangchain.chainsimportConversationChainfromlangchain_openaiimportChatOpenAI# 初始化向量库embeddingOpenAIEmbeddings()vectorstoreChroma(collection_namememory,embedding_functionembedding,persist_directory./chroma_memory)# 创建检索器每次检索返回最相似的 2 条记忆retrievervectorstore.as_retriever(search_kwargs{k:2})# 创建向量记忆memoryVectorStoreRetrieverMemory(retrieverretriever)# 保存记忆每次对话后调用memory.save_context({input:我叫小明我喜欢编程。},{output:好的我记住了。小明喜欢编程。})memory.save_context({input:我还喜欢打篮球。},{output:记住了小明还喜欢打篮球。})# 查询相关记忆resultmemory.load_memory_variables({input:小明有什么爱好})print(result[history])# 输出会包含“小明喜欢编程”和“小明喜欢打篮球”的相关片段4. 状态快照Checkpointer适用框架LangGraph原理在图的每个节点执行后自动保存整个 State 的快照。支持恢复、回退和会话持久化。4.1 内存版MemorySaverfromlanggraph.graphimportStateGraph,MessagesStatefromlanggraph.checkpoint.memoryimportMemorySaverfromlangchain_core.messagesimportHumanMessage# 构建一个简单图builderStateGraph(MessagesState)builder.add_node(chat,lambdastate:{messages:[llm.invoke(state[messages])]})builder.set_entry_point(chat)graphbuilder.compile(checkpointerMemorySaver())# 第一次调用保存状态config{configurable:{thread_id:user_001}}resultgraph.invoke({messages:[HumanMessage(content我叫小明)]},configconfig)# 第二次调用从同一 thread_id 恢复状态resultgraph.invoke({messages:[HumanMessage(content我叫什么名字)]},configconfig)print(result[messages][-1].content)# 模型会回答“小明”4.2 持久化版SqliteSaverimportsqlite3fromlanggraph.checkpoint.sqliteimportSqliteSaver# 创建 SQLite 存储connsqlite3.connect(checkpoints.db,check_same_threadFalse)checkpointerSqliteSaver(conn)# 编译图时传入 checkpointergraphbuilder.compile(checkpointercheckpointer)# 之后的使用与 MemorySaver 完全一致只是状态会持久化到磁盘# 程序重启后相同 thread_id 仍能恢复历史策略对比总结策略适用场景优点缺点消息裁剪对话轮次可控不关心早期内容实现简单Token 可控可能丢失重要早期信息摘要压缩长对话但需保留核心信息节省 Token保留语义摘要摘要可能丢失细节需额外 LLM 调用向量记忆超长对话或知识库场景可扩展至海量历史按需检索实现复杂有额外检索延迟状态快照Agent 工作流、故障恢复保存完整状态支持时间旅行存储开销大需持久化支持根据你的实际场景可以组合使用这些策略例如短对话用消息裁剪长对话用摘要向量记忆关键工作流用状态快照。