哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

高質量RAG系統的五個核心設計要點

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-04-24 14:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

打造高質量 RAG 系統:必守的 5 大核心設計準則

檢索增強生成(Retrieval-Augmented Generation, RAG)已成為構建大模型應用的標準架構。然而,大多數RAG系統在設計初期會因為忽略核心設計原則而在實際部署中暴露嚴重問題。本文從工程實踐角度出發(fā),梳理高質量RAG系統的5個核心設計要點。

一、文檔分塊策略:決定檢索粒度

分塊(Chunking)是RAG系統的第一個關鍵決策點。分塊太大導致檢索精度下降,分塊太小則丟失上下文。

1.1 固定大小分塊的局限性

簡單的固定大小分塊(如每塊512 tokens)是最常見的實現方式,但它存在明顯缺陷:

# 簡單的固定大小分塊 - 不推薦用于生產
defnaive_chunking(text: str, chunk_size: int =512)-> list[str]:
  tokens = text.split() # 錯誤的tokenize方式
 return[' '.join(tokens[i:i+chunk_size])foriinrange(0, len(tokens), chunk_size)]

這種方法的問題在于:

不考慮語義邊界,可能將完整的句子或段落切斷

不考慮代碼結構,可能在函數中間斷開

不考慮表格結構,可能將一行數據切成兩半

1.2 基于語義的智能分塊

高質量RAG系統應使用基于語義的分塊策略:

fromlangchain.text_splitterimportRecursiveCharacterTextSplitter

# 推薦的智能分塊配置
text_splitter = RecursiveCharacterTextSplitter(
  chunk_size=800,
  chunk_overlap=100, # 重疊區(qū)域保持上下文連續(xù)性
  length_function=len,
  separators=["

","
","。","!","?"," ",""] # 按優(yōu)先級嘗試分割
)

1.3 特殊內容的分塊處理

代碼文件:應按函數、類或邏輯單元分割,而不是固定行數

importast

defsplit_code_by_function(code: str)-> list[dict]:
 """按函數/類分割代碼,保持完整的代碼結構"""
 try:
    tree = ast.parse(code)
    chunks = []
   fornodeinast.walk(tree):
     ifisinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
       # 獲取節(jié)點的起始和結束行
        start = node.lineno -1
        end = node.end_lineno
        chunk_content = code.split('
')[start:end]
        chunks.append({
         "content":'
'.join(chunk_content),
         "type": type(node).__name__,
         "name": node.name
        })
   returnchunks
 except:
   return[{"content": code,"type":"unknown","name":"unknown"}]

表格數據:表格應作為整體檢索單元,不應拆分

defprocess_table_as_unit(table_element)-> dict:
 """將表格處理為獨立的檢索單元"""
 return{
   "content": table_element.to_markdown(),
   "metadata": {
     "type":"table",
     "row_count": len(table_element.rows),
     "header": table_element.headers
    }
  }

二、向量嵌入模型選型

向量嵌入的質量直接決定檢索的相關性。

2.1 通用 embedding 模型對比

模型 維度 MTEB基準 優(yōu)勢場景
text-embedding-3-large 3072 通用場景
text-embedding-3-small 1536 成本敏感
cohere-embed-v4 1024 多語言
BGE-M3 1024 中英雙語

2.2 領域適配embedding

對于垂直領域(如醫(yī)療、法律、金融),通用embedding模型的效果可能不如領域適配模型:

# 使用領域適配的embedding配置
embedding_config = {
 "model":"thenlper/gte-large-zh", # 中文優(yōu)化
 "dimension":1024,
 "normalize":True, # 余弦相似度計算需要
 "batch_size":32 # 批量處理的批次大小
}

2.3 Embedding質量驗證

上線前必須驗證embedding的質量:

defevaluate_embedding_quality(embedder, test_cases: list[dict])-> dict:
 """評估embedding模型在測試集上的性能"""
  correct =0
 forcaseintest_cases:
    query_emb = embedder.encode(case["query"])
    doc_emb = embedder.encode(case["positive_doc"])
    neg_emb = embedder.encode(case["negative_doc"])

    pos_sim = cosine_similarity(query_emb, doc_emb)
    neg_sim = cosine_similarity(query_emb, neg_emb)

   ifpos_sim > neg_sim:
      correct +=1

 return{
   "accuracy": correct / len(test_cases),
   "avg_positive_sim": sum(c["pos_sim"]forcinresults) / len(results),
   "avg_negative_sim": sum(c["neg_sim"]forcinresults) / len(results)
  }

三、混合檢索架構

單一向量檢索無法覆蓋所有查詢類型,高質量RAG系統必須采用混合檢索。

3.1 稀疏檢索與稠密檢索的互補

稠密檢索(向量檢索):擅長語義相似性匹配,捕捉同義詞、多義詞關系

稀疏檢索(BM25/TF-IDF):擅長關鍵詞精確匹配,捕捉專有名詞、術語

fromrank_bm25importBM25Okapi

classHybridRetriever:
 def__init__(self, vector_store, documents: list[str]):
    self.vector_store = vector_store
   # 構建BM25索引
    tokenized_docs = [doc.lower().split()fordocindocuments]
    self.bm25 = BM25Okapi(tokenized_docs)

 defretrieve(self, query: str, k: int =10, alpha: float =0.5)-> list[dict]:
   """
    混合檢索
    alpha: 0=純BM25, 0.5=等權重, 1=純向量檢索
    """
   # 向量檢索
    vector_results = self.vector_store.similarity_search(query, k=k*2)
    vector_scores = {r.page_content: r.metadata.get("score",1.0)forrinvector_results}

   # BM25檢索
    tokenized_query = query.lower().split()
    bm25_scores = self.bm25.get_scores(tokenized_query)
    top_bm25_indices = np.argsort(bm25_scores)[::-1][:k*2]
    bm25_results = {
      documents[i]: bm25_scores[i] / max(bm25_scores) # 歸一化
     foriintop_bm25_indices
    }

   # 分數融合
    all_docs = set(vector_scores.keys()) | set(bm25_results.keys())
    fused_scores = []
   fordocinall_docs:
      vs = vector_scores.get(doc,0)
      bs = bm25_results.get(doc,0)
      fused = alpha * vs + (1- alpha) * bs
      fused_scores.append((doc, fused))

   # 按融合分數排序
    fused_scores.sort(key=lambdax: x[1], reverse=True)
   return[{"content": doc,"score": score}fordoc, scoreinfused_scores[:k]]

3.2 Keyword Cache加速稀疏檢索

對于高頻查詢的稀疏檢索結果,可以緩存以避免重復計算:

importredis

classCachedHybridRetriever(HybridRetriever):
 def__init__(self, *args, cache: redis.Redis, **kwargs):
    super().__init__(*args, **kwargs)
    self.cache = cache

 def_get_cache_key(self, query: str)-> str:
   returnf"bm25:{hashlib.md5(query.encode()).hexdigest()}"

 def_bm25_retrieve(self, query: str, k: int)-> list[tuple[str, float]]:
    cache_key = self._get_cache_key(query)
    cached = self.cache.get(cache_key)

   ifcached:
     returnjson.loads(cached)

    result = super()._bm25_retrieve(query, k)
    self.cache.setex(cache_key,3600, json.dumps(result))
   returnresult

四、元數據過濾與索引設計

高質量RAG系統必須支持多維度的元數據過濾,以縮小檢索范圍。

4.1 元數據結構設計

# 文檔的元數據結構
document_metadata = {
 "id":"doc_001",
 "source":"api_docs",
 "source_url":"https://api.example.com/v1/users",
 "created_at":"2024-03-15",
 "updated_at":"2024-11-20",
 "version":"2.1.0",
 "category":"user_management",
 "tags": ["users","authentication","crud"],
 "language":"zh",
 "author":"backend_team",
 "chunk_index":3, # 在原文檔中的塊序號
}

4.2 多級索引架構

fromelasticsearchimportElasticsearch

classMultiIndexRetriever:
 def__init__(self, es_client: Elasticsearch):
    self.es = es_client

 defretrieve_with_filter(
    self,
    query: str,
    filters: dict,
    k: int =10
  )-> list[dict]:
   """帶元數據過濾的檢索"""
    must_clauses = [
      {"multi_match": {"query": query,"fields": ["content^2","title"]}}
    ]

   # 構建過濾條件
    filter_clauses = []
   iffilters.get("category"):
      filter_clauses.append({"term": {"category": filters["category"]}})
   iffilters.get("date_range"):
      filter_clauses.append({
       "range": {
         "updated_at": {
           "gte": filters["date_range"]["start"],
           "lte": filters["date_range"]["end"]
          }
        }
      })
   iffilters.get("tags"):
      filter_clauses.append({"terms": {"tags": filters["tags"]}})

    search_body = {
     "query": {
       "bool": {
         "must": must_clauses,
         "filter": filter_clauses
        }
      },
     "size": k
    }

   returnself.es.search(index="documents", body=search_body)

4.3 層級索引設計

對于大規(guī)模文檔集,建議使用層級索引:

層級1: 元數據索引(Elasticsearch/Solr)
  - 支持快速過濾
  - 存儲文檔ID、類別、日期等結構化字段

層級2: 向量索引(Pinecone/Milvus)
  - 高維向量檢索
  - 存儲文檔內容的向量表示

查詢流程:
1. 根據用戶過濾條件在元數據索引中篩選候選文檔ID
2. 用候選文檔ID過濾向量檢索結果
3. 對過濾后的top-k結果進行重排序

五、重排序(Reranking)機制

初步檢索的結果往往不能直接滿足最終質量要求,重排序是提升最終效果的關鍵步驟。

5.1 Cross-Encoder重排序

fromsentence_transformersimportCrossEncoder

classReranker:
 def__init__(self, model_name: str ="BAAI/bge-reranker-large"):
    self.model = CrossEncoder(model_name, max_length=512)

 defrerank(
    self,
    query: str,
    documents: list[str],
    top_k: int =5
  )-> list[dict]:
   """對檢索結果進行重排序"""
    pairs = [[query, doc]fordocindocuments]
    scores = self.model.predict(pairs)

   # 按分數排序
    ranked = sorted(zip(documents, scores), key=lambdax: x[1], reverse=True)
   return[
      {"content": doc,"score": float(score)}
     fordoc, scoreinranked[:top_k]
    ]

5.2 級聯重排序策略

classCascadeReranker:
 def__init__(self, retrievers: list, rerankers: list):
    self.retrievers = retrievers # 多路檢索器
    self.rerankers = rerankers  # 多個重排序模型

 defretrieve_and_rerank(
    self,
    query: str,
    filters: dict = None,
    initial_k: int =50,
    final_k: int =5
  )-> list[dict]:
   # 第一階段:多路檢索,收集候選
    candidates = {}
   forretrieverinself.retrievers:
      results = retriever.retrieve(query, k=initial_k, filters=filters)
     forrinresults:
        doc_id = r["content"]
       ifdoc_idnotincandidates:
          candidates[doc_id] = {"content": r["content"],"scores": []}
        candidates[doc_id]["scores"].append(r["score"])

   # 匯總候選文檔
    candidate_docs = [c["content"]forcincandidates.values()]

   # 第二階段:第一個重排序模型粗排
   iflen(self.rerankers) >=1:
      coarse_ranked = self.rerankers[0].rerank(query, candidate_docs, top_k=20)
      candidate_docs = [r["content"]forrincoarse_ranked]

   # 第三階段:第二個重排序模型精排
   iflen(self.rerankers) >=2:
      final_ranked = self.rerankers[1].rerank(query, candidate_docs, top_k=final_k)
     returnfinal_ranked

   returncoarse_ranked[:final_k]

六、質量保障與持續(xù)優(yōu)化

6.1 離線評估指標

defevaluate_rag_system(
  rag_pipeline,
  test_dataset: list[dict]
)-> dict:
 """評估RAG系統性能"""
  results = {
   "retrieval_precision": [],
   "retrieval_recall": [],
   "generation_fluency": [],
   "answer_relevance": []
  }

 forcaseintest_dataset:
   # 獲取檢索結果
    retrieved_docs = rag_pipeline.retrieve(case["query"])
    relevant_docs = set(case["relevant_docs"])

   # 計算召回率
    retrieved_set = set(d["content"]fordinretrieved_docs)
    recall = len(retrieved_set & relevant_docs) / len(relevant_docs)
    results["retrieval_recall"].append(recall)

   # 生成答案
    answer = rag_pipeline.generate(case["query"], retrieved_docs)

   # 評估生成質量
    results["answer_relevance"].append(
      compute_answer_relevance(answer, case["question"])
    )

 return{k: sum(v) / len(v)fork, vinresults.items()}

6.2 在線監(jiān)控指標

生產環(huán)境必須監(jiān)控:

檢索召回率(通過用戶點擊/反饋推斷)

答案滿意度評分

P99檢索延遲

向量索引存儲增長率

總結

高質量RAG系統的5個核心設計:

設計要點 關鍵決策 推薦實踐
分塊策略 塊大小、重疊度、分割粒度 語義分割 + 代碼/表格特殊處理
Embedding 模型選型、維度、歸一化 領域適配模型 + 質量驗證
混合檢索 稠密+稀疏權重、緩存 alpha=0.5 + Redis緩存
元數據過濾 索引結構、過濾語法 兩層索引:ES元數據 + 向量
重排序 模型選型、級聯策略 Cross-Encoder + 級聯精排

這些設計點相互關聯,共同決定了RAG系統的最終效果。在實際工程中,應根據數據規(guī)模、查詢類型、延遲要求做權衡取舍。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4422

    瀏覽量

    67834
  • 大模型
    +關注

    關注

    2

    文章

    3770

    瀏覽量

    5269

原文標題:打造高質量 RAG 系統:必守的 5 大核心設計準則

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何做一高質量的畢業(yè)設計?

    希望跟各位大峽討論一下,如何做一高質量的畢業(yè)設計? 畢業(yè)設計專業(yè)代理QQ:445384923
    發(fā)表于 01-26 09:14

    protel輸出高質量gerber

    圖文并茂一步一步手把手教你輸出高質量的gerber傻瓜式教學。。。。[hide] [/hide]
    發(fā)表于 12-12 15:43

    高質量C++、C編程指南

    高質量C++、C編程指南
    發(fā)表于 08-06 11:58

    高質量C&C++

    高質量C&C++
    發(fā)表于 08-16 19:45

    原版PIC實戰(zhàn)項目-C(高質量PDF版本)

    英文原版,高質量保證。
    發(fā)表于 07-10 21:42

    高質量C語言編程

    高質量c語言,精,精,精,精華
    發(fā)表于 07-22 13:48

    編寫高質量C語言代碼

    編寫高質量C語言代碼 編寫高質量C語言代碼 編寫高質量C語言代碼
    發(fā)表于 07-31 17:47

    林銳《高質量C語言編程》

    林銳《高質量C語言編程》
    發(fā)表于 08-17 12:10

    高質量C++與C編程指南

    高質量C++與C編程指南
    發(fā)表于 03-09 10:54

    高質量編程

    干貨,《495C語言問題》、《華為內部程序設計編碼規(guī)范》、《C語言:陷阱和缺陷》、《高質量C編程[林銳]》
    發(fā)表于 02-27 19:39

    單向測徑儀以技術為核心,環(huán)環(huán)相扣高質量測量

    致力于其性能的提升。  單向測徑儀:  單向測徑儀能適應多種環(huán)境,以光學測量為基礎,單片機編程為核心,聲光報警為提示,閉環(huán)自動控制為質量保障,實現高質量線纜電纜等的在線檢測。它的各部分模塊緊湊合理,使其
    發(fā)表于 03-08 15:07

    【下載】高質量干貨-22本高質量EMC電磁兼容性設計資料

    22本高質量EMC電磁兼容性設計資料請君自取總體太大壓縮成兩壓縮包。希望這些內容能對大家在設計上有所幫助!
    發(fā)表于 03-20 00:02

    請問怎么才能設計出高質量的印制線路板?

    怎么才能設計出高質量的印制線路板?
    發(fā)表于 04-23 06:57

    如何推動我國制造業(yè)高質量發(fā)展_步驟告訴你

    制造業(yè)高質量發(fā)展是建設現代化經濟體系、實現新時代高質量發(fā)展的基礎與前提?,F階段我國制造業(yè)高質量發(fā)展面臨技術、資本、人才、制度、結構大挑戰(zhàn)。
    的頭像 發(fā)表于 08-05 06:36 ?1.7w次閱讀

    高質量是新興電纜的核心競爭力

    ――對話新興電纜董事長楊曉東、總經理郭偉明、品牌操盤手張默聞 2018年7月12日,新興新時代高速高質量2018新興共贏商發(fā)展大會暨極線N70家裝電線發(fā)布會在廣州增城隆重舉行。會上,新興電纜董事長楊
    發(fā)表于 12-17 12:57 ?1255次閱讀
    阜宁县| 万全县| 大余县| 湘潭市| 龙里县| 黑水县| 永顺县| 安吉县| 石家庄市| 松江区| 专栏| 岳池县| 广饶县| 苏尼特左旗| 米脂县| 福泉市| 太和县| 临夏市| 庆云县| 宽城| 墨竹工卡县| 武汉市| 逊克县| 平山县| 白玉县| 青冈县| 江达县| 康平县| 通海县| 凌海市| 兴宁市| 盐山县| 吴川市| 麟游县| 双城市| 虞城县| 太白县| 隆化县| 景德镇市| 丁青县| 搜索|