庫(kù)問(wèn)答系統(tǒng)的落地實(shí)踐)
1. 從會(huì)跑模型到AI工程差的不是技術(shù)是系統(tǒng)思維我見(jiàn)過(guò)太多這樣的場(chǎng)景一個(gè)人興沖沖地在筆記本上跑通了一個(gè)大模型Demo對(duì)話流暢、效果驚艷于是他覺(jué)得自己已經(jīng)會(huì)AI了。但等他把這個(gè)Demo往真實(shí)的業(yè)務(wù)場(chǎng)景里一放問(wèn)題接踵而至——數(shù)據(jù)格式千奇百怪、模型答非所問(wèn)、響應(yīng)慢得讓人抓狂、出了問(wèn)題不知道是提示詞的鍋還是數(shù)據(jù)的鍋。最后項(xiàng)目爛尾留下一句大模型也就那樣。這恰恰是會(huì)跑模型和懂AI工程之間最本質(zhì)的差距。所謂AI工程不是把模型API接進(jìn)來(lái)就完事而是從業(yè)務(wù)問(wèn)題定義、數(shù)據(jù)準(zhǔn)備、模型選型、評(píng)估體系搭建到部署上線、監(jiān)控反饋、持續(xù)迭代的一整套系統(tǒng)方法論。它解決的核心問(wèn)題是如何讓一個(gè)AI能力在真實(shí)、復(fù)雜、多變的環(huán)境里穩(wěn)定可靠地工作。這篇文章想分享的正是我從零開(kāi)始搭建AI工程體系的全過(guò)程。不吹噓哪個(gè)模型多厲害也不糾結(jié)某個(gè)框架多時(shí)髦只講我在實(shí)際項(xiàng)目里驗(yàn)證過(guò)的思路、踩過(guò)的坑以及那些文檔里不會(huì)寫但你遲早會(huì)撞上的問(wèn)題。無(wú)論你是剛?cè)腴T的技術(shù)愛(ài)好者還是已經(jīng)在業(yè)務(wù)里摸爬滾打的工程師這篇文章應(yīng)該都能給你一些可落地的參考。為了不讓討論停留在抽象層面我會(huì)用一個(gè)貫穿全文的虛擬案例來(lái)說(shuō)明給公司內(nèi)部搭建一個(gè)知識(shí)庫(kù)問(wèn)答助手讓員工用自然語(yǔ)言查詢制度文件、技術(shù)文檔和項(xiàng)目經(jīng)驗(yàn)。這個(gè)案例足夠典型——它有數(shù)據(jù)清洗、有檢索增強(qiáng)、有評(píng)估調(diào)優(yōu)、有部署迭代幾乎覆蓋了AI工程的所有關(guān)鍵環(huán)節(jié)。2. 別急著選模型先把問(wèn)題定義清楚再動(dòng)手很多AI項(xiàng)目死在起跑線上不是技術(shù)不夠而是根本沒(méi)想清楚要解決什么問(wèn)題。我在做知識(shí)庫(kù)問(wèn)答助手之前先花了整整一周時(shí)間做需求澄清這可能是整個(gè)項(xiàng)目里最值錢的一周。2.1 需求澄清和業(yè)務(wù)方對(duì)齊什么是好的結(jié)果需求澄清不是簡(jiǎn)單問(wèn)一句你想要什么功能而是要挖出業(yè)務(wù)方真實(shí)的使用場(chǎng)景和驗(yàn)收標(biāo)準(zhǔn)。我常用的幾個(gè)問(wèn)題用戶會(huì)用什么方式提問(wèn)是完整的句子還是零散的關(guān)鍵詞哪些問(wèn)題的答案必須是完全準(zhǔn)確的哪些可以容忍模糊回答需要多快5秒內(nèi)還是可以接受1分鐘如果AI答錯(cuò)了最壞的后果是什么這個(gè)系統(tǒng)是給誰(shuí)用的技術(shù)背景如何以我們做內(nèi)部知識(shí)庫(kù)問(wèn)答為例訪談完行政、技術(shù)、銷售三個(gè)部門后我發(fā)現(xiàn)需求差異非常大行政部希望查制度文件時(shí)給出原文出處和條款編號(hào)錯(cuò)了就是合規(guī)風(fēng)險(xiǎn)技術(shù)部希望查歷史項(xiàng)目文檔時(shí)能給出相似案例作為參考允許一定模糊度銷售部最關(guān)心響應(yīng)速度他們問(wèn)的大多是產(chǎn)品參數(shù)這類確定性信息。這些差異直接影響后續(xù)所有技術(shù)決策數(shù)據(jù)清洗的粒度、檢索策略的選擇、甚至模型提示詞的設(shè)計(jì)方向。如果一開(kāi)始不搞清楚后面每走一步都是在空中樓閣上蓋房子。2.2 模型選型的決策框架別只盯著效果最好模型選型是另一個(gè)容易踩坑的地方。很多團(tuán)隊(duì)上來(lái)就想用最強(qiáng)的大模型仿佛效果就是一切。但真實(shí)工程環(huán)境里你要在效果、成本、延遲、可控性四個(gè)維度上做權(quán)衡。我自己的選型框架是這樣的先根據(jù)需求澄清的結(jié)果劃定必須答對(duì)和可以大致答對(duì)的邊界對(duì)每個(gè)任務(wù)優(yōu)先嘗試足夠簡(jiǎn)單、足夠便宜的方案只有當(dāng)它確實(shí)撐不住時(shí)再升級(jí)模型永遠(yuǎn)給API模型留一個(gè)降級(jí)路徑比如模型服務(wù)不可用或超時(shí)時(shí)退回關(guān)鍵詞檢索結(jié)果如果涉及敏感數(shù)據(jù)優(yōu)先考慮私有化部署的開(kāi)源模型哪怕效果略差一點(diǎn)。具體到知識(shí)庫(kù)問(wèn)答場(chǎng)景我用的是檢索增強(qiáng)中小規(guī)模模型的組合方案先用embedding模型做向量化召回再把召回結(jié)果拼接成上下文交給生成模型做最終回答。這樣既控制了成本又能保證答案有據(jù)可查。embedding模型選的是開(kāi)源的中文向量模型生成模型則根據(jù)場(chǎng)景混合使用API和私有化部署實(shí)測(cè)下來(lái)效果和純大模型方案差距不大但成本和響應(yīng)時(shí)間優(yōu)勢(shì)明顯。2.3 架構(gòu)設(shè)計(jì)的核心原則讓每一層各司其職AI工程和傳統(tǒng)軟件工程有一個(gè)很大的區(qū)別傳統(tǒng)系統(tǒng)里每個(gè)模塊的行為是可預(yù)期的而模型的行為天然帶有不確定性。因此架構(gòu)設(shè)計(jì)上必須建立一個(gè)原則——把確定性的部分交給代碼把不確定性的部分交給模型并且給不確定性留好緩沖。我的知識(shí)庫(kù)問(wèn)答系統(tǒng)大致分四層數(shù)據(jù)層負(fù)責(zé)文檔清洗、切分、向量化生成并維護(hù)知識(shí)庫(kù)索引檢索層根據(jù)用戶問(wèn)題召回最相關(guān)的文檔片段生成層把召回內(nèi)容整理成上下文交給LLM生成最終答案控制層負(fù)責(zé)意圖識(shí)別、兜底邏輯、引用溯源、日志記錄。每層只做自己的事不越界。比如生成層絕不試圖在沒(méi)有召回內(nèi)容的情況下憑空作答控制層則時(shí)刻監(jiān)控檢索質(zhì)量一旦發(fā)現(xiàn)召回片段和問(wèn)題的相關(guān)度過(guò)低直接觸發(fā)信息不足的兜底回復(fù)而不是讓模型硬著頭皮編。這個(gè)設(shè)計(jì)看起來(lái)簡(jiǎn)單卻是整個(gè)系統(tǒng)穩(wěn)定性的基石。3. 數(shù)據(jù)工程AI項(xiàng)目里最耗時(shí)、最不起眼、最要命的環(huán)節(jié)如果說(shuō)模型是AI項(xiàng)目的大腦數(shù)據(jù)就是它的食物。我在這個(gè)項(xiàng)目里感受最深的一點(diǎn)是數(shù)據(jù)工程占了我超過(guò)60%的精力而它的重要性卻最容易被低估。3.1 從原始文檔到可檢索的知識(shí)單元清洗與切分公司知識(shí)庫(kù)里的原始文檔類型五花八門PDF制度文件、Word技術(shù)方案、Excel產(chǎn)品參數(shù)、PPT培訓(xùn)材料、甚至還有掃描版的會(huì)議紀(jì)要。這些文檔直接丟給模型是不行的必須經(jīng)過(guò)一套完整的清洗流程。我總結(jié)的清洗步驟格式統(tǒng)一把所有文檔轉(zhuǎn)成純文本或Markdown去掉頁(yè)眉頁(yè)腳、水印、頁(yè)碼等噪音信息編碼修復(fù)處理中文亂碼、全半角符號(hào)混用、特殊字符等歷史遺留問(wèn)題結(jié)構(gòu)保留對(duì)制度類文檔保留章節(jié)標(biāo)題層級(jí)這對(duì)后續(xù)切分至關(guān)重要噪聲過(guò)濾剔除表格中無(wú)意義的空行、重復(fù)段落、廢棄版本說(shuō)明。清洗完之后就是切分。切分粒度直接決定檢索質(zhì)量這是很多新手最容易忽略的細(xì)節(jié)。切太碎檢索到的片段缺乏上下文語(yǔ)義切太大上下文窗口塞滿無(wú)關(guān)信息模型反而抓不住重點(diǎn)。我試過(guò)幾種切分策略最終的經(jīng)驗(yàn)是固定字符數(shù)切分加重疊窗口配合結(jié)構(gòu)錨點(diǎn)。具體來(lái)說(shuō)優(yōu)先按照文檔本身的標(biāo)題層級(jí)切分當(dāng)某個(gè)小節(jié)過(guò)長(zhǎng)時(shí)再按固定長(zhǎng)度比如500字切分相鄰切片之間保留50字左右的重疊。這樣既能保證語(yǔ)義相對(duì)完整又不會(huì)讓檢索單元過(guò)大。3.2 向量化、索引與元數(shù)據(jù)檢索召回的基礎(chǔ)設(shè)施切分后的文本片段還需要轉(zhuǎn)成向量才能做相似度檢索。這里有兩個(gè)關(guān)鍵選擇embedding模型的選擇和向量索引的構(gòu)建。embedding模型我對(duì)比過(guò)好幾個(gè)開(kāi)源中文模型最終選了一個(gè)在領(lǐng)域文檔上表現(xiàn)均衡的判斷標(biāo)準(zhǔn)很簡(jiǎn)單——拿真實(shí)業(yè)務(wù)問(wèn)題去測(cè)召回率而不是看模型榜單分?jǐn)?shù)。模型榜單測(cè)的是通用場(chǎng)景你的領(lǐng)域文檔長(zhǎng)什么樣只有你自己測(cè)了才知道。向量索引選擇了支持混合檢索的方案既做向量相似度召回也做關(guān)鍵詞精確匹配。很多人只做向量檢索但實(shí)際場(chǎng)景里用戶的提問(wèn)往往包含產(chǎn)品型號(hào)、制度編號(hào)這類精確關(guān)鍵詞向量檢索對(duì)這種精確匹配反而不如傳統(tǒng)倒排索引靠譜?;旌蠙z索、然后融合排序這個(gè)組合在知識(shí)庫(kù)場(chǎng)景下實(shí)測(cè)提升非常明顯。元數(shù)據(jù)設(shè)計(jì)同樣不能馬虎。我給每個(gè)知識(shí)片段都打上了文檔來(lái)源、部門歸屬、更新日期、權(quán)限級(jí)別等標(biāo)簽。這些標(biāo)簽短期內(nèi)看不出價(jià)值但在做權(quán)限過(guò)濾、結(jié)果去重、溯源展示時(shí)缺了它們寸步難行。3.3 測(cè)試集建設(shè)數(shù)據(jù)工程也講究驗(yàn)收標(biāo)準(zhǔn)數(shù)據(jù)工程做完了怎么算合格這一年里我養(yǎng)成了一個(gè)習(xí)慣不管做什么AI項(xiàng)目第一周必須先建立一個(gè)小而精的測(cè)試集。所謂測(cè)試集就是一批真實(shí)、有代表性的用戶問(wèn)題以及對(duì)應(yīng)的標(biāo)準(zhǔn)答案。數(shù)量不用多50到100條足矣但必須覆蓋各類典型場(chǎng)景和困難case。我把問(wèn)題分成幾類常見(jiàn)問(wèn)題員工最常問(wèn)的比如年假怎么休、報(bào)銷流程是什么細(xì)節(jié)問(wèn)題需要從某個(gè)文檔某一段落找到精確答案跨文檔問(wèn)題答案分散在多個(gè)文檔里需要整合模糊/異常問(wèn)題問(wèn)法不標(biāo)準(zhǔn)、甚至跟知識(shí)庫(kù)無(wú)關(guān)的問(wèn)題。這個(gè)測(cè)試集會(huì)陪伴項(xiàng)目從出生到成長(zhǎng)每次改動(dòng)模型、優(yōu)化提示詞、調(diào)整切分策略第一件事就是跑一遍測(cè)試集看效果差異。沒(méi)有這個(gè)測(cè)試集你所有的優(yōu)化都是盲人摸象——憑感覺(jué)覺(jué)得好了上線后被用戶一堆問(wèn)題打得措手不及。4. 評(píng)估體系沒(méi)有評(píng)測(cè)標(biāo)準(zhǔn)優(yōu)化就是無(wú)底洞做AI工程和做傳統(tǒng)開(kāi)發(fā)最大的心態(tài)差異是傳統(tǒng)開(kāi)發(fā)里Bug是明確的、可復(fù)現(xiàn)的但AI系統(tǒng)的錯(cuò)是模糊的、漸變的。同一個(gè)問(wèn)題這周回答得很好下周換個(gè)模型版本就答偏了。因此一個(gè)完善的評(píng)估體系是AI項(xiàng)目能不能長(zhǎng)期健康運(yùn)行的分水嶺。4.1 從人工看效果到可量化的多維指標(biāo)很多團(tuán)隊(duì)做AI項(xiàng)目評(píng)估就是開(kāi)發(fā)人員自己多問(wèn)幾個(gè)問(wèn)題感覺(jué)差不多就上線了。這種評(píng)估方式最大的問(wèn)題是不可復(fù)現(xiàn)、不可對(duì)比——你今天覺(jué)得效果好改了一版之后感覺(jué)也還行但到底哪里變好了、哪里變差了完全說(shuō)不清。我設(shè)計(jì)的評(píng)估體系包含三個(gè)維度答案正確性核心信息是否正確。按滿分5分人工打分或通過(guò)答案與標(biāo)準(zhǔn)答案的語(yǔ)義相似度自動(dòng)評(píng)估回答忠實(shí)性回答是否嚴(yán)格基于檢索到的知識(shí)片段有沒(méi)有編造內(nèi)容。這個(gè)指標(biāo)我特別看重直接關(guān)系用戶信任引用可溯源性答案是否清晰標(biāo)注了來(lái)源文檔和原文位置能不能點(diǎn)開(kāi)溯源。三個(gè)維度分開(kāi)打分任何一次優(yōu)化都要保證三項(xiàng)指標(biāo)不出現(xiàn)明顯劣化。尤其是忠實(shí)性我把它設(shè)為一票否決項(xiàng)——哪怕答案再流暢再全面只要發(fā)現(xiàn)有一次編造就必須回爐。4.2 自動(dòng)化回歸測(cè)試給AI項(xiàng)目上個(gè)保險(xiǎn)栓人工評(píng)估必不可少但不能天天靠人工——費(fèi)時(shí)費(fèi)力還容易手滑。我搭建了一個(gè)半自動(dòng)化的回歸測(cè)試機(jī)制每周自動(dòng)跑一遍測(cè)試集生成效果報(bào)告變更多個(gè)環(huán)節(jié)進(jìn)行比較評(píng)估任何改動(dòng)的上線都得有評(píng)估數(shù)據(jù)支持生產(chǎn)環(huán)境的日志每周做一次bad case挖掘主動(dòng)抓取用戶問(wèn)過(guò)但系統(tǒng)答得不好的case補(bǔ)進(jìn)測(cè)試集。這套機(jī)制救了我很多次。印象最深的一次是調(diào)整了切分策略當(dāng)時(shí)人工抽了幾個(gè)問(wèn)題覺(jué)得一切正常結(jié)果自動(dòng)回歸測(cè)試發(fā)現(xiàn)制度有效期類問(wèn)題的答案準(zhǔn)確率下降了12個(gè)百分點(diǎn)——因?yàn)樾碌那蟹址绞桨焉掌谶@類關(guān)鍵信息從上下文里切出去了。如果不是回歸測(cè)試攔住了這次改動(dòng)這個(gè)問(wèn)題大概率會(huì)潛伏到用戶吐槽之后才發(fā)現(xiàn)。4.3 用戶反饋閉環(huán)評(píng)估體系的活水來(lái)源測(cè)試集是固定的但真實(shí)用戶的問(wèn)題是流動(dòng)的。我做了兩個(gè)低成本的動(dòng)作來(lái)捕捉用戶反饋一是在問(wèn)答頁(yè)面加了一個(gè)答案是否有幫助的點(diǎn)贊點(diǎn)踩按鈕二是每周導(dǎo)出用戶真實(shí)提問(wèn)日志人工篩選高頻問(wèn)題中沒(méi)有被很好回答的case。這些真實(shí)反饋會(huì)定期回流到測(cè)試集和知識(shí)庫(kù)修正流程中。我發(fā)現(xiàn)一個(gè)有意思的現(xiàn)象真實(shí)用戶最常問(wèn)的問(wèn)題往往和你預(yù)想的重點(diǎn)完全不同。比如我們做的是內(nèi)部知識(shí)庫(kù)問(wèn)答結(jié)果上線后最高頻的問(wèn)題居然是會(huì)議室怎么預(yù)約——這個(gè)問(wèn)題的答案其實(shí)在OA系統(tǒng)里根本不在知識(shí)庫(kù)里。數(shù)據(jù)告訴我們系統(tǒng)需要對(duì)接的入口比想象中多得多而不是單純?cè)谖臋n庫(kù)里找答案。5. 提示詞、檢索與生成決定回答質(zhì)量的三駕馬車評(píng)估體系落定之后我才開(kāi)始把重心放到回答質(zhì)量的精細(xì)調(diào)優(yōu)上。很多人一上來(lái)就死磕提示詞但我的建議是先把數(shù)據(jù)和評(píng)估做好再碰提示詞——否則你連改得好不好都判斷不了。5.1 提示詞設(shè)計(jì)的結(jié)構(gòu)化方法不是越復(fù)雜越好關(guān)于提示詞我需要先糾一個(gè)普遍的誤解。網(wǎng)上那些一句話讓AI幫你搞定一切的萬(wàn)能提示詞在真實(shí)工程場(chǎng)景里基本是屠龍之技。專業(yè)的提示詞設(shè)計(jì)更像是在為一套嚴(yán)謹(jǐn)?shù)臉I(yè)務(wù)邏輯編寫控制規(guī)則。我在知識(shí)庫(kù)問(wèn)答助手里用的提示詞核心包含五個(gè)要素角色設(shè)定告訴模型它是什么內(nèi)部知識(shí)庫(kù)問(wèn)答助手以及行為邊界只能依據(jù)給定資料回答任務(wù)指令明確生成任務(wù)根據(jù)檢索內(nèi)容回答問(wèn)題不得超出范圍格式約束規(guī)定答案結(jié)構(gòu)先給結(jié)論再給依據(jù)標(biāo)注引用編號(hào)負(fù)面約束說(shuō)明不能做什么不知道就說(shuō)不了解不得編造不得轉(zhuǎn)發(fā)無(wú)關(guān)信息輸入占位符標(biāo)記用戶問(wèn)題和檢索上下文的位置。關(guān)鍵經(jīng)驗(yàn)是負(fù)面約束必須具體不能寫成要準(zhǔn)確、要嚴(yán)謹(jǐn)這種空話。比如我寫的是如果你無(wú)法從資料中找到答案請(qǐng)直接回復(fù)知識(shí)庫(kù)中暫無(wú)相關(guān)信息建議聯(lián)系行政部或訪問(wèn)OA系統(tǒng)查閱不要嘗試推測(cè)。5.2 檢索與生成的配合讓模型輕松地做摘抄而不是創(chuàng)作生成層有兩條高級(jí)經(jīng)驗(yàn)花了我很長(zhǎng)時(shí)間才悟出來(lái)第一條檢索質(zhì)量直接決定回答效果的天花板提示詞只是守住底線。模型再聰明喂給它的上下文內(nèi)容是錯(cuò)的輸出也只能是錯(cuò)的。所以與其花時(shí)間雕琢提示詞不如把精力花在提升檢索召回精度上。在做檢索增強(qiáng)RAG項(xiàng)目時(shí)我周圍太多人試圖通過(guò)提示詞讓模型更聰明但真正效果顯著的優(yōu)化90%來(lái)自檢索側(cè)的改進(jìn)。第二條給模型創(chuàng)造一個(gè)容易抄對(duì)的上下文。我一開(kāi)始把檢索到的所有片段一股腦拼接進(jìn)提示詞結(jié)果模型經(jīng)常在多個(gè)冗余片段中迷失重點(diǎn)。后來(lái)改為檢索后重排關(guān)鍵片段摘取先用向量檢索加關(guān)鍵詞召回的粗篩再用一個(gè)重排序模型對(duì)候選片段打分只挑最相關(guān)的3到5個(gè)片段進(jìn)上下文并按相關(guān)度從高到低排列。實(shí)驗(yàn)數(shù)據(jù)表明這種做法的答案準(zhǔn)確率提升了將近9個(gè)百分點(diǎn)——解釋也很自然高質(zhì)量的檢索結(jié)果讓模型從命題作文變成了信息摘抄難度完全不同。5.3 兜底設(shè)計(jì)AI系統(tǒng)的安全閥再好的檢索和生成配置也會(huì)有失敗的時(shí)候。工程思維要求我們必須預(yù)設(shè)失敗路徑并設(shè)計(jì)好兜底處理。我在知識(shí)庫(kù)問(wèn)答系統(tǒng)里設(shè)計(jì)了多級(jí)兜底模型超時(shí)或API不可用返回檢索列表并提示系統(tǒng)正忙請(qǐng)稍后再試或點(diǎn)擊以下相關(guān)文檔;檢索召回score過(guò)低直接觸發(fā)知識(shí)庫(kù)中暫無(wú)相關(guān)信息話術(shù)用戶問(wèn)題識(shí)別為閑聊不做強(qiáng)行回答轉(zhuǎn)而引導(dǎo)用戶輸入與工作相關(guān)的問(wèn)題涉及敏感權(quán)限的文檔未被檢索到不回顯沒(méi)有權(quán)限這種泄露信息的話術(shù)統(tǒng)一用無(wú)法提供該文檔內(nèi)容來(lái)處理。這套兜底機(jī)制上線后系統(tǒng)的容錯(cuò)能力有了質(zhì)的提升。用戶反饋里最明顯的變化是以前模型偶爾會(huì)一本正經(jīng)地胡說(shuō)八道現(xiàn)在頂多是抱歉查不到但用戶不會(huì)覺(jué)得系統(tǒng)在騙人。6. 部署上線與持續(xù)迭代從能用到好用的最后一公里一個(gè)AI系統(tǒng)在本地跑通了和它能在生產(chǎn)環(huán)境穩(wěn)定運(yùn)行中間隔著的距離比大多數(shù)人想象的要大。這個(gè)階段考驗(yàn)的已經(jīng)不是模型能力而是軟件工程的基本功。6.1 服務(wù)化部署與性能優(yōu)化部署層面最重要的三個(gè)指標(biāo)是延遲、吞吐和可用性。知識(shí)庫(kù)問(wèn)答的鏈路是查詢改寫→向量檢索→重排過(guò)濾→LLM生成每個(gè)環(huán)節(jié)都有延遲開(kāi)銷。我主要做了三件事第一向量檢索上緩存。把高頻問(wèn)題的檢索結(jié)果緩存起來(lái)熱門問(wèn)題直接命中緩存幾乎零延遲返回。數(shù)據(jù)表明知識(shí)庫(kù)類的問(wèn)答請(qǐng)求約有20%是高頻重復(fù)的緩存帶來(lái)的收益非??捎^。第二對(duì)生成層做了流式輸出改造。大模型生成答案通常是逐字輸出的如果等全部生成完再返回首字響應(yīng)時(shí)間會(huì)很長(zhǎng)用戶體感就是轉(zhuǎn)圈圈。流式輸出讓第一個(gè)字在幾百毫秒內(nèi)就出來(lái)體感提升明顯。技術(shù)實(shí)現(xiàn)并不復(fù)雜但交互體驗(yàn)差異是質(zhì)的。第三模型調(diào)用做容錯(cuò)。為API調(diào)用配置了超時(shí)重試和熔斷機(jī)制。當(dāng)模型服務(wù)連續(xù)報(bào)錯(cuò)時(shí)自動(dòng)降級(jí)到純檢索模式保證用戶至少還能拿到相關(guān)文檔而不是一頓報(bào)錯(cuò)。這個(gè)設(shè)計(jì)很簡(jiǎn)單但救命能力一流——我遇到過(guò)不止一次模型服務(wù)不穩(wěn)定如果沒(méi)有降級(jí)機(jī)制整個(gè)系統(tǒng)就直接癱瘓了。6.2 日志、監(jiān)控與bad case反哺上線只是開(kāi)始。我搭建了一套從日志到改進(jìn)的閉環(huán)每個(gè)問(wèn)題、檢索結(jié)果、生成的答案、用戶反饋全部結(jié)構(gòu)化記錄每天監(jiān)控平均延遲、召回率、無(wú)命中率、用戶點(diǎn)踩率等核心指標(biāo)每周做一次bad case專項(xiàng)分析挑出有代表性的錯(cuò)誤案例反哺到數(shù)據(jù)清洗、切分策略、提示詞調(diào)整的優(yōu)先級(jí)排序里。這個(gè)機(jī)制里最妙的一點(diǎn)是讓bad case自己說(shuō)話。比如通過(guò)日志分析我發(fā)現(xiàn)當(dāng)用戶問(wèn)法用了口語(yǔ)化表達(dá)或簡(jiǎn)稱時(shí)檢索效果明顯變差。于是我在檢索前加了一層同義擴(kuò)展邏輯把年假休假帶薪假這類相關(guān)表述統(tǒng)一映射后再去檢索命中率顯著提升。這種洞察如果不依賴日志數(shù)據(jù)純粹靠拍腦袋想很難發(fā)現(xiàn)。6.3 持續(xù)迭代的節(jié)奏小步快跑數(shù)據(jù)驅(qū)動(dòng)AI系統(tǒng)沒(méi)有做完的一天。知識(shí)庫(kù)里的文檔在持續(xù)更新用戶的問(wèn)題分布也在不斷變化系統(tǒng)必須跟著演進(jìn)。我習(xí)慣的迭代節(jié)奏是每周一次小版本更新通常包含知識(shí)庫(kù)文檔增量更新、提示詞微調(diào)、壞case修補(bǔ)每月一次大版本評(píng)估全面跑測(cè)試集、分析用戶反饋、調(diào)整評(píng)估指標(biāo)權(quán)重每次改動(dòng)強(qiáng)制過(guò)回歸測(cè)試寧慢勿快確保沒(méi)有引入新的劣化。節(jié)奏感非常重要因?yàn)锳I項(xiàng)目的改動(dòng)往往牽一發(fā)動(dòng)全身。我做事的雷打不動(dòng)的原則是每次只改一個(gè)變量用數(shù)據(jù)對(duì)比來(lái)驗(yàn)證改動(dòng)效果。如果同時(shí)改了好幾個(gè)東西效果變好或變差你都搞不清楚是哪個(gè)環(huán)節(jié)的貢獻(xiàn)。7. 真實(shí)記錄我在這個(gè)項(xiàng)目里踩過(guò)的幾個(gè)坑最后想寫點(diǎn)純粹的踩坑記錄這些坑你在教科書和官方文檔里幾乎看不到但每一個(gè)都是真實(shí)時(shí)間換來(lái)的教訓(xùn)。7.1 第一個(gè)坑把模型當(dāng)數(shù)據(jù)庫(kù)用項(xiàng)目初期我貪圖方便讓模型直接回答知識(shí)庫(kù)問(wèn)題不接入檢索環(huán)節(jié)。結(jié)果模型在回答具體制度和數(shù)據(jù)時(shí)經(jīng)常出錯(cuò)——它會(huì)把訓(xùn)練數(shù)據(jù)里的過(guò)時(shí)信息當(dāng)成最新內(nèi)容。用戶問(wèn)三類醫(yī)療器械的注冊(cè)流程它答的是幾年前的老流程。這個(gè)教訓(xùn)促使我下定決心做檢索增強(qiáng)架構(gòu)。本質(zhì)上讓模型憑記憶回答動(dòng)態(tài)更新的企業(yè)內(nèi)部文檔等于讓一個(gè)人考一份永遠(yuǎn)在更新的試——他能及格才是奇跡。7.2 第二個(gè)坑切分粒度想當(dāng)然我曾輕信按段落切分最自然的說(shuō)法結(jié)果制度文件里一句話往往跨了好幾個(gè)段落檢索時(shí)老是召回語(yǔ)義不全的片段。后來(lái)通過(guò)測(cè)試集跑分對(duì)比發(fā)現(xiàn)固定長(zhǎng)度加重疊窗口的方式在召回率上明顯占優(yōu)果斷推翻重來(lái)。這個(gè)經(jīng)歷讓我明白在AI工程里任何理所當(dāng)然的判斷都要用數(shù)據(jù)驗(yàn)證直覺(jué)只配做假設(shè)數(shù)據(jù)才配做結(jié)論。7.3 第三個(gè)坑忽視引用溯源第一版系統(tǒng)回答問(wèn)題時(shí)干干凈凈沒(méi)有任何引用標(biāo)注。內(nèi)部試用時(shí)收到一條印象深刻的反饋這個(gè)答案看起來(lái)挺對(duì)的但我怎么知道它是真的對(duì)沒(méi)有出處用戶就不敢信。后來(lái)我把引用來(lái)源從增強(qiáng)項(xiàng)改成了必選項(xiàng)——每個(gè)核心結(jié)論后面都附上文檔名和章節(jié)位置點(diǎn)擊即可查看原文。這個(gè)改動(dòng)直接讓用戶信任度和采納率上了一個(gè)大臺(tái)階也讓我真正理解了AI系統(tǒng)里可信這兩個(gè)字的分量。7.4 第四個(gè)坑權(quán)限過(guò)濾想得太簡(jiǎn)單公司知識(shí)庫(kù)里有不同密級(jí)的文檔我一開(kāi)始天真地認(rèn)為文檔級(jí)權(quán)限控制就夠了。但真實(shí)情況是同一份PDF里可能混著公開(kāi)信息和機(jī)密段落檢索系統(tǒng)按文檔粒度去過(guò)濾機(jī)密內(nèi)容照樣會(huì)被召回。后來(lái)我把權(quán)限標(biāo)簽細(xì)化到片段級(jí)并且在前置查詢改寫時(shí)帶上提問(wèn)者的權(quán)限上下文檢索階段就過(guò)濾掉無(wú)權(quán)限的片段才把這個(gè)問(wèn)題解決干凈。7.5 第五個(gè)坑拿著錘子找釘子這個(gè)坑不是技術(shù)問(wèn)題是心態(tài)問(wèn)題。項(xiàng)目做大了以后有一段時(shí)間我沉迷于嘗試各種新技術(shù)——換更強(qiáng)的模型、上更復(fù)雜的框架。但冷靜下來(lái)跑測(cè)試集才發(fā)現(xiàn)大部分升級(jí)對(duì)業(yè)務(wù)效果的提升微乎其微倒是成本和復(fù)雜度直線上升。后來(lái)我給自己立了個(gè)規(guī)矩任何技術(shù)升級(jí)必須先回答一個(gè)問(wèn)題——它到底解決了哪個(gè)具體的業(yè)務(wù)痛點(diǎn)答不上來(lái)就不做。回到最初的話題。從零開(kāi)始做AI工程真正考驗(yàn)人的不在于你調(diào)通了多少模型接口而在于你愿不愿意為一個(gè)清晰的問(wèn)題搭建完整的系統(tǒng)為每一個(gè)環(huán)節(jié)建立可驗(yàn)證的評(píng)估標(biāo)準(zhǔn)并接受這是一個(gè)持續(xù)演進(jìn)的過(guò)程這個(gè)事實(shí)。我自己的體會(huì)是AI工程的入門門檻其實(shí)并不高因?yàn)楝F(xiàn)成的工具鏈已經(jīng)很完善了真正稀缺的是系統(tǒng)思維——從定義問(wèn)題、構(gòu)造數(shù)據(jù)、設(shè)計(jì)評(píng)估到部署迭代、閉環(huán)反饋。這個(gè)思維框架一旦建立換個(gè)場(chǎng)景、換個(gè)模型你都能快速?gòu)?fù)制出可靠落地的解決方案。希望這篇記錄能把你在從零到一的路上少走幾步彎路哪怕只有一兩個(gè)點(diǎn)能派上用場(chǎng)我就覺(jué)得值了。