:從原理到代碼,打造會做事的AI)
智能體Agent到底是個啥東西我直接說結(jié)論智能體不是一個神秘的技術(shù)黑盒而是“大模型 記憶 工具 自主決策循環(huán)”的組合體。它跟普通的聊天機器人最大的區(qū)別就三個字——會做事。你問ChatGPT“明天深圳天氣怎么樣”它給你一段文字你問一個Agent同樣的問題它自己去查天氣接口、比對數(shù)據(jù)、組織語言、甚至幫你把加衣提醒推到手機里。這一來一回的差異就是Agent存在的意義。這篇文章不堆概念我會用一套完整的實操視角來拆解智能體它跟普通AI程序的分界線在哪里、核心組件是什么、一個最小可用的Agent怎么搭起來、跑起來會踩哪些坑。適合剛開始接觸AI開發(fā)、想搞清楚“Agent到底能不能落地”的人也適合已經(jīng)在做LLM應(yīng)用、但總覺得“差點火候”的開發(fā)者。1. 智能體和聊天機器人的本質(zhì)區(qū)別在哪里很多教程喜歡說“Agent LLM 記憶 工具”這句話沒錯但太粗了。真正決定一個東西是不是智能體的不是它用了多大的模型而是它有沒有“行動”的能力。1.1 從“說話”到“做事”的跨越普通聊天機器人的工作流程是輸入 → 模型生成 → 輸出文字。它是一個封閉回路模型既看不到外界也改變不了外界。你讓它“幫我定個明天早上的鬧鐘”它只能給你一段“好的我記住了”的假話因為它根本沒有能力碰你手機里的時鐘App。開發(fā)者想要欺騙這種局限最常見的做法是把功能硬編碼進對話里比如識別到“鬧鐘”關(guān)鍵詞就彈個確認(rèn)按鈕。這就是一種偽智能——所有的“能力”都是預(yù)先寫好的規(guī)則模型只是在做關(guān)鍵詞匹配。Agent不一樣。它把“生成文字”拆成了“思考”和“執(zhí)行”兩個環(huán)節(jié)。模型先分析你的意圖把它轉(zhuǎn)成一個結(jié)構(gòu)化的行動指令比如“調(diào)用系統(tǒng)鬧鐘App設(shè)定早上7:00響鈴”。然后Agent框架接管真正去執(zhí)行這個指令再把執(zhí)行結(jié)果喂回給模型讓模型決定下一步怎么做。這個“行動—觀察—再決策”的循環(huán)才是智能體的核心也是它和聊天機器人之間那堵看不見的墻。1.2 自主性才是靈魂剛才說的鬧鐘例子其實還只是“工具調(diào)用”很多框架不調(diào)用工具也能做。真正讓Agent從“工具”升級為“智能體”的是自主性。我用一個生活里的場景來說。你去餐廳吃飯跟服務(wù)員說“來一份招牌套餐”服務(wù)員只需要把菜單遞給后廚——這是工具調(diào)用型Agent。但如果你說“幫我安排一頓適合父母50歲壽宴的晚餐”服務(wù)員要自己定預(yù)算、選菜系、考慮長輩口味、訂座位、算時間——這是自主決策型Agent。落到技術(shù)層面自主性體現(xiàn)在Agent能自己拆解目標(biāo)。它不會等你把每一步都告訴它而是把一個大任務(wù)分解成若干子任務(wù)然后為每個子任務(wù)選擇合適的工具、合適的執(zhí)行順序甚至在執(zhí)行失敗時自己換一套方案重試。這種能力來自大模型本身具備的規(guī)劃能力再加上Agent框架提供的“反思”和“修正”機制。一句話總結(jié)聊天機器人是“張嘴就來”Agent是“想好了再干干完回頭看”。2. 智能體的核心組件拆解一個可用的Agent最少需要五個部分。少一個它就退化成聊天機器人或者一個普通腳本。我按重要程度逐個拆。2.1 大腦大模型的角色不只是“聊天”Agent里的大模型承擔(dān)的是決策中樞的工作而不是一個話癆。它要做的事情包括理解用戶請求、分析當(dāng)前狀態(tài)、選擇合適的工具、生成行動參數(shù)、判斷行動結(jié)果、決定是否繼續(xù)。這個角色對模型的推理能力要求明顯高于純聊天場景——你在選型時不能只看模型在排行榜上的分?jǐn)?shù)還要看它在“多輪工具調(diào)用”場景下的穩(wěn)定性。我拿一個實際案例來對比。某次我用一個輕量模型搭A(yù)gent讓它處理“幫我把這個表格里的重復(fù)數(shù)據(jù)清理掉”這個任務(wù)。它第一步對了識別出需要打開表格工具但在第二步就亂了——它輸出了一個完全不存在的函數(shù)名把“清理重復(fù)數(shù)據(jù)”錯誤地翻譯成了“排序”。換成推理能力更強的模型同一份數(shù)據(jù)、同一個框架它就能正確調(diào)用“數(shù)據(jù)去重”并返回處理后的結(jié)果。這就是為什么Agent項目里模型選型幾乎決定了整個項目的上限。2.2 記憶短期記憶和長期記憶是兩個存儲Agent的記憶機制分兩層。短期記憶相當(dāng)于工作臺。Agent在執(zhí)行任務(wù)的過程中需要不斷把中間狀態(tài)放進去當(dāng)前目標(biāo)是什么、已經(jīng)做了哪一步、下一步打算做什么、工具返回了什么結(jié)果。大多數(shù)Agent框架用“聊天歷史”承載短期記憶但這有個隱患模型有上下文窗口上限窗口滿了之后最早的信息會被擠掉導(dǎo)致Agent“忘記”任務(wù)最初的約束條件。實操里我見過最典型的一個場景用戶讓Agent“總結(jié)這份報告控制在300字以內(nèi)”Agent執(zhí)行到一半上下文溢出等它回來寫總結(jié)時早把“300字以內(nèi)”忘了輸出了2000字的全文摘要。長期記憶則負(fù)責(zé)跨會話的持久化。比如一個Agent助手記住了用戶的偏好“我喜歡早上九點開會”、歷史任務(wù)的結(jié)論、甚至用戶的說話風(fēng)格。長期記憶的實現(xiàn)方式通常是向量數(shù)據(jù)庫加Embedding先把文本轉(zhuǎn)成向量存進去需要時再做相似度檢索。這一層是智能體能不能“越用越懂你”的關(guān)鍵也是最容易被新手忽略的部分——很多人搭的Agent只能處理單次對話換個會話就失憶了。2.3 工具智能體的手和腳工具是Agent連接外部世界的接口。工具可以是函數(shù)、API、數(shù)據(jù)庫查詢、瀏覽器操作腳本、命令行指令甚至可以是另一個Agent。每一條工具定義通常包含三部分工具名稱、參數(shù)描述、執(zhí)行邏輯。Agent框架會把這些描述塞進系統(tǒng)提示詞里讓模型知道“你有什么工具可以用、分別怎么用”。這里有個關(guān)鍵細節(jié)工具描述的質(zhì)量直接影響調(diào)用準(zhǔn)確率。我見過太多人隨手寫工具描述比如“更新用戶信息”結(jié)果模型經(jīng)常在需要更新用戶地址的時候調(diào)用了別的工具。把描述改成“根據(jù)用戶ID更新用戶地址address字段只能用于修改收貨地址”之后調(diào)用準(zhǔn)確率肉眼可見地提升。你完全可以把它理解為給工具寫“上崗說明書”說明書越精確新員工模型犯錯的概率就越低。2.4 規(guī)劃器把大目標(biāo)拆成小步驟規(guī)劃器負(fù)責(zé)把一個大目標(biāo)拆成有序的子步驟。有的Agent用ReAct模式Reasoning and Acting邊推理邊行動每一步都基于上一步的結(jié)果生成下一步的思考有的用Plan-and-Execute模式先一次性生成完整計劃再逐條執(zhí)行還有的更復(fù)雜帶任務(wù)隊列和優(yōu)先級調(diào)度。實際場景里ReAct更適合任務(wù)步驟不明確、需要探索的場景Plan-and-Execute更適合步驟固定、可預(yù)測的流水線任務(wù)。這里要提一個實施細節(jié)規(guī)劃器不一定要用額外的代碼模塊實現(xiàn)。很多成熟的Agent框架直接靠大模型的提示詞完成規(guī)劃模型在每一輪先輸出“Thought思考、Action行動、Observation觀察結(jié)果”循環(huán)往復(fù)直到任務(wù)完成。這種模式簡單直接但缺點也很明顯——一旦模型陷入錯誤循環(huán)它可能在一件錯誤的事情上反復(fù)嘗試燒掉大量Token。所以現(xiàn)在越來越多的方案會在外部加一層“硬校驗”比如規(guī)定最大步數(shù)、超時自動終止、每個工具調(diào)用的參數(shù)做Schema校驗。外置校驗和價值判斷對穩(wěn)定性很重要別把安全托付給模型自覺。2.5 反饋循環(huán)把“做完了”變成“做好了”閉環(huán)的最后一個環(huán)節(jié)是反饋循環(huán)。Agent每次調(diào)用工具后會拿到一個結(jié)果它不急著交答案而是先“看一眼”結(jié)果是否符合預(yù)期。如果工具返回的數(shù)據(jù)格式不對、結(jié)果為空、或者明顯不合理Agent會重新調(diào)整參數(shù)再試一次或者換一個工具。這個“觀察—反思—調(diào)整”的過程是Agent質(zhì)量比普通腳本高一個檔次的原因。有一些比較講究的落地項目還會給Agent加一層“自我批評”讓模型對每一步的執(zhí)行結(jié)果打分低分就重跑。這種方式很耗Token但對那些“一步錯、步步錯”的復(fù)合任務(wù)很有幫助。你可以在自己的項目里做成可配置項讓用戶按需開關(guān)而不是一刀切強制開啟。3. 從零搭建一個最小可用的智能體理論說完了直接上手。我盡量用最少的依賴做出一個能跑起來的Agent你不需要任何高級的框架一個支持Function Calling的模型API就夠了。我們要做的事情是搭一個能查天氣、能算簡單數(shù)學(xué)的Agent讓它具備“自主決策該調(diào)用哪個工具”的能力。3.1 環(huán)境準(zhǔn)備選型邏輯我這里選Python環(huán)境因為生態(tài)最成熟。核心依賴只有一個openai官方SDK因為它的Function Calling機制是最典型的Agent工具調(diào)用范式其他平臺也都兼容類似的能力。你本地需要配置一個環(huán)境變量存放API Key不要硬編碼進代碼里。pip install openai export OPENAI_API_KEY你的密鑰有些人對“Function Calling”這個名稱不理解它其實就是你在API請求里描述一批可用函數(shù)模型根據(jù)用戶的話決定調(diào)不調(diào)用其中一個并且把調(diào)用參數(shù)以結(jié)構(gòu)化JSON返回給你。真正的“調(diào)用動作”由你的代碼執(zhí)行模型只負(fù)責(zé)決策。明白這層之后Agent就不神秘了——它就是“模型決策 程序執(zhí)行”的組合。3.2 定義工具給Agent準(zhǔn)備“能力”我們給Agent定義兩個工具get_weather和calculator。注意工具描述怎么寫直接影響模型的調(diào)用準(zhǔn)確度。tools [ { type: function, function: { name: get_weather, description: 根據(jù)城市名查詢當(dāng)前天氣情況支持中文城市名如深圳、北京、上海, parameters: { type: object, properties: { city: { type: string, description: 城市名例如深圳 } }, required: [city] } } }, { type: function, function: { name: calculator, description: 執(zhí)行四則運算表達式支持加、減、乘、除、括號如12 * 5 8, parameters: { type: object, properties: { expression: { type: string, description: 數(shù)學(xué)表達式例如(12 3) * 4 } }, required: [expression] } } } ]這段代碼會告訴大模型“你有兩個工具一個查天氣一個算數(shù)學(xué)”。但注意一個細節(jié)模型并不知道“get_weather這個函數(shù)應(yīng)該去哪個網(wǎng)站查數(shù)據(jù)”它只負(fù)責(zé)“根據(jù)用戶意圖返回city參數(shù)”。真正聯(lián)網(wǎng)查詢的代碼是你要寫的模型不參與。這種職責(zé)分離是Agent落地時最需要注意的邊界。3.3 執(zhí)行循環(huán)Agent的心臟工具定義好之后核心的執(zhí)行循環(huán)如下。這段邏輯是所有Agent框架的雛形理解了它你就能看懂任何復(fù)雜的Agent框架。from openai import OpenAI import json client OpenAI() def run_agent(user_message): messages [{role: user, content: user_message}] # 第一步把用戶問題 工具定義 一起發(fā)給模型 response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolstools, tool_choiceauto ) # 第二步模型決定調(diào)用哪個工具 response_message response.choices[0].message messages.append(response_message) # 把模型的“決策”加入對話歷史 # 第三步如果模型決定調(diào)用工具就執(zhí)行 if response_message.tool_calls: for tool_call in response_message.tool_calls: func_name tool_call.function.name args json.loads(tool_call.function.arguments) if func_name get_weather: # 這里是模擬查詢實際應(yīng)接天氣API result f{args[city]}今天晴28度微風(fēng) elif func_name calculator: result eval(args[expression]) # 把工具執(zhí)行結(jié)果返回給模型 messages.append({ role: tool, tool_call_id: tool_call.id, content: str(result) }) # 第四步模型拿到工具結(jié)果后生成最終回答 final_response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolstools ) return final_response.choices[0].message.content # 如果沒有調(diào)用工具直接返回模型回答 return response_message.content # 測試 print(run_agent(深圳天氣怎么樣)) print(run_agent(12 * 5 8等于多少)) print(run_agent(先算一下(12 3) * 4然后告訴我深圳天氣))這個循環(huán)就是我前面說的“感知—決策—行動—觀察”的具體實現(xiàn)。第一輪請求相當(dāng)于“感知 決策”模型的輸出里帶著工具調(diào)用指令代碼執(zhí)行工具是“行動”執(zhí)行結(jié)果回傳給模型是“觀察”模型基于觀察結(jié)果組織最終回答。一個多步驟的Agent任務(wù)無非就是把第四步的結(jié)果再次喂給模型讓它繼續(xù)決策下一輪工具調(diào)用直到模型認(rèn)為任務(wù)完成、不再返回工具調(diào)用為止。3.4 讓Agent跑多輪任務(wù)上面的例子只跑了一輪工具調(diào)用就收尾了。真實的Agent任務(wù)往往需要多輪先查一個數(shù)據(jù)再基于數(shù)據(jù)做計算最后再生成報告。把上面的循環(huán)改造一下讓“判斷是否還需要調(diào)用工具”變成一個while循環(huán)就是最簡版的多輪Agent。def run_agent_multi(user_message, max_steps5): messages [{role: user, content: user_message}] for step in range(max_steps): response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolstools, tool_choiceauto ) response_message response.choices[0].message messages.append(response_message) if not response_message.tool_calls: return response_message.content for tool_call in response_message.tool_calls: func_name tool_call.function.name args json.loads(tool_call.function.arguments) if func_name get_weather: result f{args[city]}今天晴28度微風(fēng) elif func_name calculator: result eval(args[expression]) messages.append({ role: tool, tool_call_id: tool_call.id, content: str(result) }) return 已達到最大輪次仍未完成請調(diào)整任務(wù)描述或增加上限這個max_steps限制非常重要。我第一次寫Agent時沒加這個限制結(jié)果模型在“計算一個復(fù)雜表達式”時陷入了死循環(huán)它反復(fù)調(diào)用計算器、看到結(jié)果、覺得不對、再換個方式調(diào)用直到API賬單飆升我才發(fā)現(xiàn)。加一個硬上限既保護錢包也避免框架掛死。3.5 小型項目可直接配置一份Agent調(diào)度源碼示例多輪循環(huán)本身也可拆成獨立配置。如果你不想每次都在代碼里寫死“工具名稱—函數(shù)名”的映射可以做成一個按名稱注冊和分發(fā)的表格式調(diào)度結(jié)構(gòu)如下方示例所示# mini_agent.py # 用名稱注冊表管理工具調(diào)用方便后續(xù)新增工具 TOOL_REGISTRY {} def register(func): 把函數(shù)注冊到工具表函數(shù)docstring作為工具描述 TOOL_REGISTRY[func.__name__] func return func register def get_weather(city: str) - str: 根據(jù)城市名查詢當(dāng)前天氣情況支持中文城市名 # 實際場景替換為真實天氣API調(diào)用 return f{city}今天晴28度微風(fēng) register def calculator(expression: str) - str: 執(zhí)行四則運算表達式支持加、減、乘、除、括號 return str(eval(expression)) def run(user_message: str, max_steps: int 5) - str: tools [ { type: function, function: { name: name, description: fn.__doc__, parameters: {...} } } for name, fn in TOOL_REGISTRY.items() ] # 循環(huán)邏輯略和上文run_agent_multi一致這種寫法在工具少的時候看不出優(yōu)勢等工具數(shù)量上到十幾個你會發(fā)現(xiàn)“注冊表模式”比一長串if-else好維護得多。新增工具只用寫一個函數(shù)加注冊裝飾器不用改動主循環(huán)代碼。4. 智能體能做什么用場景說話理解了原理再看應(yīng)用場景你的視角會完全不一樣。因為Agent的能力邊界不是由“它能做什么”決定的而是由“你給它接了什么工具”決定的。我給幾個不同類型、已經(jīng)可以落地的場景。4.1 辦公?產(chǎn)力把重復(fù)勞動扔給Agent最典型的應(yīng)用是郵件和會議日程處理。一個Agent可以接入你的日歷API、郵件API、通訊錄API。你只需要對它說一句“幫我看看明天下午三點有沒有空如果有的話安排一個跟某同事的半小時溝通會并把會議紀(jì)要模板準(zhǔn)備好”它會自己查日歷、判斷空閑時間、發(fā)起會議邀請、創(chuàng)建文檔模板。這一步跨了三個系統(tǒng)傳統(tǒng)自動化腳本要做到這個程度你需要寫幾百行膠水代碼而且每個系統(tǒng)接口一升級就要重新維護。Agent把“接口調(diào)用邏輯”藏在工具層之后你用自然語言就能指揮它完成跨系統(tǒng)操作。數(shù)據(jù)整理也是Agent的強項。之前我?guī)鸵粋€團隊做銷售周報的自動化以前的流程是人手動從CRM里導(dǎo)出數(shù)據(jù)、用Excel做透視表、再寫總結(jié)。改成Agent后流程變成了Agent定時觸發(fā)→查詢數(shù)據(jù)庫→調(diào)用數(shù)據(jù)分析工具→生成圖表→調(diào)用大模型把數(shù)據(jù)寫成周報文案→推送消息到工作群。整套流程需要人的環(huán)節(jié)只剩下“審核”。4.2 代碼輔助從補全代碼到改Bug代碼補全工具已經(jīng)普及了但Agent級別的代碼助手做的是另外一件事理解整個倉庫結(jié)構(gòu)、定位問題、修改代碼、運行測試、根據(jù)測試結(jié)果決定是否繼續(xù)修改。給你一個具體的例子。我讓一個Agent處理“這個項目的前端控制臺報錯提示某個接口返回了404幫我排查”。Agent先調(diào)用代碼搜索工具找到調(diào)用這個接口的代碼位置再調(diào)用日志查詢工具看后端有沒有對應(yīng)路由最后用調(diào)試工具在測試環(huán)境請求一遍接口拿到404的具體原因——路由路徑寫錯了大小寫不一致。整個過程它自己定位、自己驗證、自己給出修改建議。人只負(fù)責(zé)最后點一下“確認(rèn)修改”。這類Agent落地速度最快的是獨立開發(fā)者和中小團隊因為代碼庫規(guī)模小、結(jié)構(gòu)相對清晰Agent的上下文窗口Cover得住。4.3 個人助理讓Agent真正“懂你”個人助理類Agent是目前門檻最高的場景原因在于它需要長期記憶而且不能犯低級錯誤。一個合格的助理Agent至少要會根據(jù)日程提醒你提前出發(fā)要接地圖API和航班動態(tài)、一個月后主動問你是否需要續(xù)費某個會員要接支付記錄、洞察到你說“最近好累”時自動把本周的晚間會議推遲要接日歷和情緒判斷。這些功能單拆出來都不復(fù)雜難的是狀態(tài)管理Agent要隨時追蹤“用戶身處什么階段、需要什么信息、上次聊過什么”。這也是為什么很多產(chǎn)品團隊先從“垂直場景的單功能Agent”做起比如只做一個日程管家、只做一個賬單助理而不是一上來就做全能管家。4.4 行業(yè)落地客服、運維、銷售頭部企業(yè)級Agent落地最成熟的三個方向智能客服、自動化運維、銷售助手。智能客服Agent已經(jīng)不是早期的關(guān)鍵詞回復(fù)了?,F(xiàn)在的方案是Agent理解用戶問題→搜索知識庫→調(diào)用訂單系統(tǒng)查詢用戶訂單狀態(tài)→判斷是否需要人工介入。整套流程里它可以同時處理好幾萬并發(fā)遇到解決不了的問題再一鍵轉(zhuǎn)人工這個模式在零售和金融行業(yè)已經(jīng)大規(guī)模驗證過。運維Agent現(xiàn)在的做法是接到告警→查監(jiān)控系統(tǒng)→分析日志→判斷根因→執(zhí)行預(yù)案操作比如重啟某服務(wù)、擴容某集群。能不能真正自動執(zhí)行操作取決于企業(yè)的風(fēng)險承受能力但“輔助排查根因”這一步已經(jīng)能用Agent跑得很穩(wěn)。5. 常見問題與排查技巧實錄Agent項目跟傳統(tǒng)軟件開發(fā)最大的不同是失敗路徑極多而且很多失敗是概率性的不是必現(xiàn)的。同一個輸入有時成功有時失敗這種不確定性讓排查變得很頭疼。我把我踩過的坑集中列一下都是實戰(zhàn)里反復(fù)出現(xiàn)的問題。5.1 模型不愛調(diào)用工具怎么辦現(xiàn)象Agent能正常對話但用戶說了“查一下天氣”模型卻直接回答“我查不了我只是一個語言模型”。原因分析要么是工具描述寫得不清晰模型不認(rèn)識這個工具要么是模型對工具的“信任度”不夠或者上下文里類似場景沒出現(xiàn)過。還有一個常見原因你在系統(tǒng)提示詞里沒明確告訴模型“你可以使用工具”。排查手段把工具描述寫得更具體給出典型觸發(fā)場景比如“當(dāng)用戶詢問天氣、氣溫、降雨等信息時必須使用get_weather工具并傳入城市名”。在系統(tǒng)提示詞里加一句“你有充足的工具來回答用戶問題當(dāng)用戶請求涉及工具能力時請直接調(diào)用”。測試時把tool_choice從auto改成指定工具名比如tool_choice{type: function, function: {name: get_weather}}強制模型走一次工具調(diào)用排查是不是工具定義本身有問題。5.2 Agent產(chǎn)生幻覺自己編造工具結(jié)果現(xiàn)象Agent明明沒調(diào)用工具卻在回答里寫“根據(jù)天氣API查詢結(jié)果深圳今天31度”。這是最危險的一種錯誤因為回答看起來非??尚?。原因分析模型在訓(xùn)練語料里見過類似的數(shù)據(jù)當(dāng)上下文沒有明確約束時它會“腦補”一個答案。這本質(zhì)上是模型對“無法獲得信息”這件事的容忍度太低它寧可編一個也不愿意承認(rèn)自己不知道。排查手段在系統(tǒng)提示詞里強調(diào)“只有工具調(diào)用返回的數(shù)據(jù)才能作為事實依據(jù)未經(jīng)工具驗證的信息必須聲明為推測”。在Agent框架里加一條校驗規(guī)則如果模型回答中包含數(shù)據(jù)性陳述但本輪循環(huán)中沒有任何工具調(diào)用記錄則判定為可疑回答要求重寫。對于高正確率要求的場景如金融、醫(yī)療可以采用“拒絕回答”策略當(dāng)工具結(jié)果無法獲取時要求Agent明確回復(fù)“暫時無法獲取該數(shù)據(jù)”而不是猜測。5.3 多輪任務(wù)中Agent“迷失方向”現(xiàn)象一個三步任務(wù)Agent做完第一步之后忘記最初的目標(biāo)是什么開始自由發(fā)揮。原因分析這是上下文窗口被中間工具結(jié)果填充導(dǎo)致的注意力稀釋尤其是工具返回的長文本會把關(guān)鍵約束擠出有效注意力范圍。排查手段把“原始目標(biāo)”固定在系統(tǒng)提示詞的前部并重復(fù)強調(diào)。比如“本輪任務(wù)起點用戶在請求一份季度銷售報告。你必須在生成最終回答前確保已經(jīng)完成數(shù)據(jù)分析步驟”。工具返回結(jié)果做摘要而非原樣塞入。如果工具返回了5000行數(shù)據(jù)不要讓模型硬讀先用程序做統(tǒng)計摘要再把摘要喂給模型。在Agent里引入“目標(biāo)檢查點”每執(zhí)行完一個子任務(wù)用一條程序日志記錄“當(dāng)前進度”下一次循環(huán)把這條進度注入上下文幫助Agent重新錨定目標(biāo)。5.4 工具參數(shù)格式反復(fù)出錯現(xiàn)象需要傳入JSON格式的參數(shù)模型總是傳錯要么字段名不對要么類型不對。原因分析參數(shù)Schema描述不夠嚴(yán)格或者模型對類型定義理解不足尤其在參數(shù)是嵌套結(jié)構(gòu)時更容易出錯。比如給“address”字段傳了一個對象而不是字符串。排查手段參數(shù)的description寫清楚“類型是什么、格式是什么、示例值是什么”。比如“date: string格式Y(jié)YYY-MM-DD示例2025-06-01”。在Schema里用enum定義可選值范圍模型只能從枚舉里選基本上不會錯。在框架層加JSON Schema校驗校驗不過就讓模型重新生成一次參數(shù)。這比直接報錯要友好因為模型看到“格式錯誤請修正為XX格式”往往能自己改對。5.5 成本失控Agent燒Token比預(yù)期兇現(xiàn)象一個簡單問題Agent內(nèi)部調(diào)了好幾次模型賬單數(shù)字嚇人。原因分析每次工具調(diào)用的結(jié)果都會塞回對話歷史多輪之后每發(fā)一次請求Token消耗都是上一次的累加。另一個隱性成本是工具描述本身——每輪請求都要重新攜帶全部工具定義。排查手段給Agent設(shè)定最大工具調(diào)用輪數(shù)比如3輪超過就強制終止。對工具返回結(jié)果做截斷只保留前幾百個字符既節(jié)省Token又避免無效信息分散注意力。工具數(shù)量多的項目把工具做分組按需加載。比如用戶聊天氣時只加載天氣相關(guān)工具不加載查數(shù)據(jù)庫的工具。這個優(yōu)化能讓Token消耗直接減半。6. 智能體項目的基本設(shè)計要點最后把思路拉高一點講幾個我在搭建Agent時反復(fù)用到的設(shè)計原則。這些原則不是通用的但凡是能穩(wěn)定上線的Agent基本都會遵守其中至少三條。6.1 “最小權(quán)限”原則也適用于Agent給Agent接工具時不要圖方便把所有API都接上。比如一個只處理“讀取”任務(wù)的Agent就不要給它“刪除”或“寫入”的權(quán)限。一旦模型被注入惡意提示或者陷入錯誤循環(huán)最小權(quán)限能避免發(fā)生不可逆的破壞。我在做運維Agent時第一步就先做權(quán)限隔離只允許Agent執(zhí)行只讀操作所有變更類操作必須經(jīng)過人工審批。6.2 可觀測性設(shè)計Agent的“黑盒”要留觀察窗Agent決策過程對用戶來說是個黑盒但對開發(fā)者不能是。設(shè)計Agent時每輪模型響應(yīng)都應(yīng)當(dāng)記錄模型思考摘要、調(diào)用的工具、參數(shù)、返回結(jié)果、耗時、Token消耗。這些日志在測試階段是唯一能幫你快速定位問題的線索。我自己的習(xí)慣是在開發(fā)階段強制打印每一步的完整JSON上線后再改為只記錄關(guān)鍵字段。沒有日志的Agent就是盲人摸象問題復(fù)現(xiàn)不了也就永遠修不好。6.3 把工具做薄把描述做厚傳統(tǒng)開發(fā)里函數(shù)職責(zé)越單一越好這個原則在Agent的“工具”設(shè)計里同樣成立但有一個額外維度描述信息的質(zhì)量比實現(xiàn)邏輯更關(guān)鍵。一個工具哪怕實現(xiàn)邏輯很簡單只要描述清晰、參數(shù)定義精確模型的調(diào)用準(zhǔn)確率就會高很多。反過來一個工具實現(xiàn)邏輯很復(fù)雜但是描述含糊模型就不知道該什么時候用它再強的能力也白搭。每一次工具定義都值得像寫接口文檔一樣對待。6.4 兜底策略比聰明邏輯更可靠Agent的失敗模式太多了你不可能預(yù)測所有場景。與其寫一堆復(fù)雜的分支邏輯來應(yīng)對特殊狀況不如做好三件事最大輪次限制、異常重試機制、人工接管接口。關(guān)鍵操作一律要求人工確認(rèn)這不是對Agent能力的不信任而是工程上的負(fù)責(zé)任。7. 再分享兩個實操里的小技巧這個章節(jié)算是我個人實戰(zhàn)的附帶收獲不一定寫得進正式文檔但確實好用。第一個技巧是關(guān)于“凍結(jié)工具描述版本”。Agent跑在線上生產(chǎn)環(huán)境工具描述稍微改動一個字模型的行為就可能漂移。我遇到過一次小版本更新只是把工具描述里的“城市名”改成了“城市中文名”結(jié)果模型的調(diào)用準(zhǔn)確率突然下降因為新描述跟模型在預(yù)訓(xùn)練時見過的樣例格式不匹配了。從那之后我養(yǎng)成了一個習(xí)慣工具描述改動后必須跑一遍固定測試集對比準(zhǔn)確率再決定是否上線。第二個技巧是把“觀察”環(huán)節(jié)做實。默認(rèn)的Agent循環(huán)里模型把工具返回的結(jié)果直接拿過來用不做質(zhì)量判斷。但實際上工具返回結(jié)果可能為空、可能格式異常、可能數(shù)據(jù)明顯不合理。在有臻求的項目里我會在代碼里加一層經(jīng)驗判斷程序也就是簡單的規(guī)則校驗比如“結(jié)果是否為空”“是否超時”“JSON是否能解析”。解析失敗的結(jié)果先不進對話歷史先要求模型重新生成工具參數(shù)重試一次。這一步防住了很多因為工具自身偶發(fā)故障導(dǎo)致的連鎖錯誤。Agent這東西說到底不是“造一個無所不能的仙靈”而是把“人的意圖”翻譯成“一步步可執(zhí)行的行動”再把每一步行動的結(jié)果反饋給模型繼續(xù)決策。它不會取代復(fù)雜系統(tǒng)設(shè)計但確實把人與程序之間的交互方式往前推進了一大截。如果你手邊正好有某個經(jīng)常重復(fù)的任務(wù)或者某個跨系統(tǒng)的協(xié)作流程不妨像上面那樣先寫一個最簡Agent試著跑起來。先把“感知—決策—行動”的閉環(huán)跑通再往里加記憶、加規(guī)劃、加反思你的智能體會一步步長出你想要的樣子。