删除持久消息
描述
一般只会向状态添加消息。但是,有时也可能想要删除消息(直接修改状态或作为图的一部分)。
- 例如,当用户说“忘记所有对话”时,你希望删除所有对话历史记录。
- 例如,可以使用删除消息实现只保留最新的n条消息
使用 MessageState
作为状态图,其中的 reducer
可以接受 RemoveMessage
修饰符,reducer
可以使用这些 RemoveMessage
从键中删除对应的消息
注意:许多模型对消息列表有某些规则。例如,有些模型期望它们以
user
消息开头,另一些模型期望所有带有工具调用的消息都后跟工具消息。删除消息时,你将需要确保不违反这些规则。
使用
将传入的第一条消息删除
from langchain_core.messages import RemoveMessage
graph.update_state(config, {"messages": RemoveMessage(id=messages[0].id)})
例子——删除所有消息,保留最后一条
from langchain_core.messages import HumanMessage
from my_openai.deepseekv3 import get_deepseek_v3_client
from langgraph.graph import StateGraph, START, END, MessagesState
from langgraph.checkpoint.memory import MemorySaver
from langchain_core.messages import RemoveMessage
# 持久化
memory = MemorySaver()
config = {"configurable": {"thread_id": "1" } }
builder = StateGraph(MessagesState)
llm = get_deepseek_v3_client()
# 删除所有消息,只保留最后一条消息
def delete_messages(state: MessagesState):
messages = state["messages"]
if len(messages) > 1:
return {"messages": [RemoveMessage(id = m.id) for m in messages[:-1]]}
def chatbot(state: MessagesState):
return {
"messages": [llm.invoke(state["messages"])]
}
builder.add_node("chatbot", chatbot)
builder.add_node(delete_messages)
builder.add_edge(START, "delete_messages")
# 每次删除消息后,再调用chatbot
builder.add_edge("delete_messages", "chatbot")
builder.add_edge("chatbot", END)
graph = builder.compile(checkpointer=memory)
调用:
user_input = HumanMessage(content="你好,我叫小明!")
events = graph.stream(
{"messages": [user_input]},
config,
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
user_input = HumanMessage(content="我叫什么名字?")
events = graph.stream(
{"messages": [user_input]},
config,
stream_mode="values"
)
for event in events:
event["messages"][-1].pretty_print()
================================ Human Message =================================
你好,我叫小明!
================================== Ai Message ==================================
你好,小明!很高兴认识你~😊 今天有什么想聊的,或者需要帮忙的吗?无论是学习、生活还是兴趣爱好,我都可以陪你聊聊哦!
================================ Human Message =================================
我叫什么名字?
================================ Human Message =================================
我叫什么名字?
================================== Ai Message ==================================
你还没有告诉我你的名字呢!😊 你可以告诉我你的名字,我会记住并用来称呼你~或者,如果你希望我帮你起个名字,也可以告诉我你的喜好哦!