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

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

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

3天內(nèi)不再提示

高質(zhì)量RAG系統(tǒng)的五個核心設(shè)計要點

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

掃碼添加小助手

加入工程師交流群

打造高質(zhì)量 RAG 系統(tǒng):必守的 5 大核心設(shè)計準則

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

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

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

1.1 固定大小分塊的局限性

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

# 簡單的固定大小分塊 - 不推薦用于生產(chǎn)
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)]

這種方法的問題在于:

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

不考慮代碼結(jié)構(gòu),可能在函數(shù)中間斷開

不考慮表格結(jié)構(gòu),可能將一行數(shù)據(jù)切成兩半

1.2 基于語義的智能分塊

高質(zhì)量RAG系統(tǒng)應(yīng)使用基于語義的分塊策略:

fromlangchain.text_splitterimportRecursiveCharacterTextSplitter

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

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

1.3 特殊內(nèi)容的分塊處理

代碼文件:應(yīng)按函數(shù)、類或邏輯單元分割,而不是固定行數(shù)

importast

defsplit_code_by_function(code: str)-> list[dict]:
 """按函數(shù)/類分割代碼,保持完整的代碼結(jié)構(gòu)"""
 try:
    tree = ast.parse(code)
    chunks = []
   fornodeinast.walk(tree):
     ifisinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
       # 獲取節(jié)點的起始和結(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"}]

表格數(shù)據(jù):表格應(yīng)作為整體檢索單元,不應(yīng)拆分

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
    }
  }

二、向量嵌入模型選型

向量嵌入的質(zhì)量直接決定檢索的相關(guān)性。

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 領(lǐng)域適配embedding

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

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

2.3 Embedding質(zhì)量驗證

上線前必須驗證embedding的質(zhì)量:

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)
  }

三、混合檢索架構(gòu)

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

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

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

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

fromrank_bm25importBM25Okapi

classHybridRetriever:
 def__init__(self, vector_store, documents: list[str]):
    self.vector_store = vector_store
   # 構(gòu)建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=等權(quán)重, 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
    }

   # 分數(shù)融合
    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))

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

3.2 Keyword Cache加速稀疏檢索

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

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

四、元數(shù)據(jù)過濾與索引設(shè)計

高質(zhì)量RAG系統(tǒng)必須支持多維度的元數(shù)據(jù)過濾,以縮小檢索范圍。

4.1 元數(shù)據(jù)結(jié)構(gòu)設(shè)計

# 文檔的元數(shù)據(jù)結(jié)構(gòu)
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 多級索引架構(gòu)

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]:
   """帶元數(shù)據(jù)過濾的檢索"""
    must_clauses = [
      {"multi_match": {"query": query,"fields": ["content^2","title"]}}
    ]

   # 構(gòu)建過濾條件
    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 層級索引設(shè)計

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

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

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

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

五、重排序(Reranking)機制

初步檢索的結(jié)果往往不能直接滿足最終質(zhì)量要求,重排序是提升最終效果的關(guān)鍵步驟。

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]:
   """對檢索結(jié)果進行重排序"""
    pairs = [[query, doc]fordocindocuments]
    scores = self.model.predict(pairs)

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

5.2 級聯(lián)重排序策略

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]

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

6.1 離線評估指標

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

 forcaseintest_dataset:
   # 獲取檢索結(jié)果
    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)

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

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

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

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

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

答案滿意度評分

P99檢索延遲

向量索引存儲增長率

總結(jié)

高質(zhì)量RAG系統(tǒng)的5個核心設(shè)計:

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

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

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

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67832
  • 大模型
    +關(guān)注

    關(guān)注

    2

    文章

    3770

    瀏覽量

    5269

原文標題:打造高質(zhì)量 RAG 系統(tǒng):必守的 5 大核心設(shè)計準則

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

    protel輸出高質(zhì)量gerber

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

    高質(zhì)量C++、C編程指南

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

    高質(zhì)量C&C++

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

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

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

    高質(zhì)量C語言編程

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

    編寫高質(zhì)量C語言代碼

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

    林銳《高質(zhì)量C語言編程》

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

    高質(zhì)量C++與C編程指南

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

    高質(zhì)量編程

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

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

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

    【下載】高質(zhì)量干貨-22本高質(zhì)量EMC電磁兼容性設(shè)計資料

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

    請問怎么才能設(shè)計出高質(zhì)量的印制線路板?

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

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

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

    高質(zhì)量是新興電纜的核心競爭力

    ――對話新興電纜董事長楊曉東、總經(jīng)理郭偉明、品牌操盤手張默聞 2018年7月12日,新興新時代高速高質(zhì)量2018新興共贏商發(fā)展大會暨極線N70家裝電線發(fā)布會在廣州增城隆重舉行。會上,新興電纜董事長楊
    發(fā)表于 12-17 12:57 ?1255次閱讀
    广河县| 龙山县| 道真| 天长市| 蓬安县| 沐川县| 大竹县| 盐源县| 绥阳县| 大新县| 台前县| 怀宁县| 南昌市| 尚义县| 喀喇沁旗| 新疆| 盐亭县| 慈利县| 宿迁市| 克拉玛依市| 阿城市| 托里县| 新野县| 阿尔山市| 左云县| 临夏市| 兰考县| 黑山县| 吐鲁番市| 思茅市| 沭阳县| 泾阳县| 德惠市| 西吉县| 高淳县| 壤塘县| 正蓝旗| 玉林市| 陵川县| 和平县| 股票|