:Harness架構(gòu)核心組件與實(shí)戰(zhàn)拆解)
Harness 架構(gòu)在大模型 Agent 應(yīng)用開發(fā)領(lǐng)域已經(jīng)不算冷門詞匯但很多教程只是把概念圖貼一遍看完之后你還是不知道它到底拆開以后長(zhǎng)什么樣、跑起來需要什么環(huán)境、卡住的時(shí)候應(yīng)該先查哪里。這幾年我接觸過的 Harness 類項(xiàng)目越來越多尤其是 DeepSeek Harness、Codex Harness 這類把 Agent 運(yùn)行流程固化下來的開源方案它們解決的問題高度一致讓模型調(diào)用、工具調(diào)用、上下文管理、任務(wù)調(diào)度這些環(huán)節(jié)從手寫代碼變成一套可配置的工程架構(gòu)。這篇文章不打算復(fù)讀概念而是直接按我實(shí)際跑通項(xiàng)目的順序拆 Harness 的核心組件、環(huán)境準(zhǔn)備、單任務(wù)跑通、批量任務(wù)落地和面試會(huì)被追問的點(diǎn)。如果你正在做智能體應(yīng)用開發(fā)或者準(zhǔn)備大模型開發(fā)方向的崗位面試這篇文章值得你按順序看一遍。1. Harness 到底在解決什么問題別把它和同名 CI/CD 工具混在一起1.1 先搞清楚“Harness”這個(gè)詞在這個(gè)領(lǐng)域指的是什么很多第一次接觸的人會(huì)搜到兩個(gè)同名概念。一個(gè)是軟件交付平臺(tái) Harness專注 CI/CD 和 DevOps 流程。另一個(gè)是本文要說的大模型 Agent 領(lǐng)域里的 Harness指承載 Agent 運(yùn)行能力的中控框架。兩者只是名字相同解決的問題完全不同。你可以把后者理解成一個(gè)“智能體的指揮臺(tái)”模型只是大腦而 Harness 負(fù)責(zé)把大腦接到任務(wù)、工具、記憶、流程上。之所以需要這樣一個(gè)中間層是因?yàn)橹苯诱{(diào)用大模型 API 做單輪問答很簡(jiǎn)單但一旦要處理多輪對(duì)話、調(diào)用外部工具、在多個(gè)智能體之間分配任務(wù)、控制上下文長(zhǎng)度、處理失敗重試代碼復(fù)雜度會(huì)快速上升。如果每個(gè)項(xiàng)目都從零手寫這套調(diào)度邏輯重復(fù)造輪子的成本非常高。Harness 把這套公共能力抽出來形成可復(fù)用的架構(gòu)。我見過不少團(tuán)隊(duì)最初沒有用 Harness直接用裸 API 寫 Agent。單條鏈路能跑一旦加需求就到處改代碼。比如要臨時(shí)加一個(gè)工具得改提示詞、改函數(shù)列表、改結(jié)果解析邏輯、改前端展示非常痛苦。后來遷移到 Harness 類方案很多邏輯變成配置項(xiàng)改動(dòng)范圍明顯縮小。1.2 這類方案最核心的價(jià)值不是“調(diào)用模型”而是“管理任務(wù)”如果你去看 Harness 類項(xiàng)目的源碼會(huì)發(fā)現(xiàn)真正花大力氣寫的不是模型的調(diào)用封裝而是 Agent 主循環(huán)、工具執(zhí)行、上下文截?cái)?、結(jié)果結(jié)構(gòu)化、日志追蹤、任務(wù)排隊(duì)這些偏工程的部分。一套合格的 Harness 要保證的不是某一次調(diào)用成功而是連續(xù)運(yùn)行時(shí)仍然穩(wěn)定。在 DeepSeek Harness、Codex Harness 這類項(xiàng)目里你通常能看到的形態(tài)是通過命令行或 Web 界面發(fā)起任務(wù)內(nèi)部把任務(wù)翻譯成可供模型處理的上下文同時(shí)把模型需要的外部工具注入到可執(zhí)行空間里最后把模型輸出再解析成用戶能看的結(jié)果。整個(gè)過程看著不復(fù)雜但細(xì)節(jié)非常多這也是為什么我們需要一篇不是背概念而是講實(shí)操的文章來拆解。建議學(xué) Harness 架構(gòu)時(shí)不要只看它的功能演示而是先問一個(gè)問題如果任務(wù)失敗、超時(shí)、重復(fù)執(zhí)行、工具返回異常這個(gè)框架是怎么處理的能回答清楚這個(gè)問題說明你真的看懂了它的架構(gòu)。2. 把 Harness 拆開看核心組件到底有哪些2.1 Agent 主循環(huán)整個(gè)架構(gòu)的發(fā)動(dòng)機(jī)Harness 架構(gòu)里最先要理解的是 Agent 主循環(huán)也叫 Agent Loop。它決定了智能體在執(zhí)行一個(gè)任務(wù)時(shí)會(huì)經(jīng)歷哪些反復(fù)步驟。常規(guī)流程是這樣的接收用戶請(qǐng)求把請(qǐng)求整理成系統(tǒng)提示和用戶消息發(fā)送給模型拿到模型回復(fù)判斷回復(fù)是直接答案還是工具調(diào)用請(qǐng)求。如果是工具調(diào)用就先執(zhí)行工具、拿回結(jié)果再把結(jié)果作為新的上下文喂給模型直到模型輸出最終答案。這個(gè)循環(huán)看起來簡(jiǎn)單但設(shè)計(jì)之處很講究。比如循環(huán)的最大次數(shù)是多少如果模型一直調(diào)用工具怎么辦單次執(zhí)行超時(shí)時(shí)間怎么設(shè)置工具調(diào)用結(jié)果過大時(shí)要不要截?cái)?。這些參數(shù)直接影響到任務(wù)的完成率。我在實(shí)際使用中會(huì)先把 max_iterations 設(shè)小一點(diǎn)比如 5驗(yàn)證流程正常后再調(diào)大避免一開始出現(xiàn)“模型反復(fù)調(diào)用工具不返回”的失控狀態(tài)。主循環(huán)還涉及任務(wù)的隊(duì)列管理。單任務(wù)模式相對(duì)簡(jiǎn)單但 Harness 在批量場(chǎng)景下會(huì)把多個(gè)任務(wù)排隊(duì)控制并發(fā)避免同時(shí)打爆模型 API 和本地資源。這也是它作為工程架構(gòu)和普通 Demo 的最大區(qū)別。2.2 上下文管理與記憶模塊影響回答質(zhì)量的關(guān)鍵大模型有上下文窗口限制而 Agent 場(chǎng)景里要處理的信息量往往特別大歷史對(duì)話、工具返回結(jié)果、用戶初始輸入、系統(tǒng)提示詞、參考資料。如果不做管理很快會(huì)把上下文塞滿。Harness 類的項(xiàng)目通常會(huì)做幾件事按 token 數(shù)截?cái)?、聚類壓縮、重要內(nèi)容保存到長(zhǎng)期記憶、結(jié)果落盤。這里最需要留意的是截?cái)嗖呗浴S行┛蚣苁呛?jiǎn)單地從最早的消息開始刪這會(huì)丟關(guān)鍵信息好一點(diǎn)的做法是給不同消息設(shè)置權(quán)重比如工具執(zhí)行結(jié)果可以壓縮成摘要但用戶的核心指令保留。記憶模塊則通常分為短期記憶和長(zhǎng)期記憶。短期記憶就是當(dāng)前任務(wù)內(nèi)的上下文長(zhǎng)期記憶會(huì)在不同任務(wù)之間復(fù)用比如用戶偏好、之前任務(wù)的結(jié)果記錄。大模型開發(fā)里經(jīng)常會(huì)說“讓 Agent 記住上次的對(duì)話”其實(shí)就是把記憶從內(nèi)存持久化到數(shù)據(jù)庫或本地文件。面試官問記憶實(shí)現(xiàn)時(shí)你可以說清楚存儲(chǔ)介質(zhì)、檢索方式和寫入時(shí)機(jī)會(huì)比只背概念加分很多。2.3 工具注冊(cè)與執(zhí)行沙箱Agent 能力的延伸Harness 區(qū)別于普通對(duì)話機(jī)器人的地方就在這里。有了工具調(diào)用Agent 才能去查數(shù)據(jù)庫、執(zhí)行代碼、發(fā)送請(qǐng)求、操作文件。工具注冊(cè)通常需要聲明三樣?xùn)|西工具名稱、工具描述、工具參數(shù)結(jié)構(gòu)。名稱要唯一描述要讓模型理解什么時(shí)候該用參數(shù)結(jié)構(gòu)要符合模型的函數(shù)調(diào)用協(xié)議。實(shí)際項(xiàng)目中工具描述寫得好不好直接影響模型選工具的準(zhǔn)確率。如果模型經(jīng)常選錯(cuò)工具優(yōu)先檢查描述是否清晰而不是急著換模型。工具執(zhí)行側(cè)安全性是重點(diǎn)。尤其當(dāng) Agent 需要執(zhí)行代碼時(shí)Harness 一般會(huì)限制執(zhí)行環(huán)境比如沙箱、容器、或至少限制可訪問的目錄和網(wǎng)絡(luò)。搭建測(cè)試環(huán)境時(shí)也不要圖省事直接給整個(gè)服務(wù)器權(quán)限最好用一個(gè)臨時(shí)目錄或 Docker 容器來跑可能危險(xiǎn)的操作。常見錯(cuò)誤是工具返回結(jié)果格式不統(tǒng)一。比如有的工具返回 JSON有的返回純文本有的返回大段 HTML。Harness 需要在工具調(diào)用后做一層標(biāo)準(zhǔn)化解析否則模型看到混亂內(nèi)容會(huì)懵或者把不該復(fù)述的內(nèi)容直接輸出給用戶。2.4 模型接入層與多智能體調(diào)度模型接入層做的是把不同模型統(tǒng)一成同一種調(diào)用格式。你可能會(huì)在 Harness 里切換不同模型的 API這時(shí)候接入層要能統(tǒng)一處理請(qǐng)求日志、超時(shí)重試、返回解析。很多 Harness 項(xiàng)目支持多智能體即同一個(gè)任務(wù)由多個(gè)不同角色分工完成。比如一個(gè)智能體負(fù)責(zé)理解用戶意圖另一個(gè)負(fù)責(zé)檢索資料第三個(gè)負(fù)責(zé)整理答案。多智能體架構(gòu)的難點(diǎn)在于任務(wù)怎么拆分、結(jié)果怎么合并、之間怎么通信。我在自己的實(shí)驗(yàn)里發(fā)現(xiàn)多智能體并不總是比單 Agent 好。任務(wù)復(fù)雜度不高時(shí)單 Agent 加工具已經(jīng)足夠多智能體反而會(huì)帶來更多上下文消耗和協(xié)調(diào)失敗的可能性。如果你在面試或項(xiàng)目評(píng)審里討論多智能體能說出“什么時(shí)候不該用多智能體”會(huì)是一個(gè)差異化優(yōu)勢(shì)。因?yàn)楹芏嗫蚣苤皇窃谛麄鞫嘀悄荏w能力但真正在固定預(yù)算和延遲約束下單 Agent 的穩(wěn)定性往往更高。3. 本地環(huán)境搭建從零到能發(fā)起第一次對(duì)話3.1 跑 Harness 前需要準(zhǔn)備什么先給結(jié)論你不要一上來就研究所有功能先驗(yàn)證最小環(huán)境能跑通。以常見的本地 Harness 項(xiàng)目為例環(huán)境準(zhǔn)備通常包含這幾個(gè)維度。硬件資源普通開發(fā)機(jī)足夠跑 Agent 框架本身但如果你還要本地部署模型就要單獨(dú)看顯存和內(nèi)存。常見情況下顯存至少 8GB 以上才能跑 7B 量級(jí)的量化模型如果模型更大或需要更高精度16GB 到 24GB 會(huì)比較穩(wěn)妥。只運(yùn)行框架、API 調(diào)用云端模型的話8GB 內(nèi)存的開發(fā)機(jī)也能跑。軟件依賴一般會(huì)要求 Python 3.10 以上或者 Node 18 以上具體取決于項(xiàng)目主要語言。使用這類工具時(shí)建議安裝版本管理工具避免系統(tǒng)自帶 Python 或 Node 版本過舊。項(xiàng)目的依賴安裝基本都用 pip、npm 或 pnpm。網(wǎng)絡(luò)條件拉取模型權(quán)重、安裝依賴、調(diào)用云端 API 都需要網(wǎng)絡(luò)。如果你所在環(huán)境對(duì)某些域名訪問不穩(wěn)定優(yōu)先配置好鏡像源比如 pip 或 npm 的國(guó)內(nèi)鏡像然后重試。這可以排除很多卡在依賴安裝階段的問題。API 憑證如果使用云端模型需要準(zhǔn)備 API Key并在配置文件中設(shè)置模型名稱、接口地址、密鑰等信息。3.2 最小步驟安裝、配置、啟動(dòng)以一個(gè)典型的使用 pnpm 安裝和 Web 界面交互的 Harness 項(xiàng)目為例我建議按以下順序操作。第一步檢查基礎(chǔ)環(huán)境。node -v python3 --version pnpm -v如果 pnpm 沒有安裝先全局安裝npm install -g pnpm第二步克隆項(xiàng)目并安裝依賴。安裝過程里如果網(wǎng)絡(luò)不穩(wěn)定先配置鏡像源再重試。git clone 項(xiàng)目地址 cd 項(xiàng)目目錄 pnpm install第三步檢查配置文件。通常項(xiàng)目里會(huì)有一個(gè).env.example或config.example.json復(fù)制成實(shí)際使用的配置cp .env.example .env # 編輯 .env填入模型 API Key、模型名稱等第四步啟動(dòng)項(xiàng)目。常見的啟動(dòng)方式有兩種一種是純命令行pnpm dsh run 你的測(cè)試問題另一種是啟動(dòng) Web 界面pnpm dsh web啟動(dòng)后瀏覽器訪問localhost對(duì)應(yīng)的端口即可。如果端口被占用日志里會(huì)報(bào)錯(cuò)需要換一個(gè)可用端口。注意第一次不要開太復(fù)雜的任務(wù)先發(fā)一個(gè)簡(jiǎn)單問題確認(rèn)模型能返回結(jié)果再繼續(xù)加工具和批量任務(wù)。3.3 啟動(dòng)失敗的排查順序這類框架卡住是常態(tài)但排查要有順序。別一上來就懷疑框架的 Bug先按下面四層排。第一層看依賴和版本。很多啟動(dòng)失敗是某個(gè)依賴版本不兼容導(dǎo)致的。先確認(rèn) Node 或 Python 版本是否滿足要求再確認(rèn)安裝依賴過程中有沒有報(bào)錯(cuò)。pnpm install如果出現(xiàn)類似 electron 下載失敗、node-gyp 編譯錯(cuò)誤、模塊缺失的提示說明是安裝階段的問題。第二層看配置。確認(rèn) API Key 有沒有填對(duì)、模型名稱是否能被當(dāng)前框架識(shí)別、接口地址有沒有拼寫錯(cuò)誤。模型名稱寫錯(cuò)是最常見的低級(jí)失誤報(bào)錯(cuò)信息可能很誤導(dǎo)人比如 401、404 或空響應(yīng)。第三層看日志。大部分 Harness 項(xiàng)目會(huì)在終端打印運(yùn)行日志。卡在pnpm dsh web時(shí)日志會(huì)告訴你卡在哪個(gè)階段。比如最常見的是模型權(quán)重下載、依賴編譯、端口監(jiān)聽。你可以根據(jù)日志倒數(shù)幾行去定位。第四層看資源。如果內(nèi)存不足或進(jìn)程死鎖程序可能沒有任何可讀報(bào)錯(cuò)就卡死。打開系統(tǒng)監(jiān)控看 CPU、內(nèi)存、磁盤是否被打滿。如果磁盤滿了模型權(quán)重和日志都會(huì)寫不進(jìn)去程序表現(xiàn)為一直在等待非常具有迷惑性。我遇到過不少看起來像“框架不支持某個(gè)功能”的問題最后定位都是配置錯(cuò)誤或目錄權(quán)限問題。所以排查時(shí)先把輸入、環(huán)境、配置這幾層過完再懷疑功能和代碼。4. 實(shí)戰(zhàn)配置從單輪問答到會(huì)調(diào)用工具的智能體4.1 先實(shí)現(xiàn)一個(gè)干凈的問答 Agent很多時(shí)候你只需要一個(gè)干凈的問答鏈路不涉及工具調(diào)用。這時(shí) Harness 的配置應(yīng)該盡量精簡(jiǎn)設(shè)置一個(gè)短的系統(tǒng)提示詞指定返回格式其他參數(shù)用默認(rèn)值。配置里最核心的幾個(gè)參數(shù)是這幾個(gè)模型名稱、溫度、最大輸出 token、最大循環(huán)次數(shù)。溫度控制隨機(jī)性問答場(chǎng)景建議設(shè)置為 0.2 到 0.5 之間。最大輸出 token 要看你需要的答案長(zhǎng)度但不要設(shè)得太大因?yàn)檫^長(zhǎng)的輸出會(huì)增加等待時(shí)間和失敗概率。這里我建議把 Agent 的系統(tǒng)提示詞寫得具體一些明確“你是干什么的”“回答時(shí)要不要引用來源”“如果不知道應(yīng)該怎么處理”。系統(tǒng)提示詞越具體后續(xù)越少出現(xiàn)跑偏。跑通之后驗(yàn)證這三個(gè)點(diǎn)輸入能不能被正確解析、輸出能不能被正確渲染、多輪對(duì)話時(shí)上下文是否按預(yù)期工作。如果發(fā)現(xiàn)第二輪回復(fù)丟失上一輪信息說明上下文管理沒配置好優(yōu)先檢查記憶模塊是否開啟。4.2 工具調(diào)用讓 Agent 學(xué)會(huì)“動(dòng)手干活”工具調(diào)用是 Harness 實(shí)戰(zhàn)里最重要的一個(gè)能力。以一個(gè)簡(jiǎn)單工具為例假設(shè)你要讓 Agent 能執(zhí)行一段計(jì)算任務(wù)。工具注冊(cè)的示意圖大致如下def calculate_expression(expression: str) - str: # 生產(chǎn)環(huán)境不要用 eval這里只是示意 return str(eval(expression)) tool_registry { calculate: { description: 計(jì)算數(shù)學(xué)表達(dá)式例如 3 * 7 2, parameters: { type: object, properties: { expression: { type: string, description: 需要計(jì)算的數(shù)學(xué)表達(dá)式 } }, required: [expression] }, handler: calculate_expression } }注冊(cè)后要在配置里把工具名加入 Agent 的可用工具列表。然后發(fā)一條需要計(jì)算的問題觀察模型是否選擇調(diào)用工具、工具結(jié)果是否正確返回、最終回答是否引用了工具結(jié)果。這里最常遇到的坑是模型不調(diào)用工具。一般是工具描述不清晰或者是主循環(huán)配置里沒有把工具列表傳給模型。第二個(gè)坑是工具執(zhí)行失敗但 Agent 假裝成功。比如工具返回空結(jié)果模型可能直接編造一個(gè)答案。要避免這個(gè)需要查看日志確認(rèn)每個(gè)步驟的實(shí)際輸出。4.3 批量任務(wù)不能只跑通一條就算數(shù)批量任務(wù)是 Harness 從玩具走向工程的分水嶺。很多人在單條任務(wù)里表現(xiàn)很好但一跑批量就出各種問題。批量場(chǎng)景下重點(diǎn)看四件事。第一輸入格式統(tǒng)一。所有任務(wù)最好轉(zhuǎn)換成同一種格式比如 JSON 數(shù)組或 Markdown 文件列表不要一個(gè)任務(wù)一種寫法。第二輸出命名與目錄。批量任務(wù)的結(jié)果要按任務(wù) ID 或輸入文件名命名避免覆蓋。如果你同時(shí)在跑多個(gè)任務(wù)輸出目錄一定要分好層級(jí)。第三失敗重試與斷點(diǎn)。批量至少要有失敗重試機(jī)制。長(zhǎng)時(shí)間任務(wù)如果中斷能不能從上次失敗的條目繼續(xù)是衡量工具是否適合生產(chǎn)的重要標(biāo)準(zhǔn)。第四并發(fā)控制。不要一上來就開最大并發(fā)。先跑 1 條再跑 3 條觀察延遲和資源占用再逐步提高。并發(fā)過高模型 API 會(huì)限流本地進(jìn)程也會(huì)因?yàn)閮?nèi)存不足被系統(tǒng)殺掉。建議批量任務(wù)第一次跑時(shí)先在任務(wù)列表里挑 5 條覆蓋典型場(chǎng)景的用例。如果這 5 條都能正確處理輸出、日志和錯(cuò)誤再考慮跑完整批。4.4 如何判斷輸出質(zhì)量是否達(dá)標(biāo)很多人以為“有輸出”就等于“成功”這是誤區(qū)。在 Harness 場(chǎng)景里一個(gè)成功任務(wù)至少要滿足這幾個(gè)條件輸出內(nèi)容與用戶請(qǐng)求匹配、輸出包含必要的結(jié)構(gòu)化字段、工具調(diào)用的結(jié)果被正確落到上下文里、日志里沒有未處理的異常、單次任務(wù)耗時(shí)在可接受范圍。如果輸出為空、輸出太短、輸出重復(fù)同一句話、輸出和用戶請(qǐng)求無關(guān)都不要當(dāng)成正?,F(xiàn)象。尤其是批量任務(wù)寧可多開幾個(gè)類型的測(cè)試樣例也不要只跑一條“完美樣例”就判斷整個(gè)方案可靠。5. 面試和項(xiàng)目評(píng)審時(shí)Harness 相關(guān)的問題其實(shí)在考什么5.1 面試題往往不是讓你背架構(gòu)圖網(wǎng)上很多“面試題”只是列出概念讓你解釋什么是 Harness、什么是 Agent、什么是工具調(diào)用。但真正有區(qū)分度的面試題是讓你在給定約束下設(shè)計(jì)一個(gè)方案或者指出當(dāng)前方案的短板。比如面試官可能會(huì)問“如果你的 Agent 在連續(xù)執(zhí)行 50 個(gè)任務(wù)后回答質(zhì)量越來越差你會(huì)怎么排查”這道題考的是上下文管理、記憶模塊、日志監(jiān)控這三點(diǎn)。合理的回答思路是先看日志確認(rèn)上下文是否一直在增長(zhǎng)再看模型是否在長(zhǎng)上下文下丟失關(guān)鍵信息接著檢查是否觸發(fā)了上下文截?cái)嗖呗宰詈蟠_認(rèn)記憶模塊有沒有正確保存和檢索。另一個(gè)高頻問題是“如果一個(gè)工具調(diào)用的結(jié)果非常大比如一次返回了 10 萬字的文本你怎么處理”這個(gè)問題考的是對(duì)上下文窗口和消息結(jié)構(gòu)的理解??梢曰卮鸸ぞ呓Y(jié)果做摘要、截?cái)?、分段存?chǔ)或者讓模型先提取關(guān)鍵信息再?zèng)Q定是否需要完整內(nèi)容。5.2 幾個(gè)可以直接套用的回答框架框架一先說結(jié)論再說手段最后補(bǔ)邊界。比如問“Harness 的核心價(jià)值是什么”不要只說“它是智能體的調(diào)度框架”而要接著說“它的價(jià)值在于把模型調(diào)用、工具執(zhí)行、上下文管理、失敗重試這些公共能力收斂到統(tǒng)一層避免每個(gè)業(yè)務(wù)重復(fù)開發(fā)”再補(bǔ)一句“但它的邊界是如果業(yè)務(wù)邏輯特別復(fù)雜仍然需要定制主循環(huán)不能全靠配置”??蚣芏脤?duì)比來解釋。面試官問“Harness 和直接調(diào)大模型 API 有什么區(qū)別”可以對(duì)比裸 API 只有請(qǐng)求和響應(yīng)Harness 多出了主循環(huán)、工具解析、上下文管理、任務(wù)隊(duì)列。對(duì)比之后再舉一個(gè)實(shí)際場(chǎng)景比如“如果用戶讓 Agent 連續(xù)查詢?nèi)螖?shù)據(jù)庫后匯總結(jié)果”說明裸 API 很難直接實(shí)現(xiàn)而 Harness 天然支持這類多步推理。框架三把問題引到工程指標(biāo)上。當(dāng)被問到“你怎么評(píng)估一套 Harness 方案好不好”不要只聊功能要給指標(biāo)任務(wù)成功率、平均延遲、失敗重試次數(shù)、上下文消耗量、日志可讀性、依賴安裝復(fù)雜度。這些指標(biāo)一出來說明你是真的做過落地而不是只寫過簡(jiǎn)單的 Demo。5.3 面試?yán)锍R姷摹胺刺茁贰眴栴}有些面試官會(huì)故意問一些看似和 Harness 無關(guān)的題目。比如“你做過最失敗的項(xiàng)目是什么”如果你做過 Agent 應(yīng)用可以誠(chéng)實(shí)說一次批量任務(wù)因?yàn)椴l(fā)過高導(dǎo)致 API 限流和結(jié)果丟失的經(jīng)歷。重點(diǎn)是講清楚你是如何發(fā)現(xiàn)、排查、解決的這比講一個(gè)完美的成功案例更有說服力。也有面試官會(huì)問“多智能體一定比單 Agent 好嗎”這時(shí)候不要為了迎合潮流可以說“不是場(chǎng)景復(fù)雜度不夠時(shí)單 Agent 加工具更穩(wěn)定、成本更低只有任務(wù)天然可拆且需要不同角色時(shí)多智能體才有優(yōu)勢(shì)”。這種回答體現(xiàn)的是工程判斷力而不是工具狂熱度。還有一個(gè)問題很常見“如果測(cè)試集中有 20 個(gè)場(chǎng)景其中 5 個(gè)場(chǎng)景 Agent 回答混亂你會(huì)怎么優(yōu)化”正確的思路不是立刻換模型而是先分析這 5 個(gè)場(chǎng)景有什么共性是工具選擇錯(cuò)誤、上下文丟失還是提示詞不夠清晰。不同原因?qū)?yīng)不同優(yōu)化方向換模型是最后一步不是第一步。6. 真正常態(tài)化使用時(shí)最該盯住的邊界和坑6.1 資源占用會(huì)跑不代表能批量跑本地部署 Harness 類項(xiàng)目時(shí)最容易產(chǎn)生誤判的是單條任務(wù)能跑通就以為生產(chǎn)環(huán)境沒問題。實(shí)際上批量任務(wù)會(huì)同時(shí)放大三方面的資源消耗上下文占用的內(nèi)存、工具執(zhí)行占用的 CPU 和文件句柄、API 調(diào)用的帶寬與配額。如果你負(fù)責(zé)一個(gè) 200 條任務(wù)的批量隊(duì)列建議先做一次資源預(yù)判任務(wù)平均耗時(shí)、單任務(wù)上下文 token 數(shù)、同時(shí)占用進(jìn)程數(shù)量。比如平均每個(gè)任務(wù)消耗 8000 token200 個(gè)任務(wù)就是 160 萬 token具體費(fèi)用和耗時(shí)都可以估算出來。提前算這筆賬能避免任務(wù)跑到一半才發(fā)現(xiàn)配額不夠或內(nèi)存不足。低配機(jī)器能跑不代表適合跑復(fù)雜任務(wù)。如果內(nèi)存只有 8GB把顯存要求高的本地模型和多線程執(zhí)行放到同一臺(tái)機(jī)器上很容易因?yàn)閮?nèi)存不足導(dǎo)致進(jìn)程被殺。讓一臺(tái)機(jī)器只做模型推理另一臺(tái)只做任務(wù)編排這個(gè)方案雖然簡(jiǎn)單但很有效。6.2 輸入輸出格式報(bào)錯(cuò)的大半來源Harness 項(xiàng)目的輸入輸出格式比普通腳本嚴(yán)格得多。輸入 JSON 里多一個(gè)無用的字段、少一個(gè)必填字段、編碼不是 UTF-8都可能導(dǎo)致解析失敗或不穩(wěn)定。實(shí)際測(cè)試時(shí)盡量保證輸入材料干凈統(tǒng)一換行符、統(tǒng)一編碼、避免空行和特殊字符。輸出端同樣要注意。如果你把 Agent 輸出接入下游系統(tǒng)下游系統(tǒng)往往對(duì)格式要求嚴(yán)格。比如只要 JSON那就是全部 JSON不能有解釋文字。這里你需要在系統(tǒng)提示詞里強(qiáng)制說明“只輸出 JSON不要多余解釋”并在主循環(huán)里增加結(jié)果校驗(yàn)邏輯如果模型輸出不合規(guī)就重新生成或拋出可讀錯(cuò)誤。我一般會(huì)先在 Harness 里對(duì)每條任務(wù)的輸入輸出做 schema 校驗(yàn)校驗(yàn)不過的任務(wù)單獨(dú)進(jìn)入“待人工處理”目錄而不是混在成功任務(wù)里。這個(gè)習(xí)慣能省下大量后期整理數(shù)據(jù)的時(shí)間。6.3 日志、失敗重試和任務(wù)隊(duì)列批量前先想清楚批量任務(wù)最怕的不是執(zhí)行慢而是“不知道跑到哪了、失敗了沒記錄、重試之后輸出混亂”。所以落地之前先確認(rèn)三件事。第一日志要按任務(wù) ID 記錄。不能所有任務(wù)共用一個(gè)日志文件否則排查時(shí)根本分不清是哪條任務(wù)報(bào)錯(cuò)。如果是 Web 界面服務(wù)日志還需要附帶時(shí)間戳和請(qǐng)求 ID。第二失敗重試要有上限。Harness 雖然可以做重試但無限制重試會(huì)浪費(fèi)資源和時(shí)間。一般重試 2 到 3 次比較合理超過后標(biāo)記失敗移動(dòng)到一個(gè)專門的目錄等人工處理。第三輸出文件要原子化。批量任務(wù)寫入結(jié)果時(shí)先寫臨時(shí)文件寫完后重命名。如果程序中途崩潰臨時(shí)文件可以清理不會(huì)留下半截結(jié)果讓人誤判為成功。6.4 我的建議順序單任務(wù)、小批量、大批量、持續(xù)觀察最后說一個(gè)個(gè)人經(jīng)驗(yàn)。不管是學(xué)習(xí)還是正式使用 Harness都建議按這個(gè)順序推進(jìn)先跑通單條任務(wù)確認(rèn)輸入輸出和日志正常再跑 5 到 10 條的小批量檢查輸出命名、失敗重試和耗時(shí)確認(rèn)沒有問題后才擴(kuò)大到完整批量批量運(yùn)行期間至少看一眼實(shí)時(shí)日志和資源占用別跑完就不管了。踩過幾次坑之后我發(fā)現(xiàn)很多問題不是框架能力不夠而是前置環(huán)境和輸入材料沒有處理干凈。模型選錯(cuò)、上下文沒管好、工具描述不清晰、并發(fā)開太大這些才是大多數(shù)失敗案例的真正原因。Harness 本身只是把復(fù)雜流程結(jié)構(gòu)化但它不會(huì)替你做數(shù)據(jù)清洗、環(huán)境管理和質(zhì)量驗(yàn)收。把這些前置工作做好這個(gè)架構(gòu)才能真正變成能長(zhǎng)期使用的工程底座。