棧選型到實(shí)戰(zhàn)部署)
做智能大腦這件事真正難的不是選一個(gè)“最強(qiáng)模型”而是怎么把底座模型、記憶、知識(shí)庫(kù)、工具調(diào)用和業(yè)務(wù)系統(tǒng)組織成一套能長(zhǎng)期穩(wěn)定運(yùn)行的技術(shù)棧。Qwen和DeepSeek是我在模擬項(xiàng)目里用得最多的兩組底座前者中文指令跟隨和工具調(diào)用非常穩(wěn)后者復(fù)雜推理和長(zhǎng)上下文很有優(yōu)勢(shì)。這篇文章把我用這兩個(gè)模型構(gòu)建智能大腦的完整思路寫(xiě)下來(lái)包括選型邏輯、分層架構(gòu)、核心模塊拆解、部署參數(shù)和排查記錄給正在從“單模型問(wèn)答”往“系統(tǒng)級(jí)智能體”遷移的朋友做個(gè)參考。這套方案適合誰(shuí)準(zhǔn)備把大模型接進(jìn)真實(shí)業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)者、已經(jīng)跑通單一模型接口但總被“沒(méi)記憶、答非所問(wèn)、上下文爆掉”困擾的團(tuán)隊(duì)以及正在糾結(jié)“Qwen和DeepSeek到底選哪個(gè)”的人。先說(shuō)結(jié)論真正好用的智能大腦不是靠挑一個(gè)更聰明的底座而是靠一套分工明確的技術(shù)棧。1. 智能大腦的整體藍(lán)圖先搞清楚技術(shù)棧里應(yīng)該放什么1.1 從“單模型問(wèn)答”到“系統(tǒng)級(jí)大腦”差的不只是模型很多人一開(kāi)始容易踩坑覺(jué)得只要選一個(gè)聰明的模型接進(jìn)來(lái)系統(tǒng)就變聰明了。實(shí)際跑起來(lái)才發(fā)現(xiàn)沒(méi)有記憶、沒(méi)法查內(nèi)部數(shù)據(jù)、不能操作業(yè)務(wù)系統(tǒng)模型就是一座孤島。我也見(jiàn)過(guò)不少團(tuán)隊(duì)把Qwen系列接進(jìn)聊天窗口結(jié)果一問(wèn)到具體業(yè)務(wù)數(shù)據(jù)就啞火最后要么把答案硬編碼進(jìn)Prompt要么靠人工復(fù)制粘貼體驗(yàn)非常糟糕。一個(gè)能落地的智能大腦至少需要解決四件事知道用戶問(wèn)什么、記得上下文說(shuō)過(guò)什么、能查到外部數(shù)據(jù)、能調(diào)用工具完成動(dòng)作。這四件事對(duì)應(yīng)到技術(shù)棧里就是模型層、記憶層、知識(shí)檢索層和工具調(diào)用層。把它們組合起來(lái)才叫大模型技術(shù)棧否則只是在用一個(gè)模型接口。我習(xí)慣把整個(gè)系統(tǒng)類比成一個(gè)人底座模型是大腦皮層負(fù)責(zé)思考和表達(dá)記憶模塊像海馬體負(fù)責(zé)記住剛才聊過(guò)什么知識(shí)庫(kù)是隨身攜帶的圖書(shū)館隨時(shí)查證工具調(diào)用是手和腳負(fù)責(zé)執(zhí)行動(dòng)作。任何一個(gè)環(huán)節(jié)缺失這個(gè)人都會(huì)顯得很笨。1.2 技術(shù)棧的五層劃分每一層都解決一個(gè)具體問(wèn)題具體到項(xiàng)目里我把技術(shù)棧分成五層模型層Qwen系列、DeepSeek系列作為主要推理底座另外配專門(mén)的embedding模型和rerank模型編排層Agent框架、任務(wù)路由、狀態(tài)管理負(fù)責(zé)把用戶請(qǐng)求拆解成可執(zhí)行的動(dòng)作記憶層短期上下文管理、長(zhǎng)期向量記憶、自動(dòng)摘要工具層Function Calling定義、業(yè)務(wù)API接入、代碼解釋器執(zhí)行應(yīng)用層統(tǒng)一會(huì)話入口、權(quán)限控制、日志埋點(diǎn)、效果評(píng)估為什么要分層因?yàn)槊恳粚佣荚讵?dú)立演進(jìn)。今天想換一個(gè)更聰明的底座模型只需要改模型層的接入配置工具層和應(yīng)用層完全不用動(dòng)明天想新增一個(gè)查詢工具只要按既定Schema補(bǔ)一條定義就行。分層最大的價(jià)值是降低了“牽一發(fā)而動(dòng)全身”的耦合風(fēng)險(xiǎn)。另外分層的系統(tǒng)才方便做評(píng)測(cè)。跑一輪回歸測(cè)試如果輸出變差了可以快速定位是模型版本變了還是知識(shí)庫(kù)召回變了還是工具返回格式變了。這個(gè)能力在單模型加一大段Prompt的架構(gòu)里幾乎不可能實(shí)現(xiàn)。2. 底座選型Qwen與DeepSeek的區(qū)別和組合策略2.1 不糾結(jié)誰(shuí)更強(qiáng)先看各自擅長(zhǎng)什么把Qwen和DeepSeek放在一起比“誰(shuí)更強(qiáng)”是個(gè)偽命題更合理的方式是先看任務(wù)類型。Qwen系列在中文對(duì)話、指令跟隨、工具調(diào)用場(chǎng)景很穩(wěn)社區(qū)里的Agent案例大量跑在Qwen上部署方案和周邊工具都全中小團(tuán)隊(duì)很快能跑起來(lái)。DeepSeek系列在復(fù)雜推理、數(shù)學(xué)、代碼邏輯鏈上優(yōu)勢(shì)明顯面對(duì)多跳問(wèn)題不容易中途“斷開(kāi)思路”同時(shí)訓(xùn)練和推理成本控制得比較好長(zhǎng)上下文場(chǎng)景下也有優(yōu)勢(shì)。我自己的實(shí)測(cè)感受是要求“把一段需求拆解成三個(gè)步驟并安排執(zhí)行順序”Qwen給出的結(jié)果工整、適合直接執(zhí)行DeepSeek會(huì)給出更深入的分析和備選方案但偶爾會(huì)夾帶較多思考性描述。不能簡(jiǎn)單說(shuō)誰(shuí)比誰(shuí)好只能說(shuō)它們回答的風(fēng)格和適用場(chǎng)景不同。下面這個(gè)表是我做選型時(shí)的常用參考注意它不是絕對(duì)的具體還要看你的數(shù)據(jù)和部署條件任務(wù)類型更推薦的選擇理由日常對(duì)話、客服問(wèn)答Qwen系列中文指令跟隨穩(wěn)定響應(yīng)風(fēng)格可控復(fù)雜推理、數(shù)學(xué)、邏輯規(guī)劃DeepSeek系列推理鏈路更長(zhǎng)多步拆解表現(xiàn)好代碼生成、代碼補(bǔ)全DeepSeek或?qū)?yīng)的代碼專用模型代碼邏輯連貫上下文銜接好Function Calling工具調(diào)用Qwen系列工具調(diào)用格式和周邊生態(tài)更成熟長(zhǎng)文檔分析DeepSeek系列長(zhǎng)上下文方面更有優(yōu)勢(shì)多模態(tài)圖文任務(wù)Qwen系列的多模態(tài)版本圖文關(guān)聯(lián)能力強(qiáng)這個(gè)表只是選型起點(diǎn)。真正做決定時(shí)要結(jié)合自己的場(chǎng)景跑一組評(píng)測(cè)問(wèn)題而不是看誰(shuí)熱度高。項(xiàng)目里要留一個(gè)評(píng)測(cè)集至少準(zhǔn)備30到50條真實(shí)業(yè)務(wù)問(wèn)題每次換模型都跑一遍對(duì)比回答質(zhì)量和格式合規(guī)率。2.2 組合使用用路由層把兩個(gè)模型放進(jìn)同一條流水線既然兩個(gè)模型各有優(yōu)勢(shì)最自然的組合方式不是二選一而是讓路由層根據(jù)請(qǐng)求類型把任務(wù)分發(fā)給對(duì)應(yīng)模型。我們項(xiàng)目里簡(jiǎn)單的FAQ查詢、日常聊天、工具操作對(duì)話走Qwen因?yàn)樗?、風(fēng)格穩(wěn)復(fù)雜的多跳推理、長(zhǎng)文檔總結(jié)、代碼調(diào)試走DeepSeek因?yàn)樗m合慢下來(lái)思考。路由聽(tīng)起來(lái)高大上實(shí)現(xiàn)起來(lái)可以很樸素。早期用規(guī)則加關(guān)鍵詞就能分類請(qǐng)求里有“推導(dǎo)”“證明”“對(duì)比分析”“計(jì)算”“規(guī)劃”這類詞就路由到DeepSeek剩下的走Qwen。等日志數(shù)據(jù)積累多了可以換一個(gè)小模型做意圖分類本質(zhì)上也是把文本分類任務(wù)交給模型。def route_query(query: str) - str: reason_keywords [推導(dǎo), 證明, 對(duì)比分析, 計(jì)算, 規(guī)劃, 為什么] if any(k in query for k in reason_keywords): return deepseek if detect_tool_intent(query): return qwen return qwen有個(gè)心得非常重要路由層不要做得太重。很多人一上來(lái)就上復(fù)雜的Agent規(guī)劃框架結(jié)果模型還沒(méi)干活路由先出問(wèn)題。最初的版本只要做到“把明顯需要深度推理的請(qǐng)求識(shí)別出來(lái)”就夠了剩下的默認(rèn)走日常模型。等有足夠日志和錯(cuò)誤樣本后再逐步優(yōu)化路由規(guī)則。組合使用的另一個(gè)好處是容災(zāi)。Qwen的服務(wù)因?yàn)槟P桶姹靖鲁霈F(xiàn)抖動(dòng)時(shí)可以把流量切到DeepSeek反過(guò)來(lái)也行。同一個(gè)請(qǐng)求在兩個(gè)底座上各跑一遍做效果對(duì)比也比只用一個(gè)模型更容易發(fā)現(xiàn)回歸問(wèn)題。這在實(shí)際長(zhǎng)期運(yùn)行中的價(jià)值比單純“誰(shuí)強(qiáng)用誰(shuí)”大得多。3. 記憶、工具調(diào)用與知識(shí)檢索三個(gè)讓大腦真正能用的關(guān)鍵設(shè)計(jì)3.1 記憶系統(tǒng)短期上下文、長(zhǎng)期記憶和摘要策略沒(méi)有記憶的智能助手每輪對(duì)話都是“初次見(jiàn)面”。很多項(xiàng)目的失敗點(diǎn)恰恰在這里不加節(jié)制地把所有歷史對(duì)話塞進(jìn)上下文結(jié)果窗口爆掉模型開(kāi)始答非所問(wèn)。記憶系統(tǒng)至少要分兩層短期記憶管理最近N輪對(duì)話長(zhǎng)期記憶保存用戶偏好、歷史結(jié)論和關(guān)鍵事實(shí)。短期記憶的建議做法是給模型上下文設(shè)置一個(gè)軟預(yù)算。比如模型窗口是32K可以只讓對(duì)話歷史占16K留出一半給工具返回結(jié)果和知識(shí)庫(kù)內(nèi)容。每次組裝請(qǐng)求時(shí)算一下當(dāng)前歷史有多少token超過(guò)預(yù)算就把最老的幾輪丟掉或者轉(zhuǎn)成摘要。別等上下文滿了再處理到那時(shí)已經(jīng)晚了。長(zhǎng)期記憶我用“向量存儲(chǔ)加摘要”的形式。不是把每輪對(duì)話都塞進(jìn)向量庫(kù)而是當(dāng)對(duì)話滿足一定條件時(shí)調(diào)用模型生成一段摘要再寫(xiě)回向量庫(kù)。比如用戶提到“這個(gè)季度要重點(diǎn)優(yōu)化轉(zhuǎn)化率”這就是值得存的信息。觸發(fā)條件可以設(shè)計(jì)成檢測(cè)到新實(shí)體、出現(xiàn)決策性結(jié)論、對(duì)話輪數(shù)達(dá)到閾值。這里給一個(gè)我常用的摘要提示詞模板請(qǐng)把下面的對(duì)話壓縮成一段不超過(guò)100字的用戶畫(huà)像或關(guān)鍵結(jié)論 只保留對(duì)后續(xù)對(duì)話有價(jià)值的信息不要重復(fù)已經(jīng)知道的事實(shí)。 對(duì)話內(nèi)容...這個(gè)模板看起來(lái)簡(jiǎn)單但實(shí)際效果很好。關(guān)鍵是“只保留對(duì)后續(xù)對(duì)話有價(jià)值的信息”這句話能幫模型過(guò)濾寒暄和無(wú)效信息。長(zhǎng)期記憶不是越多越好少而精準(zhǔn)才是核心。3.2 工具調(diào)用先有結(jié)構(gòu)化協(xié)議再談讓模型“動(dòng)手”讓大模型操作業(yè)務(wù)系統(tǒng)靠的不是在對(duì)話里讓它“直接改”而是Function Calling機(jī)制。簡(jiǎn)單說(shuō)模型不是真正執(zhí)行函數(shù)而是輸出一個(gè)結(jié)構(gòu)化的調(diào)用請(qǐng)求由程序去執(zhí)行。Qwen和DeepSeek都支持類似能力但具體到提示詞模板和工具Schema的寫(xiě)法上會(huì)有差異。以查訂單為例工具定義大概長(zhǎng)這樣{ name: query_order, description: 根據(jù)訂單號(hào)查詢訂單狀態(tài)包括物流信息、支付金額、創(chuàng)建時(shí)間。, parameters: { type: object, properties: { order_id: { type: string, description: 用戶提供的訂單號(hào) } }, required: [order_id] } }注意description字段要寫(xiě)得足夠詳細(xì)因?yàn)槟P偷墓ぞ咭鈭D識(shí)別主要靠它。不要只寫(xiě)“查詢訂單”三個(gè)字要寫(xiě)清楚這個(gè)工具在什么情況下使用、參數(shù)格式是什么。我見(jiàn)過(guò)很多工具調(diào)用失敗案例根因都是description太簡(jiǎn)略模型根本不知道什么時(shí)候該用這個(gè)工具。程序拿到模型輸出的結(jié)構(gòu)化調(diào)用請(qǐng)求后執(zhí)行實(shí)際邏輯再把結(jié)果作為一條消息拼回對(duì)話上下文讓模型基于結(jié)果生成最終回答。這個(gè)閉環(huán)里有三個(gè)容易出錯(cuò)的地方一是模型輸出JSON不合法二是工具執(zhí)行失敗后模型“將錯(cuò)就錯(cuò)”編造結(jié)果三是沒(méi)有限制工具返回長(zhǎng)度導(dǎo)致上下文被撐爆。我的兜底建議解析JSON時(shí)不要直接一把梭先用正則提取代碼塊里的JSON工具執(zhí)行失敗時(shí)明確告訴模型“該工具調(diào)用失敗請(qǐng)基于已有信息回答不要編造結(jié)果”工具返回結(jié)果進(jìn)入上下文之前做好截?cái)嗪妥侄魏Y選只保留關(guān)鍵信息。3.3 知識(shí)檢索給智能大腦外掛一個(gè)專業(yè)資料庫(kù)大模型的知識(shí)截止時(shí)間有限專業(yè)領(lǐng)域數(shù)據(jù)也不在預(yù)訓(xùn)練范圍里所以RAG基本是智能大腦的必選項(xiàng)。RAG的流程并不復(fù)雜文檔切塊、向量化、召回、重排、把結(jié)果拼進(jìn)Prompt。但細(xì)節(jié)非常多每個(gè)環(huán)節(jié)都會(huì)讓答案質(zhì)量出現(xiàn)明顯波動(dòng)。先說(shuō)切塊。很多人直接把PDF按固定字?jǐn)?shù)切兩刀下去把一個(gè)完整概念切成兩半檢索出來(lái)自然缺胳膊少腿。更穩(wěn)妥的做法是按文檔結(jié)構(gòu)切先按標(biāo)題分章節(jié)再按段落分塊塊與塊之間保留少量重疊。我常用的參數(shù)是chunk_size設(shè)256到512 tokenoverlap約50 token既能保證語(yǔ)義完整又不會(huì)讓索引過(guò)大。再說(shuō)向量化。中文場(chǎng)景下embedding模型的選擇比很多人想象的更重要。一個(gè)針對(duì)英文優(yōu)化的向量模型遇到中文長(zhǎng)句時(shí)匹配質(zhì)量會(huì)明顯下降。建議先用幾組同義問(wèn)題做召回測(cè)試看看排序結(jié)果是否合理別只盯著公開(kāi)評(píng)測(cè)分?jǐn)?shù)。召回后的重排層值得單獨(dú)說(shuō)。初篩召回20條直接全部塞進(jìn)Prompt既浪費(fèi)token又引入噪聲用rerank模型重排后只保留前3到5條回答準(zhǔn)確度會(huì)明顯提升。重排層計(jì)算量不大但收益非常明顯應(yīng)該作為標(biāo)配而不是可選優(yōu)化。最后是Prompt組裝。把召回結(jié)果拼進(jìn)提示詞時(shí)要告訴模型“以下內(nèi)容來(lái)自知識(shí)庫(kù)檢索結(jié)果如果與問(wèn)題無(wú)關(guān)請(qǐng)明確說(shuō)不知道”。同時(shí)給每條結(jié)果加一個(gè)來(lái)源編號(hào)讓模型在回答時(shí)能引用方便人工審計(jì)。這不僅能降低幻覺(jué)還能讓用戶看到答案有據(jù)可查。4. 本地部署與編排層實(shí)現(xiàn)我跑通一套智能大腦的實(shí)操記錄4.1 模型服務(wù)部署vLLM與量化選型模型要落地離不開(kāi)推理服務(wù)。推理框架我用得最多的是vLLM吞吐量和顯存控制都比較好適合同時(shí)服務(wù)多個(gè)業(yè)務(wù)請(qǐng)求。Qwen系列的較小尺寸模型可以直接加載運(yùn)行DeepSeek系列因?yàn)閰?shù)量更大需要重點(diǎn)考慮顯存和量化方式。啟動(dòng)命令大致如下python -m vllm.entrypoints.openai.api_server \ --model ./models/qwen-7b-instruct \ --served-model-name qwen-brain \ --max-model-len 32768 \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.85幾個(gè)關(guān)鍵參數(shù)說(shuō)一下。max-model-len是最大上下文長(zhǎng)度設(shè)置成32K不代表每次都占用這么多而是給了一個(gè)上限但不要盲目設(shè)大否則KV Cache會(huì)吃掉大量顯存。tensor-parallel-size是張量并行數(shù)只有單卡顯存不夠時(shí)才需要多卡分?jǐn)?。gpu-memory-utilization控制在0.85左右別頂滿留點(diǎn)余量給偶發(fā)的顯存峰值不然高并發(fā)時(shí)容易OOM。量化方面我踩過(guò)“無(wú)腦上量化”的坑。如果顯卡能跑FP16或BF16就不要急著量化因?yàn)榱炕欢〞?huì)帶來(lái)精讀損失。只有在顯存確實(shí)捉襟見(jiàn)肘或需要提高并發(fā)時(shí)再考慮AWQ或GGUF。AWQ對(duì)生成任務(wù)更友好GGUF可以用CPU和GPU混合部署但速度和精度都要實(shí)測(cè)之后再?zèng)Q定。還有一個(gè)容易被忽略的點(diǎn)服務(wù)上線前一定要壓測(cè)。不要一上來(lái)就接業(yè)務(wù)流量用腳本模擬并發(fā)請(qǐng)求觀察P95延遲和顯存變化。我見(jiàn)過(guò)有人只測(cè)了單請(qǐng)求延遲一上生產(chǎn)并發(fā)就超時(shí)原因是并發(fā)時(shí)KV Cache占用的顯存翻倍增長(zhǎng)直接打爆顯存。4.2 編排層的代碼骨架怎么把路由、記憶、工具和RAG串起來(lái)編排層是整個(gè)智能大腦的中樞我習(xí)慣用一個(gè)統(tǒng)一入口串聯(lián)各個(gè)模塊。下面是精簡(jiǎn)骨架真實(shí)項(xiàng)目里會(huì)在此基礎(chǔ)上加日志、異常處理和權(quán)限校驗(yàn)但核心結(jié)構(gòu)不變class Brain: def __init__(self, config): self.router Router(config.router) self.memory MemoryManager(config.memory) self.rag RAGEngine(config.rag) self.tools ToolRegistry(config.tools) self.llm LLMClient(config.llm) def chat(self, user_id, query): history self.memory.load(user_id) search_results self.rag.search(query) model_name self.router.route_query(query) messages self.llm.build_context(history, search_results) response self.llm.call(model_name, messages, toolsself.tools.schemas()) if response.tool_calls: tool_result self.tools.execute(response.tool_calls) messages.append({role: tool, content: tool_result}) response self.llm.call(model_name, messages) self.memory.save(user_id, query, response) return response這段骨架的核心思想只有一個(gè)所有模塊都通過(guò)統(tǒng)一的客戶端和Schema連接切換模型只需改配置。比如把某個(gè)任務(wù)的模型從qwen-brain切到deepseek-brain只需要改路由配置業(yè)務(wù)代碼完全不用動(dòng)。這個(gè)特性在模型快速迭代的階段非常重要能隨時(shí)切換才敢持續(xù)優(yōu)化。注意上面的骨架里我故意沒(méi)有把“記憶保存”放在模型回答之前因?yàn)橛洃洷4嬉蕾囎罱K回答的完整上下文。實(shí)際操作時(shí)要做兩件事保存用戶問(wèn)題保存系統(tǒng)回答方便后續(xù)做效果評(píng)估和日志審計(jì)。編排層還有一個(gè)職責(zé)是兜底。假如模型調(diào)用超時(shí)或者工具拋了異常系統(tǒng)必須返回一個(gè)面向用戶的友好提示而不是把異常堆棧直接甩給前端。這個(gè)兜底邏輯看起來(lái)不起眼但在真實(shí)業(yè)務(wù)里的價(jià)值比任何高深的Prompt都大。5. 排查實(shí)錄上下文爆掉、工具調(diào)用失敗與成本失控這三座大山5.1 上下文爆掉與幻覺(jué)最常見(jiàn)的兩類質(zhì)量事故先說(shuō)上下文爆掉?,F(xiàn)象很典型對(duì)話到第10輪之后模型開(kāi)始忘記最開(kāi)始說(shuō)了什么甚至答非所問(wèn)。排查方法不復(fù)雜把每次請(qǐng)求發(fā)出的token數(shù)記錄下來(lái)看是不是接近窗口上限。如果是說(shuō)明歷史消息沒(méi)有做滑窗或摘要直接把最近10輪全塞進(jìn)去了哪有不爆的道理。解決辦法剛才提過(guò)給上下文設(shè)軟預(yù)算歷史只占窗口一半超預(yù)算內(nèi)容先轉(zhuǎn)成摘要再?zèng)Q定保留還是丟棄。另一個(gè)容易被忽視的點(diǎn)是工具返回結(jié)果也占token。我遇到過(guò)一次性把整個(gè)訂單列表幾百條數(shù)據(jù)扔給模型的情況直接把上下文撐爆。后來(lái)給所有工具結(jié)果統(tǒng)一加了截?cái)嗪妥侄魏Y選問(wèn)題立刻改善?;糜X(jué)問(wèn)題則是另一座大山。模型一本正經(jīng)地編造訂單、虛構(gòu)政策條款原因大多是知識(shí)庫(kù)里沒(méi)有對(duì)應(yīng)內(nèi)容但Prompt沒(méi)有約束模型的“不知道邊界”。處理分三步一是在Prompt里明確寫(xiě)“如果知識(shí)庫(kù)中沒(méi)有明確依據(jù)請(qǐng)回答不知道”二是把檢索結(jié)果和來(lái)源編號(hào)綁定模型只能基于檢索內(nèi)容作答三是把temperature調(diào)低到0.2左右減少自由發(fā)揮空間。這里有個(gè)更隱蔽的坑檢索結(jié)果明明存在但模型還是會(huì)偏離它去講自己的“常識(shí)”。這時(shí)候不要只怪模型看看Prompt是否把“檢索結(jié)果”和“閑聊內(nèi)容”混在一起。我的做法是給檢索內(nèi)容單獨(dú)加標(biāo)簽比如用knowledge.../knowledge包起來(lái)并告訴模型“只有標(biāo)簽內(nèi)的內(nèi)容可以作為事實(shí)依據(jù)”。上下文爆掉和幻覺(jué)本質(zhì)上都是“輸入結(jié)構(gòu)和預(yù)算失控”先管理輸入再談優(yōu)化模型。5.2 工具調(diào)用失敗與知識(shí)庫(kù)命中率低從日志里找根因工具調(diào)用失敗最討厭的點(diǎn)在于它不是每次都失敗而是隨機(jī)失敗很難復(fù)現(xiàn)。常見(jiàn)情況有三種模型沒(méi)在結(jié)果里輸出tool_calls、輸出的JSON格式不合法、工具執(zhí)行失敗后模型繼續(xù)編造答案。排查第一步是看日志里模型原始輸出是什么樣而不是直接懷疑模型不行。如果模型經(jīng)常不輸出tool_calls先檢查工具Schema的description是否足夠清晰有沒(méi)有給出觸發(fā)條件。如果JSON經(jīng)常不合法大概率是提示詞里的格式約束不夠可以在system prompt里加一句“你必須輸出嚴(yán)格的JSON不要包含Markdown代碼塊標(biāo)記”。如果工具執(zhí)行失敗后模型還在編就要在Prompt里顯式聲明“工具調(diào)用失敗后請(qǐng)回復(fù)用戶無(wú)法完成操作絕不猜測(cè)結(jié)果”。知識(shí)庫(kù)命中率低的問(wèn)題很多人的第一反應(yīng)是換更強(qiáng)的模型方向其實(shí)錯(cuò)了。命中率低要去查檢索鏈路切塊是不是破壞了語(yǔ)義完整、embedding是不是中文優(yōu)化、召回top_k是不是太小、重排有沒(méi)有加。可以單獨(dú)做一個(gè)“檢索命中測(cè)試”用20個(gè)真實(shí)問(wèn)題檢查召回結(jié)果是否包含正確答案。我調(diào)過(guò)最久的一次案例最后的根因是文檔里同一個(gè)概念有多種叫法用戶問(wèn)的是A叫法文檔里寫(xiě)的是B叫法向量召回匹配不上。解決辦法很樸素在元數(shù)據(jù)里維護(hù)一批同義詞和別名做檢索時(shí)進(jìn)行query擴(kuò)展。這類問(wèn)題換再大的模型也解決不了只能在知識(shí)工程層面下功夫。5.3 成本與延遲控制讓智能大腦跑得起長(zhǎng)期業(yè)務(wù)智能大腦上線之后最痛的往往是賬單。不做控制的話每個(gè)請(qǐng)求都把幾十輪歷史和二十條檢索結(jié)果丟給模型token消耗會(huì)非???。我的做法是給每個(gè)請(qǐng)求建立token預(yù)算表歷史占40%檢索結(jié)果占20%工具返回占20%輸出預(yù)留20%。哪一塊超了就先壓縮哪一塊。路由策略對(duì)成本的影響也很大。簡(jiǎn)單任務(wù)用小模型復(fù)雜任務(wù)才用大模型這個(gè)道理大家都懂但落地時(shí)要敢“多分流”。給“走Qwen還是DeepSeek”加一個(gè)簡(jiǎn)單閾值邏輯普通問(wèn)答直接走Qwen識(shí)別到需要深度推理的關(guān)鍵詞或問(wèn)題復(fù)雜度評(píng)分高時(shí)才切DeepSeek。這在我的項(xiàng)目里讓DeepSeek側(cè)調(diào)用量下降了接近一半成本也隨之下降。緩存策略值得認(rèn)真對(duì)待。至少兩層緩存一是相同system prompt的前綴緩存避免重復(fù)計(jì)算KV二是相同問(wèn)題的結(jié)果緩存常見(jiàn)FAQ可以不經(jīng)過(guò)模型直接命中緩存返回。對(duì)在線業(yè)務(wù)來(lái)說(shuō)結(jié)果緩存不僅省錢(qián)還能讓P95延遲斷崖式下降。最后提醒一點(diǎn)度量要先行。從第一天起就給每次請(qǐng)求記日志模型名、輸入token、輸出token、耗時(shí)、路由決策。建立一張簡(jiǎn)單的成本看板每天看一次。沒(méi)有度量成本控制全是拍腦袋有了度量哪怕費(fèi)用突然漲了也能逐層排查是哪個(gè)環(huán)節(jié)出了問(wèn)題。這套架構(gòu)在我自己的模擬項(xiàng)目里跑了好幾個(gè)月最大的體會(huì)是模型能力只是起點(diǎn)真正決定智能大腦好用程度的是記憶、知識(shí)、工具和編排之間的耦合是否順暢。Qwen和DeepSeek各有各的長(zhǎng)處與其花時(shí)間爭(zhēng)論哪個(gè)更強(qiáng)不如把它們放進(jìn)同一條流水線讓各自干最擅長(zhǎng)的事。今天能快速切換底座模型明天能加一個(gè)新工具后天能換一套知識(shí)庫(kù)這樣的系統(tǒng)才算得上真正意義上的智能大腦。如果這篇文章能幫你在選型和調(diào)試時(shí)少走幾步彎路那就不虧。