型AI Agent:原理、工具調(diào)用與并發(fā)實戰(zhàn))
寫了五年Java天天跟Spring Boot、MySQL、Redis打交道突然看到滿屏的AI Agent第一反應大概率是這玩意兒是不是又得轉(zhuǎn)Python說實話不用。2025年再回頭看Java生態(tài)里做AI Agent的路已經(jīng)非常成熟了Spring官方下場做了Spring AI社區(qū)也有LangChain4j這類像樣的框架加上Java 21虛擬線程對高并發(fā)IO場景的天然優(yōu)勢Java工程師轉(zhuǎn)型AI Agent不僅可行甚至在某些場景下比Python更順。這篇東西不搞虛的從原理講到代碼落地再到并發(fā)方案和轉(zhuǎn)型路線全是實操視角。內(nèi)容主要圍繞一個核心問題一個只會Java的普通后端工程師怎么把手里的訂單系統(tǒng)、客服系統(tǒng)改造成帶Agent能力的服務并且能扛住生產(chǎn)流量。會看懂原理、寫得出代碼、能部署上線、知道坑在哪。1. 先搞懂AI Agent的原理它就是會自己調(diào)工具的Service不要被Agent這個名詞唬住。拆開來看它的本質(zhì)就是一層帶有規(guī)劃和調(diào)用能力的服務層。Java后端里天天寫的Service是接收參數(shù)、執(zhí)行邏輯、返回結(jié)果Agent在此基礎上多了一個理解和決策的環(huán)節(jié)——它先理解你說了什么再決定調(diào)用哪個方法最后把結(jié)果整理成回答。差別就這里。1.1 用JVM的視角重新認識Agent如果非要用一句Java能聽懂的話概括AI Agent那就是一個能根據(jù)用戶輸入、動態(tài)選擇并調(diào)用不同Bean方法的門面服務。傳統(tǒng)寫法是前端調(diào)Controller、Controller調(diào)Service路由是寫死的。Agent寫法則不一樣路由由大模型決定。你有一個查訂單的Tool方法、一個查庫存的Tool方法、一個生成優(yōu)惠券的Tool方法模型根據(jù)用戶的話自己選該調(diào)哪個。這個選擇的動作在技術上叫Function Calling或Tool Calling。這里有個關鍵點模型本身不執(zhí)行代碼它只是生成一個結(jié)構(gòu)化的調(diào)用請求真正的執(zhí)行權(quán)還是在你寫的Java方法里。換句話說模型是大腦你的Java方法是手和腳兩者通過JSON協(xié)議通信。搞懂這層關系Java工程師心里就有底了——核心的業(yè)務邏輯、數(shù)據(jù)校驗、事務控制、權(quán)限判斷全都還是你說了算模型只是幫你做了路由分發(fā)。1.2 Agent和傳統(tǒng)接口調(diào)用到底差在哪傳統(tǒng)接口調(diào)用是確定性行為客戶端發(fā)什么參數(shù)我返回什么結(jié)果全鏈路可預期。Agent則引入了概率模型同樣的用戶問題模型這次選擇調(diào)ToolA下次可能就選ToolB結(jié)果存在不確定性。用電商客服場景舉例。傳統(tǒng)客服接口是這樣的流程請求帶userId和orderId后端直接查庫返回狀態(tài)邏輯固定。Agent化之后用戶可能會說幫我查一下我最近一個訂單到哪了——這句請求里沒有orderId甚至沒有明確說查訂單但模型能理解用戶意圖先從用戶上下文里找到orderId再調(diào)用查詢工具最后組裝成自然語言回復。這一步意圖到參數(shù)的轉(zhuǎn)換是傳統(tǒng)接口完全不具備的。再往深一層說Agent的核心能力不是對話是任務拆解。復雜任務會被模型拆成多步每一步可能調(diào)用不同工具中間還有失敗重試和分支判斷。設計Agent的時候你要把它當作一個由模型驅(qū)動的狀態(tài)機來看待每個狀態(tài)對應一個Tool調(diào)用狀態(tài)之間由模型決策流轉(zhuǎn)。帶著這種思維去做比只看Prompt怎么寫的人高一個段位。1.3 Java工程師最容易誤解的三個概念第一個誤解Agent就是寫個很長的Prompt。Prompt確實重要但只有Prompt并不能讓系統(tǒng)具備穩(wěn)定的工具調(diào)用能力。真正讓Agent跑起來的是模型對工具的定義和調(diào)用約束Prompt只是引導不是核心。第二個誤解Agent就是大模型聊天。對話只是交互形態(tài)底層是推理加工具調(diào)用的循環(huán)。如果產(chǎn)品只是聊天不需要Agent架構(gòu)直接調(diào)接口就好。Agent的價值在于它能把聊天轉(zhuǎn)化成真實業(yè)務動作。第三個誤解Agent必須用Python寫。這個最坑。很多Java工程師被Python生態(tài)的LangChain教程勸退實際上工具調(diào)用、記憶管理、多輪對話這些能力Java生態(tài)里全都有而且對于以Spring Boot為核心的企業(yè)級應用來說嵌在原有系統(tǒng)里做Agent比另起一套Python服務省事得多。尤其是涉及事務、權(quán)限、老系統(tǒng)對接時Java天然占據(jù)優(yōu)勢。2. 技術選型解析Spring AI和LangChain4j怎么選選了Java方向之后下一步就是選框架。目前Java生態(tài)里做Agent有兩條主線Spring官方出品的Spring AI以及社區(qū)驅(qū)動的LangChain4j。兩條我都在項目里實際用過各有脾氣。2.1 Spring AISpring官方下場省心但還在快速迭代Spring AI是Spring官方推出的AI集成項目目標很明確把大模型接入變成Spring Boot的常規(guī)操作。它的核心價值在于統(tǒng)一抽象對接OpenAI、通義千問、Ollama、Azure OpenAI等各種模型提供商接口風格和Spring Data系列保持一致。我偏愛它的一個點是工具調(diào)用寫法非常原生。定義一個方法加上Tool注解ChatClient就能自動把方法暴露給模型。這意味著不用額外學習和維護一套工具描述體系方法簽名、注釋、參數(shù)定義直接轉(zhuǎn)化為模型可識別的工具定義。對于業(yè)務代碼量大的Java項目這種侵入性很小的集成方式是很有吸引力的。不過實話說Spring AI目前版本迭代很快API有過調(diào)整。如果你計劃在生產(chǎn)環(huán)境使用要鎖定版本不要盲目跟隨最新快照。另外它的生態(tài)組件還在充實中某些高級特性比如復雜的多Agent編排不如Python生態(tài)豐富但常規(guī)單Agent場景、工具調(diào)用、RAG檢索增強已經(jīng)夠用了。2.2 LangChain4j功能多樣但要做好封裝LangChain4j是社區(qū)項目目標是彌補Java生態(tài)在LLM應用開發(fā)上的空白。它的功能覆蓋面廣從多輪對話、工具調(diào)用、RAG到內(nèi)存管理都有結(jié)構(gòu)上更接近Python的LangChain但有明顯的Java風格。這個框架靈活度高適合Agent場景的定制。比如它的Tool Provider機制可以動態(tài)把Spring容器里的Bean暴露給模型支持自定義工具描述權(quán)限控制也好做。我在做一個多租戶Agent項目時用LangChain4j實現(xiàn)了按租戶維度動態(tài)下發(fā)不同工具的方案效果不錯。但它的問題是資料少、社區(qū)規(guī)模不如Spring AI增長快遇到奇怪的坑只能看源碼。選它需要團隊有啃源碼的能力遇到框架層面的Bug不至于被卡死。2.3 選型建議什么場景選什么我的建議是分情況討論。如果項目是Spring Boot 3 JDK 17以上并且想快速接入Agent能力團隊對Spring生態(tài)熟悉Spring AI是當前最舒服的選擇官方支持帶來的安全感很重要。如果項目需要深度定制的Agent編排、復雜的RAG流程或者想借鑒Python生態(tài)里LangChain的成熟思維LangChain4j更合適。團隊里需要有一個愿意研究源碼的人兜底。如果項目其實很簡單就是給內(nèi)部系統(tǒng)加一個能調(diào)用工具的智能助手也可以不上框架直接用HTTP客戶端模型加JSON Schema解析自己實現(xiàn)工具調(diào)度。它有優(yōu)勢——沒有框架依賴邏輯全在掌控中排查問題容易。缺點是重復造輪子對話管理、工具描述、錯誤處理全要自己寫適合Agent交互不復雜、工具數(shù)量少的場景。2.4 不用框架裸寫到底可行不可行順帶把裸寫方案說透。核心邏輯并不復雜發(fā)起請求攜帶工具定義列表模型返回一個包含工具調(diào)用指令的消息結(jié)構(gòu)你解析出函數(shù)名和參數(shù)反射調(diào)用對應方法把結(jié)果再發(fā)回模型循環(huán)直到模型不再請求調(diào)用工具。這一步的難點在于對話歷史的維護。工具調(diào)用的中間結(jié)果必須按正確的消息角色插回上下文一旦角色混淆比如把工具結(jié)果當成用戶消息模型可能就會產(chǎn)生幻覺。框架幫你處理了這部分枯燥且容易錯的工作裸寫等于自己維護一套簡易協(xié)議。我的經(jīng)驗是五六個工具以內(nèi)的項目可以裸寫練手理解原理超過十個工具老老實實用框架維護成本是天壤之別。3. 從零到一Java版Agent的完整落地套路理解了原理下面進入寫代碼階段。我用Spring AI為例因為它在Spring Boot項目里集成最簡單一步步拆開給各位看。整個落地路徑是建工程、配模型、定義工具、加記憶、暴露接口。3.1 五分鐘搭建基礎工程先建一個標準的Spring Boot項目JDK建議17以上。Maven依賴直接引入Spring AI的Starter以OpenAI兼容協(xié)議為例dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId version1.0.0/version /dependency配置文件中填入模型地址和API Key。這里有一個對國內(nèi)團隊很實用的點Spring AI支持配置自定義Base URL所以無論用的是OpenAI官方、Azure還是國產(chǎn)模型服務只要協(xié)議兼容都能無縫接入spring: ai: openai: base-url: https://your-model-endpoint api-key: ${AI_API_KEY} chat: options: model: gpt-4o-mini接著注入ChatClient。這是Spring AI里的核心門面它把請求構(gòu)造、工具注冊、響應解析都封裝好了RestController RequestMapping(/agent) public class AgentController { private final ChatClient chatClient; public AgentController(ChatClient.Builder builder) { this.chatClient builder .defaultSystem(你是客服助手回答盡量簡潔最多兩句話。) .build(); } PostMapping(/chat) public String chat(RequestBody String message) { return chatClient.prompt() .user(message) .call() .content(); } }到這一步一個能對話的接口就通了。但要成為Agent還差最關鍵的一步讓模型能調(diào)用你自己的業(yè)務方法。3.2 核心一步讓大模型學會調(diào)用你的Java方法Spring AI的工具調(diào)用實現(xiàn)非常Java——寫一個普通組件方法加Tool注解然后通過ChatClient的tools方法注冊。例如把一個查訂單狀態(tài)的Service方法暴露給模型Component public class OrderAgentTools { Tool(description 根據(jù)訂單號查詢訂單物流狀態(tài)) public String queryOrderStatus(String orderId) { // 這里直接查自己系統(tǒng)的訂單表 return 訂單 orderId 已發(fā)貨當前位于杭州轉(zhuǎn)運中心; } Tool(description 根據(jù)用戶ID查詢最近一筆訂單號) public String getRecentOrderId(Long userId) { return 20250115001; } }注意description一定要寫清楚因為模型就是靠這個描述決定什么時候調(diào)這個方法的。描述寫得模糊模型就會在錯誤的場景調(diào)用它。然后注入到Controller里public AgentController(ChatClient.Builder builder, OrderAgentTools tools) { this.chatClient builder .defaultSystem(你是客服助手回答盡量簡潔。) .tools(tools) // 注冊工具 .build(); }這時再發(fā)幫我看看最近訂單到哪了模型會自動先調(diào)用getRecentOrderId拿到訂單號再調(diào)用queryOrderStatus查詢物流最后拼接成一段自然的回復返回。整個過程是模型自主決策完成的你的Java代碼只負責接收參數(shù)、執(zhí)行、返回結(jié)果。這里要提醒一個細節(jié)工具方法的入?yún)㈩愋汀⒎祷刂底詈檬呛唵晤愋突蛘吣鼙籎ackson正常序列化的對象。復雜嵌套對象雖然能用但模型生成對應JSON參數(shù)的準確率會下降。能拆成簡單參數(shù)就拆拆不了就設計一個扁平DTO。3.3 給Agent加上記憶會話級上下文管理默認情況下Agent是無記憶的每次請求都是全新的上下文。要實現(xiàn)多輪對話得把歷史消息傳回去。最簡單的方案是前端每次把歷史消息都傳過來。但這樣有幾個問題一是消息體越來越大二是會話狀態(tài)完全依賴客戶端不安全。正規(guī)做法是服務端管理會話。我常用Redis存儲消息歷史以會話ID為Key每次請求來了先取出歷史拼進Prompt再調(diào)用模型最后把新一輪的問答追加回去。用Spring AI可以這樣實現(xiàn)Service public class ChatSessionService { Autowired private StringRedisTemplate redis; public String chat(String sessionId, String userMessage) { String history redis.opsForValue().get(session: sessionId); ListMessage messages parseHistory(history); // 解析歷史JSON ChatClient client buildClientWithTools(); String answer client.prompt() .messages(messages) .user(userMessage) .call() .content(); saveHistory(sessionId, userMessage, answer); return answer; } }存儲時需要注意消息角色的正確性用戶消息標user模型回復標assistant工具調(diào)用結(jié)果標tool角色錯亂會讓模型產(chǎn)生幻覺。另外要給會話設置過期時間比如30分鐘無交互就清理Redis中的歷史避免存儲無限膨脹。3.4 一個能處理真實業(yè)務流的完整例子把前面所有東西串起來實現(xiàn)一個帶完整業(yè)務流的客服Agent。它的任務是用戶咨詢訂單問題Agent自動查庫、判斷問題類型、必要時發(fā)送售后處理結(jié)果。核心Controller我按生產(chǎn)標準來寫增加了錯誤兜底RestController RequestMapping(/api/agent/customer) public class CustomerServiceAgentController { private final ChatClient chatClient; private final OrderAgentTools orderTools; private final RefundAgentTools refundTools; public CustomerServiceAgentController(ChatClient.Builder builder, OrderAgentTools orderTools, RefundAgentTools refundTools) { this.orderTools orderTools; this.refundTools refundTools; this.chatClient builder .defaultSystem(你是電商售后客服先查訂單再回答不要編造信息。) .tools(orderTools, refundTools) .build(); } PostMapping(/chat) public ResponseEntityAgentResponse chat(RequestBody AgentChatRequest req) { try { String answer chatClient.prompt() .user(req.message()) .call() .content(); return ResponseEntity.ok(new AgentResponse(answer)); } catch (Exception e) { // 模型調(diào)用失敗時至少給用戶一個兜底回復 return ResponseEntity.ok(new AgentResponse(系統(tǒng)繁忙請稍后再試)); } } }這個例子里幾十行代碼就實現(xiàn)了一個能查訂單、能處理售后、能用自然語言回復的Agent接口。它和你系統(tǒng)里原有的訂單服務、售后系統(tǒng)全部打通模型只做解析和路由真正干活的還是那些已經(jīng)在生產(chǎn)環(huán)境穩(wěn)定運行的Java方法。這就是Java工程師做Agent的優(yōu)勢所在你不用把業(yè)務邏輯重寫一遍只需要封裝成Tool暴露出去就行。4. 實戰(zhàn)硬仗AI Agent到底怎么扛并發(fā)熱搜里AI Agent怎么扛并發(fā)被問得最多這個問題確實要專門拆開講。Agent服務有一個很多后端工程師容易踩的認知誤區(qū)就是拿傳統(tǒng)的CPU密集型并發(fā)思路去設計它。實際上Agent的調(diào)用鏈路是IO密集型的瓶頸在網(wǎng)絡往返和大模型推理耗時而不是JVM的計算能力。4.1 先搞清楚瓶頸在哪一次Agent請求的耗時分布大致是這樣的請求進入JVM準備上下文和工具定義然后發(fā)起外部模型API調(diào)用這一步通常要等1到5秒模型返回后可能還要二次調(diào)用工具、再把工具結(jié)果發(fā)回模型又是一次1到5秒的等待。算下來一次完整的Agent請求JVM在線程上等待外部IO的時間可能占到90%以上。這意味著如果你用傳統(tǒng)的Tomcat線程池一個請求占著一個線程線程大部分時間在空等。假設Tomcat最大線程數(shù)200每個Agent請求平均耗時3秒那么這個服務最多只能支撐每秒幾十個請求性能上不去線程資源卻大量浪費。4.2 無狀態(tài)化設計是并發(fā)的前提扛并發(fā)的第一件事是讓Agent服務無狀態(tài)化。前面提到會話記憶不能把歷史消息存在本地內(nèi)存里因為多個實例負載均衡之后請求打到不同機器就找不到上下文了。會話狀態(tài)必須放到Redis這類外部存儲中Agent實例本身保持無狀態(tài)隨時可以水平擴容。具體實施時要保證所有可變狀態(tài)都在Redis里包括會話歷史、工具調(diào)用的中間結(jié)果、上下文變量。Agent實例只負責計算和IO調(diào)用不持有任何和某個用戶強相關的本地狀態(tài)。這招做扎實了后續(xù)擴容就是加實例數(shù)量的事并發(fā)能力直接翻倍。4.3 虛擬線程還是響應式編程JDK 21的虛擬線程對Agent場景是重大利好。虛擬線程極其輕量你可以為每個請求創(chuàng)建一個虛擬線程阻塞在外部模型調(diào)用上時底層載體線程自動讓出去執(zhí)行其他任務。這意味著即使同時有上萬個Agent請求在等待模型回復你也不需要配置上萬條載體線程JVM自己能調(diào)度好。我在一個生產(chǎn)項目里做過對比同樣的Agent服務從普通線程池切換到虛擬線程在50并發(fā)、單請求3秒的壓測場景下吞吐量提升接近十倍P99延遲也降了一半。配置方式極其簡單Spring Boot中只要設置spring.threads.virtual.enabledtrue應用代碼不用改一行。這是Java做Agent對比Python生態(tài)的一個隱性優(yōu)勢Python的異步方案寫起來要改整個調(diào)用鏈Java這邊虛擬線程幾乎無感。如果你不想用虛擬線程也可以用WebFlux走響應式路線但響應式編程對團隊要求高調(diào)試困難代碼可讀性差。我的建議是能上虛擬線程就上虛擬線程簡單粗暴坑少。4.4 緩存、限流與兜底缺一不可Agent服務的成本高在每次調(diào)用都走大模型API而且并發(fā)高了之后外部模型服務也會限流。所以生產(chǎn)環(huán)境必須做三層保護。第一層是緩存。對于高頻的、確定的問答比如常見問題、固定業(yè)務的查詢在Redis里做結(jié)果緩存。用戶問了同樣的問題直接返回緩存內(nèi)容不走模型。值得說明的是我自己實測的結(jié)果是語義完全一致的重復問題占比通常是相當高的尤其是在客服、內(nèi)部運維場景緩存命中率能達到30%以上成本能省不少。緩存時要注意帶上工具調(diào)用的上下文標識避免把不同業(yè)務域的結(jié)果串了。第二層是限流。對外部模型的調(diào)用要加客戶端限流防止突發(fā)流量打爆模型服務的配額。用Resilience4j或者RedisLua都能實現(xiàn)我習慣用Resilience4j的RateLimiter配置簡單和Spring Boot集成也好。第三層是兜底。模型調(diào)用必然會偶發(fā)超時、限流、返回異常一定要做重試和熔斷降級。重試要注意指數(shù)退避不能一失敗就立刻重試否則會把模型服務打得更慘。熔斷是當連續(xù)失敗超過閾值短時間內(nèi)直接走降級邏輯返回預設的提示信息保護下游也保護自己。4.5 壓測參數(shù)與調(diào)優(yōu)經(jīng)驗簡單分享一下實踐中的壓測數(shù)據(jù)和調(diào)優(yōu)思路。在某項目里Agent服務部署兩節(jié)點JDK 21虛擬線程模式模型接口單次調(diào)用平均2.5秒。用100并發(fā)持續(xù)壓測5分鐘結(jié)果是這樣的指標優(yōu)化前默認線程池200優(yōu)化后虛擬線程吞吐量 QPS35190P99 延遲8.2s3.8s線程池耗盡次數(shù)頻繁無外部模型限流觸發(fā)經(jīng)常極少調(diào)優(yōu)的關鍵動作很簡單先確認瓶頸是線程等待而非CPU計算然后切換虛擬線程同時把模型超時時間設短一點比如10秒快速失敗讓用戶盡快得到響應。緩存和限流做在前面給模型服務減壓。這套組合拳打下來生產(chǎn)環(huán)境跑得穩(wěn)。5. Java工程師轉(zhuǎn)型AI Agent的學習路線與避坑實錄最后聊轉(zhuǎn)型路徑。很多Java工程師問我怎么入行AI Agent是先把機器學習數(shù)學補一遍還是先學Python我給的答案始終是直接做項目在項目中反向補知識。Agent開發(fā)本質(zhì)是工程問題不是算法問題。但基礎概念也不能完全不碰下面給出三階段路線和踩坑實錄。5.1 三階段學習路線第一階段是搞懂最小必要原理不需要啃數(shù)學公式。要理解大模型是怎么生成的Token預測、什么是上下文窗口、什么是溫度參數(shù)、什么是嵌入向量。這些概念不需要推導公式只需要能用直覺描述清楚就行。能說清楚模型是根據(jù)概率生成下一個字的人比會背Transformer論文的更適合做Agent工程。第二階段是掌握框架用法。Spring AI或LangChain4j選一個深入進去從調(diào)用模型接口開始再到工具調(diào)用再到帶記憶的多輪對話最后做一個完整的RAG檢索項目。這階段的核心目標是打通整條鏈路踩一遍API設計的坑建立起模型調(diào)用是有失敗率的這個工程意識。第三階段是往生產(chǎn)級靠攏。關注可觀測性Agent的調(diào)用日志、Token消耗統(tǒng)計、工具調(diào)用鏈追蹤、并發(fā)優(yōu)化、成本控制、評估體系。這個階段要建立的是工程化思維讓Agent系統(tǒng)從能跑變成能長期穩(wěn)定跑。5.2 必備知識清單整理一下做Agent開發(fā)真正會用到的基礎知識按重要性排列如下知識模塊為什么需要學習深度Prompt工程決定Agent行為邊界和輸出質(zhì)量精通反復實踐Function Calling協(xié)議理解模型如何選擇工具熟練掌握向量檢索基礎RAG場景必備做知識庫問答必用理解原理會調(diào)庫上下文窗口意識控制Token用量避免上下文溢出熟悉成本模型結(jié)構(gòu)化輸出解析模型輸出不穩(wěn)定時的兜底手段實踐出真知有一個東西我單獨拿出來說評估體系。傳統(tǒng)開發(fā)你知道Bug是什么Agent開發(fā)里模型答錯了到底算Bug還是算概率事件我在項目里建了一套評估集固定幾百條測試問題每次修改Prompt或者調(diào)整工具定義就把評估集跑一遍對比回答正確率。沒有這套機制你根本沒法判斷這次改動是變好了還是變差了。這是Agent工程和傳統(tǒng)工程最大的區(qū)別一定要盡早建立。5.3 典型問題排查實錄轉(zhuǎn)型過程中必然會遇到各種問題把最常見的幾個列出來按風險從高到低排第一個問題是模型輸出JSON不穩(wěn)定。工具調(diào)用依賴模型返回結(jié)構(gòu)化的JSON但模型偶爾會輸出多余的前綴文字或者截斷。解決辦法是使用模型服務商提供的強制JSON模式并在代碼里做容錯解析失敗時告訴模型重新生成或進入人工兜底。第二個問題是工具調(diào)用死循環(huán)。模型在特定場景下會反復調(diào)用同一個工具或者多個工具來回調(diào)用停不下來。解決辦法是設置最大迭代次數(shù)Spring AI里可以配置ChatClient的最大工具調(diào)用輪數(shù)。還要在工具返回結(jié)果里加入足夠明確的信息讓模型知道任務已經(jīng)完成。我遇到過連續(xù)七次調(diào)用同一個查詢工具的情況加了迭代上限和結(jié)果明確性之后就解決了。第三個問題是長對話上下文膨脹。對話輪數(shù)多了之后歷史消息全塞進上下文Token費用上漲模型響應變慢甚至超出上下文窗口。解決辦法是摘要壓縮把早期對話用模型總結(jié)成一段摘要代替完整歷史或者做滑動窗口只保留最近N輪對話。生產(chǎn)環(huán)境我用的是兩步走對30分鐘內(nèi)的對話做滑動窗口保留最近十輪更早的內(nèi)容生成摘要存儲效果和成本之間比較平衡。第四個問題是工具描述與業(yè)務錯位。工具描述寫得太寬泛模型就在不該調(diào)用的時候調(diào)用了。比如查詢訂單工具描述寫查詢用戶訂單信息用戶咨詢售后政策時模型也可能去調(diào)它。解決方式是嚴格限定觸發(fā)條件在description里寫清楚僅當用戶明確提供訂單號且詢問物流或狀態(tài)時調(diào)用其他咨詢請直接回復。這一步需要在實際使用中反復打磨描述寫到位了工具調(diào)用的準確率能提升一大截。5.4 轉(zhuǎn)型期心態(tài)建設最后說一點經(jīng)驗層面的東西。Java工程師轉(zhuǎn)型AI Agent最大的障礙不是技術而是思維慣性。傳統(tǒng)后端追求的是確定性每一個分支都可預測每一個異常都有明確的處理方案。Agent開發(fā)需要接受不確定性接受模型會犯錯接受同樣的輸入可能得到不同的輸出。我見過兩個轉(zhuǎn)型風格的團隊。一個團隊把Agent當傳統(tǒng)接口寫要求模型輸出必須100%可解析任何不確定性都被當成Bug去堵結(jié)果項目推進異常艱難。另一個團隊接受概率思維把重點放在兜底、重試、評估和灰度上系統(tǒng)設計上留出容錯空間結(jié)果反而穩(wěn)定得多。Agent系統(tǒng)的穩(wěn)定靠的不是消滅不確定性而是用工程手段管理不確定性。把這句話想通了轉(zhuǎn)型路上會少很多內(nèi)耗。另外如果只是個人學習或者小團隊探索不要一上來就做大而全的Agent平臺。先挑一個具體的、有明確痛點的業(yè)務場景比如工單自動分類、知識庫問答、訂單查詢助手三四天時間做一個能用的最小版本跑給真實用戶看。有了真實反饋有了線上數(shù)據(jù)你才會真正理解Agent應該在哪個環(huán)節(jié)介入、在哪一步引入人工兜底。這種體驗和看教程完全是兩回事。做完一個小項目再去接更復雜的需求往前走的信心自然就有了。