日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2026-04-24 14:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

1.1 固定大小分塊的局限性

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

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

這種方法的問(wèn)題在于:

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

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

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

1.2 基于語(yǔ)義的智能分塊

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

fromlangchain.text_splitterimportRecursiveCharacterTextSplitter

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

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

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

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

importast

defsplit_code_by_function(code: str)-> list[dict]:
 """按函數(shù)/類(lèi)分割代碼,保持完整的代碼結(jié)構(gòu)"""
 try:
    tree = ast.parse(code)
    chunks = []
   fornodeinast.walk(tree):
     ifisinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
       # 獲取節(jié)點(diǎn)的起始和結(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:
 """將表格處理為獨(dú)立的檢索單元"""
 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 模型對(duì)比

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

2.2 領(lǐng)域適配embedding

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

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

2.3 Embedding質(zhì)量驗(yàn)證

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

defevaluate_embedding_quality(embedder, test_cases: list[dict])-> dict:
 """評(píng)估embedding模型在測(cè)試集上的性能"""
  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)

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

3.1 稀疏檢索與稠密檢索的互補(bǔ)

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

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

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
    }

   # 分?jǐn)?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))

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

3.2 Keyword Cache加速稀疏檢索

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

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ù)過(guò)濾與索引設(shè)計(jì)

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

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

# 文檔的元數(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, # 在原文檔中的塊序號(hào)
}

4.2 多級(jí)索引架構(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ù)過(guò)濾的檢索"""
    must_clauses = [
      {"multi_match": {"query": query,"fields": ["content^2","title"]}}
    ]

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

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

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

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

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

五、重排序(Reranking)機(jī)制

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

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

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

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

 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()]

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

   # 第三階段:第二個(gè)重排序模型精排
   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 離線評(píng)估指標(biāo)

defevaluate_rag_system(
  rag_pipeline,
  test_dataset: list[dict]
)-> dict:
 """評(píng)估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"])

   # 計(jì)算召回率
    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)

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

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

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

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

檢索召回率(通過(guò)用戶點(diǎn)擊/反饋推斷)

答案滿意度評(píng)分

P99檢索延遲

向量索引存儲(chǔ)增長(zhǎng)率

總結(jié)

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

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

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

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

    關(guān)注

    3

    文章

    4422

    瀏覽量

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

    關(guān)注

    2

    文章

    3796

    瀏覽量

    5276

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    希望跟各位大峽討論一下,如何做一個(gè)高質(zhì)量的畢業(yè)設(shè)計(jì)? 畢業(yè)設(shè)計(jì)專(zhuān)業(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實(shí)戰(zhàn)項(xiàng)目-C(高質(zhì)量PDF版本)

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

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

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

    編寫(xiě)高質(zhì)量C語(yǔ)言代碼

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

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

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

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

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

    高質(zhì)量編程

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

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

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

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

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

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

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

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

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

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

    ――對(duì)話新興電纜董事長(zhǎng)楊曉東、總經(jīng)理郭偉明、品牌操盤(pán)手張默聞 2018年7月12日,新興新時(shí)代高速高質(zhì)量2018新興共贏商發(fā)展大會(huì)暨極線N70家裝電線發(fā)布會(huì)在廣州增城隆重舉行。會(huì)上,新興電纜董事長(zhǎng)楊
    發(fā)表于 12-17 12:57 ?1266次閱讀
    鱼台县| 砚山县| 诸城市| 平远县| 永寿县| 山阴县| 湖北省| 涞水县| 奈曼旗| 马山县| 浮梁县| 青冈县| 乌兰察布市| 肇源县| 北辰区| 诏安县| 廊坊市| 永川市| 疏勒县| 镇原县| 清河县| 宝兴县| 稻城县| 利川市| 左云县| 宁化县| 横峰县| 洛隆县| 西宁市| 新蔡县| 丰县| 花莲市| 教育| 中超| 旬邑县| 日照市| 滦南县| 新蔡县| 吉木乃县| 长丰县| 贺州市|