框架)
說實話這兩年我見過太多新手和轉(zhuǎn)行者沖進來學(xué) AI Agent第一步就是打開某幾個熱門編排框架的文檔裝了一堆依賴照著教程跑通一個 demo然后發(fā)個朋友圈就完事了。再過兩天問他原理基本答不上來項目也改不動版本一升級就全崩。問題不出在不努力而是順序反了。我自己的體會是AI Agent 本質(zhì)上是“大模型 工具 記憶 決策循環(huán)”的組合框架只是把這幾個東西打包好、加了一層調(diào)度邏輯而已。新手真正該做的是先搞懂模型調(diào)用、提示詞、結(jié)構(gòu)化輸出和工具設(shè)計然后用原生代碼手寫一個極簡 Agent讓它在自己手里跑起來之后再回頭看框架你一眼就能看穿它到底做了什么。這篇文章就給打算入門、以及從傳統(tǒng)開發(fā)轉(zhuǎn)行做 Agent 的朋友畫一條路線。不講玄學(xué)不推框架只講第一性原理和能落地的實操你按這個順序?qū)W至少能省兩個月彎路的錢。1. 先想清楚AI Agent 到底是什么1.1 一句話本質(zhì)大模型驅(qū)動的決策循環(huán)很多人把 Agent 想得很玄其實拆到最底層它就是一個循環(huán)接收用戶目標(biāo) → 大模型思考下一步 → 調(diào)用一個工具/給出回答 → 把結(jié)果帶回來 → 再思考 → 循環(huán)直到任務(wù)完成這個循環(huán)里有四個核心零件缺一個都不成立大模型負(fù)責(zé)理解意圖、拆解任務(wù)、決定下一步動作。它是“大腦”但它自己不會執(zhí)行只會輸出文字。工具模型能指揮的外部能力比如查數(shù)據(jù)庫、發(fā)請求、算數(shù)、搜索、操作文件。這是 Agent 能做事而不是只會聊天的關(guān)鍵。記憶上下文窗口是有限的Agent 需要把歷史對話、工具結(jié)果、長期知識保存下來在合適的時機塞回給模型。這部分最容易被新手忽略也最容易翻車。循環(huán)控制什么時候繼續(xù)什么時候停出錯怎么恢復(fù)怎么防止同一個工具被反復(fù)調(diào)用這是判斷一個 Agent 工程質(zhì)量的分水嶺。你看這四個零件沒有一個是某個框架專屬的。你完全可以用標(biāo)準(zhǔn)代碼把它們拼起來。1.2 為什么別一上來就啃框架我先說個扎心的事實框架抽象掉了大量細節(jié)而這些細節(jié)恰恰是新手最該練的基本功。拿常見的編排框架來說它給你封裝好了 Agent、Tool、Memory、Retriever、Plan 這些概念你寫幾行配置就能跑。但代價是什么是出了問題你不知道去哪查。模型返回了一個奇怪的 JSON你不知道是框架解析的鍋還是模型輸出的鍋。工具一直重試你不知道是框架的重試策略還是你自己業(yè)務(wù)代碼的 bug。想把長上下文做個截斷你得先翻半天框架源碼看它有沒有隱藏邏輯。我打個比方這就好比學(xué)做菜正常人肯定先學(xué)切菜、備料、開火、調(diào)味你直接去五星酒店后廚跟行政總廚學(xué)“如何管理一個后廚團隊”學(xué)是能學(xué)到東西但你連顛勺都不會學(xué)完也做不出一桌菜。框架是給已經(jīng)懂原理的人用的。它幫你省的是重復(fù)勞動不是幫你省學(xué)習(xí)。所以新手入門第一步不是打開框架文檔而是把一個 Agent 能跑起來的最小閉環(huán)用最原始的 API 調(diào)用自己親手搭出來。1.3 建議的學(xué)習(xí)路線總覽我給自己帶的新手團隊定的路線固定是四層任何人我都攔著不讓跳級大模型調(diào)用層搞懂 API 怎么調(diào)、輸入輸出長什么樣、參數(shù)怎么控制。結(jié)構(gòu)化輸出層搞懂怎么讓模型穩(wěn)定輸出 JSON、工具調(diào)用指令怎么處理失敗。工具與服務(wù)層搞懂怎么設(shè)計一個能被模型可靠調(diào)用的工具怎么接外部系統(tǒng)。狀態(tài)與循環(huán)層搞懂記憶怎么管、循環(huán)怎么控制、Agent 怎么評估。四層全部用原生代碼過一遍快的話一周半慢的話三周。之后再去學(xué)框架你會發(fā)現(xiàn)它的每個概念你都能對上號看源碼就像看自己寫的代碼再也不會被一堆抽象概念繞暈。2. 入門第一課把大模型調(diào)用玩熟2.1 跑通一次 API 調(diào)用比你想象的更有價值很多人覺得“不就是調(diào)個 API 嗎”但作為數(shù)學(xué)和編程基礎(chǔ)相對薄弱的轉(zhuǎn)行者這一步千萬別跳過。你需要親手在代碼里完成一次完整的對話補全并且理解三個關(guān)鍵東西。第一消息格式。最常見的格式是一個數(shù)組里面有 system、user、assistant 三種角色。system 負(fù)責(zé)定規(guī)則user 是用戶輸入assistant 是模型自己的歷史回復(fù)。多輪對話就是把這個數(shù)組不斷追加進去。初學(xué)者最容易犯的錯是新的一輪只傳當(dāng)前用戶問題導(dǎo)致模型“失憶”。第二幾個核心參數(shù)。temperature 控制隨機性一般寫代碼、做工具調(diào)用設(shè)低一點比如 0.1 到 0.3閑聊可以設(shè)高一點。max_tokens 控制回復(fù)長度很多人忽略它結(jié)果模型回復(fù)到一半被截斷JSON 解析直接失敗。top_p 現(xiàn)在用得少了保持默認(rèn)也行。第三上下文窗口。模型一次能看到的 token 數(shù)是有限的你的歷史消息越多留給新問題和新工具結(jié)果的空間就越少。后面講到記憶時你會反復(fù)遇到這個問題但你在第一次調(diào) API 時就該有這個意識。我建議你寫一個小腳本用任意一門熟練語言發(fā)一條請求打印出完整響應(yīng)。然后故意調(diào)高 temperature 到 1.5觀察回復(fù)變得多么離譜故意把 max_tokens 設(shè)成 10觀察回復(fù)怎么被截斷。這比看任何教程都印象深刻。2.2 手寫一個最小的 ReAct 循環(huán)ReAct 是 Reasoning Acting 的縮寫意思是模型一邊推理一邊行動也是最樸素的一種 Agent 模式。下面是核心偽代碼不依賴任何框架function run_agent(goal): messages [{role: system, content: system_prompt}, {role: user, content: goal}] for step in range(max_steps): reply call_llm(messages) messages.append({role: assistant, content: reply}) if reply contains FINAL_ANSWER: return extract_answer(reply) else: tool_name, tool_input parse_action(reply) result call_tool(tool_name, tool_input) messages.append({role: system, content: 工具返回: result}) return timeout_error你可以看到Agent 的核心就是一個循環(huán)循環(huán)里只發(fā)生了三件事把歷史交給模型、解析模型輸出、執(zhí)行工具并把結(jié)果回填。框架里的 Agent 執(zhí)行器翻來覆去做的就是這件事。我建議你把這段偽代碼真正跑通加一個最小工具比如“計算兩個數(shù)之和”或者“查當(dāng)前時間”。你會發(fā)現(xiàn)一個很現(xiàn)實的問題模型可能不按你說的格式輸出行動指令可能輸出一段散文而不是 “TOOL_NAME: xxx, INPUT: yyy”。從這一步起你就開始體會 Agent 工程師日常的痛了。2.3 提示詞是新手的第一套“隱形框架”很多轉(zhuǎn)行的人以為框架是配置出來的其實是“提示詞 代碼”對出來的。你的第一套框架應(yīng)該是能在提示詞里把任務(wù)邊界寫清楚。我常用的 system prompt 結(jié)構(gòu)是四段式角色你是誰專長是什么在什么場景下工作。目標(biāo)你現(xiàn)在要完成的任務(wù)是什么成功標(biāo)準(zhǔn)是什么。約束哪些事情絕對不能做哪些情況必須請求工具回復(fù)格式是什么。示例給一兩個輸入輸出的例子尤其是“工具調(diào)用格式”的例子。這里有一條經(jīng)驗示例要貼近真實場景不要用“用戶問天氣”這種通用例子。你讓模型調(diào)用訂單查詢工具就給它一個帶訂單號、平臺、時間字段的真實 JSON 例子模型大概率會照著你的格式輸出比你在提示詞里寫一百遍“你必須輸出 JSON”管用得多。另外務(wù)必要給模型“思考的空間”。比如你直接問“這個用戶的訂單狀態(tài)是什么”模型可能猜但如果你提示它“先檢查是否有訂單號沒有就問用戶要”它就會按你的流程走。這就是思維鏈最簡單的用法不需要什么復(fù)雜技巧先把推理步驟寫進提示詞里就能明顯提升準(zhǔn)確性。3. 轉(zhuǎn)行者最缺的一塊工具調(diào)用與結(jié)構(gòu)化輸出3.1 Function Calling 到底是怎么一回事很多從傳統(tǒng)后端轉(zhuǎn)過來的朋友對 Function Calling 天生產(chǎn)生誤解以為“模型在執(zhí)行我的函數(shù)”其實不是。模型只是一個文本生成器它生成的是“調(diào)用意圖”真正執(zhí)行的是你的代碼。舉個具體場景。你有一個函數(shù) query_user(name)Function Calling 的過程是這樣你事先給模型一份“工具說明書”說明有哪些函數(shù)、每個函數(shù)接受哪些參數(shù)、參數(shù)的含義和格式。當(dāng)用戶說“幫我查一下張三的信息”模型看懂了意圖就輸出一個結(jié)構(gòu)化的指令你可以理解為調(diào)用函數(shù) query_user參數(shù) name 張三。你的代碼收到這個指令自己執(zhí)行 query_user拿到結(jié)果把結(jié)果作為一條新消息發(fā)給模型。模型再根據(jù)結(jié)果組織回答。關(guān)鍵點在于函數(shù)的執(zhí)行結(jié)果模型本來不知道模型只知道“我已經(jīng)請求調(diào)用某個函數(shù)了”結(jié)果是你喂給它的。所以工具返回結(jié)果的格式非常重要最好整理成簡潔、結(jié)構(gòu)化的文本不要一股腦把一個超大的 JSON 原樣塞回去。好的工具結(jié)果可以這樣設(shè)計查詢成功。 用戶: 張三 賬戶狀態(tài): 正常 當(dāng)前余額: 1280.50 元 最近一筆交易: 2024-11-03 充值 500 元差的工具結(jié)果是把整個數(shù)據(jù)庫行、幾十個字段、嵌套對象直接丟給模型。模型確實能讀但會浪費大量 token而且容易在無關(guān)字段上產(chǎn)生幻覺得不償失。3.2 不靠框架自己實現(xiàn)一個工具路由自己寫工具路由其實很考驗工程能力正好適合轉(zhuǎn)行者練手。我推薦的做法是“注冊表模式”。先定義一個統(tǒng)一接口所有工具都返回同一個結(jié)構(gòu)。然后你維護一張注冊表注冊表里記錄工具的元信息包括函數(shù)名、描述、參數(shù) schema、真實處理函數(shù)。最后寫一個分發(fā)器根據(jù)模型輸出的工具名去注冊表里查找到就執(zhí)行找不到就返回錯誤。我貼一個簡化版本用偽代碼解釋這個模式tools {} def register_tool(name, description, params_schema, handler): tools[name] {description: description, schema: params_schema, handler: handler} def dispatch(tool_name, arguments): tool tools.get(tool_name) if not tool: return 錯誤: 未知工具 tool_name try: result tool[handler](**arguments) return 成功: format_result(result) except Exception as e: return 失敗: str(e) # 注冊一個工具 register_tool(get_user_info, 根據(jù)用戶名查詢用戶賬戶信息, {user_name: string, 必填}, query_user_db)這個模式的優(yōu)點有三個新工具接入只加一個注冊項不用改主干代碼工具列表可以動態(tài)生成隨時能拼到提示詞里告訴模型有哪些可用工具出了錯能根據(jù)工具名快速定位。這套思路等你以后看框架源碼你會發(fā)現(xiàn)很多框架底層就是這么做的只是它用裝飾器和配置幫你省了注冊這一步。3.3 工具層最容易踩的坑這部分是我?guī)F隊時整理出的高頻問題新手基本都會踩一遍先列出來給你打個預(yù)防針。第一參數(shù)校驗千萬別省。模型輸出的參數(shù)是它“猜”的可能出現(xiàn)字段缺失、格式不對、value 超出枚舉范圍甚至直接輸出 null。你的 handler 里必須做嚴(yán)格校驗不要假設(shè)模型一定按 schema 來。很多項目工具調(diào)用半天不成功最終一查就是參數(shù)里混進去一個空格。第二超時和重試必須有。工具可能調(diào)用一個遠程服務(wù)如果這個服務(wù) 10 秒沒響應(yīng)你的 Agent 會一直卡在循環(huán)里。我的做法是每個工具調(diào)用設(shè)置一個超時時間超出就返回一個明確錯誤“工具執(zhí)行超時請換一個方式查詢”讓模型自己去決定是重試還是換策略。第三工具返回結(jié)果必須加長度上限。模型上下文是有限的一個工具返回了 10000 個 token整個 Agent 直接撐爆后面什么事情都做不了。我的習(xí)慣是在工具里做摘要、截斷、只返回關(guān)鍵字段。返回前先把數(shù)據(jù)壓縮一遍別偷懶。第四權(quán)限邊界不能全交給模型。根據(jù)模型判斷“要不要調(diào)用有副作用的工具”是不可靠的比如發(fā)郵件、刪文件、轉(zhuǎn)賬這類操作一定要在代碼里設(shè)置二次確認(rèn)或者用只讀/可寫兩套模式區(qū)分。這不是技術(shù)問題是安全意識問題。4. 核心難點狀態(tài)、記憶與循環(huán)控制4.1 記憶分層短期、長期、工作記憶新手往往會問模型不是能記住上下文嗎為什么還要自己做記憶原因前面說過上下文窗口有上限而且每輪對話全部重發(fā)token 成本會高得離譜。所以你要自己設(shè)計記憶體系。我把 Agent 的記憶粗分成三層工作記憶當(dāng)前任務(wù)用到的關(guān)鍵信息比如臨時變量、上一步工具結(jié)果任務(wù)結(jié)束就清空。實現(xiàn)上就是放一個 dict。短期記憶最近幾輪的對話摘要用來保持多輪任務(wù)的連續(xù)性。常見做法是滑動窗口截斷只保留最近 N 條或者用模型把早期對話壓縮成摘要。長期記憶跨會話保存的用戶偏好、歷史結(jié)論、領(lǐng)域知識。一般存到向量數(shù)據(jù)庫里按需檢索出來塞進提示詞。我建議入門階段先別碰向量數(shù)據(jù)庫用一個簡單的滑動窗口就夠。關(guān)鍵代碼邏輯是當(dāng)消息總長度超過閾值時把最早的消息刪掉或者把最舊的一段對話用模型摘要成一行字然后繼續(xù)。等你的任務(wù)真正需要跨會話記憶時再引入向量檢索不遲。4.2 循環(huán)控制與終止條件防止 Agent 越跑越偏沒有終止條件的 Agent 就是定時炸彈。我見過一個 demo 因為沒有最大輪次限制模型反復(fù)調(diào)用同一個垃圾工具一分鐘內(nèi)花掉了幾十塊錢的 token。所以無論你手寫還是用框架下面四個終止條件都必須有最大輪次限制一般任務(wù) 5 到 10 輪內(nèi)應(yīng)該解決超過即終止。目標(biāo)任務(wù)完成條件如果你知道完成的標(biāo)準(zhǔn)比如“日期已經(jīng)拿到且用戶沒有其他要求”就主動終止。重復(fù)工具檢測同一個工具、同樣的參數(shù)連續(xù)被調(diào)兩次以上基本可以判定模型在打轉(zhuǎn)直接中斷。用戶取消永遠留一個入口讓模型或前端能停止循環(huán)。我甚至建議你在日志里給每個循環(huán)打個編號標(biāo)記第幾步、用什么工具、結(jié)果摘要。一旦 Agent 出了問題你能像回放錄像一樣看它每一步干了什么。這套日志習(xí)慣比任何框架功能都重要。4.3 怎么評估一個 Agent 做得好不好這是入門的人很少想、但實際工作一定會遇到的問題。你不能只說“感覺它變聰明了”要有可量化的指標(biāo)。我自己的評估棋盤是這樣的我先準(zhǔn)備一小組測試任務(wù)比如 30 條人工標(biāo)好期望結(jié)果。然后跑 Agent記錄三個數(shù)任務(wù)完成率也就是成功完成的比例工具調(diào)用準(zhǔn)確率也就是整個任務(wù)中模型選擇的工具和參數(shù)是否合理平均耗時和平均 token 成本。每次改提示詞、改工具格式就重新跑一遍這組測試對比看數(shù)值漲跌。這不是什么高深的評測體系但它是你做后續(xù)一切優(yōu)化的基準(zhǔn)。沒有這個基準(zhǔn)你會陷入“改一下試試好像好一點又好像差一點”的死循環(huán)。我強調(diào)一句這句話同樣適用于以后你學(xué)框架、換模型、調(diào)參先定基線再談優(yōu)化。5. 再決定要不要學(xué)框架什么時候上框架才合理5.1 框架到底幫你解決了什么我不是反對框架恰恰相反我把這套邏輯徹底跑通之后很多日常項目我也會用框架。但我是帶著“我已經(jīng)知道它底層在干什么”的心態(tài)去用的。框架最大的價值在于幾個方面。第一省掉樣板代碼比如消息組裝、工具注冊、重試策略這些重復(fù)勞動框架替你做了。第二提供標(biāo)準(zhǔn)的接口約定尤其是 Tool 的輸入輸出抽象多團隊協(xié)作時特別有用。第三內(nèi)置很多通用模塊比如記憶、檢索、人機交互的 callback不用自己從零造輪子。這些對你以后的工程效率提升確實很大。你可以把它理解成“一個經(jīng)驗豐富的項目經(jīng)理”已經(jīng)把需求對齊、排期、風(fēng)險和異常處理都幫你打了個模板。但前提是你自己得知道項目邏輯否則模板反而是枷鎖。5.2 框架的坑版本迭代快、概念多、黑盒我還是要給你潑點冷水框架本身有三個問題。版本迭代快到離譜。很多熱門框架每周發(fā)新版本API 說改就改。你上周照著文檔寫的代碼這周可能就報一堆廢棄警告。對新手來說網(wǎng)上搜到的教程和當(dāng)前版本不匹配會讓你陷入無盡的排查中。概念抽象層太厚。Agent、Task、Chain、Memory、Retriever 這些概念層層嵌套。你以為你在配置業(yè)務(wù)邏輯其實你被框架的“世界觀”綁架了。遇到問題你根本不知道是配置寫錯了還是框架的 bug只能去翻源碼花的時間比自己手寫還長。社區(qū)教程兩極分化。要么是簡單到?jīng)]有營養(yǎng)的 hello world要么是直接給你一個巨型項目模板新手根本拆不動。學(xué)習(xí)體驗相當(dāng)差。所以我的結(jié)論是在你親手寫過一遍原生 Agent 之前不建議把框架作為學(xué)習(xí)主線。等你能用 100 行代碼跑通一個帶工具調(diào)用的 Agent再學(xué)框架你會感覺非常輕松甚至想吐槽它“怎么多了一層沒必要的東西”。5.3 我建議的看框架姿勢對照源碼而不是照抄教程我自己學(xué)框架的方法是這樣不追求學(xué)會框架的全部功能只挑我手寫代碼里已經(jīng)實現(xiàn)的那些模塊去源碼里找對應(yīng)部分。比如我已經(jīng)手寫了一個工具注冊表那我就去框架源碼里搜 “register” 或者 “tool” 關(guān)鍵詞看它怎么設(shè)計的、有沒有處理我沒想到的邊界情況。我已經(jīng)寫了滑動窗口記憶就去源碼里找它的 memory 模塊對比一下它的截斷策略和我的有什么不同。這種“帶著問題看源碼”的方式效率大約是看教程的十倍。因為你已經(jīng)有了實踐基礎(chǔ)源碼里的每一個抽象你都能映射到具體問題上而不是被符號和類名牽著鼻子走。看完之后你很可能有兩種收獲一種是發(fā)現(xiàn)框架比我寫得漂亮吸收它的設(shè)計另一種是發(fā)現(xiàn)框架某個地方其實不如你的實現(xiàn)靈活你以后就知道什么時候不該用它。6. 新手入門必踩的坑與排查思路實錄6.1 五個高頻問題速查表我把自己帶新人過程中最高頻的五個問題整理成了一張速查表你收藏起來遇到對著看。問題現(xiàn)象可能原因排查與解決模型不按格式輸出工具調(diào)用提示詞里沒給示例或示例與當(dāng)前場景差異太大在 system prompt 里加一個與真實任務(wù)一致的 few-shot 示例同一個工具被反復(fù)調(diào)用工具返回結(jié)果不清晰模型不知道下一步該干嘛把工具結(jié)果結(jié)構(gòu)化末尾明確給出“結(jié)果已獲取還需要給用戶組織回答”這類指引上下文一長模型開始瞎答滑動窗口或摘要策略沒生效檢查消息數(shù)組長度強制做截斷或在每輪工具調(diào)用后刪掉歷史工具原始結(jié)果工具調(diào)用成功但 Agent 仍報錯參數(shù)里混入不可見字符或格式不符在 handler 入口打日志把原始 arguments 完整打印出來肉眼檢查成本暴漲任務(wù)沒完成多少輪就超額最大輪次設(shè)置過大或每輪重發(fā)大量歷史消息設(shè)置合理的 max_steps壓縮歷史消息先跑一個任務(wù)估算單次成本這張表里幾乎每個問題我都踩過一遍尤其是“同一個工具被反復(fù)調(diào)用”剛開始手寫 ReAct 循環(huán)的人遇到概率接近百分之百。你記住一個原則模型不是不聽話是你給它的反饋信息不夠清楚工具結(jié)果里沒有告訴它“任務(wù)已完成”。6.2 排查 Agent 問題的基礎(chǔ)方法論排查 Agent 和排查普通代碼最大的區(qū)別是普通代碼是確定性的Agent 是不確定性的同一句話跑兩次結(jié)果可能不一樣。所以你沒法用“打斷點、跑單測”那套思路直接套。我的方法論就三條全程日志、回放復(fù)現(xiàn)、最小樣本。全程日志指的是我要求每個環(huán)節(jié)都打日志。模型原始輸出打一份解析后的工具調(diào)用打一份工具真實返回打一份。三條日志對齊基本就能定位問題出在模型、解析還是工具?;胤艔?fù)現(xiàn)指的是把出問題的對話原封不動地保存下來下一次跑測試時直接輸入同一段歷史。這樣你可以反復(fù)改提示詞、改工具圍繞一個固定的樣例去驗證效果而不是靠隨機撞。最小樣本指的是別拿一個 50 條任務(wù)的復(fù)雜測試集去調(diào)問題。先把出問題的那一條拎出來寫成一個單測調(diào)通了再擴大范圍。單測跑通是底線跑不通就不要去碰別的任務(wù)。這套方法論在我后來的真實項目里幫了大忙。Agent 的問題排查不能靠直覺和運氣靠的是把不確定的東西盡量變成可回放的過程。7. 給新手和轉(zhuǎn)行者的三周學(xué)習(xí)計劃7.1 第一周大模型 API 提示詞基礎(chǔ)這一周的目標(biāo)只有一個把一個模型 API 調(diào)得滾瓜爛熟能用提示詞控制它的輸出格式。每天固定寫一個練習(xí)。比如周二實現(xiàn)多輪對話周三實現(xiàn)結(jié)構(gòu)化 JSON 輸出周四做一個判斷題“給模型一段文本讓它提取姓名和日期兩個字段輸出 JSON”。周五看一篇提示詞工程相關(guān)的資料然后把前一天練習(xí)加 few-shot 示例重跑一遍。到周末你手寫一個簡單總結(jié)器把一段會議記錄壓縮成三條摘要。第一周最重要的是形成“API 就是編程接口”的直覺。不要覺得調(diào)模型是玄學(xué)它就是一次帶輸入輸出的函數(shù)調(diào)用只是輸出富有不確定性你需要用提示詞和參數(shù)去馴服它。7.2 第二周工具調(diào)用 手寫第一個 Agent這周開始進入真正的 Agent 環(huán)節(jié)。你選一個熟悉的領(lǐng)域比如查詢訂單、查天氣、做數(shù)學(xué)計算設(shè)計兩個到三個工具注冊到一個工具注冊表里。然后實現(xiàn)一個最簡 ReAct 循環(huán)讓模型根據(jù)用戶問題選擇工具、執(zhí)行、返回結(jié)果。我建議你第一版先不要讓模型自由思考直接在提示詞里寫死流程必須判斷是否需要工具不需要就作答需要就輸出工具調(diào)用的 JSON。跑通后再放開約束讓模型自己推理。這周結(jié)束時你手里應(yīng)該有一個能用自然語言驅(qū)動兩個工具的 Agent哪怕它看起來有點笨。第二周最值得慶祝的時刻是你發(fā)現(xiàn)“這個 Agent 真的會自己選擇用工具了”。這一刻你對 Agent 的理解會一下子從紙面名詞變成肌肉記憶。7.3 第三周記憶 評估 對框架祛魅第三周做三件事。第一給你的 Agent 加上滑動窗口記憶讓它能夠連續(xù)對話十輪以上不崩潰。第二準(zhǔn)備一組 20 道題的測試集用手寫的方式記錄完成率和工具調(diào)用準(zhǔn)確率。第三找任何一個你之前想學(xué)的熱門框架用“看源碼”的方式對照你自己寫的代碼理解它的設(shè)計。第三周的核心目標(biāo)是“祛魅”。你會發(fā)現(xiàn)框架里的很多東西你已經(jīng)實現(xiàn)了只是它封裝得更成熟同時你也會發(fā)現(xiàn)自己的實現(xiàn)確實粗糙需要用框架補齊邊界能力。這一步做扎實了以后再學(xué)任何新框架你都能快速上手而不是每次都被框架牽著走。7.4 三個適合入門的練手項目如果你不知道自己該做什么練手項目我給你三個選題難度從低到高每一個都能寫進項目經(jīng)歷里。第一個是“個人知識小助手”讓它讀取你收藏的文章接一個向量存儲用問答方式查詢。這個項目的關(guān)鍵點是文本切塊和檢索質(zhì)量能讓你體會 RAG 的基礎(chǔ)套路。第二個是“自動化周報生成器”讓它通過工具讀取本周的 Git 提交記錄自動生成周報并發(fā)送到指定的地方。關(guān)鍵點是工具設(shè)計你的“讀提交記錄”工具必須返回結(jié)構(gòu)化數(shù)據(jù)模型才能穩(wěn)定生成總結(jié)。第三個是“智能客服問答機器人”讓它查詢訂單狀態(tài)、退換貨政策遇到查不到的信息時能禮貌地轉(zhuǎn)人工。關(guān)鍵點是循環(huán)控制你必須給足用戶明確回復(fù)的時機這是真實場景里最挑剔的能力。這三個項目做完你基本能覆蓋 Agent 開發(fā)的核心場景檢索增強、工具調(diào)用、狀態(tài)管理。面試的時候也很有說服力因為每一步都是你自己寫出來的不是照抄框架 demo。寫在最后的幾句經(jīng)驗我見過很多入門者倒在不同階段。有人卡在“調(diào) API 都覺得玄”有人卡在“模型老是不按格式輸出”也有人卡在“學(xué)了框架卻發(fā)現(xiàn)離不開框架”。說實話這些都是必經(jīng)之路但順序錯了痛苦會加倍。我個人最深的體會是Agent 開發(fā)的門檻不在代碼而在“把不可控的東西變成可控”的工程思維。大模型是不可控的但你可以用提示詞約束它工具結(jié)果是不可控的但你可以用標(biāo)準(zhǔn)化格式馴服它上下文是有限制的但你可以用記憶和截斷去管理它。這套思維建立起來之后框架對你來說只是工具而不是信仰。如果你現(xiàn)在還在糾結(jié)要不要啃框架聽我一句勸先關(guān)掉框架文檔用一個最普通的 API 調(diào)用手寫一個最小 Agent讓它在你的電腦上跑起來哪怕是只會查時間和算加法。等你跑通的那一刻你對 AI Agent 的理解就超過了 80% 停留在“看過教程”的人。剩下的事都是你見招拆招之后自然會發(fā)生的事。