☰
第四单元——第十课:一个真正的“两轮聊天”
2026/10/11 20:27:26 网站建设 项目流程

做一个真正的“两轮聊天”:第一轮告诉助手名字,第二轮问它还记不记得。这里把刚学的add_messages、上一课的状态合并,以及之前的InMemorySaver连起来。

在已激活的.venv中,新建unit4_lesson10_chat_memory.py:

import os from typing import Annotated, TypedDict from langchain_core.messages import AnyMessage, HumanMessage, SystemMessage from langchain_openai import ChatOpenAI from langgraph.checkpoint.memory import InMemorySaver from langgraph.graph import START, END, StateGraph from langgraph.graph.message import add_messages class ChatState(TypedDict): messages: Annotated[list[AnyMessage], add_messages] model = ChatOpenAI( model="deepseek-flash", base_url="https://api.deepseek.com", api_key=os.environ["DEEPSEEK_API_KEY"], ) def chat(state: ChatState) -> dict: response = model.invoke([ SystemMessage(content="你是书店助手,请简短回答。"), *state["messages"], ]) return {"messages": [response]} builder = StateGraph(ChatState) builder.add_node("chat", chat) builder.add_edge(START, "chat") builder.add_edge("chat", END) graph = builder.compile(checkpointer=InMemorySaver()) config = {"configurable": {"thread_id": "customer-a"}} questions = [ "我叫小明,请记住我的名字。", "我叫什么名字?", ] for round_number, question in enumerate(questions, start=1): result = graph.invoke( {"messages": [HumanMessage(content=question)]}, config, ) print(f"\n第 {round_number} 轮问题:{question}") print(f"第 {round_number} 轮回答:{result['messages'][-1].content}") print(f"\n已保存的消息数:{len(result['messages'])}")

运行python unit4_lesson10_chat_memory.py。第二轮通常会答出“小明”,消息数应为4:两条用户消息、两条助手消息。

输出截图:

这节最重要的区分:add_messages负责合并消息列表;InMemorySaver负责让下一次调用找回状态;相同的thread_id表示同一段对话。LangGraph 消息状态文档 · DeepSeek 当前模型名称

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询