:從文檔到智能問答的RAG工程鏈路)
簡介這是一份面向AI應用開發(fā)者與知識庫搭建需求者的萬字教程資源圍繞AI Agent概念與字節(jié)Coze平臺展開幫助零基礎讀者理解智能體原理并動手構建企業(yè)級知識庫。內容系統(tǒng)梳理了AI Agent的核心公式——LLM、Planning、Memory、Tools四要素對比Copilot與Agent在自主性、流程決策上的差異并延伸至開源項目、行業(yè)應用、發(fā)展趨勢及倫理法律等議題。資源包內含1個PDF文件大小約3.46MB結構完整、圖文并茂適合作為系統(tǒng)學習與實操參考。教程以Coze為落地工具通過具體知識庫案例手把手演示設置、內容添加與維護更新流程讀者可據(jù)此掌握從概念理解到定制化搭建的完整路徑。目前已有324人學習適合希望快速入門AI Agent并落地企業(yè)知識庫的開發(fā)者與產品人員。1. 扣子知識庫從一堆散落文檔到能問答的智能體中間差了什么手里攢了幾十份產品手冊、會議紀要、客服話術想用扣子做一個能自動回答問題的知識庫智能體結果上傳完文檔一測試回答要么答非所問要么干脆編造內容。這不是扣子不好用而是從「有文檔」到「能問答」之間隔著一整套檢索增強生成RAG的工程鏈路??圩又R庫的本質是把文檔切片、向量化、存進向量數(shù)據(jù)庫用戶提問時先檢索相關片段再把片段塞進大模型上下文里生成回答。這條鏈路里任何一個環(huán)節(jié)參數(shù)沒調對最終效果都會打折扣。這篇內容面向已經上手扣子、想認真把知識庫做扎實的從業(yè)者從文檔預處理一路講到工作流編排和效果驗證每一步都給可復現(xiàn)的操作和參數(shù)建議。2. 扣子知識庫的底層鏈路文檔進來之后到底發(fā)生了什么2.1 從上傳到召回四個階段拆開看很多人以為知識庫就是「上傳文檔 → 提問 → 回答」三步實際上扣子內部走的是四段式流程。第一階段是文檔解析??圩又С?PDF、Word、Markdown、TXT、CSV 等格式上傳后平臺會先做文本抽取。PDF 里的表格、圖片、雙欄排版是解析翻車的高發(fā)區(qū)掃描件如果沒有 OCR 層抽出來就是空白。常見做法是上傳前自己先確認 PDF 能不能選中文字不能選中的先過一遍 OCR 工具。第二階段是分片Chunking??圩幽J按固定長度切分通常 500800 字符一段段間有重疊。分片大小直接決定檢索粒度切太碎單段信息不完整模型拿到半句話沒法回答切太大一段里混了好幾個主題檢索命中后噪聲太多。我一般會把產品手冊按章節(jié)標題切會議紀要按發(fā)言人輪次切客服話術按問答對切而不是無腦用默認值。第三階段是向量化。每個分片經過 Embedding 模型轉成一個高維向量存進向量數(shù)據(jù)庫??圩悠脚_內置了 Embedding 模型不需要自己部署。這里的關鍵點是向量化質量取決于分片文本的語義完整性一段被攔腰截斷的文字向量表示本身就是模糊的。第四階段是檢索與生成。用戶提問時問題先被向量化然后在向量庫里做相似度搜索召回 Top-K 個最相關的分片拼進 Prompt 交給大模型生成回答。Top-K 設太小可能漏掉關鍵信息設太大則上下文里塞滿無關內容模型反而抓不住重點。提示扣子知識庫的檢索默認走語義相似度不是關鍵詞匹配。這意味著用戶問「退貨流程」時文檔里寫的是「退款操作步驟」也能命中但反過來如果文檔里用的是完全不同的術語體系召回率會明顯下降。2.2 分片策略怎么選三種場景的實操參數(shù)分片沒有萬能參數(shù)得看文檔類型。下面是我在三種常見場景里驗證過的配置思路。場景一產品手冊 / 技術文檔。這類文檔結構清晰有明確的章節(jié)層級。建議按標題層級切分每個二級標題下的內容作為一個分片如果單段超過 1000 字符再按段落二次切分??圩又С肿远x分段規(guī)則可以用換行符和標題標記做分隔符。重疊長度設 50100 字符保證跨段落的句子不被截斷。場景二客服話術 / FAQ。這類內容天然是問答對格式。一個問句加一個答句作為一個分片不要拆開。分片長度通常在 200400 字符不需要額外重疊。如果話術里有變量占位符比如「尊敬的{用戶名}」上傳前先替換成通用表述否則向量化時會引入噪聲。場景三會議紀要 / 聊天記錄。這類文本口語化嚴重主題跳躍。建議先做一輪人工清洗把無關的寒暄、重復內容刪掉再按話題段落切分。分片可以適當放大到 8001200 字符因為口語化文本單句信息密度低需要更多上下文才能表達完整意思。文檔類型分片長度重疊長度分隔依據(jù)產品手冊500800 字符50100 字符標題層級客服話術200400 字符0問答對會議紀要8001200 字符100150 字符話題段落2.3 用扣子工作流串起知識庫問答的最小鏈路光有知識庫還不夠得用工作流把「接收問題 → 檢索知識庫 → 生成回答」串起來。下面是一個最小可用的工作流配置思路。在扣子工作流編輯器里新建一個工作流依次添加三個節(jié)點節(jié)點1開始節(jié)點 - 輸入?yún)?shù)user_queryString用戶提問 節(jié)點2知識庫檢索節(jié)點 - 選擇已創(chuàng)建的知識庫 - 查詢變量引用開始節(jié)點的 user_query - Top-K5先設5后續(xù)根據(jù)效果調整 - 相似度閾值0.5低于此值的結果不返回 節(jié)點3大模型節(jié)點 - 模型選擇按需選擇建議先用平臺默認模型跑通 - 系統(tǒng)提示詞 你是一個基于知識庫回答問題的助手。 請嚴格根據(jù)以下參考資料回答用戶問題。 如果參考資料中沒有相關信息直接說「我沒有找到相關內容」不要編造。 參考資料 {{知識庫檢索節(jié)點的輸出}} - 用戶提示詞{{user_query}}這段配置的邏輯是開始節(jié)點接收用戶輸入知識庫檢索節(jié)點拿問題去向量庫召回相關分片大模型節(jié)點把召回內容作為上下文生成回答。關鍵參數(shù)有兩個——Top-K 和相似度閾值。Top-K 控制召回數(shù)量相似度閾值控制召回質量。初期建議 Top-K 設 5、閾值設 0.5跑一批測試問題后看召回內容是否相關再微調。注意系統(tǒng)提示詞里那句「如果參考資料中沒有相關信息直接說沒有找到」非常重要。不寫這句話模型在召回內容不相關時會強行編造答案這是知識庫問答最常見的翻車方式。3. 把知識庫接進智能體從單輪問答到多輪對話的配置細節(jié)3.1 智能體編排里知識庫節(jié)點的掛載方式工作流跑通之后下一步是把知識庫能力掛到智能體上??圩拥闹悄荏w編排頁面里知識庫是作為一個能力開關存在的。打開知識庫開關選擇已創(chuàng)建的知識庫智能體在對話時就會自動調用檢索。但這里有個容易忽略的點智能體模式下知識庫的調用時機是由模型自己判斷的。用戶說「你好」時模型不會去檢索用戶問「退貨政策是什么」時才會觸發(fā)。這個判斷依賴模型的意圖識別能力如果發(fā)現(xiàn)該檢索的時候沒檢索可以在智能體的提示詞里加一句「當用戶問題涉及產品、政策、流程等具體信息時必須先檢索知識庫再回答」。另一種更可控的方式是不用智能體的自動知識庫開關而是在工作流里顯式掛載知識庫檢索節(jié)點然后把工作流發(fā)布為智能體的技能。這樣每次調用都會走檢索不會出現(xiàn)「模型覺得不需要查」的情況。兩種方式各有適用場景自動模式適合開放域對話顯式模式適合客服、技術支持這類必須基于知識庫回答的場景。3.2 多輪對話里怎么保持上下文不丟單輪問答跑通后多輪對話是下一個坎。用戶先問「退貨政策是什么」接著問「那運費誰出」第二句話里沒有「退貨」這個關鍵詞如果檢索時只拿第二句話去搜很可能召回無關內容。解決辦法是在檢索前做一輪查詢改寫??圩庸ぷ髁骼锟梢约右粋€大模型節(jié)點專門負責把多輪對話壓縮成一個獨立的檢索查詢。配置思路如下節(jié)點查詢改寫大模型節(jié)點 - 輸入對話歷史 當前用戶輸入 - 提示詞 根據(jù)以下對話歷史將用戶的最新問題改寫成一個獨立的、 包含完整語義的檢索查詢。只輸出改寫后的查詢語句不要解釋。 對話歷史{{對話歷史變量}} 最新問題{{user_query}} - 輸出rewritten_queryString 節(jié)點知識庫檢索 - 查詢變量引用 rewritten_query這樣「那運費誰出」會被改寫成「退貨時運費由誰承擔」檢索命中率會明顯提升。查詢改寫節(jié)點會增加一次模型調用有延遲成本但在多輪場景下這個代價值得花。3.3 知識庫更新后怎么讓智能體同步生效文檔不是一成不變的。產品更新了手冊、客服話術改了版本知識庫也得跟著更新??圩又R庫里新增文檔會自動向量化并入庫但刪除舊文檔后對應的向量數(shù)據(jù)需要手動觸發(fā)重新索引否則舊內容仍然會被檢索到。我一般會養(yǎng)成一個習慣每次批量更新文檔后在知識庫管理頁面點一次「重新索引」等索引狀態(tài)變成「已完成」再去測試。另外如果更新頻率高建議給文檔加版本號或日期前綴比如「產品手冊_v2.3_20250101」這樣在檢索結果里能直觀看出召回的是哪個版本的內容排查問題時省很多事。4. 避坑與排查知識庫效果不好的五個真實原因4.1 召回內容相關但回答跑偏現(xiàn)象檢索出來的分片確實和問題相關但模型生成的回答答非所問或者把多個分片的內容混在一起說。原因通常是系統(tǒng)提示詞沒有約束模型的回答范圍。模型看到多段參考資料時傾向于把所有內容都塞進回答里而不是只提取和問題直接相關的部分。解決在系統(tǒng)提示詞里加一條「只使用與用戶問題直接相關的參考資料不要把所有參考資料的內容都復述一遍」。另外可以把 Top-K 從 5 降到 3減少干擾。4.2 相似度閾值設太高導致召回為空現(xiàn)象用戶問了一個知識庫里明明有答案的問題但模型回答「沒有找到相關內容」。原因相似度閾值設得過高比如 0.8而用戶提問的措辭和文檔表述差異較大向量相似度沒達到閾值檢索結果為空。解決先把閾值降到 0.40.5 測試看召回內容是否相關。如果降閾值后召回內容質量下降說明問題出在分片或 Embedding 質量上而不是閾值本身??圩拥臋z索日志里能看到每次召回的相似度分數(shù)對著日志調比盲猜快得多。4.3 PDF 里的表格和圖片內容丟失現(xiàn)象上傳的產品規(guī)格 PDF 里表格中的參數(shù)在回答時完全查不到。原因扣子默認的 PDF 解析器對表格和圖片的處理能力有限表格內容可能被解析成亂序文本圖片里的文字直接丟失。解決表格內容建議手動轉成 Markdown 表格或 CSV 再上傳。圖片里的文字先用 OCR 工具提取成文本作為補充文檔一起上傳。如果 PDF 本身就是掃描件必須先過 OCR否則上傳后解析出來是空的。4.4 知識庫文檔多了之后檢索變慢現(xiàn)象知識庫里文檔從幾十份增加到幾百份后每次問答的響應時間明顯變長。原因向量庫的檢索耗時隨數(shù)據(jù)量增長而增加同時 Top-K 召回后塞進模型上下文的內容變多模型推理時間也變長。解決一是控制單次召回的分片總長度扣子工作流里可以在檢索節(jié)點后加一個文本截斷節(jié)點限制總字符數(shù)不超過 2000。二是如果文檔量確實大考慮按業(yè)務線拆成多個知識庫智能體根據(jù)用戶問題先路由到對應知識庫再檢索。4.5 同一個問題每次回答不一樣現(xiàn)象用戶問同一個問題兩次回答的內容有差異有時候甚至矛盾。原因大模型生成本身有隨機性temperature 參數(shù)大于 0加上每次召回的分片可能略有不同導致回答不穩(wěn)定。解決在模型節(jié)點把 temperature 調到 0 或接近 0讓生成結果盡量確定。同時在系統(tǒng)提示詞里明確「如果多個參考資料之間有矛盾以日期最新的為準」給模型一個沖突消解規(guī)則。5. 讓知識庫回答更準的兩個進階技巧5.1 用重排序把最相關的分片頂?shù)角懊婵圩又R庫默認只做向量相似度檢索但向量相似度高不等于語義相關度高。一個有效的補充手段是加一個重排序Rerank環(huán)節(jié)先召回 Top-10 個分片再用重排序模型對這 10 個分片按與問題的實際相關度重新打分取前 3 個塞進模型上下文??圩庸ぷ髁骼锟梢酝ㄟ^插件市場找重排序插件或者用 HTTP 請求節(jié)點調用外部重排序服務。配置思路是知識庫檢索節(jié)點 Top-K 設為 10后面接重排序節(jié)點重排序節(jié)點輸出 Top-3再傳給大模型節(jié)點。這樣做的代價是多一次模型調用但召回精度提升明顯尤其是在文檔量大、主題分散的場景下。5.2 用測試集量化知識庫效果而不是憑感覺知識庫調優(yōu)最怕憑感覺?!父杏X回答還行」和「回答準確率 85%」是兩回事。建議建一個最小測試集從真實用戶問題里挑 3050 個每個問題標注正確答案所在的那份文檔和段落。然后跑一遍自動測試看每個問題召回的分片里是否包含標注段落以及最終回答是否正確??圩颖旧頉]有內置的批量測試工具但可以用工作流的 API 接口寫一個簡單的 Python 腳本批量調用import requests # 替換為你的工作流 API 地址和 Token API_URL https://api.coze.cn/v1/workflow/run TOKEN your_token_here test_cases [ {question: 退貨需要幾天內申請, expected_doc: 售后政策_v2}, {question: 企業(yè)版最多支持多少人, expected_doc: 產品定價表}, # 補充更多測試用例 ] for case in test_cases: resp requests.post(API_URL, json{ workflow_id: your_workflow_id, parameters: {user_query: case[question]} }, headers{Authorization: fBearer {TOKEN}}) result resp.json() # 檢查返回內容中是否包含預期文檔的關鍵信息 print(f問題{case[question]}) print(f回答{result.get(data, {}).get(output, )}) print(---)這段腳本的邏輯是把測試問題逐個發(fā)給工作流 API收集回答人工或自動比對是否命中預期內容。參數(shù)說明workflow_id在扣子工作流發(fā)布后的 API 頁面能拿到parameters里的 key 要和開始節(jié)點的輸入?yún)?shù)名一致。跑完一輪后把召回失敗和回答錯誤的問題單獨拎出來分析是分片問題、閾值問題還是提示詞問題針對性修。我自己的習慣是每次調整知識庫配置后都跑一遍這個測試集記錄準確率變化。有一次把分片長度從 500 調到 800準確率從 72% 漲到 86%但也有一次調完反而降了后來發(fā)現(xiàn)是某幾份文檔的格式特殊統(tǒng)一參數(shù)不適用。這種問題不跑測試集根本發(fā)現(xiàn)不了。希望幫到你。本文還有配套的精品資源點擊獲取