算感知RAG:檢索與重排的算力權(quán)衡實(shí)踐)
在開(kāi)發(fā) RAG檢索增強(qiáng)生成系統(tǒng)時(shí)檢索和重排往往被當(dāng)成兩個(gè)獨(dú)立環(huán)節(jié)來(lái)處理先拉向量庫(kù)再做重排最后拼 Prompt 丟給大模型。但真正把系統(tǒng)落到生產(chǎn)環(huán)境你會(huì)發(fā)現(xiàn)一個(gè)很棘手的問(wèn)題每一步都在消耗計(jì)算資源而計(jì)算資源和回答質(zhì)量之間并不是簡(jiǎn)單的線性關(guān)系。有時(shí)候多召回幾段文本重排模型大了幾個(gè)檔次效果提升卻很有限反而把響應(yīng)延遲和 GPU 成本拉高了一大截。近期看到 SciRet 這樣一個(gè)以“計(jì)算感知Compute-Aware”為核心視角、針對(duì)科學(xué)文獻(xiàn) RAG 場(chǎng)景的檢索與重排實(shí)證研究覺(jué)得這個(gè)方向?qū)ψ鲋R(shí)庫(kù)問(wèn)答、論文解讀、技術(shù)文檔問(wèn)答的開(kāi)發(fā)者都很有參考價(jià)值。本文會(huì)圍繞 SciRet 的研究思路展開(kāi)拆解它關(guān)注的核心問(wèn)題并結(jié)合常見(jiàn) RAG 框架給出可落地的實(shí)驗(yàn)設(shè)計(jì)與工程配置思路。如果你正在糾結(jié)“檢索到底召回多少條”“重排模型選多大”“RAG 效果怎么評(píng)估”這篇文章可以幫你理清頭緒。1. 背景為什么 RAG 的檢索與重排需要被重新審視1.1 從 RAG 的基本鏈路說(shuō)起RAG 的經(jīng)典鏈路可以概括為四個(gè)步驟文檔加載與解析。文本切塊Chunking與向量化。向量檢索召回候選文本。對(duì)候選文本做重排Rerank把最相關(guān)的內(nèi)容送入大模型生成回答。很多入門教程會(huì)把重點(diǎn)放在第 2 步和第 3 步比如如何選 Chunk 大小、用哪種 Embedding 模型、向量庫(kù)選 Milvus 還是 Qdrant。但實(shí)際上大部分線上 RAG 系統(tǒng)的效果瓶頸并不在生成端而在“召回質(zhì)量”和“排序質(zhì)量”。召回質(zhì)量決定了大模型能不能“看到”正確答案所在的段落。如果檢索回來(lái)的一大堆文本都不相關(guān)那么無(wú)論 Prompt 寫得再好大模型也只能基于噪聲生成答案。重排的作用則是在召回的候選集中做二次篩選把相關(guān)性最高的段落排到前面同時(shí)壓縮真正送入大模型的上下文長(zhǎng)度。1.2 科學(xué)文獻(xiàn)場(chǎng)景的特殊性SciRet 把研究對(duì)象聚焦在“Scientific RAG”也就是面向論文、技術(shù)報(bào)告、實(shí)驗(yàn)文檔的問(wèn)答場(chǎng)景。這類場(chǎng)景和通用知識(shí)庫(kù)問(wèn)答相比有幾個(gè)明顯的差異術(shù)語(yǔ)密度高論文里充滿了縮寫、專有名詞、公式、引用編號(hào)普通切塊方式很容易把一個(gè)完整的術(shù)語(yǔ)或公式攔腰截?cái)唷UZ(yǔ)義粒度細(xì)科學(xué)文獻(xiàn)的答案往往集中在某一小段而不是整篇文檔需要檢索器具備更強(qiáng)的段落級(jí)語(yǔ)義理解能力。結(jié)構(gòu)復(fù)雜論文有摘要、引言、方法、實(shí)驗(yàn)、結(jié)論等結(jié)構(gòu)不同部分的信息價(jià)值差異很大單純的向量相似度難以體現(xiàn)這種結(jié)構(gòu)信息。評(píng)估成本高科學(xué)問(wèn)題的答案通常需要專家標(biāo)注自動(dòng)評(píng)估指標(biāo)如命中率、準(zhǔn)確率和人工判定的相關(guān)性之間可能存在較大偏差。正是因?yàn)檫@些特殊性SciRet 這類研究才強(qiáng)調(diào)“計(jì)算感知”也就是在評(píng)估檢索和重排效果時(shí)把計(jì)算開(kāi)銷作為一個(gè)關(guān)鍵維度而不是只關(guān)心準(zhǔn)確率。1.3 什么是“Compute-Aware”研究視角傳統(tǒng)的信息檢索研究通常以“效果指標(biāo)”為核心比如 RecallK、MRRMean Reciprocal Rank、NDCGNormalized Discounted Cumulative Gain。而計(jì)算感知的研究視角會(huì)額外引入一組問(wèn)題為了提升 1 個(gè)百分點(diǎn)的 Recall需要多消耗多少倍的檢索時(shí)間更大的重排模型帶來(lái)的增益是否值得它在 GPU 上占用的顯存和延遲在固定計(jì)算預(yù)算下應(yīng)該優(yōu)先擴(kuò)大召回?cái)?shù)量還是升級(jí)重排模型換句話說(shuō)Compute-Aware 研究關(guān)注的不是“哪種方法最好”而是“在給定的算力約束下哪種配置組合最劃算”。這對(duì)實(shí)際工程落地特別重要因?yàn)榫€上服務(wù)的延遲和成本都有硬性指標(biāo)不可能無(wú)限堆算力。2. SciRet 研究的核心問(wèn)題拆解SciRet 雖然是一篇實(shí)證研究但它的選題思路可以拆解成若干個(gè)可以遷移到日常開(kāi)發(fā)中的問(wèn)題。下面逐個(gè)展開(kāi)分析。2.1 檢索器與重排器的組合如何影響最終效果在 RAG 系統(tǒng)中檢索器和重排器并不是獨(dú)立發(fā)揮作用的。檢索器決定了候選集的上限重排器決定了最終送入 Prompt 的內(nèi)容質(zhì)量。SciRet 這類研究會(huì)系統(tǒng)比較稀疏檢索如 BM25與密集檢索如向量相似度在不同領(lǐng)域數(shù)據(jù)上的表現(xiàn)差異?;旌蠙z索稀疏 密集相對(duì)單一檢索方式帶來(lái)的提升幅度。不同規(guī)模的重排模型如小型的 cross-encoder 與大型跨編碼器對(duì)最終答案質(zhì)量的影響。從工程角度看比較經(jīng)典的組合方式有下面幾種檢索方式重排方式適用場(chǎng)景計(jì)算成本純向量檢索不重排原型驗(yàn)證、對(duì)延遲極度敏感的場(chǎng)景低純向量檢索小型 Cross-Encoder 重排通用知識(shí)庫(kù)問(wèn)答中混合檢索BM25 向量小型 Cross-Encoder 重排專業(yè)術(shù)語(yǔ)較多的場(chǎng)景中高混合檢索大型重排模型對(duì)回答質(zhì)量要求極高的場(chǎng)景高2.2 Chunk 切分策略對(duì)檢索上限的影響SciRet 關(guān)注的另一個(gè)核心問(wèn)題是 Chunk 切分??茖W(xué)文獻(xiàn)中一個(gè)“理想”的 Chunk 應(yīng)該滿足兩個(gè)條件語(yǔ)義完整能夠獨(dú)立表達(dá)一個(gè)事實(shí)或論點(diǎn)。粒度適中既能被檢索器有效匹配又不會(huì)因?yàn)檫^(guò)長(zhǎng)而稀釋相關(guān)性。在實(shí)踐中Chunk 大小通常設(shè)置在 256 到 1024 個(gè) token 之間但單純調(diào)整大小并不夠。更關(guān)鍵的是切分方式固定窗口切分實(shí)現(xiàn)簡(jiǎn)單但容易切斷語(yǔ)義。遞歸字符切分按段落、句子、標(biāo)點(diǎn)逐級(jí)切分對(duì)普通文本效果好。語(yǔ)義切分基于 embedding 相似度判斷句子邊界適合科學(xué)文獻(xiàn)。結(jié)構(gòu)感知切分按 Markdown 標(biāo)題、LaTeX 章節(jié)結(jié)構(gòu)切分適合論文 PDF 轉(zhuǎn)化后的文本。SciRet 研究的價(jià)值在于它會(huì)量化不同切分策略對(duì)后續(xù)檢索和重排的影響而不是孤立地看切分結(jié)果。2.3 Top-K 數(shù)量與上下文窗口的權(quán)衡檢索后送入大模型的文本數(shù)量Top-K是 RAG 系統(tǒng)中的關(guān)鍵超參數(shù)。K 值越大大模型能看到的信息越多但也會(huì)引入更多噪聲同時(shí)增加生成階段的輸入 token 數(shù)進(jìn)而提高成本和延遲。SciRet 這類實(shí)證研究會(huì)關(guān)注在固定重排器下Top-K 從 3 增加到 10效果提升是否顯著。在固定上下文窗口如 4K、8K、32K下檢索段數(shù)增加后有效信息占比是否下降。重排器能否在 Top-K 較大的情況下通過(guò)精準(zhǔn)排序降低噪聲干擾。工程上一個(gè)比較實(shí)用的策略是檢索階段多召回比如 K20重排階段少保留比如 K5。這樣既保證了召回率又控制了上下文噪聲。2.4 重排器參數(shù)規(guī)模與效果的關(guān)系重排通常使用 Cross-Encoder 模型它能同時(shí)編碼 Query 和文檔計(jì)算相關(guān)性分?jǐn)?shù)因此效果優(yōu)于向量檢索的雙塔結(jié)構(gòu)。但 Cross-Encoder 的計(jì)算開(kāi)銷隨著參數(shù)規(guī)模增長(zhǎng)非常明顯。SciRet 關(guān)注的核心矛盾在于重排器的參數(shù)規(guī)模增大帶來(lái)的效果提升是否值得額外的計(jì)算成本。小型模型如幾億參數(shù)的版本在 CPU 上也能跑大型模型則需要 GPU 加速部署成本和延遲都會(huì)顯著上升。一個(gè)直觀的判斷方法是在小規(guī)模測(cè)試集上對(duì)比不同重排器的排序質(zhì)量再結(jié)合線上延遲要求選擇模型。如果小型重排器已經(jīng)能把相關(guān)文檔排在 Top 5那么換用大型模型的意義就不大。3. 環(huán)境準(zhǔn)備與實(shí)驗(yàn)設(shè)計(jì)要復(fù)現(xiàn) SciRet 這類研究的思路并不需要完整復(fù)刻它的實(shí)驗(yàn)環(huán)境。我們可以在自己的 RAG 項(xiàng)目中設(shè)計(jì)一組小規(guī)模的對(duì)照實(shí)驗(yàn)來(lái)衡量檢索、重排和計(jì)算成本之間的關(guān)系。3.1 推薦的技術(shù)棧下面是一個(gè)比較通用的 RAG 實(shí)驗(yàn)技術(shù)棧重點(diǎn)在于方便快速迭代組件推薦方案說(shuō)明開(kāi)發(fā)語(yǔ)言Python 3.10生態(tài)最豐富RAG 框架LlamaIndex 或 LangChain兩者都支持檢索、重排的插拔式設(shè)計(jì)向量數(shù)據(jù)庫(kù)Chroma 或 Qdrant本地開(kāi)發(fā)用 Chroma 最方便數(shù)據(jù)量大的場(chǎng)景用 QdrantEmbedding 模型BAAI/bge-small-zh-v1.5 或 OpenAI embedding中文場(chǎng)景推薦 bge 系列重排模型BAAI/bge-reranker-base 或 Cohere Rerank開(kāi)源場(chǎng)景優(yōu)先 bge-reranker評(píng)估框架RAGAS 或自定義腳本用于評(píng)估 Faithfulness、Answer Relevance 等指標(biāo)版本需要根據(jù)你的項(xiàng)目實(shí)際情況調(diào)整本文示例以常見(jiàn)環(huán)境為例重點(diǎn)演示配置思路。3.2 實(shí)驗(yàn)設(shè)計(jì)模板在復(fù)現(xiàn) SciRet 思路時(shí)建議按照下面這個(gè)模板設(shè)計(jì)實(shí)驗(yàn)固定數(shù)據(jù)集準(zhǔn)備一批科學(xué)文獻(xiàn)段落以及對(duì)應(yīng)的 Query 集合。確定變量每次只改變一個(gè)變量其他保持不變。記錄指標(biāo)同時(shí)記錄效果指標(biāo)和計(jì)算指標(biāo)。對(duì)比基線設(shè)置一個(gè)最簡(jiǎn)單的基線比如純向量檢索 不重排所有改進(jìn)都與基線對(duì)比。實(shí)驗(yàn)矩陣可以這樣設(shè)計(jì)實(shí)驗(yàn)組檢索方式重排方式Top-KChunk 大小Baseline向量檢索無(wú)5512實(shí)驗(yàn) A向量檢索小型重排5512實(shí)驗(yàn) B混合檢索小型重排5512實(shí)驗(yàn) C混合檢索小型重排10512實(shí)驗(yàn) D混合檢索小型重排10256通過(guò)這張表可以系統(tǒng)分析每個(gè)變量對(duì)結(jié)果的影響。4. 用代碼實(shí)現(xiàn)一個(gè)計(jì)算感知的實(shí)驗(yàn)框架下面通過(guò)一個(gè)完整的 Python 示例演示如何構(gòu)建一個(gè)可以對(duì)比不同檢索和重排配置的最小實(shí)驗(yàn)框架。4.1 創(chuàng)建項(xiàng)目結(jié)構(gòu)sci_ret_demo/ ├── data/ # 存放待檢索的文檔 ├── experiments/ # 實(shí)驗(yàn)結(jié)果輸出 ├── src/ │ ├── __init__.py │ ├── ingest.py # 文檔加載、切塊、寫入向量庫(kù) │ ├── retrievers.py # 不同檢索方式的封裝 │ ├── rerankers.py # 重排器封裝 │ └── evaluate.py # 評(píng)估腳本 └── requirements.txt4.2 安裝依賴pip install llama-index-core llama-index-readers-file llama-index-vector-stores-chroma llama-index-postprocessor-cohere-rerank chromadb sentence-transformers不同版本對(duì) API 的封裝略有差異如果遇到導(dǎo)入錯(cuò)誤建議根據(jù)實(shí)際安裝版本查閱對(duì)應(yīng)文檔。4.3 文檔索引模塊先實(shí)現(xiàn)文檔加載、切塊和向量化存儲(chǔ)的功能。# 文件路徑sci_ret_demo/src/ingest.py from llama_index.core import SimpleDirectoryReader from llama_index.core.node_parser import SentenceSplitter from llama_index.core.schema import TextNode from llama_index.core.vector_stores import VectorStoreIndex from chroma import PersistentClient def load_documents(data_dir: str): 加載目錄下的所有文檔 reader SimpleDirectoryReader(data_dir) documents reader.load_data() return documents def build_nodes(documents, chunk_size: int 512, chunk_overlap: int 50): 將文檔切分為節(jié)點(diǎn)chunk_size 是實(shí)驗(yàn)中的關(guān)鍵變量 splitter SentenceSplitter( chunk_sizechunk_size, chunk_overlapchunk_overlap, ) nodes splitter.get_nodes_from_documents(documents) return nodes def create_index(nodes, collection_name: str sci_ret_demo): 創(chuàng)建向量索引這里使用 Chroma 作為持久化存儲(chǔ) client PersistentClient(path./chroma_data) service_context None # 實(shí)際使用時(shí)需要配置 embedding model # 這里需要根據(jù) LlamaIndex 版本傳入 service_context 或 settings # 建議在外部統(tǒng)一初始化 embedding 模型后傳入 vector_store client.get_or_create_collection(collection_name) # 在更高版本中需要將 vector_store 與 Index 關(guān)聯(lián) index VectorStoreIndex.from_nodes(nodes) return index注意上面的代碼是核心片段實(shí)際運(yùn)行時(shí)需要根據(jù)你安裝的 LlamaIndex 版本補(bǔ)全 Embedding 模型的初始化邏輯。4.4 檢索與重排模塊然后封裝檢索和重排的對(duì)比邏輯。# 文件路徑sci_ret_demo/src/retrievers.py from llama_index.core import VectorStoreIndex from llama_index.core.retrievers import VectorIndexRetriever from llama_index.core.schema import QueryBundle def retrieve_top_k(index: VectorStoreIndex, query_text: str, top_k: int 5): 向量檢索 Top-K retriever VectorIndexRetriever( indexindex, similarity_top_ktop_k, ) nodes retriever.retrieve(QueryBundle(query_text)) return nodes# 文件路徑sci_ret_demo/src/rerankers.py from llama_index.core.postprocessor import SentenceTransformerRerank def build_reranker(model_name: str BAAI/bge-reranker-base, top_n: int 3): 構(gòu)建重排器這里以 bge-reranker 為例 reranker SentenceTransformerRerank( modelmodel_name, top_ntop_n, ) return reranker4.5 評(píng)估腳本評(píng)估部分需要實(shí)現(xiàn)兩個(gè)維度的指標(biāo)效果指標(biāo)和計(jì)算指標(biāo)。# 文件路徑sci_ret_demo/src/evaluate.py import time from dataclasses import dataclass from typing import List, Optional dataclass class ExperimentResult: config_name: str recall_at_k: float mrr: float latency_ms: float cost_notes: str def calculate_hit_rate(retrieved: List[str], relevant_ids: set) - float: 計(jì)算命中率檢索結(jié)果中是否包含相關(guān)文檔 if not retrieved: return 0.0 hits sum(1 for doc_id in retrieved if doc_id in relevant_ids) return hits / len(retrieved) def calculate_mrr(retrieved: List[str], relevant_ids: set) - float: 計(jì)算 MRR第一個(gè)相關(guān)結(jié)果排名的倒數(shù) for idx, doc_id in enumerate(retrieved, start1): if doc_id in relevant_ids: return 1.0 / idx return 0.0 def run_experiment( config_name: str, retrieve_func, rerank_func: Optional, query: str, relevant_ids: set, top_k: int 10, final_n: int 3, ): 運(yùn)行單個(gè)實(shí)驗(yàn)記錄效果和耗時(shí) start time.time() # 召回階段 nodes retrieve_func(query, top_k) retrieved_docs [n.node.node_id for n in nodes] if nodes else [] # 重排階段 if rerank_func is not None: reranked rerank_func.postprocess_nodes(nodes, query_strquery) final_docs [n.node.node_id for n in reranked[:final_n]] else: final_docs retrieved_docs[:final_n] latency_ms (time.time() - start) * 1000 result ExperimentResult( config_nameconfig_name, recall_at_kcalculate_hit_rate(final_docs, relevant_ids), mrrcalculate_mrr(final_docs, relevant_ids), latency_msround(latency_ms, 2), cost_notesf召回{top_k}條保留{final_n}條, ) return result4.6 運(yùn)行實(shí)驗(yàn)現(xiàn)在可以串聯(lián)所有模塊跑一組簡(jiǎn)單對(duì)比實(shí)驗(yàn)。# 文件路徑run_experiments.py from src.ingest import load_documents, build_nodes, create_index from src.retrievers import retrieve_top_k from src.rerankers import build_reranker from src.evaluate import run_experiment # 1. 加載與索引 docs load_documents(./data) nodes build_nodes(docs, chunk_size512) index create_index(nodes) # 2. 定義實(shí)驗(yàn)查詢和期望命中的文檔 ID queries [ { query: 什么是檢索增強(qiáng)生成, relevant_ids: {doc_001, doc_002}, } ] # 3. 構(gòu)建不同配置 reranker_small build_reranker(BAAI/bge-reranker-base, top_n3) # 4. 執(zhí)行對(duì)比實(shí)驗(yàn) results [] for item in queries: # 基線不重排 base run_experiment( config_namebaseline_vector_top5, retrieve_funclambda q, k: retrieve_top_k(index, q, top_kk), rerank_funcNone, queryitem[query], relevant_idsitem[relevant_ids], top_k5, final_n3, ) results.append(base) # 實(shí)驗(yàn)組向量檢索 重排 exp run_experiment( config_namevector_rerank_top10, retrieve_funclambda q, k: retrieve_top_k(index, q, top_kk), rerank_funcreranker_small, queryitem[query], relevant_idsitem[relevant_ids], top_k10, final_n3, ) results.append(exp) # 5. 輸出結(jié)果 for res in results: print(res)預(yù)期輸出會(huì)展示每個(gè)配置下的命中率、MRR 和延遲。通過(guò)對(duì)比基線和實(shí)驗(yàn)組的差異就能判斷重排器的加入是否真的帶來(lái)了收益。5. 常見(jiàn)問(wèn)題與排查思路在搭建類似實(shí)驗(yàn)框架的過(guò)程中下面幾個(gè)問(wèn)題是出現(xiàn)頻率最高的。問(wèn)題現(xiàn)象常見(jiàn)原因解決思路檢索結(jié)果總是缺少正確答案段落Embedding 模型與語(yǔ)料領(lǐng)域不匹配換成領(lǐng)域適配的 Embedding如 bge 系列嘗試混合檢索重排前后效果幾乎沒(méi)有變化重排模型與檢索模型來(lái)自不同領(lǐng)域或 Top-K 太小擴(kuò)大召回?cái)?shù)量更換重排模型檢查相關(guān)文檔是否在候選集內(nèi)響應(yīng)延遲過(guò)高Top-K 過(guò)大、重排模型過(guò)重、文檔切分過(guò)長(zhǎng)降低 Top-K使用小規(guī)模重排模型限制上下文長(zhǎng)度生成的回答經(jīng)?!按鸱撬鶈?wèn)”上下文噪聲太多大模型被無(wú)關(guān)文本干擾提高重排后保留的段落質(zhì)量增加 Prompt 中的引用要求不同實(shí)驗(yàn)之間結(jié)果波動(dòng)明顯數(shù)據(jù)集太小、評(píng)估指標(biāo)不穩(wěn)定擴(kuò)大測(cè)試集多次運(yùn)行取平均使用人工標(biāo)注的子集做驗(yàn)證向量庫(kù)召回結(jié)果無(wú)法穩(wěn)定復(fù)現(xiàn)Chunk 切分參數(shù)不一致或隨機(jī)種子未固定固定切分參數(shù)固定 Embedding 模型權(quán)重排查是否用到重排器的下降問(wèn)題有一個(gè)比較容易忽視的問(wèn)題重排器雖然能在相關(guān)性上做二次判斷但它無(wú)法解決“召回階段就漏掉正確答案”的問(wèn)題。如果向量檢索階段 Top-K 太小把正確答案段落排在了候選集之外重排器再?gòu)?qiáng)也無(wú)能為力。所以排查效果不佳時(shí)建議先看“召回命中率”再看“重排準(zhǔn)確率”。6. 最佳實(shí)踐與工程建議基于 SciRet 的研究視角可以從下面幾個(gè)維度優(yōu)化實(shí)際 RAG 系統(tǒng)。6.1 把“計(jì)算成本”當(dāng)成一等公民指標(biāo)在 RAG 項(xiàng)目里建議在評(píng)估表格中同時(shí)記錄召回階段耗時(shí)。重排階段耗時(shí)。LLM 生成階段消耗的 token 數(shù)。單次問(wèn)答的總成本估算按 token 單價(jià)折算。不要把目光只盯在準(zhǔn)確率上因?yàn)楹芏嗲闆r下準(zhǔn)確率提升 2%成本卻上升了 50%這在生產(chǎn)環(huán)境是不可接受的。6.2 按場(chǎng)景選擇檢索和重排策略通用知識(shí)庫(kù)向量檢索 bge-reranker-baseTop-K 設(shè)為 10重排后保留 3 到 5 條性價(jià)比最高。專業(yè)文獻(xiàn)問(wèn)答建議使用混合檢索BM25 向量Top-K 設(shè)為 20重排后保留 5 條??茖W(xué)文獻(xiàn)中術(shù)語(yǔ)的精確匹配往往比語(yǔ)義相似度更可靠。延遲敏感場(chǎng)景可以考慮不做重排但把向量檢索的相似度閾值調(diào)高用規(guī)則過(guò)濾掉明顯不相關(guān)的段落。大模型上下文很長(zhǎng)如 128K不要盲目塞入大量檢索文檔。檢索質(zhì)量下降時(shí)增加文檔數(shù)量只會(huì)增加噪聲不會(huì)提升答案質(zhì)量。6.3 Chunk 策略要綁定評(píng)估一起調(diào)不要把 Chunk 大小當(dāng)作一個(gè)固定參數(shù)。建議在評(píng)估中加入一組“Chunk 大小對(duì)比實(shí)驗(yàn)”比如 256、512、1024觀察對(duì) Recall 和最終答案質(zhì)量的影響??茖W(xué)文獻(xiàn)場(chǎng)景可以考慮“按段落切分 段落級(jí)檢索 關(guān)鍵句提取”的組合避免固定 token 窗口切斷語(yǔ)義。6.4 安全與權(quán)限邊界當(dāng) RAG 系統(tǒng)接入企業(yè)內(nèi)部文檔時(shí)要特別注意檢索階段的權(quán)限隔離。向量庫(kù)中不允許存放未脫敏的敏感信息檢索結(jié)果也應(yīng)按用戶權(quán)限過(guò)濾后再送入大模型。生產(chǎn)環(huán)境建議在向量庫(kù)中增加文檔級(jí)權(quán)限字段。檢索后、重排前進(jìn)行權(quán)限過(guò)濾。記錄完整的檢索、重排、生成日志用于追溯和審計(jì)。6.5 日志與可觀測(cè)性RAG 系統(tǒng)的調(diào)優(yōu)高度依賴日志。建議每條線上請(qǐng)求都記錄查詢文本檢索召回的所有文檔 ID 和分?jǐn)?shù)重排后的排名和最終得分LLM 生成答案引用的文檔 ID有了這些日志之后做效果回歸和錯(cuò)誤分析時(shí)就有據(jù)可依不用靠“猜”來(lái)調(diào)參。7. 下一步可以深入的方向SciRet 這類計(jì)算感知研究給實(shí)際工程帶來(lái)的最大啟發(fā)是提醒我們不要孤立地看檢索和重排方法而是要以“系統(tǒng)總開(kāi)銷”為約束尋找最優(yōu)組合。沿著這個(gè)思路后續(xù)可以深入的方向包括Agentic RAG把檢索、重排、查詢改寫交給 Agent 動(dòng)態(tài)決定適合多輪復(fù)雜問(wèn)題但延遲和成本更高需要做更精細(xì)的計(jì)算預(yù)算控制。RAG 評(píng)估體系引入 RAGAS、TruLens 或自建評(píng)估集把 Faithfulness、Answer Relevance、Context Relevance 納入評(píng)估框架。知識(shí)圖譜與向量數(shù)據(jù)庫(kù)結(jié)合先用知識(shí)圖譜做結(jié)構(gòu)化過(guò)濾再用向量檢索做語(yǔ)義召回能夠顯著提升專業(yè)領(lǐng)域的檢索精度但工程復(fù)雜度更高。引用溯源與 Groundedness 校驗(yàn)讓大模型在回答中標(biāo)注引用來(lái)源用規(guī)則或模型校驗(yàn)生成內(nèi)容是否忠實(shí)于檢索到的文檔。這在企業(yè)場(chǎng)景幾乎屬于剛需。如果你正在做自己的 RAG 項(xiàng)目可以先從這篇論文的實(shí)驗(yàn)思路中抽離出一部分搭建一個(gè)小型評(píng)估平臺(tái)固定數(shù)據(jù)集、固定評(píng)估指標(biāo)、逐項(xiàng)對(duì)比檢索器、重排器和 Chunk 參數(shù)。不要一上來(lái)就追求復(fù)雜的框架先把“計(jì)算成本”和“回答質(zhì)量”這兩本賬算清楚再逐步擴(kuò)展。這樣無(wú)論是做技術(shù)選型還是向業(yè)務(wù)方解釋系統(tǒng)行為都會(huì)更有底氣。如果你想進(jìn)一步落地也可以把本文的實(shí)驗(yàn)框架擴(kuò)展成自動(dòng)化的回歸測(cè)試每次升級(jí) Embedding 模型、重排模型或調(diào)整切塊策略時(shí)都跑一遍標(biāo)準(zhǔn)測(cè)試集對(duì)比效果和耗時(shí)。這是讓 RAG 系統(tǒng)從“能跑”走向“可控”的關(guān)鍵一步。