【人工智能】RAG分塊

在RAG(檢索增強生成)系統中,文檔分塊(Chunking)是決定系統性能的核心環節,直接影響檢索精度和生成質量。分塊需平衡語義完整性檢索效率上下文保留三大目標。

一、分塊的核心標準

1.1 分塊基礎知識?

?1. 塊大小(Chunk Size)??

  • ?推薦范圍?:200-500字(通用場景)或1000-2000字(專業文檔)。

  • ?權衡原則?:

    • ?小分塊?(<500字):提升檢索精確性,但可能丟失上下文連貫性(如技術文檔的完整邏輯鏈)。

    • ?大分塊?(>1000字):保留豐富上下文,但增加噪聲和檢索延遲(如法律條文需完整條款)。

?2. 塊重疊(Chunk Overlap)??

  • ?比例?:10%-20%的塊大小(如500字塊設置50-100字重疊)。

  • ?作用?:避免語義斷裂(例如句子被切分時,重疊部分攜帶關鍵過渡信息)。

?3. 切分依據(Splitting Criteria)??

?方法?

?原理?

?適用場景?

?固定大小分塊?

按字符數/詞數均勻分割,簡單高效

輿情監控、日志分析(速度優先)

?語義分塊?

計算相鄰句子嵌入的余弦相似度,相似度驟降處切分(需調閾值)

法律合同、醫學報告(高精度需求)

?遞歸分塊?

先按段落/章節分割,超限塊再遞歸細分

技術手冊、企業年報(結構復雜文檔)

?基于結構分塊?

按標題/段落標記切分(如Markdown的#,HTML的<section>

API文檔、論文(格式規范)

?基于LLM的分塊?

由大模型動態生成語義連貫的塊,智能度高

跨領域非結構化文本(資源充足場景)

??語義完整性驗證?:切分后需確保每個塊獨立表達完整語義單元(如一個論點或事件描述)。


1.1.1 分塊算法的數學原理

1. ?語義相似度計算(核心模型)??
  • ?余弦相似度?:衡量文本塊間語義關聯性
    \text{sim}(A, B) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|}
    • 其中 \mathbf{A}, \mathbf{B} 為句子嵌入向量(如 SBERT 生成)
  • ?閾值判定?:當相鄰段落相似度低于閾值 \theta(通常 0.7-0.8)時切分新塊
2. ?遞歸分塊的空間復雜度?
  • 動態規劃實現,空間復雜度 O(m+n)m, n 為序列長度)
  • 分割公式:基于文檔結構遞歸劃分
    \text{chunk}(D) = \begin{cases} 
    D & \text{if } \text{len}(D) \leq L \\
    \text{chunk}(D_{\text{left}}) \cup \text{chunk}(D_{\text{right}}) & \text{else}
    \end{cases}
    • L 為預設塊大小上限
3. ?主題模型分塊(LDA)??
  • 潛在狄利克雷分布(Latent Dirichlet Allocation):
    P(\text{topic}_k | \text{chunk}) \propto \prod_{w \in \text{chunk}} P(w | \text{topic}_k)
  • 按主題概率分布聚類句子

1.1.2、五大分塊策略的算法實現

1.1.2.1. ?固定大小分塊(Fixed-Size Chunking)??
  • ?原理?:按字符/詞數均勻切分,重疊區緩解語義割裂
  • ?數學方法?:滑動窗口均值分割
  • ?代碼實現?(Python):
    def fixed_chunk(text, chunk_size=500, overlap=50):words = text.split()chunks = []for i in range(0, len(words), chunk_size - overlap):chunk = " ".join(words[i:i + chunk_size])chunks.append(chunk)return chunks
1.1.2.2. ?語義分塊(Semantic Chunking)??
  • ?原理?:計算相鄰句子嵌入的余弦相似度,低于閾值時切分
  • ?數學方法?:動態調整塊邊界以最大化簇內相似度
  • ?代碼實現?(使用 Sentence-BERT):
    from sentence_transformers import SentenceTransformer
    import numpy as npmodel = SentenceTransformer('all-MiniLM-L6-v2')
    def semantic_chunk(text, threshold=0.75):sentences = [sent.text for sent in nlp(text).sents]embeddings = model.encode(sentences)chunks, current_chunk = [], [sentences[0]]for i in range(1, len(sentences)):cos_sim = np.dot(embeddings[i-1], embeddings[i]) / (np.linalg.norm(embeddings[i-1]) * np.linalg.norm(embeddings[i]))if cos_sim < threshold:chunks.append(" ".join(current_chunk))current_chunk = []current_chunk.append(sentences[i])chunks.append(" ".join(current_chunk))return chunks
1.1.2.3. ?遞歸分塊(Recursive Chunking)??
  • ?原理?:按分隔符(段落 > 句子 > 單詞)層級切分
  • ?數學方法?:貪心算法優先選擇最大語義單元
  • ?代碼實現?(LangChain 內置):
    from langchain_text_splitters import RecursiveCharacterTextSplitter
    text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n", "。", "?", "!", ". "],  # 優先級降序chunk_size=300,chunk_overlap=30
    )
    chunks = text_splitter.split_text(text)
1.1.2.3.1、遞歸分塊原理與實現?

?1. 算法原理?

遞歸分塊采用分層分割策略,按優先級迭代使用分隔符切分文本:

  • ?分隔符優先級?:從大粒度(章節)到小粒度(句子)逐級切分
    \text{Separators} = [\text{"\n\n"}, "\n", "。", ". ", "?", "!", " "]
  • ?終止條件?:塊長度 ≤ chunk_size(通常512-2000字符)

  • ?數學表示?:
    \text{split}(text) = \begin{cases} 
    [text] & \text{if } len(text) \leq \text{chunk\_size} \\
    \text{split}(part_1) \cup \text{split}(part_2) & \text{else}
    \end{cases}

    其中 part_1, part_2 為按最高優先級分隔符切分的子文本

?2. 代碼實現?

?LangChain 標準實現?

from langchain_text_splitters import RecursiveCharacterTextSplittersplitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n", "。", "?", "!", ". ", " "],  # 優先級降序chunk_size=500,chunk_overlap=50,      # 塊間重疊字符數keep_separator=True    # 保留分隔符
)
chunks = splitter.split_text(long_text)

?底層Python實現(遞歸核心)??

def recursive_split(text, separators, chunk_size, overlap=0):if len(text) <= chunk_size:return [text]# 按當前最高優先級分隔符切分for sep in separators:if sep in text:parts = text.split(sep)chunks = []current_chunk = ""for part in parts:# 添加分隔符(保留語義連貫性)candidate = current_chunk + sep + part if current_chunk else partif len(candidate) > chunk_size:if current_chunk: chunks.append(current_chunk)current_chunk = part  # 開啟新塊else:  # 單個部分超長chunks.extend(recursive_split(part, separators, chunk_size))else:current_chunk = candidateif current_chunk: chunks.append(current_chunk)return chunks# 無分隔符時強制切分return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]

1.1.2.3.2、風險與漏洞分析?

?1. 核心風險?

?風險類型?

?成因?

?影響案例?

?語義割裂?

在關鍵邏輯點切分(如“但是”后)

法律條款被分割:“甲方有權...<切分>...但乙方免責” → 曲解原意

?敏感信息暴露?

重疊區包含隱私數據(如身份證號跨越兩分塊)

通過重疊區拼接還原完整敏感信息

?遞歸深度爆炸?

無分隔符的超長文本(如Base64編碼)導致棧溢出

Python遞歸深度限制(通常1000層)崩潰

?注入攻擊?

惡意構造分隔符(\n\nDROP TABLE users;--

數據庫被清空

?2. 漏洞場景?

  • ?醫療報告漏洞?:患者過敏史被分割到兩個塊:“青霉素過敏” + “史(嚴重休克)”,生成建議忽略風險。

  • ?金融欺詐?:合同條款“不得提前還款”被切分為“不得”+“提前還款”,模型解讀為允許提前還款。

  • ?資源耗盡攻擊?:提交無分隔符的10MB文本,觸發遞歸深度爆炸(CVE-2025-32711)。


?1.1.2.3.3、系統集成方案?

?1. 全鏈路調用架構?

sequenceDiagramparticipant Frontend as 前端participant API as 服務APIparticipant Chunker as 遞歸分塊participant VectorDB as 向量數據庫participant LLM as 大模型Frontend->>API: 上傳文檔API->>Chunker: 調用分塊Chunker->>VectorDB: 存儲分塊+元數據Frontend->>API: 發送查詢API->>VectorDB: 檢索相關塊VectorDB->>LLM: 發送查詢+相關塊LLM->>API: 返回生成結果API->>Frontend: 答案+溯源信息

?2. 關鍵組件調用?

  • ?推理引擎調用?(vLLM示例):
    from vllm import SamplingParams
    params = SamplingParams(max_tokens=500, temperature=0.3)
    outputs = llm.generate([f"基于上下文:{retrieved_chunks}\n問題:{query}"], params)
  • ?向量數據庫操作?(ChromaDB):
    import chromadb
    client = chromadb.HttpClient()
    collection = client.create_collection("docs", metadata={"hnsw:space": "cosine"})# 存儲分塊(添加位置元數據)
    collection.add(ids=["chunk1", "chunk2"],documents=[chunk1_text, chunk2_text],metadatas=[{"start_char": 0}, {"start_char": 480}]
    )

1.1.2.3.4、前端系統需求?

?1. 核心功能模塊?

?模塊?

?功能?

?技術方案?

?分塊可視化器?

文檔分塊高亮展示 + 塊邊界標記

Monaco Editor + 字符坐標映射

?風險掃描面板?

檢測敏感數據暴露(如身份證號跨越兩分塊)

正則匹配 + 大模型語義分析

?溯源交互?

點擊答案跳轉到原文分塊位置

關聯元數據中的start_char字段

?遞歸深度監控?

實時顯示分塊樹深度,預警棧溢出風險

樹形結構可視化(D3.js)

?2. 交互流程設計?

graph TBA[用戶上傳合同文檔] --> B(遞歸分塊引擎)B --> C{前端渲染分塊}C --> D[用戶調整分塊參數]D --> E[保存至向量庫]E --> F[用戶提問“違約責任”]F --> G[檢索相關塊]G --> H[生成答案+標記來源位置]H --> I[前端高亮原文對應段落]

1.1.2.3.5、風險緩解策略?
  1. ?語義連續性保護?:

    • ?動態重疊區?:在邏輯轉折詞(但/然而)處增加重疊(從50→150字符)

    • ?禁忌分隔符?:禁止在關鍵短語(如“不可抗力”)后切分

  2. ?安全加固?:

    • ?輸入清洗?:過濾危險分隔符(DROPDELETE等SQL關鍵詞)

    • ?遞歸深度限制?:設定最大遞歸深度(如100層),超長文本轉線性分割

    • ?隱私檢測?:掃描重疊區是否含敏感信息(身份證/銀行卡號)

  3. ?資源優化?:

    • ?尾遞歸優化?:改寫遞歸為循環,避免棧溢出

    • ?流式分塊?:對超長文檔分段加載處理,內存占用降低80%


?總結建議?

  1. ?參數調優優先?:

    • 中文文檔分隔符:["\n\n", "\n", "。", "?", "!", ";", ",", " "]

    • 推薦chunk_size=800(平衡檢索精度與上下文完整性)

  2. ?混合分塊策略?:
    # 先結構分塊(保留章節)→ 超長章節遞歸分塊
    if is_structured(doc):chunks = markdown_chunk(doc)
    else:chunks = recursive_chunk(doc)
  3. ?前端必備能力?:

    • 分塊邊界可視化 + 答案溯源定位 + 實時風險掃描

1.1.2.4. ?文檔結構分塊(Structure-Based Chunking)??
  • ?原理?:按標題/章節等 Markdown/LaTeX 標簽切分
  • ?數學方法?:樹形結構解析(DOM 樹遍歷)
  • ?代碼實現?(Markdown 示例):
    import re
    def markdown_chunk(text):pattern = r"(#+\s+.+?)(?=#|\Z)"chunks = re.findall(pattern, text, re.DOTALL)return [chunk.strip() for chunk in chunks]
?1.1.2.4.1、算法原理與底層實現?

?1. 核心原理?

文檔結構分塊利用文檔固有邏輯結構?(如標題、章節、表格、代碼塊)作為分塊邊界,確保語義和格式的完整性:

  • ?結構解析?:通過HTML/Markdown標簽(如<h1>##)、LaTeX環境或PDF布局樹識別邏輯單元。

  • ?元數據繼承?:為每個塊附加結構標簽(如{"Header 1": "引言"}),增強檢索時的上下文關聯。

  • ?數學表示?:
    \text{chunk}(D) = \bigcup_{s \in S} \text{extract}(s, D)
    其中 S 是預定義的結構標記集合(如章節標題),\text{extract} 是標簽內容提取函數。

?2. 代碼實現?

?LangChain高級API?

from langchain.text_splitter import MarkdownHeaderTextSplitterheaders = [("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3")]
splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers)
chunks = splitter.split_text(md_content)  # 返回帶元數據的文本塊

?純Python底層實現(DOM解析)??

from bs4 import BeautifulSoupdef html_structure_chunk(html):soup = BeautifulSoup(html, 'html.parser')chunks = []for section in soup.find_all(['h1', 'h2', 'section']):title = section.get_text()content = section.find_next_sibling('div').get_text()  # 提取關聯內容chunks.append({"text": content,"metadata": {"title": title, "tag": section.name}})return chunks
???1.1.2.4.2、風險與漏洞分析?

?1. 技術風險?

?風險類型?

?成因?

?影響?

?緩解方案?

?格式依賴漏洞?

非標文檔(掃描PDF/OCR錯誤)導致結構識別失敗

分塊錯亂,關鍵信息丟失

OCR預處理 + 混合分塊策略

?權限越界漏洞?

結構標簽攜帶敏感元數據(如<admin_only>),被未授權檢索

數據泄露(如CVE-2025-32711)

元數據脫敏 + 向量庫權限過濾

?上下文割裂?

表格/公式被錯誤分割(如分塊1含表頭,分塊2含表體)

模型誤解數據結構,生成錯誤結論

特殊結構識別 + 自定義分塊規則

?注入攻擊?

惡意結構標簽(如<!-- DELETE FROM users -->)污染知識庫

數據庫被篡改或數據泄露

輸入清洗 + 安全沙箱執行

?2. 安全漏洞案例?

  • ?微軟Copilot漏洞(CVE-2025-32711)??:攻擊者通過郵件注入惡意HTML標簽,誘騙系統檢索越權數據。

  • ?簡歷搜索系統攻擊?:篡改簡歷中的<skills>標簽注入釣魚鏈接,模型生成帶惡意鏈接的推薦。

?1.1.2.4.3、系統集成方案?

?1. 全鏈路調用關系?

?2. 關鍵組件調用方式?

  • ?推理引擎調用?:
    # 使用vLLM加速生成
    from vllm import LLM
    llm = LLM(model="qwen2:1.5b", tensor_parallel_size=2)
    outputs = llm.generate(prompts, sampling_params={"max_tokens": 500})
  • ?向量數據庫操作?:
    from pymilvus import Collection
    collection = Collection("structured_chunks")
    # 插入分塊(含結構元數據)
    data = [[chunk_ids], [chunk_embeddings], [{"title": "引言", "section": "2.1"}]]
    collection.insert(data)
    # 檢索時過濾敏感標簽
    results = collection.search(query_vec, filter="section != 'confidential'", limit=3)

?1.1.2.4.4、前端系統需求與交互設計?

?1. 必備功能模塊?

?模塊?

?功能?

?技術方案?

?分塊調試器?

可視化文檔結構解析結果,標注分塊邊界

D3.js樹狀圖 + 塊高亮

?安全審計面板?

標記敏感塊(如含PII)、注入攻擊風險

正則匹配 + 大模型敏感詞掃描

?溯源交互界面?

點擊答案顯示來源塊,關聯元數據(章節/標題)

React + 塊ID映射

?動態分塊配置?

用戶調整分塊參數(如最小塊大小、標簽過濾)

配置中心 + 實時重分塊

?2. 交互流程示例?


?1.1.2.4.5、風險緩解最佳實踐?
  1. ?結構驗證層?:

    • 使用XML Schema/JSON Schema校驗文檔結構完整性。

  2. ?動態混合分塊?:

    • 先結構分塊 → 超長表格/代碼塊啟用語義分塊(如SemanticChunker)。

  3. ?零信任安全?:

    • ?輸入層?:清洗HTML標簽(移除<script><!-->)。

    • ?輸出層?:LLM生成前掃描敏感詞(如身份證號、API密鑰)。

  4. ?權限控制?:

    • 向量庫按角色過濾元數據(如filter="security_level <= user_level")。


總結?

文檔結構分塊通過尊重文檔邏輯關系顯著提升RAG精度,但需警惕格式依賴、權限漏洞、結構割裂三大風險。生產環境中建議:

  1. ?技術選型?:結構化文檔用LangChain分塊器,非結構化數據混合遞歸分塊。

  2. ?安全加固?:輸入清洗 → 向量庫權限過濾 → 輸出審計三層防護。

  3. ?前端協同?:實現分塊調試器 + 安全面板,提升系統可解釋性。

1.1.2.5. ?主題分塊(Topic-Based Chunking)??
  • ?原理?:用 LDA/k-means 聚類主題相似的句子
  • ?數學方法?:期望最大化(EM)算法迭代優化主題分布
  • ?代碼實現?(Scikit-learn):
    from sklearn.decomposition import LatentDirichletAllocation
    from sklearn.feature_extraction.text import CountVectorizerdef topic_chunk(text, n_topics=3):sentences = text.split('. ')vectorizer = CountVectorizer(stop_words='english')X = vectorizer.fit_transform(sentences)lda = LatentDirichletAllocation(n_components=n_topics)lda.fit(X)topic_labels = lda.transform(X).argmax(axis=1)chunks = {}for i, label in enumerate(topic_labels):chunks.setdefault(label, []).append(sentences[i])return list(chunks.values())
?
?1. 算法原理?

主題分塊旨在將語義連貫的文本單元聚合成塊,關鍵技術包括:

  • ?主題建模?:通過 LDA(Latent Dirichlet Allocation)或 BERTopic 識別文本主題分布,公式表示為:
    P(\text{topic}_k | \text{chunk}) \propto \prod_{w \in \text{chunk}} P(w | \text{topic}_k) \cdot P(\text{topic}_k)
  • ?語義邊界檢測?:計算相鄰句子嵌入的余弦相似度,低于閾值 \theta(通常 0.6-0.8)時切分:
    \text{split if } \cos(\vec{s_i}, \vec{s_{i+1}}) < \theta
  • ?LLM 增強分塊?:利用大模型動態識別主題邊界(如 GPT-4 生成分割建議)。
?2. 代碼實現?

?LangChain 語義分塊示例?:

from langchain_experimental.text_splitter import SemanticChunker
from langchain.embeddings import HuggingFaceEmbeddings# 加載嵌入模型(調用本地推理引擎)
embed_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")# 初始化語義分塊器
text_splitter = SemanticChunker(embeddings=embed_model,breakpoint_threshold_type="percentile",  # 動態閾值threshold_multiplier=1.5,               # 寬松閾值=μ-1.5σadd_start_index=True                     # 保留原始位置
)# 執行分塊
docs = text_splitter.create_documents([long_text])

?底層 LDA 分塊實現?:

from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizerdef topic_chunk(text, n_topics=3, max_chunk_size=500):sentences = text.split('. ')vectorizer = CountVectorizer(stop_words='english')X = vectorizer.fit_transform(sentences)# LDA 主題聚類lda = LatentDirichletAllocation(n_components=n_topics)lda.fit(X)topic_labels = lda.transform(X).argmax(axis=1)# 合并同主題句子chunks = []current_chunk = []last_topic = topic_labels[0]for i, topic in enumerate(topic_labels):if topic == last_topic and len(current_chunk) < max_chunk_size:current_chunk.append(sentences[i])else:chunks.append(" ".join(current_chunk))current_chunk = [sentences[i]]last_topic = topicreturn chunks

風險與漏洞分析?
?1. 技術風險?
?風險類型??成因??影響?
?主題漂移?長文檔中主題漸變,硬切分導致語義斷裂塊內信息不連貫,生成答案偏離事實
?敏感信息泄露?分塊時未過濾隱私字段(如醫療記錄中的身份證號)違反 GDPR/ HIPAA,法律風險
?對抗攻擊?惡意注入誤導性文本(如“青霉素安全”被篡改為“青霉素無害”)模型生成危險建議
?計算資源瓶頸?LDA/LLM 分塊需高頻計算,高并發時延遲飆升系統響應超時,用戶體驗下降
?2. 安全漏洞?
  • ?向量數據庫污染?:攻擊者注入帶惡意指令的文本塊(如 <!-- DELETE FROM users -->),檢索后觸發 SQL 注入 。
  • ?越獄漏洞?:無害知識塊組合觸發模型有害生成(如“制作炸彈”+“廚房用品清單”=危險配方)。
  • ?元數據篡改?:修改塊關聯的標題/章節信息,導致檢索結果偏離上下文 。

系統集成方法?
?1. 調用推理引擎與大模型?
  • ?本地推理?(Ollama + vLLM):
    # 通過 Ollama 調用本地模型
    import ollama
    response = ollama.chat(model='llama3:8b', messages=[{'role':'user', 'content': prompt}])# 通過 vLLM 加速生成
    from vllm import LLM
    llm = LLM(model="meta-llama/Llama-3-8B", tensor_parallel_size=4)
    outputs = llm.generate([prompt])
  • ?云 API 調用?(OpenAI/Dashscope):
    # Dashscope 示例(國內低延遲)
    from dashscope import Generation
    response = Generation.call(model="qwen-plus", prompt=prompt, api_key="YOUR_KEY")
?2. 向量數據庫操作?
  • ?存儲與檢索?(Milvus/Chroma):
    from pymilvus import Collection
    collection = Collection("medical_records")  # 連接集合# 插入分塊向量
    data = [[chunk_ids], [chunk_embeddings], [chunk_metadata]]
    collection.insert(data)# 語義檢索
    results = collection.search(query_embedding, anns_field="vector", limit=3)
?3. 前端輸出與交互?
?前端產品需求?
  • ?可視化調試面板?:展示分塊邊界、主題聚類、檢索來源(如 Streamlit + UMAP 降維圖)。
  • ?安全審計模塊?:標記敏感字段、對抗樣本檢測結果。
  • ?實時反饋環?:用戶對答案評分,反向優化分塊閾值。
?交互設計?


風險緩解策略?
  1. ?動態分塊加固?:
    • 醫療/金融領域采用 ?LGMGC 算法?(滑動窗口 + 主題連續性校驗)。
    • 敏感字段(如過敏史)強制單塊存儲,避免分割。
  2. ?安全防護層?:
    • ?輸入過濾?:正則表達式匹配隱私字段(身份證/銀行卡號)。
    • ?輸出過濾?:LLM 生成結果經規則引擎校驗(如禁止藥品組合)。
  3. ?資源優化?:
    • 層疊式分塊:先遞歸分塊 → 僅對復雜段落調用 LLM 分塊,計算量降低 50%+ 。

前端系統實現示例?

?Streamlit 可視化面板?:

import streamlit as st
import umap
import pandas as pd# 主題分塊可視化
reducer = umap.UMAP()
chunk_embeddings = model.encode(chunks)
embedding_2d = reducer.fit_transform(chunk_embeddings)# 繪制分塊聚類
df = pd.DataFrame(embedding_2d, columns=['x','y'])
df['topic'] = chunk_topics  # 主題標簽
st.scatter_chart(df, x='x', y='y', color='topic')
?
  • ?算法選型?:通用場景用語義分塊(LangChain),高危領域用 LGMGC 分塊。
  • ?架構設計?:
    graph LR
    文檔 --> 主題分塊 --> 向量數據庫 --> 檢索服務 --> LLM生成 --> 前端溯源
  • ?合規要點?:分塊階段脫敏處理,生成階段添加審計日志。

1.1.2.6 基于LLM的分塊
?1.1.2.6.1 基于LLM的分塊方法原理

1. ?核心思想?

通過LLM理解文本語義邊界,動態劃分語義連貫的文本塊:

  • ?主題一致性?:識別文本中的主題轉換點(如段落邏輯分隔)

  • ?上下文感知?:利用LLM預訓練的語言模式捕捉長程依賴關系

  • ?邊界識別?:檢測語義轉折詞(如“然而”、“綜上所述”)作為切分點

2. ?數學模型?

  • ?主題概率模型?(基于LDA擴展):
    P(\text{chunk}|d) \propto \prod_{s \in \text{chunk}} P(s|\text{topic}_k) \cdot P(\text{topic}_k|d)

    LLM通過隱狄利克雷分布(LDA)優化主題劃分

  • ?語義相似度閾值?:
    \text{split if } \cos(\vec{s_i}, \vec{s_{i+1}}) < \theta \quad (\theta \in [0.7,0.9])

    相鄰句子嵌入相似度驟降時切分


1.1.2.6.2、實現流程與代碼解析

1. ?分層處理流程?

graph TD
A[原始文本] --> B(句子分割)
B --> C{LLM生成句嵌入}
C --> D[計算相鄰句相似度]
D --> E{相似度<閾值?}
E -->|是| F[創建新塊]
E -->|否| G[并入當前塊]
F/G --> H[輸出語義塊]

2. ?關鍵代碼實現?(Python示例)

# 基于LangChain的LLM分塊實現
from langchain_experimental.text_splitter import SemanticChunker
from langchain.embeddings import HuggingFaceEmbeddings# 1. 加載嵌入模型(實際調用推理引擎)
embed_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")# 2. 初始化語義分塊器
text_splitter = SemanticChunker(embeddings=embed_model,breakpoint_threshold_type="percentile",  # 動態閾值buffer_size=3  # 重疊句子數
)# 3. 執行分塊
docs = text_splitter.create_documents([long_text])

3. ?底層計算邏輯?

# 相似度計算核心代碼(簡化版)
import torch
from transformers import AutoModel, AutoTokenizermodel = AutoModel.from_pretrained("bert-base-chinese")
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")def get_sentence_embedding(sentence):inputs = tokenizer(sentence, return_tensors="pt", padding=True, truncation=True)outputs = model(**inputs)return torch.mean(outputs.last_hidden_state, dim=1)  # 池化為句向量def semantic_split(text, threshold=0.8):sentences = text.split('。')  # 初步分句embeddings = [get_sentence_embedding(s) for s in sentences]chunks, current_chunk = [], [sentences[0]]for i in range(1, len(sentences)):cos_sim = torch.cosine_similarity(embeddings[i-1], embeddings[i], dim=0)if cos_sim < threshold:chunks.append("。".join(current_chunk))current_chunk = []current_chunk.append(sentences[i])chunks.append("。".join(current_chunk))return chunks

1.1.2.6.3 系統集成方案

1. ?與推理引擎交互?

  • ?LLM調用方式?:

    • ?本地部署?:通過Ollama API調用本地模型:
      import ollama
      response = ollama.chat(model='qwen2:1.5b', messages=[{'role':'user','content':prompt}])
    • ?云服務?:使用vLLM加速推理(支持張量并行):
      from vllm import LLM
      llm = LLM(model="meta-llama/Llama-3-8B", tensor_parallel_size=4)
      outputs = llm.generate(prompts)

2. ?向量數據庫集成?

  • ?數據流架構?:
    graph LR
    A[原始文檔] --> B(LLM分塊)
    B --> C{嵌入模型}
    C --> D[向量數據庫]
    D --> E[相似性檢索]
    E --> F((RAG系統))
  • ?代碼示例?(ChromaDB):
    import chromadb
    from chromadb.utils.embedding_functions import OllamaEmbeddingFunction# 1. 連接向量庫
    client = chromadb.HttpClient(host="localhost", port=8000)
    collection = client.get_or_create_collection(name="docs", embedding_function=OllamaEmbeddingFunction())# 2. 存儲分塊數據
    collection.add(documents=chunks, ids=[f"id_{i}" for i in range(len(chunks))])# 3. 檢索相關塊
    results = collection.query(query_texts=["用戶問題"], n_results=3)

3. ?端到端RAG工作流?

  1. ?文檔加載?:用PyPDF提取PDF文本

  2. ?LLM分塊?:動態劃分語義塊

  3. ?向量化存儲?:BGE模型生成嵌入 → 存入Milvus/Chroma

  4. ?檢索增強?:
    retrieved = vector_db.similarity_search(query, k=3)
    prompt = f"基于上下文:{retrieved},回答:{query}"
  5. ?生成響應?:通過vLLM調用LLM生成答案


1.1.2.6.4、工程挑戰與優化
?問題??解決方案??技術要點?
計算成本高層疊式分塊:先遞歸分塊 → 僅對復雜段落調用LLM分塊減少LLM調用次數50%+
長文檔處理效率低流式處理 + 滑動窗口內存占用降低80%
主題漂移引入注意力掩碼:Attention(Q,K,V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}} \odot M)V屏蔽無關句子
向量檢索精度不足混合索引:語義塊 + 結構元數據(標題/章節)HNSW索引 + 元數據過濾
實時性要求高GPU加速分塊:NVIDIA RAPIDS cuML實現并行LDA10倍速度提升

1.1.2.6.5、參數調優建議
# LangChain最佳配置參考
optimized_splitter = SemanticChunker(embeddings=OpenAIEmbeddings(model="text-embedding-3-small"),breakpoint_threshold_type="standard_deviation", threshold_multiplier=1.8,  # 寬松閾值=μ-1.8σadd_start_index=True,      # 保留原始位置max_chunk_size=1000        # 安全截斷
)

?關鍵參數?:

  • ?閾值類型?:結構化文本用percentile,非結構化用standard_deviation
  • ?塊大小?:技術文檔≤800字,文學文本≤1500字
  • ?重疊量?:主題切換頻繁時設15%重疊

1.1.3、分塊策略的適用場景對比

?策略??最佳場景??缺陷??數學約束?
固定大小分塊日志分析/高吞吐批處理語義割裂塊大小方差=0
語義分塊醫療法律文檔/強上下文依賴問答計算開銷大相似度閾值 \theta 敏感
遞歸分塊技術手冊/多層級文檔遞歸深度影響性能分隔符優先級排序
文檔結構分塊API文檔/Markdown論文依賴格式規范性樹形結構深度 O(\log n)
主題分塊新聞聚合/跨領域知識庫LDA訓練成本高主題數 k 需預設

1.1.4、工程優化建議

  1. ?動態塊大小調整?:
    • 根據查詢復雜度動態擴展塊大小(簡單查詢→300字,多跳推理→1500字)
  2. ?混合分塊策略?:
    • 先按結構分塊,超長塊再用語義分塊細分
  3. ?元數據繼承?:
    • 為每個塊添加標題/章節號等上下文標記,提升LLM理解力
  4. ?量化評估指標?:
    • 檢索召回率(Recall@K)和生成事實準確性(Factuality Score)


?二、分塊策略選型指南?

?1. 按文檔類型選擇?
?文檔類型??推薦策略??案例說明?
?技術文檔/手冊?遞歸分塊 + 結構標記先按章節分割,超長節遞歸細分(保留代碼塊完整性)
?法律/醫療文本?語義分塊(閾值0.7-0.8)合同條款需完整,避免分割責任條款
?新聞/社交媒體?固定大小分塊 + 15%重疊500字分塊,重疊75字(兼顧效率與連貫性)
?學術論文?結構分塊(標題層級)Abstract/Introduction/Method切分
?2. 按業務需求優化?
  • ?高檢索精度場景?(如QA問答):
    • 小分塊(300字) + 語義分塊 → 精準匹配問題關鍵詞。
  • ?強上下文依賴場景?(如報告生成):
    • 大分塊(1500字) + 塊重疊 → 保留論證邏輯鏈。
?3. 避免常見陷阱?
  • ?閾值敏感性問題?:語義分塊需動態調整相似度閾值(不同領域文檔閾值差異可達0.2)。
  • ?結構依賴風險?:非標格式文檔(如掃描PDF)需預處理OCR,否則結構分塊失效。
  • ?資源開銷平衡?:LLM分塊計算成本高,僅建議關鍵業務使用(如金融風控報告)。

?三、工具與實施建議?

?1. 分塊工具鏈?
  • ?LangChain集成?:
    • RecursiveCharacterTextSplitter:通用遞歸分割
    • SemanticChunker:基于嵌入相似度分塊(需調breakpoint_threshold
    • MarkdownHeaderTextSplitter:結構化分塊(自動繼承標題元數據)
  • ?自定義流程?:
    # 語義分塊示例(Sentence-BERT嵌入)
    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('all-MiniLM-L6-v2')
    sentences = ["sentence1", "sentence2", ...]  # 輸入句子列表
    embeddings = model.encode(sentences)
    # 計算相鄰句子相似度,低于閾值則切分
?2. 調優與驗證?
  • ?A/B測試指標?:
    • 檢索召回率(Recall@K)、生成答案的事實準確性(Factuality Score)。
  • ?動態調整?:
    • 監控長尾查詢的失敗率,反向優化分塊大小(如失敗率>20%時增大塊尺寸)。

四、總結:分塊黃金法則?

  1. ?先分類后分塊?:根據文檔類型(結構化/非結構化)和業務目標(精度/上下文)選擇策略。
  2. ?小步快跑驗證?:從固定大小分塊(500字+20%重疊)起步,逐步升級到語義/結構分塊。
  3. ?資源效率平衡?:
    • 90%文檔用遞歸分塊(LangChain默認),10%高價值文檔用LLM分塊。
  4. ?持續監控迭代?:嵌入模型更新后需重新評估分塊效果(如text-embedding-3-small優化后支持更大分塊)。

注:分塊是RAG的“隱形架構師”,直接決定知識消化能力。建議結合LangChain文檔和業務日志數據持續迭代分塊矩陣,而非追求通用最優解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86486.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

能耗管理新革命:物聯網實現能源高效利用

在全球能源危機與 “雙碳” 目標的雙重壓力下&#xff0c;企業與社會對能耗管理的重視程度達到前所未有的高度。然而&#xff0c;傳統能耗管理方式存在數據采集滯后、分析維度單一、節能措施粗放等問題&#xff0c;無法滿足精細化管理需求。物聯網技術憑借其強大的數據感知、傳…

基于CMS的黃道吉日萬年歷源碼(自適應)

本模板采用帝國cms7.5版UTF-8制作&#xff1b; 適用站點&#xff1a;時間查詢、時差計算、萬年歷、黃道吉日查詢、假期查詢、節氣表等&#xff1b; 源碼優勢&#xff1a;代碼精簡&#xff0c;利于SEO、UI大氣精簡&#xff0c;搜索引擎收錄高&#xff1b; 全站偽靜態無需刷新生成…

如何構建個人AIagent

構建個人AI Agent是一個結合技術實現和場景設計的系統工程&#xff0c;以下是分步驟的詳細指南&#xff0c;涵蓋從需求定義到部署落地的全流程&#xff1a; ?一、明確Agent定位&#xff08;關鍵第一步&#xff09;?? ?角色定義矩陣? 類型典型場景技術復雜度示例信息處理Ag…

lutris登錄不進去

日志 Cannot create Vulkan instance.This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU thatdoes not support Vulkan.ERROR at /home/abuild/rpmbuild/BUILD/vulkan-tools-1.4.313-build/Vulkan-Tools-vulkan-sdk-1.…

緩存與加速技術實踐-NoSQL之Redis配置與優化

目錄 #1.1關系數據庫與非關系型數據庫 1.1.1關心型數據庫 1.1.2非關系型數據庫 1.1.3非關系型數據庫產生背景 #2.1redis簡介 2.1.1redis安裝部署 2.1.2配置參數 #3.1redis命令工具 3.1.1redis-cli命令行工具 3.1.2redis-benchmark測試工具 #4.1redis數據庫常用命令 4.1.1ke…

走近科學IT版:FreeBSD系統下ThinkPad鍵盤突然按不出b、n、/和空格鍵了!

走近科學IT版&#xff1a;FreeBSD系統下ThinkPad鍵盤突然按不出b和n鍵了&#xff01; 很慌&#xff0c;以為鍵盤壞了&#xff0c;在控制臺無法按出b和n&#xff0c;但是在瀏覽器里&#xff0c;可以按出來。 重啟機器&#xff0c;結果在瀏覽器里也按不出來了.... 按Ctrl空格&a…

聚銘網絡入選嘶吼《中國網絡安全細分領域產品名錄》“云平臺安全管理”與“態勢感知”雙領域TOP10

近日&#xff0c;在嘶吼安全產業研究院發布的《中國網絡安全細分領域產品名錄》中&#xff0c;聚銘網絡憑借其核心產品——聚銘云端安全管家與聚銘安全態勢感知與管控系統&#xff0c;分別入選“云平臺安全管理”與“態勢感知”兩大關鍵細分領域TOP10榜單&#xff0c;充分展現了…

DEYOLO 全面復現,將雙增強跨模態目標檢測網絡 DEYOLO 融合到 YOLOFuse 框架

模型架構模態精度 P召回率 RmAP50mAP50-95模型大小(MB)計算量(GFLOPs)yolov8n (baseline)RGB0.8880.8290.8910.5006.28.1yolo-fuse-中期特征融合RGBIR0.9510.8810.9470.6012.613.2yolo-fuse-早期特征融合RGBIR0.9500.8960.9550.6235.26.7yolo-fuse-決策級融合RGBIR0.9560.9050.…

python基于Django+mysql實現的圖書管理系統【完整源碼+數據庫】

摘要 隨著信息技術與教育現代化的深度融合&#xff0c;圖書管理系統的智能化與自動化成為提升資源利用效率的關鍵需求。本文基于Python語言&#xff0c;采用Django框架與MySQL數據庫設計并實現了一套功能完備的圖書管理系統&#xff0c;旨在通過信息化手段優化圖書借閱流程、強…

論軟件設計方法及其應用

20250427-作 題目 軟件設計&#xff08;Software Design&#xff0c;SD)根據軟件需求規格說明書設計軟件系統的整體結構、劃分功能模塊、確定每個模塊的實現算法以及程序流程等&#xff0c;形成軟件的具體設計方案。軟件設計把許多事物和問題按不同的層次和角度進行抽象&…

QT 自定義ComboBox,實現下拉框文本顏色設置

最近在做項目中遇到需求&#xff0c;在下拉框中&#xff0c;文本需要設置不同的顏色&#xff0c;遂網上了解了一番后&#xff0c;得出以下代碼&#xff0c;可以完美實現效果&#xff0c;現分享出來&#xff01; 1.實現效果 2.自定義類 colorcombobox.h #ifndef COLORCOMBOBOX…

【時間戳】

在編程競賽和高效數據處理場景中&#xff0c;時間戳技巧是一種極其高效的標記方法&#xff0c;常用于避免頻繁清空數組或 map&#xff0c;提高算法運行效率。本文將從定義、應用場景、模板代碼、技巧細節等方面系統整理時間戳的使用方式。 一、時間戳技巧是什么&#xff1f; 時…

json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig)

有一次爬蟲遇到了json的字符串響應對象 然后轉為json對象 報這個錯誤 raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)", json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0) 意思是叫…

python訓練day43 復習日

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader, random_split import matplotlib.pyplot as plt import numpy as np# 設置中文字體支持&#xff0c;避免繪圖時中文…

C++11 lambda

前言 在Cpp11以前&#xff0c;為了把函數當作對象調用&#xff0c;可以使用C中的函數指針類型&#xff0c;也可以使用Cpp98的仿函數。 但二者都不是很好用&#xff0c;函數指針 return_type (*name)(parameters)的長相就令人望而卻步&#xff0c;仿函數將一個函數重載為一個類…

【國產化-K8s】混合架構的 K8s + KubeSphere 部署指南

本文由 KubeSphere 社區貢獻者 天行1st 編寫。本文為作者實踐總結。本文記錄了在信創環境中基于混合架構&#xff08;x86 與 ARM64&#xff09;部署 Kubernetes 和 KubeSphere 的實踐過程&#xff0c;覆蓋多種國產 CPU 和操作系統&#xff0c;具有一定的參考價值。 環境涉及軟…

利用python實現NBA數據可視化

大家好&#xff0c;今天我們利用python爬取NBA球星每年的比賽數據并進行可視化展示。主要用到三個模塊&#xff1a;xpath、matplotlib。其中xpth負責爬取網站上的信息。Matplotlib是Python開發人員常用的Python繪圖庫&#xff0c;可以用來繪制各種2D圖形&#xff0c;具有繪圖質…

基于 SpringBoot+JSP 的醫療預約與診斷系統設計與實現

摘要 本研究針對傳統醫療預約與診斷流程中存在的效率低下、信息不透明、患者等待時間長等問題&#xff0c;設計并實現了一個基于 SpringBootJSP 的醫療預約與診斷系統。系統采用 B/S 架構&#xff0c;整合了用戶管理、科室管理、醫生排班、預約掛號、在線問診、檢查檢驗、診斷…

2025.6.27總結

最近工作又開始內耗了&#xff0c;一位同事的轉崗直接讓我破防了&#xff0c;明明他工作干得很不錯&#xff0c;會得又多&#xff0c;性格又好&#xff0c;我還經常請教他業務上的問題。我和他的關系并不算太好&#xff0c;但他加入其他部門&#xff0c;竟然讓我有些不舍&#…

詳解HashMap底層原理

核心數據結構&#xff1a;數組 鏈表 / 紅黑樹 HashMap 的底層核心是一個 Node<K,V>[] table 數組&#xff08;通常稱為 桶數組 或 哈希桶數組&#xff09;。這個數組的每個元素稱為一個 桶。 Node<K,V> (鏈表節點)&#xff1a; 這是存儲鍵值對的基本單位&#xf…