Python----大模型( RAG的文本分割,文本分割方法 )

一、RAG文本分割

????????RAG(Retrieval-Augmented Generation,檢索增強生成)模型是一種結合了檢索 和生成能力的自然語言處理模型。 它通過檢索相關的文檔片段,并將這些信息作為生成過程的上下文,以提高生成質量 和準確性。

????????在RAG模型中,文本分割是一個非常關鍵的步驟。合理地分割文檔文本, 不僅能夠提高檢索的效率,還能更有效地將檢索到的信息提供給生成模型,使生成內 容更加連貫和準確。

文本分割優點:?

????????提升檢索效率: 文本分割的首要原因是為了提高檢索的效率。對于較長的文檔,直接檢索整篇文 檔可能會導致信息冗余或者重要信息丟失。因此,合理的文本分割將長文檔分成 多個段落或片段,這樣每個片段可以單獨進行檢索,從而提高檢索的精度和速 度。

????????更好的信息匹配: 當文檔被合理地分割后,檢索算法可以更加精確地匹配用戶查詢和文檔片段。這 樣不僅能夠減少噪聲,還可以確保檢索到的內容更加相關,生成模型在使用這些 片段進行回答時能夠生成更加相關和有意義的內容。

????????增強生成質量: 檢索增強生成模型依賴檢索到的內容作為生成輸入的一部分。如果檢索到的文檔 片段不準確或上下文不完整,生成的結果可能會偏離用戶的期望。文本分割可以 確保每個文檔片段足夠獨立,且能夠提供完整的上下文信息,從而提高生成的準 確性和上下文連貫性。

????????降低計算復雜度: 長文本的直接處理會大大增加模型的計算量和時間開銷,甚至有些大模型并不支 持超長文本的輸入。通過將文本分割成多個較小的片段,可以只針對特定的片段 進行處理,從而減少計算量,提高響應速度。這不僅優化了模型的性能,還減少 了生成結果時的延遲。?

二、文本分割方法?

2.1、字符分割

????????字符分割是最基礎的文本分割方式,按照指定的分隔符進行分割。chunk_size 指的 是每個分割片段(chunk)的長度。chunk_overlap 指的是每個分割片段之間的重疊 部分。

注意: split_text 和 split_documents 不同:

????????split_text:處理單純的字符串。

????????split_documents:處理包含元數據的文檔對象。?

# 導入LangChain的字符文本分割器
from langchain.text_splitter import CharacterTextSplitter# 定義要分割的中文文本
text = "在西天取經的幾百年前黑風山上有一只黑熊精占山為王,自稱黑風大王。"# 創建字符文本分割器實例
# 參數說明:
# chunk_size=15: 每個文本塊的最大字符數
# chunk_overlap=2: 相鄰文本塊之間的重疊字符數
# separator="": 分割符設為空字符串(按字符分割)
splitter = CharacterTextSplitter(chunk_size=15,chunk_overlap=2,separator=""
)# 執行文本分割
chunks = splitter.split_text(text)# 打印分割結果
print(chunks)
['在西天取經的幾百年前黑風山上有', '上有一只黑熊精占山為王,自稱黑', '稱黑風大王。']

2.2、遞歸字符文本分割

????????遞歸字符文本分割是字符分割的升級版,它以字符分割為基礎,但在分割時引入了遞 歸的機制。 在初步分割之后,再對一些不完整或冗長的片段進行進一步細分,從而獲得更加細粒 度的分割。

????????這個方法比簡單的字符分割更加靈活,可以通過遞歸深度來控制分割的粒度。 RecursiveCharacterTextSplitter不設置separators時,默認的separators參數為 ["\n\n", "\n", " ", ""]:將按不同的字符遞歸地分割(按照這個優先級["\n\n", "\n", " ", ""]),文本分割器首先在"\n\n"處嘗試分割,如果分出的塊過大(大于 chunk_size),則找到"\n"處嘗試分割以此類推,若都不滿足則按照字符劃分。

# 導入LangChain的遞歸字符文本分割器
from langchain.text_splitter import RecursiveCharacterTextSplitter# 定義要分割的中文文本
text = "在西天取經的幾百年前黑風山上有一只黑熊精占山為王,這里只是為了占位沒什么用,自稱黑風大王。"# 創建遞歸字符文本分割器實例
# 參數說明:
# chunk_size=15: 每個文本塊的最大字符數
# chunk_overlap=3: 相鄰文本塊之間的重疊字符數
# separators=[...]: 分割符優先級列表(按順序嘗試分割)
splitter = RecursiveCharacterTextSplitter(chunk_size=15,  # 每個分塊最大15個字符chunk_overlap=3,  # 分塊間重疊3個字符separators=["\n\n",  # 雙換行(最高優先級)"\n",    # 單換行" ",      # 空格".",      # 英文句號",",      # 英文逗號",",     # 中文逗號"。",     # 中文句號""        # 最后按字符分割(最低優先級)]
)# 執行文本分割
chunks = splitter.split_text(text)# 打印分割結果
print(chunks)
['在西天取經的幾百年前黑風山上有', '山上有一只黑熊精占山為王', ',這里只是為了占位沒什么用', ',自稱黑風大王。']

遞歸分割機制:

????????會按照separators列表中的順序,優先嘗試用高級別的分隔符

????????如果高級別分隔符無法滿足chunk_size要求,會降級使用更低級別的分隔符

參數特點:

????????chunk_overlap=3確保分塊之間有3個字符的重疊,保持上下文連貫

????????中文標點","和"。"被明確列為分隔符,確保在標點處自然分割

分割策略:

????????優先在段落(\n\n)、句子(。)級別分割

????????其次在短語(,)和詞語(空格)級別分割

????????最后才會按單個字符分割

中文適配:

????????專門添加了中文標點作為分隔符

????????確保中文文本能在語義合理的邊界處分割

2.3、特定文檔分割(以markdown為例):

????????特定文檔分割是基于文檔結構對文本進行分割的一種方式。不同的文檔類型通常有各 自的結構化信息,例如書籍中的章節和段落、網頁中的HTML標簽等。 利用這些預定義的結構化信息,可以更加自然地分割文本,保證片段的上下文連貫 性。

# 導入Markdown標題文本分割器
from langchain.text_splitter import MarkdownHeaderTextSplitter# 定義包含Markdown標題的文本內容
text = """
# 第一章
在西天取經的幾百年前,黑風山上。\n\n在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。
# 第二章
測試。
"""# 定義需要分割的標題級別和對應的元數據名稱
# 格式: [(標題標記, 元數據字段名), ...]
headers_to_split_on = [("#", "Header 1"),   # 一級標題,保存到Header 1元數據字段("##", "Header 2"),  # 二級標題,保存到Header 2元數據字段
]# 創建Markdown標題分割器實例
splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on  # 傳入標題配置
)# 執行文本分割
chunks = splitter.split_text(text)# 打印分割結果
print(chunks)
# 預期輸出結構:
# [
#     {
#         'content': '在西天取經的幾百年前...',  # 正文內容
#         'metadata': {'Header 1': '第一章'}  # 標題元數據
#     },
#     {
#         'content': '測試。',
#         'metadata': {'Header 1': '第二章'}
#     }
# ]
[Document(metadata={'Header 1': '第一章'}, page_content='在西天取經的幾百年前,黑風山上。  \n在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。在西天取經的幾百年前,黑風山上。'), Document(metadata={'Header 1': '第二章'}, page_content='測試。')]

2.4、實例

# 導入必要的庫
from langchain_community.document_loaders import TextLoader  # 文本加載器
from langchain.text_splitter import RecursiveCharacterTextSplitter  # 遞歸字符分割器# 1. 加載TXT文檔
# 創建TextLoader實例,指定文件路徑和編碼格式
text_loader = TextLoader("黑悟空.txt", encoding="UTF-8")
# 加載文檔內容,返回Document對象列表
documents = text_loader.load()# 2. 定義遞歸字符分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200,  # 每個分塊的最大字符數chunk_overlap=20,  # 相鄰分塊間的重疊字符數separators=["\n\n", "\n", " ", ".", ",", ",", "。", ""]  # 分割符優先級列表# 分割符優先級說明:# 1. 首先嘗試用雙換行符(\n\n)分割# 2. 然后嘗試單換行符(\n)# 3. 接著是空格、英文標點# 4. 最后是中文標點# 5. 如果以上都不適用,則按單個字符分割
)# 3. 執行文檔分割
# 對加載的文檔進行分割,返回分割后的Document對象列表
splits_docs = text_splitter.split_documents(documents)# 4. 打印分割結果
# 遍歷所有分塊,打印序號和內容
for i, chunk in enumerate(splits_docs):print(f"分塊 {i+1}: \n{chunk}\n")  # 打印分塊編號和內容# 每個chunk是一個Document對象,包含page_content和metadata屬性# 補充說明:
# 1. 適合處理包含中文標點的文本
# 2. 會盡量在段落、句子邊界處進行分割
# 3. 重疊部分(chunk_overlap)確保上下文連貫性
# 4. 輸出結果保留了原始文檔的結構信息

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

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

相關文章

vue筆記3 VueRouter VueX詳細講解

vueRouter & vueX 看到這里的朋友如果沒有看過前幾期,可以通過文章的鏈接跳轉到第一期,從第一期的 vue2 語法開始學習,如果是復習的朋友,也可以看本期只學習 vueRouter & VueX 項目初始化 經過上期,我們學習…

從當下需求聊聊Apifox 與 Apipost 的差異

作為一名長期投身于復雜項目開發的工程師,我深切體會到一款適配的接口管理工具對提升開發效率的關鍵意義。當團隊在進行工具選型時,我對 Apifox 和 Apipost 展開了全面且系統的對比分析,其中的諸多發現,值得與大家深入探討。 一、…

藍牙協議棧高危漏洞曝光,攻擊可入侵奔馳、大眾和斯柯達車載娛樂系統

OpenSynergy BlueSDK關鍵漏洞,可遠程執行代碼入侵數百萬車輛系統PCA網絡安全公司的研究人員在OpenSynergy BlueSDK藍牙協議棧中發現了一組被統稱為"完美藍"(PerfektBlue)的關鍵漏洞。利用這些漏洞可能對數百萬輛汽車實施遠程代碼執…

Android 性能優化:啟動優化全解析

前言 Android應用的啟動性能是用戶體驗的重要組成部分。一個啟動緩慢的應用不僅會讓用戶感到煩躁,還可能導致用戶放棄使用。 本文將深入探討Android應用啟動優化的各個方面,包括啟動流程分析、優化方法、高級技巧和具體實現。 一、Android應用啟動流程深…

前沿重器[69] | 源碼拆解:deepSearcher動態子查詢+循環搜索優化RAG流程

前沿重器欄目主要給大家分享各種大廠、頂會的論文和分享,從中抽取關鍵精華的部分和大家分享,和大家一起把握前沿技術。具體介紹:倉頡專項:飛機大炮我都會,利器心法我還有。(算起來,專項啟動已經…

Vue+axios

1. axios簡介axios 是一個基于 Promise 的 HTTP 客戶端,主要用于瀏覽器和 Node.js 環境中發送 HTTP 請求。它是目前前端開發中最流行的網絡請求庫之一,被廣泛應用于各種 JavaScript 項目(如 React、Vue、Angular 等框架或原生 JS 項目&#x…

通過Tcl腳本命令:set_param labtools.auto_update_hardware 0

1.通過Tcl腳本命令:set_param labtools.auto_update_hardware 0 禁用JTAG上電檢測,因為2016.1 及更高版本 Vivado 硬件管理器中,當 FPGA正連接編程電纜時 重新上電,可能會出現FPGA無法自動加載程序的故障。 2.還可以通過 hw_serv…

Spring Boot 安全登錄系統:前后端分離實現

關鍵詞:Spring Boot、安全登錄、JWT、Shiro / Spring Security、前后端分離、Vue、MySQL 詳細代碼請參考這篇文章:完整 Spring Boot Vue 登錄 ? 摘要 在現代 Web 應用中,用戶登錄與權限控制是系統安全性的基礎環節。本文將手把手帶你實現…

Docker高級管理--Dockerfile 鏡像制作

目錄 一:Docker 鏡像管理 1:Docker 鏡像結構 (1) 鏡像分層核心概念 (2)鏡像層特性 (3)關鍵操作命令 (4)優化建議 2:Dockerfile介紹 (1&…

Leetcode力扣解題記錄--第42題 接雨水(動規和分治法)

題目鏈接:42. 接雨水 - 力扣(LeetCode) 這里我們可以用兩種方法去解決巧妙地解決這個題。首先來看一下題目 題目描述 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。…

寶塔配置pgsql可以遠程訪問

本地navicat premium 17.0 可以遠程訪問pgsql v16.1寶塔的軟件商店里,找到pgsql管理器;在pgsql管理器里找到客戶端認證:第二步:配置修改,CtrlF 查找listen_addresses關鍵字;第三步:在navicat里配…

小架構step系列12:單元測試

1 概述 測試的種類很多:單元測試、集成測試、系統測試等,程序員寫代碼進行測試的可以稱為白盒測試,單元測試和集成測試都可以進行白盒測試,可以理解為單元測試是對某個類的某個方法進行測試,集成測試則是測試一連串的…

SpringBoot3-Flowable7初體驗

目錄簡介準備JDKMySQLflowable-ui創建流程圖要注意的地方編碼依賴和配置控制器實體Flowable任務處理類驗證啟動程序調用接口本文源碼參考簡介 Flowable是一個輕量的Java業務流程引擎,用于實現業務流程的管理和自動化。相較于老牌的Activiti做了一些改進和擴展&…

phpMyAdmin:一款經典的MySQL在線管理工具又回來了

phpMyAdmin 是一個免費開源、基于 Web 的 MySQL/MariaDB 數據庫管理和開發工具。它提供了一個直觀的圖形用戶界面,使得我們無需精通復雜的 SQL 命令也能執行大多數數據庫管理任務。 phpMyAdmin 項目曾經暫停將近兩年,不過 2025 年又開始發布新版本了。 …

存儲服務一NFS文件存儲概述

前言: 網絡文件系統(Network File System,NFS)誕生于1984年,由Sun Microsystems首創,旨在解決異構系統間的文件共享需求。作為一種基于客戶端-服務器架構的分布式文件協議,NFS允許遠程主機通過T…

libimagequant 在 mac 平臺編譯雙架構

在 macOS 上編譯 libimagequant 的雙架構(aarch64 x86_64)通用二進制庫,以下是完整步驟:??1. 準備 Rust 工具鏈?? # 安裝兩個目標平臺 rustup target add aarch64-apple-darwin x86_64-apple-darwin# 確認安裝成功 rustup ta…

暑期自學嵌入式——Day01(C語言階段)

點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 主頁: 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1011.2682.3001.5343感悟: 今天我認為最重…

Flutter基礎(前端教程⑧-數據模型)

這個示例展示了如何創建數據模型、解析 JSON 數據,以及在 UI 中使用這些數據:import package:flutter/material.dart; import dart:convert;void main() {// 示例:手動創建User對象final user User(id: 1,name: 張三,age: 25,email: zhangsa…

SSRF10 各種限制繞過之30x跳轉繞過協議限制

ssrf漏洞在廠商的處理下可能進行一些特殊處理導致我們無法直接利用漏洞 有以下四種: 1.ip地址限制繞過 2.域名限制繞過 3.30x跳轉繞過域名限制 4.DNS rebinding繞過內網ip限制 本章我們講30x跳轉繞過域名限制 30x跳轉繞過域名限制 之前我們使用ssrf漏洞時可以…

DNS解析過程和nmap端口掃描

目錄 DNS解析流程: nmap端口掃描 指定掃描方式 TCP全連接掃描 -sT SYN半連接掃描 -sS -sT和 -sS的區別 Linux提權 利用好谷歌語法查找敏感信息 如果自己搭建了網站文件要放在phpstudy_pro\WWW下。 如果想要使用域名訪問網站,需要在phpstudy_pro…