Langgraph会话全程如何存储与检索聊天历史?
Langgraph中存储并实时打印聊天历史的解决方案
错误原因分析
- 消息包装错误:
llm.invoke(user_message)返回的本身就是AIMessage对象,你却把它作为content参数传入新的AIMessage,导致content类型不符合字符串要求,触发ValidationError。 - 拼写错误:代码中
raph_builder.add_node应为graph_builder.add_node,否则会抛出未定义变量的错误。 - 聊天历史维护逻辑:虽然用了
Annotated[list, add_messages]注解,但返回消息时需要正确传递消息对象,让Langgraph自动完成历史累加。
修正后的完整代码
from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, START, END from langchain_core.messages import AIMessage, HumanMessage from typing import TypedDict, Annotated from langgraph.graph.message import add_messages llm = ChatOpenAI(temperature=1.0) class State(TypedDict): # add_messages注解自动维护消息列表的累加逻辑 messages: Annotated[list, add_messages] graph_builder = StateGraph(State) def chatbot(state: State): # 获取最新的用户消息内容 user_message = state["messages"][-1].content # llm.invoke直接返回AIMessage对象,无需二次包装 ai_response = llm.invoke(user_message) # 返回消息列表,add_messages会自动将其追加到全局messages中 return {"messages": [ai_response]} def past_message_node(state: State): print("\nConversation History:") # 提取所有消息的内容并拼接成字符串 message_contents = [msg.content for msg in state['messages']] print(", ".join(message_contents)) return state # 修正拼写错误,使用正确的graph_builder变量 graph_builder.add_node("chatbot", chatbot) graph_builder.add_edge(START, "chatbot") graph_builder.add_node("past_message_node", past_message_node) graph_builder.add_edge("chatbot", "past_message_node") graph_builder.add_edge("past_message_node", END) graph = graph_builder.compile() while True: user_input = input("\nUser: ") if user_input.lower() in ['quit', 'q']: print("Chat Ended") break # 用HumanMessage包装用户输入,或使用元组("user", user_input)均可 for event in graph.stream({"messages": [HumanMessage(content=user_input)]}): for value in event.values(): # 获取AI的最新回复并打印 last_message = value["messages"][-1] print("Assistant:", last_message.content)
关键逻辑说明
add_messages注解:这个注解是Langgraph维护聊天历史的核心,它会自动将每个节点返回的messages列表追加到全局State的messages中,无需手动编写历史累加代码。- 消息对象正确传递:
llm.invoke返回的是标准AIMessage对象,直接放入返回的列表即可,不需要再用AIMessage(content=...)包装。 - 输入消息格式:用户输入可以用
HumanMessage包装,也可以用元组("user", user_input),Langgraph都会正确识别为用户消息并加入历史。
预期运行效果
User: Hi Assistant: How can I help you? Conversation History: Hi, How can I help you? User: What is the capital of UK? Assistant: London Conversation History: Hi, How can I help you?, What is the capital of UK?, London User: q Chat Ended
内容的提问来源于stack exchange,提问作者Tech_fusion
相关产品推荐
相关产品推荐

