# 让AI学会“动手”:企业级Agent编排实战

发布时间:2026/7/21 6:20:04
# 让AI学会“动手”:企业级Agent编排实战 让AI学会“动手”企业级Agent编排实战引言AI应用的新范式如果说ChatGPT是能说会道的“嘴强王者”那么Agent就是既能说又能干的“六边形战士”。大模型的能力边界正在被不断刷新从最初单纯的自然语言理解与生成到如今能够调用外部工具、执行具体操作、完成复杂任务。这种转变的核心驱动力正是Agent智能体技术——它让AI不再只是被动回答问题的聊天机器而是能够自主规划、决策并采取行动的“数字员工”。然而从Demo到生产环境中间隔着一道名为“工程化”的鸿沟。如何用Java生态优雅地构建企业级Agent如何让AI稳定地调用几十甚至上百个工具如何在复杂业务场景中编排工具调用流程本文将结合Spring AI与LangChain两大框架深入剖析企业级Agent构建与工具调用编排的实战之道。一、Agent为何需要“工具”在讨论技术实现之前先厘清一个核心问题为什么Agent必须依赖工具大模型的知识截至训练日期无法获取实时信息也无法执行实际操作。比如当用户问“今天的天气如何顺便帮我订一张机票”大模型本身无法查询天气更无法完成订票操作。工具调用Tool Calling / Function Calling正是解决这一问题的关键机制大模型识别用户意图后生成结构化的工具调用请求系统执行相应函数并返回结果模型再基于结果生成最终回复。这个过程中大模型扮演的是“大脑”角色——负责思考和决策而工具则是“手和脚”——负责执行。二、企业级Agent核心架构无论是基于Spring AI还是LangChain一个成熟的企业级Agent都需要具备以下核心模块模块职责关键技术规划引擎理解用户意图拆解任务步骤Prompt工程、ReAct模式工具注册表管理所有可调用工具的元数据注解驱动、动态注册执行器调用工具并处理返回结果同步/异步执行、超时控制记忆系统维护对话上下文和工具调用历史多级记忆压缩、向量存储可观测性记录调用链路、监控性能日志、链路追踪、指标采集架构设计的核心原则是“关注点分离”——将业务逻辑、AI推理和工具调度解耦每个模块独立演进、可替换、可测试。三、Spring AI实践以ToolCallAdvisor为核心的Agent编排Spring AI从1.1.0-M4版本开始引入递归顾问Recursive Advisor机制将工具调用循环提升为顾问链中的一等公民实现了对Agent迭代工作流的原生支持。3.1 核心机制ToolCallAdvisor在Spring AI 1.x中工具执行逻辑内嵌在ChatModel实现内部开发者无法干预调用过程。2.0版本彻底重构了这一设计——ToolCallAdvisor作为递归顾问接管了整个工具调用生命周期。关键流程如下定义工具通过Tool注解标记方法注册工具在ChatClient构建时传入ToolCallback执行循环ChatClient将请求发给LLM → LLM返回含工具调用的响应 → ToolCallAdvisor截获并执行对应工具 → 将工具结果追加到对话历史 → 再次调用LLM → 直到LLM返回不含工具调用的最终答案代码实现如下// 1. 定义工具ComponentpublicclassWeatherTools{Tool(description获取指定城市的当前天气)publicStringgetCurrentWeather(ToolParam(description城市名称如北京)Stringcity){// 实际项目中可调用真实天气APIreturncity晴25°C;}Tool(description预订机票)publicBookingConfirmationbookFlight(ToolParam(description出发城市)Stringorigin,ToolParam(description目的城市)Stringdestination,ToolParam(description日期格式YYYY-MM-DD)Stringdate){returnflightService.book(origin,destination,date);}}// 2. 构建ChatClient并注册工具ConfigurationpublicclassAiConfig{BeanpublicChatClientchatClient(ChatModelchatModel,WeatherToolsweatherTools){returnChatClient.builder(chatModel).defaultToolCallbacks(FunctionToolCallback.builder(getCurrentWeather,weatherTools::getCurrentWeather).description(获取指定城市的当前天气).inputType(WeatherRequest.class).build()).defaultAdvisors(newToolCallAdvisor()).build();}}// 3. 业务调用ServicepublicclassAgentService{privatefinalChatClientchatClient;publicStringprocessUserRequest(StringuserInput){returnchatClient.prompt().user(userInput).call().content();}}3.2 记忆管理将记忆顾问置于工具循环内部一个容易被忽视的关键设计是记忆Memory与工具循环Tool Loop的交互。默认情况下MessageChatMemoryAdvisor顺序HIGHEST_PRECEDENCE 200在ToolCallAdvisor顺序HIGHEST_PRECEDENCE 300之前执行这意味着工具调用的请求和响应不会被写入记忆存储——它只记录最终的User和Assistant消息。如果想让LLM拥有完整的“反思能力”——知道之前尝试过哪些工具、返回了什么结果——就需要将记忆顾问置于工具循环内部// 将记忆顾问的顺序设置为高于ToolCallAdvisor使其在循环内部执行varmemoryAdvisorMessageChatMemoryAdvisor.builder(chatMemory).order(ToolCallAdvisor.DEFAULT_ORDER1)// 关键放在ToolCallAdvisor之后.build();varchatClientChatClient.builder(chatModel).defaultAdvisors(memoryAdvisor,newToolCallAdvisor()).build();Spring AI 2.0中当检测到记忆顾问在循环内部时ToolCallAdvisor会自动禁用其内部对话历史避免重复写入。支持完整工具消息持久化的内置存储包括InMemoryChatMemoryRepository、RedisChatMemoryRepository和Neo4jChatMemoryRepository。四、LangChain实践工具调用与编排如果说Spring AI是Java生态的“正规军”那么LangChain就是Python生态的“特种部队”。LangChain的Agent框架同样提供了完善的工具调用能力。4.1 工具定义与注册LangChain中工具通过继承BaseTool类或使用tool装饰器定义fromlangchain.toolsimportBaseToolfromtypingimportType,OptionalfrompydanticimportBaseModel,FieldimportrequestsclassAPITestInput(BaseModel):endpoint:strField(descriptionAPI端点地址)method:strField(descriptionHTTP方法如GET、POST)payload:Optional[dict]Field(None,description请求体)expected_status:intField(200,description期望的状态码)classAPITestTool(BaseTool):nameapi_test_tooldescription执行API测试并验证响应args_schema:Type[BaseModel]APITestInputdef_run(self,endpoint:str,method:str,payload:dictNone,expected_status:int200):同步执行try:ifmethod.upper()GET:responserequests.get(endpoint,paramspayload)elifmethod.upper()POST:responserequests.post(endpoint,jsonpayload)else:return{error:f不支持的HTTP方法:{method}}successresponse.status_codeexpected_statusreturn{success:success,status_code:response.status_code,response_body:response.json()ifresponse.contentelseNone,message:f状态码验证{通过ifsuccesselse失败}}exceptExceptionase:return{error:fAPI测试异常:{str(e)}}asyncdef_arun(self,endpoint:str,method:str,payload:dictNone,expected_status:int200):异步执行returnself._run(endpoint,method,payload,expected_status)4.2 Agent构建与执行使用ReAct模式构建Agent通过create_react_agent和AgentExecutor完成编排fromlangchain.agentsimportAgentExecutor,create_react_agentfromlangchain_openaiimportChatOpenAIfromlangchain.promptsimportPromptTemplatefromlangchain.memoryimportConversationBufferMemory# 测试Agent专用Prompt——注入测试工程师的思维链TEST_AGENT_PROMPTPromptTemplate.from_template(你是一名资深自动化测试工程师。请按以下步骤执行任务 1. **需求分析**理解测试目标识别测试类型 2. **环境检查**确认测试环境可用性 3. **测试设计**设计测试场景考虑边界条件 4. **工具选择**选择合适的测试工具 5. **执行验证**执行测试并验证结果 6. **结果分析**给出结论和建议 当前任务{input} 可用工具{tools} {agent_scratchpad})# 初始化LLM温度设为0.1保证测试结果的确定性llmChatOpenAI(modelgpt-4-turbo,temperature0.1)# 构建工具集tools[APITestTool(),UITestTool(),DBValidationTool()]# 创建Agentagentcreate_react_agent(llmllm,toolstools,promptTEST_AGENT_PROMPT)# 创建执行器带记忆agent_executorAgentExecutor(agentagent,toolstools,memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue),verboseTrue,handle_parsing_errorsTrue,max_iterations10# 防止无限循环)# 执行测试任务resultagent_executor.invoke({input:测试用户登录流程使用test_userexample.com登录系统验证登录成功后跳转到首页})4.3 企业级增强并发执行与自愈生产环境中Agent往往需要处理批量任务。LangChain结合concurrent.futures可实现并发执行fromconcurrent.futuresimportThreadPoolExecutor,as_completedclassConcurrentTestRunner:def__init__(self,agent_executor,max_workers5):self.executorThreadPoolExecutor(max_workersmax_workers)self.agentagent_executordefrun_concurrent_tests(self,test_cases):futures{}fortest_caseintest_cases:futureself.executor.submit(self.agent.invoke,{input:f执行测试{test_case[description]}})futures[future]test_case[id]results[]forfutureinas_completed(futures):test_idfutures[future]try:resultfuture.result(timeout60)results.append({test_id:test_id,result:result})exceptExceptionase:results.append({test_id:test_id,error:str(e)})returnresults五、最佳实践与避坑指南5.1 终止条件是生命线递归顾问和Agent循环如果没有明确的终止条件可能造成无限调用既消耗大量Token费用又可能导致系统宕机。务必设置max_iterations最大迭代次数Spring AI中需在自定义顾问中实现LangChain的AgentExecutor默认支持maxRepeatAttempts结构化输出验证的最大重试次数5.2 工具数量爆炸渐进式披露当工具数量超过30个将所有工具定义一次性塞入上下文会引发上下文膨胀、准确率下降、Token成本飙升三大问题。Spring AI 2.0提供了ToolSearchToolCallingAdvisor通过渐进式工具披露解决该问题初始只暴露一个toolSearch工具LLM通过自然语言查询按需获取相关工具定义再执行后续调用。实测可减少34-64%的Token消耗。启用方式spring.ai.chat.client.tool-search-advisor.enabledtrue spring.ai.chat.client.tool-search-advisor.tool-index-typevector5.3 可观测性别等出问题才后悔生产环境的Agent调用链往往包含多次LLM调用和工具执行没有链路追踪几乎无法排查问题。建议记录每次工具调用的输入参数、输出结果、耗时使用Spring AI的Micrometer集成或LangSmith进行全链路追踪设置关键告警工具调用失败率、平均迭代次数、Token消耗速率六、总结与展望Agent的本质是让LLM从“思考者”进化为“行动者”。无论是Spring AI的ToolCallAdvisor递归循环还是LangChain的ReAct Agent框架核心都围绕着同一套逻辑理解意图 → 调用工具 → 处理结果 → 迭代决策。随着Spring AI 2.0将工具调用提升为顾问链中的一等公民并引入渐进式工具披露、MCP协议集成等企业级特性Java生态在AI工程化领域的竞争力正在快速追赶。而LangChain凭借丰富的生态和灵活的Python表达力依然是快速验证和原型开发的首选。选择框架是战术问题理解“工具编排”的设计哲学才是战略问题。无论你使用哪套技术栈清晰的分层架构、可靠的终止条件、完善的可观测性才是企业级Agent落地的三大基石。未来的Agent将不再是单打独斗的“孤勇者”而是通过MCP等协议实现跨系统、跨组织、跨语言的协作网络。而这正是AI从“对话工具”走向“数字生产力”的必经之路。