spring ai alibaba
零、reactAgent
Chatclient已经弃用,使用ChatModel
内嵌node仅为两种,这里面支持ChatClient-可以自定义advisor chain

	private final AgentLlmNode llmNode;
	private final AgentToolNode toolNode;

一、记忆
使用自带的saver()
实现自定义的hook-before model-进行数据库存储
消息的取舍-可采用策略(修剪、删除、总结-extends ModelHook

二、token
估算token

 // 估算 token 数量(简化版)
      int estimatedTokens = messages.stream()
          .mapToInt(m -> m.getText().length() / 4)
          .sum();

三、agent即工具
在这里插入图片描述

FunctionToolCallback与McpToolCallback是不同的:FunctionToolCallback是自定义的一些工具-函数等,相当于方法的进一步封装作为“公共方法”。而获取mcp server连接来的工具天然实现toolcallback。

agent作为工具使用作为子智能体,实现implements BiFunction<String, ToolContext, String>,其中ToolContext作为运行时的
“公共笔记本”,写入共享参数和获取参数

例如:
场景一:
获取-读取公共参数人员id,可以作为一个提取,有点类似chatclient的advisor方法,作为一个公共的函数,想在哪里使用就配置上即可
然后可以作为主智能体的Interceptor

public class SubAgentInterceptor extends ModelInterceptor
public class UserInfoTool implements BiFunction<String, ToolContext, String> {

  @Override
  public String apply(String query, ToolContext toolContext) {
      // 从上下文中获取用户信息
      RunnableConfig config = (RunnableConfig) toolContext.getContext().get("config");
      String userId = (String) config.metadata("user_id").orElse("");

      if ("user_123".equals(userId)) {
          return "用户是 John Smith";
      } else {
          return "未知用户";
      }
  }
}

四、FunctionToolCallback、hook、 interceptor
公共方法函数:FunctionToolCallback
运行时动态:interceptor 、hook
在这里插入图片描述

上下文工程(Context Engineering)正是解决这一问题的核心理念:以正确的格式提供正确的信息和工具,使 LLM 能够可靠地完成任务。
在这里插入图片描述

五、可自定义实现
(1)FunctionToolCallback

public class UserInfoTool implements BiFunction<String, ToolContext, String> {}

(2)Interceptor,抽象类有ToolInterceptor、ToolInterceptor,实现自Interceptor。

常用的有TodoListInterceptor:提供todo list管理功能给之呢个题,这个拦截器提高了在复杂问题的时候系统提示词去设置待办事项
场景一:
例如动态获取用户名作为曾倩

public class DynamicPromptInterceptor extends ModelInterceptor {

六,参数共享

OverAllState与Runnableconfig的数据是不一样的
举例子
对一个线程,只从该线程下的对话,有该用户的多个提问
线程主键就应该存在Runnableconfig.metadata中,作为长期记忆的用户画像的用户主键 存在Runnableconfig的context中; 多个提问的主键应该存入Runnableconfig
OverAllState中,作为额外固定信息;

在这里插入图片描述
官方举例子为:

RunnableConfig 提供了一个 context() 方法,允许你在同一个执行流程中的多个 Hook 调用、多轮模型或工具调用之间共享数据。这对于实现计数器、累积统计信息或跨多次调用维护状态非常有用。
适用场景:
跟踪模型或工具调用次数
累积性能指标(总耗时、平均响应时间等)
在 before/after Hook 之间传递临时数据
实现基于计数的限流或断路器

这是config的配置
在这里插入图片描述
可变性不同
metadata:不可变 (immutable)

一旦初始化,执行期间不改变

类似"只读配置"

context:可变 (mutable)

执行过程中会不断更新

节点可以读取和修改其中的数据
也就是说,如果在agent执行过程中会对其进行更新操作就放在context,而metadata类似”只读配置“

Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐