文本切塊技術(Splitter)

為什么要分塊?

將長文本分解成適當大小的片段,以便于嵌入、索引和存儲,并提高檢索的精確度。

用ChunkViz工具可視化分塊

在線使用

ChunkViz

github

https://github.com/gkamradt/ChunkViz

如何確定大模型所能接受的最長上下文

可以從模型card和config文件中得知

文本分塊的方法和實現

CharacterTextSplitter - 按固定字符數分塊

RecursiveCharacterTextSplitter – 遞歸分塊

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = TextLoader("90-文檔-Data/山西文旅/云岡石窟.txt")
documents = loader.load()
# 定義分割符列表,按優先級依次使用
separators = ["\n\n", ".", ",", " "] # . 是句號,, 是逗號, 是空格
# 創建遞歸分塊器,并傳入分割符列表
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100,chunk_overlap=10,separators=separators
)
chunks = text_splitter.split_documents(documents)
print("\n=== 文檔分塊結果 ===")
for i, chunk in enumerate(chunks, 1):print(f"\n--- 第 {i} 個文檔塊 ---")print(f"內容: {chunk.page_content}")print(f"元數據: {chunk.metadata}")print("-" * 50)

基于特定格式(如python代碼格式)分塊

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_text_splitters import Language
separators = RecursiveCharacterTextSplitter.get_separators_for_language(Language.JAVASCRIPT)
print(separators)from langchain_text_splitters import (Language,RecursiveCharacterTextSplitter,
)
GAME_CODE = """
class CombatSystem:def __init__(self):self.health = 100self.stamina = 100self.state = "IDLE"self.attack_patterns = {"NORMAL": 10,"SPECIAL": 30,"ULTIMATE": 50}def update(self, delta_time):self._update_stats(delta_time)self._handle_combat()def _update_stats(self, delta_time):self.stamina = min(100, self.stamina + 5 * delta_time)def _handle_combat(self):if self.state == "ATTACKING":self._execute_attack()def _execute_attack(self):if self.stamina >= self.attack_patterns["SPECIAL"]:damage = 50self.stamina -= self.attack_patterns["SPECIAL"]return damagereturn self.attack_patterns["NORMAL"]
class InventorySystem:def __init__(self):self.items = {}self.capacity = 20self.gold = 0def add_item(self, item_id, quantity):if len(self.items) < self.capacity:if item_id in self.items:self.items[item_id] += quantityelse:self.items[item_id] = quantitydef remove_item(self, item_id, quantity):if item_id in self.items:self.items[item_id] -= quantityif self.items[item_id] <= 0:del self.items[item_id]def get_item_count(self, item_id):return self.items.get(item_id, 0)
class QuestSystem:def __init__(self):self.active_quests = {}self.completed_quests = set()self.quest_log = []def add_quest(self, quest_id, quest_data):if quest_id not in self.active_quests:self.active_quests[quest_id] = quest_dataself.quest_log.append(f"Started quest: {quest_data['name']}")def complete_quest(self, quest_id):if quest_id in self.active_quests:self.completed_quests.add(quest_id)del self.active_quests[quest_id]def get_active_quests(self):return list(self.active_quests.keys())
"""
python_splitter = RecursiveCharacterTextSplitter.from_language(language=Language.PYTHON,  # 指定編程語言為Pythonchunk_size=1000,chunk_overlap=0
)python_docs = python_splitter.create_documents([GAME_CODE])
print("\n=== 代碼分塊結果 ===")
for i, chunk in enumerate(python_docs, 1):print(f"\n--- 第 {i} 個代碼塊 ---")print(f"內容:\n{chunk.page_content}")print(f"元數據: {chunk.metadata}")print("-" * 50)

LlamaIndex-語義分塊

from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import (SentenceSplitter,SemanticSplitterNodeParser,
)
from llama_index.embeddings.openai import OpenAIEmbedding 
# from llama_index.embeddings.huggingface import HuggingFaceEmbedding 
# embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-zh")
documents = SimpleDirectoryReader(input_files=["90-文檔-Data/黑悟空/黑悟空wiki.txt"]).load_data()# 創建語義分塊器
splitter = SemanticSplitterNodeParser(buffer_size=3,  # 緩沖區大小breakpoint_percentile_threshold=90, # 斷點百分位閾值embed_model=OpenAIEmbedding()     # 使用的嵌入模型
)
# 創建基礎句子分塊器(作為對照)
base_splitter = SentenceSplitter(# chunk_size=512
)'''
buffer_size:
默認值為1
這個參數控制評估語義相似度時,將多少個句子組合在一起當設置為1時,每個句子會被單獨考慮
當設置大于1時,會將多個句子組合在一起進行評估例如,如果設置為3,就會將每3個句子作為一個組來評估語義相似度breakpoint_percentile_threshold:
默認值為95
這個參數控制何時在句子組之間創建分割點,它表示余弦不相似度的百分位數閾值,當句子組之間的不相似度超過這個閾值時,就會創建一個新的節點
數值越小,生成的節點就越多(因為更容易達到分割閾值)
數值越大,生成的節點就越少(因為需要更大的不相似度才會分割)這兩個參數共同影響文本的分割效果:
buffer_size 決定了評估語義相似度的粒度
breakpoint_percentile_threshold 決定了分割的嚴格程度
例如:
如果 buffer_size=2 且 breakpoint_percentile_threshold=90:每2個句子會被組合在一起,當組合之間的不相似度超過90%時就會分割,這會產生相對較多的節點
如果 buffer_size=3 且 breakpoint_percentile_threshold=98:每3個句子會被組合在一起,需要更大的不相似度才會分割,這會產生相對較少的節點
'''# 使用語義分塊器對文檔進行分塊
semantic_nodes = splitter.get_nodes_from_documents(documents)
print("\n=== 語義分塊結果 ===")
print(f"語義分塊器生成的塊數:{len(semantic_nodes)}")
for i, node in enumerate(semantic_nodes, 1):print(f"\n--- 第 {i} 個語義塊 ---")print(f"內容:\n{node.text}")print("-" * 50)# 使用基礎句子分塊器對文檔進行分塊
base_nodes = base_splitter.get_nodes_from_documents(documents)
print("\n=== 基礎句子分塊結果 ===")
print(f"基礎句子分塊器生成的塊數:{len(base_nodes)}")
for i, node in enumerate(base_nodes, 1):print(f"\n--- 第 {i} 個句子塊 ---")print(f"內容:\n{node.text}")print("-" * 50)

使用Unstructured基于文檔結構分塊

與分塊相關的高級索引技巧?

帶滑動窗口的句子切分(Sliding Windows)

上下窗口為3的滑動窗口

分塊時混合生成父子文本塊(Parent-Child Docs)

通過子文本塊檢索父文本塊

分塊時為文本塊創建元數據

打關鍵信息標簽

在分塊時形成有級別的索引(Summary→Details )?

從摘要到細節的文檔索引

文檔→嵌入對象(Document→Embedded Objects)?

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

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

相關文章

C++:用 libcurl 發送一封帶有附件的郵件

編寫mingw C 程序&#xff0c;用 libcurl 發送一封帶有附件的郵件 下面是一個使用 MinGW 編譯的 C 程序&#xff0c;使用 libcurl 發送帶附件的郵件。這個程序完全通過代碼實現 SMTP 郵件發送&#xff0c;不依賴外部郵件客戶端&#xff1a; // send_email.cpp #include <i…

tensorflow image_dataset_from_directory 訓練數據集構建

以數據集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 為例 目錄結構 訓練圖像數據集要求&#xff1a; 主目錄下包含多個子目錄&#xff0c;每個子目錄代表一個類別。每個子目錄中存儲屬于該類別的圖像文件。 例如 main_directory/ ...cat/ ...…

遨游Spring AI:第一盤菜Hello World

Spring AI的正式版已經發布了&#xff0c;很顯然&#xff0c;接下來我們要做的事情就是寫一個Hello World。 總體思路就是在本地搭建一個簡單的大模型&#xff0c;然后編寫Spring AI代碼與模型進行交互。 分五步&#xff1a; 1. 安裝Ollama&#xff1b; 2. 安裝DeepSeek&…

華為云Flexus+DeepSeek征文|基于華為云Flexus X和DeepSeek-R1打造個人知識庫問答系統

目錄 前言 1 快速部署&#xff1a;一鍵搭建Dify平臺 1.1 部署流程詳解 1.2 初始配置與登錄 2 構建專屬知識庫 2.1 進入知識庫模塊并創建新庫 2.2 選擇數據源導入內容 2.3 上傳并識別多種文檔格式 2.4 文本處理與索引構建 2.5 保存并完成知識庫創建 3接入ModelArts S…

Java優化:雙重for循環

在工作中&#xff0c;經常性的會出現在兩張表中查找相同ID的數據&#xff0c;許多開發者會使用兩層for循環嵌套&#xff0c;雖然實現功能沒有問題&#xff0c;但是效率極低&#xff0c;一下是一個簡單的優化過程&#xff0c;代碼耗時湊從26856ms優化到了748ms。 功能場景 有兩…

Prompt Tuning:生成的模型文件有什么構成

一、為什么Prompt Tuning會生成模型文件? 1. Prompt Tuning的本質:優化可訓練的「提示參數」 核心邏輯:Prompt Tuning(提示調優)是一種輕量級的微調技術,僅優化模型輸入層的提示向量(Prompt Embedding)或少量額外參數,而非更新整個預訓練模型的權重。生成模型文件的原…

ARM SMMUv3簡介(一)

1.概述 SMMU&#xff08;System Memory Management Unit&#xff0c;系統內存管理單元&#xff09;是ARM架構中用于管理設備訪問系統內存的硬件模塊。SMMU和MMU的功能類似&#xff0c;都是將虛擬地址轉換成物理地址&#xff0c;不同的是MMU轉換的虛擬地址來自CPU&#xff0c;S…

在 Windows 系統上運行 Docker 容器中的 Ubuntu 鏡像并顯示 GUI

在 Windows 上安裝一個 X Server&#xff08;如 VcXsrv 或 X410&#xff09;&#xff0c;Ubuntu 容器通過網絡將圖形界面轉發到 Windows。 步驟&#xff1a; 安裝 X Server&#xff1a; 推薦使用VcXsrv&#xff0c;免費開源。 安裝后運行 XLaunch&#xff0c;選擇&#xff1…

Vue3學習(4)- computed的使用

1. 簡述與使用 作用&#xff1a;computed 用于基于響應式數據派生出新值&#xff0c;其值會自動緩存并在依賴變化時更新。 ?緩存機制?&#xff1a;依賴未變化時直接返回緩存值&#xff0c;避免重復計算&#xff08;通過 _dirty 標志位實現&#xff09;。?響應式更新?&…

【HarmonyOS 5】出行導航開發實踐介紹以及詳細案例

以下是 ?HarmonyOS 5? 出行導航的核心能力詳解&#xff08;無代碼版&#xff09;&#xff0c;聚焦智能交互、多端協同與場景化創新&#xff1a; 一、交互革新&#xff1a;從被動響應到主動服務 ?意圖驅動導航? ?自然語義理解?&#xff1a;用戶通過語音指令&#xff08;如…

csrf攻擊學習

原理 csrf又稱跨站偽造請求攻擊&#xff0c;現代網站利用Cookie、Session 或 Token 等機制識別用戶身份&#xff0c;一旦用戶訪問某個網站&#xff0c;瀏覽器在之后請求會自動帶上這些信息來識別用戶身份。用戶在網站進行請求或者操作時服務器會給出對應的內容&#xff0c;比如…

深入剖析MySQL鎖機制,多事務并發場景鎖競爭

一、隱藏字段對 InnoDB 的行鎖&#xff08;Record Lock&#xff09;與間隙鎖&#xff08;Gap Lock&#xff09;的影響 1. 隱藏字段與鎖的三大核心影響 類型影響維度描述DB_TRX_IDMVCC 可見性控制決定是否讀取當前版本&#xff0c;或在加鎖時避開不可見版本&#xff08;影響加鎖…

以SMMUv2為例,使用Trace32可視化操作SMMU的常用命令詳解

Trace32支持一系列的SMMU命令&#xff0c;可以幫助用戶更好地配置、查看和分析SMMU。換句話說&#xff0c;就是讓SMMU的配置變得可視化。 在添加SMMU實例之前&#xff0c;需要選擇一個CPU來激活該SMMU實例的相關命令。Trace32讓SMMU的配置可視化的本質是&#xff0c;操縱CPU讀取…

將數據庫表導出為C#實體對象

數據庫方式 use 數據庫;declare TableName sysname 表名 declare Result varchar(max) /// <summary> /// TableName /// </summary> public class TableName {select Result Result /// <summary>/// CONVERT(NVARCHAR(500), ISNULL(ColN…

CSS 預處理器與工具

目錄 CSS 預處理器與工具1. Less主要特性 2. Sass/SCSS主要特性 3. Tailwind CSS主要特性 4. 其他工具PostCSSCSS Modules 5. 選擇建議 CSS 預處理器與工具 1. Less Less 是一個 CSS 預處理器&#xff0c;它擴展了 CSS 語言&#xff0c;添加了變量、嵌套規則、混合&#xff0…

this.$set() 的用法詳解(Vue響應式系統相關)

1. 什么是 this.$set()&#xff1f; this.$set(target, key, value) 是 Vue 2 中提供的一個方法&#xff0c;用于向響應式對象中動態添加屬性&#xff0c;確保新加的屬性同樣是響應式的。 2. 為什么需要它&#xff1f; Vue 2 的響應式系統基于 Object.defineProperty&#…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十)

目錄 1 -> 部署云側工程 2 -> 通過CloudDev面板獲取云開發資源支持 3 -> 通用云開發模板 3.1 -> 適用范圍 3.2 -> 效果圖 4 -> 總結 1 -> 部署云側工程 可以選擇在云函數和云數據庫全部開發完成后&#xff0c;將整個云工程資源統一部署到AGC云端。…

如何配置nginx解決前端跨域請求問題

我們以一個簡單的例子模擬不同情況下產生的跨域問題以及解決方案。假設在http://127.0.0.1:8000的頁面調用接口 fetch(http://127.0.0.1:8003/api/data)常看到的錯誤“Access to fetch at ‘http://127.0.0.1:8003/api/data’ from origin ‘http://localhost:8000’ has been…

React Hooks 指南:何時使用 useEffect ?

在 React 的函數組件中&#xff0c;useEffect Hook 是一個強大且不可或缺的工具。它允許我們處理副作用 (side effects)——那些在組件渲染之外發生的操作。但是&#xff0c;什么時候才是使用 useEffect 的正確時機呢&#xff1f;讓我們深入探討一下&#xff01; 什么是副作用…

bat批量去掉本文件夾中的文件擴展名

本文本夾內 批量去掉本文件夾中的文件擴展名 假如你有一些文件&#xff0c;你想去掉他們的擴展名 有沒有方便的辦法呢 今天我們就分享一種辦法。 下面&#xff0c;就來看看吧。 首先我們新建一個記事本&#xff0c;把名字改為&#xff0c;批量去掉本文件夾中的文件擴展名.txt 然…