你可以从 Graph 状态中删除消息以管理消息历史。
这在你想要删除特定消息或清除整个消息历史时很有用。
要从 Graph 状态中删除消息,你可以在 Hook 中返回新的消息列表:
import com.alibaba.cloud.ai.graph.agent.hook.HookPosition;
import com.alibaba.cloud.ai.graph.agent.hook.HookPositions;
import com.alibaba.cloud.ai.graph.agent.hook.messages.MessagesModelHook;
import com.alibaba.cloud.ai.graph.agent.hook.messages.AgentCommand;
import com.alibaba.cloud.ai.graph.agent.hook.messages.UpdatePolicy;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import org.springframework.ai.chat.messages.Message;
import java.util.List;
@HookPositions({HookPosition.AFTER_MODEL})
public class MessageDeletionHook extends MessagesModelHook {
@Override
public String getName() {
return "message_deletion";
}
@Override
public AgentCommand afterModel(List<Message> previousMessages, RunnableConfig config) {
if (previousMessages.size() > 2) {
// 删除最早的两条消息,只保留剩余的消息
List<Message> remainingMessages = previousMessages.subList(2, previousMessages.size());
return new AgentCommand(remainingMessages, UpdatePolicy.REPLACE);
}
return new AgentCommand(previousMessages);
}
}
删除所有消息:
import com.alibaba.cloud.ai.graph.agent.hook.HookPosition;
import com.alibaba.cloud.ai.graph.agent.hook.HookPositions;
import com.alibaba.cloud.ai.graph.agent.hook.messages.MessagesModelHook;
import com.alibaba.cloud.ai.graph.agent.hook.messages.AgentCommand;
import com.alibaba.cloud.ai.graph.agent.hook.messages.UpdatePolicy;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import org.springframework.ai.chat.messages.Message;
import java.util.ArrayList;
import java.util.List;
@HookPositions({HookPosition.AFTER_MODEL})
public class ClearAllMessagesHook extends MessagesModelHook {
@Override
public String getName() {
return "clear_all_messages";
}
@Override
public AgentCommand afterModel(List<Message> previousMessages, RunnableConfig config) {
// 删除所有消息,返回空列表
return new AgentCommand(new ArrayList<>(), UpdatePolicy.REPLACE);
}
}
警告:删除消息时,确保生成的消息历史有效。检查你使用的 LLM 提供商的限制。例如:
- 某些提供商期望消息历史以 user 消息开始
- 大多数提供商要求带有工具调用的 assistant 消息后跟相应的 tool 结果消息
import com.alibaba.cloud.ai.graph.agent.hook.HookPosition;
import com.alibaba.cloud.ai.graph.agent.hook.HookPositions;
import com.alibaba.cloud.ai.graph.agent.hook.messages.MessagesModelHook;
import com.alibaba.cloud.ai.graph.agent.hook.messages.AgentCommand;
import com.alibaba.cloud.ai.graph.agent.hook.messages.UpdatePolicy;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import org.springframework.ai.chat.messages.Message;
import java.util.List;
@HookPositions({HookPosition.AFTER_MODEL})
public class DeleteOldMessagesHook extends MessagesModelHook {
@Override
public String getName() {
return "delete_old_messages";
}
@Override
public AgentCommand afterModel(List<Message> previousMessages, RunnableConfig config) {
if (previousMessages.size() > 2) {
// 删除最早的两条消息,只保留剩余的消息
List<Message> remainingMessages = previousMessages.subList(2, previousMessages.size());
return new AgentCommand(remainingMessages, UpdatePolicy.REPLACE);
}
return new AgentCommand(previousMessages);
}
}
ReactAgent agent = ReactAgent.builder()
.name("my_agent")
.model(chatModel)
.systemPrompt("请简洁明了。")
.hooks(new DeleteOldMessagesHook())
.saver(new MemorySaver())
.build();
RunnableConfig config = RunnableConfig.builder()
.threadId("1")
.build();
// 第一次调用
agent.call("你好!我是 bob", config);
// 输出:[('human', "你好!我是 bob"), ('assistant', '你好 Bob!很高兴见到你...')]
// 第二次调用
agent.call("我叫什么名字?", config);
// 输出:[('human', "我叫什么名字?"), ('assistant', '你的名字是 Bob...')]
本文整理自 Spring AI Alibaba 官方文档《Memory 短期记忆》:https://java2ai.com/docs/frameworks/agent-framework/tutorials/memory

AI项目博客






