当前位置: 首页 > news >正文

spring ai如何实现Agent工作流编排,支持多轮对话,上下文记忆,工具自动调用?

Spring AI(核心基于Spring AI Alibaba Agent Framework)通过ReAct范式+工作流编排+对话记忆+Function Calling四大核心能力,完整实现Agent的多轮对话、上下文记忆、工具自动调用与工作流编排。下面从工作流编排、多轮对话、上下文记忆、工具自动调用四个维度,分别讲清原理、核心组件、实现方式与代码示例。

一、Agent工作流编排:如何组织多Agent/多步骤执行

核心原理

基于ReAct(Reasoning+Acting)推理-行动循环+ 内置编排模式(顺序/并行/路由/循环)+ 基于图的工作流,实现复杂任务的分步拆解、动态路由、迭代执行。

核心组件

  1. ReactAgent:基础Agent单元,负责单轮思考-行动-观察循环,是编排的最小执行单元
  2. 编排Agent(工作流容器)
    • SequentialAgent:顺序执行多个子Agent,适合流水线任务(如:查天气→查景点→生成计划)
    • ParallelAgent:并行执行多个子Agent,适合独立任务并发(如:同时查机票+酒店)
    • LlmRoutingAgent:LLM动态决策路由,根据用户问题选择对应Agent(如:用户问天气→路由到天气Agent,问旅游→路由到攻略Agent)
    • LoopAgent:循环执行Agent,直到满足终止条件(如:工具调用失败重试、多轮推理直到答案完整)
    • GraphWorkflow:基于有向无环图(DAG)的复杂编排,支持条件分支、嵌套、状态管理,适合企业级复杂流程
  3. State/OverAllState:全局状态对象,在工作流各步骤间传递上下文、工具结果、对话历史,实现数据共享

实现示例(顺序工作流)

// 1. 定义多个原子AgentReactAgentweatherAgent=ReactAgent.builder().name("weather").model(chatModel).tools(List.of(weatherTool))// 天气查询工具.instruction("查询指定城市天气").build();ReactAgentplanAgent=ReactAgent.builder().name("travel_plan").model(chatModel).instruction("基于天气生成旅游计划").build();// 2. 构建顺序工作流:先查天气→再生成计划SequentialAgenttravelWorkflow=SequentialAgent.builder().name("travel_workflow").subAgents(List.of(weatherAgent,planAgent))// 顺序执行.build();// 3. 执行工作流,传入用户问题+会话ID(关联上下文)OverAllStateresult=travelWorkflow.invoke(UserMessage.builder("6月去青海旅游,帮我做计划").build(),RunnableConfig.builder().threadId("user_1001").build());

二、多轮对话:如何实现连续交互、上下文连贯

核心原理

LLM本身无状态,多轮对话的本质是:每次请求都把历史对话(用户问题+AI回复)作为上下文,一起发给LLM,让模型感知对话历史,实现连贯交互。

核心组件

  1. ChatMemory(对话记忆管理器):负责存储、追加、截断、格式化对话历史,Spring AI提供多种实现:
    • InMemoryChatMemory:内存存储,适合开发/单实例
    • RedisChatMemory:Redis持久化,适合分布式、跨实例
    • MongoChatMemory:MongoDB存储,适合长期记忆
  2. Message/Conversation:统一消息模型,区分UserMessage、AssistantMessage、ToolResponseMessage,按轮次有序存储
  3. ChatClient/Agent:自动将Memory中的历史消息,注入到每次LLM请求的Prompt中

实现流程

  1. 用户发起第1轮提问 → 保存UserMessage到Memory
  2. Agent调用LLM,传入当前问题+空历史→ 返回AssistantMessage → 保存到Memory
  3. 用户发起第2轮提问 → 保存新UserMessage → Agent自动读取Memory中前2轮历史+当前问题→ 发给LLM → 生成连贯回复
  4. 循环往复,实现多轮对话

关键配置(自动历史注入)

// 初始化带记忆的ChatClientChatClientchatClient=ChatClient.builder(chatModel).defaultSystem("你是旅游助手,记住对话历史").chatMemory(redisChatMemory)// 绑定Redis记忆.build();// 多轮对话调用(自动携带历史)ChatResponseresponse1=chatClient.prompt().user("青海6月天气").call();ChatResponseresponse2=chatClient.prompt().user("那适合穿什么衣服").call();// 自动带上上一轮历史

三、上下文记忆:如何持久化、管理短期/长期记忆

核心原理

记忆分为短期会话记忆(多轮对话历史)长期记忆(跨会话知识/用户偏好),通过Memory+State+Checkpoint+Store四层管理,实现上下文的自动传递、持久化、检索与截断(防止Token溢出)。

核心能力与实现

1. 短期会话记忆(多轮对话上下文)
  • 作用:单会话内,保存用户与AI的每一轮交互,保证对话连贯
  • 实现:ChatMemory + ThreadId(会话唯一标识)
    • 每个会话分配唯一threadId,Memory按threadId隔离存储历史
    • 自动截断:超过Token上限时,自动保留最近N轮历史,丢弃最早历史(避免LLM上下文溢出)
    • 持久化:Redis/Mongo实现,重启/扩容不丢失会话
2. 长期记忆(跨会话/全局知识)
  • 作用:保存用户偏好、历史任务结果、知识库,跨会话可用
  • 实现:VectorStore(向量存储)+ RAG检索
    • 将长期知识(如用户常去城市、历史计划)向量化存入向量库
    • Agent每次执行时,自动检索相关长期记忆,注入上下文
3. 工作流状态记忆(跨步骤数据)
  • 作用:在工作流的多个Agent/步骤间,共享工具结果、中间变量、全局状态
  • 实现:OverAllState + CheckpointSaver
    • State存储所有中间数据(如天气结果、景点列表)
    • CheckpointSaver(RedisSaver/MongoSaver)持久化State,支持断点续跑、故障恢复

代码示例(Redis会话记忆+状态持久化)

// 1. 配置Redis会话记忆(短期)@BeanpublicChatMemoryredisChatMemory(RedisConnectionFactoryfactory){returnRedisChatMemory.builder().redisTemplate(redisTemplate).maxHistorySize(10)// 保留最近10轮对话.build();}// 2. 配置状态持久化(工作流记忆)CheckpointSaversaver=newRedisSaver(redisTemplate);ReactAgentagent=ReactAgent.builder().model(chatModel).chatMemory(redisChatMemory).saver(saver)// 持久化工作流状态.build();// 3. 按threadId关联记忆,实现跨请求上下文agent.invoke(userMsg,RunnableConfig.builder().threadId("user_1001").build());

四、工具自动调用:如何让Agent自主选择、执行外部工具

核心原理

基于LLM Function Calling(函数调用)能力

  1. 向LLM注册可用工具(函数名、参数、描述)
  2. LLM推理判断:是否需要调用工具、调用哪个、传什么参数
  3. Spring AI自动解析LLM返回的工具调用指令 → 执行对应Java方法 → 获取结果
  4. 将工具结果作为新上下文,再次发给LLM → LLM整合结果,生成最终回答或继续调用工具(ReAct循环)

核心组件

  1. Tool/FunctionCallback:工具定义接口,将Java方法封装为LLM可调用的工具,包含:
    • 名称、描述(告诉LLM工具用途)
    • 输入参数(JSON Schema,LLM按格式传参)
    • 执行逻辑(Java业务代码,如查天气、查数据库、调API)
  2. ToolCallingAgent/ReactAgent:自动处理工具调用流程,无需手动解析
  3. ToolExecutor:工具执行器,负责参数解析、方法调用、异常捕获

实现步骤(自动调用天气工具)

1. 定义工具(Java方法→Tool)
// 定义天气查询工具,实现FunctionCallback@ComponentpublicclassWeatherToolimplementsFunctionCallback<WeatherRequest,WeatherResponse>{@OverridepublicStringgetName(){return"get_weather";// 工具名,LLM调用时使用}@OverridepublicStringgetDescription(){return"查询指定城市的实时天气,参数:city城市名";// 描述,LLM判断是否调用}@OverridepublicTypeReference<WeatherRequest>getInputTypeReference(){returnnewTypeReference<WeatherRequest>(){};}@OverridepublicWeatherResponseapply(WeatherRequestrequest){// 实际调用天气API/数据库returnweatherService.getWeather(request.getCity());}}// 工具入参DTOpublicrecordWeatherRequest(Stringcity){}
2. 注册工具到Agent,开启自动调用
// 构建支持自动工具调用的ReactAgentReactAgentagent=ReactAgent.builder().model(chatModel).tools(List.of(weatherTool))// 注册可用工具.instruction("你可以调用get_weather工具查询天气,必要时自主调用").chatMemory(redisChatMemory)// 绑定上下文记忆.build();
3. 自动调用流程(用户问天气)
  1. 用户:“青海西宁6月天气怎么样?”
  2. Agent将问题+工具列表发给LLM
  3. LLM推理:需要调用get_weather,参数{“city”:“西宁”}
  4. Spring AI自动执行WeatherTool → 返回天气结果
  5. Agent将天气结果+原问题,再次发给LLM
  6. LLM整合结果,生成自然语言回答:“西宁6月平均温度15-25℃,适合出行…”

五、四大能力整合:完整Agent工作流(一句话总结)

  1. 工作流编排:用Sequential/Parallel/Graph组织多个ReactAgent,按步骤/条件执行任务
  2. 多轮对话:通过ChatMemory保存历史,每次请求自动注入上下文,实现连贯交互
  3. 上下文记忆:ThreadId隔离会话、State共享步骤数据、VectorStore存储长期知识,持久化不丢失
  4. 工具自动调用:注册Tool→LLM决策调用→Spring AI执行→结果回传→LLM整合,完成ReAct循环
http://www.jsqmd.com/news/642353/

相关文章:

  • 保姆级教程:PVE/Proxmox VE拔掉独显后网络失联?一招搞定网卡名绑定(Debian系通用)
  • **发散创新:基于Python的文件API深度封装与实战应用**在现代软件开发中,**文
  • ubuntu的lazarus的Tline/TeaLine组件的构思
  • KEBA DI325数字输入模块卡
  • Kafka 的 ISR 是什么
  • 团队任务管理软件哪个好?trello、Worktile、Todoist等10大产品对比
  • 提高文本表达清晰度指令
  • 3步终极解锁:中兴光猫工厂模式与Telnet服务完全指南
  • ESP32驱动1.8寸TFT屏幕(ST7735)避坑指南:从User_Setup.h配置到显示时钟的完整流程
  • **发散创新:基于Go语言的协同计算框架设计与实践**在现代分布式系统中,**协同计算(Collaborative
  • 记忆的遗忘与压缩:Harness 的上下文维护
  • 如何5分钟快速上手抖音批量下载神器:douyin-downloader完整指南
  • 安庆口碑好的健身房有哪些
  • 身份证OCR识别系统完整搭建指南
  • 高速纸机脱水元件,为何氧化锆成首选
  • 3个理由告诉你为什么League Akari是英雄联盟玩家的必备智能助手
  • pytest自动化测试框架从0到1实战
  • 互联网大厂Java面试全场景技术栈解析与模拟问答
  • HarmonyOS StateStore 全局状态管理实战
  • 终极指南:如何免费解锁Cursor AI编辑器的完整Pro功能
  • Oracle监听程序配置全攻略:从ORA-12541错误到完美解决(附PLSQL连接技巧)
  • 双叶家具联系方式查询:在山西大同选购实木家具时如何通过官方渠道联系与实地探访 - 品牌推荐
  • **发散创新:基于 OpenTelemetry 的分布式链路追踪实战与性能
  • 网盘直链下载助手:八大网盘一键解析,告别限速烦恼的终极解决方案
  • 无线充电电动牙刷设计解析:瑞萨R7F0C807与PWM驱动技术
  • 性能测试项目中遇到的20个问题以及解决方法
  • KAWASAKI 50999-2145R10控制卡
  • Python学习日志(二):基础语法
  • 教你怎样搭建自动化测试框架?
  • 精准力控安全夹持,力控夹爪厂家品控与售后体系全解析 - 品牌2026