使用 BERT 的 NSP 實現語義感知切片 —— 提升 RAG 系統的檢索質量

在構建 Retrieval-Augmented Generation(RAG)系統時,文檔的切片方式至關重要。我們需要將長文本切分成合適的段落(chunks),然后存入向量數據庫進行召回。如果切得太粗,會丟失上下文細節;切得太細,語義就會支離破碎。

傳統切片方法(如固定 token 窗口、按句子數切)不考慮句子間的語義關系,很容易導致把兩個緊密相關的句子切開,影響后續檢索和生成質量。

為了解決這個問題,我們可以借助 BERT 模型中的 Next Sentence Prediction(NSP)機制,實現語義感知的切片

什么是 NSP?

NSP 是 BERT 在預訓練階段的兩個任務之一,其目標是判斷兩個句子是否在原始文本中是相鄰的。具體來說,給定句子 A 和 B,BERT 會輸出一個判斷:

“B 是不是 A 的下一句?”

我們可以反過來利用這個能力,判斷兩個句子之間是否具有語義連續性,從而找出應該切片的位置

如何用 NSP 做文本切片?

步驟概覽:

  1. 將文本分句(sentence tokenization)

  2. 對每對相鄰句子使用 BERT NSP 判斷是否連貫

  3. 如果不連貫 → 作為一個切片邊界

  4. 合并成語義一致的 chunk,用于向量化和檢索

Python 實現示例

from transformers import BertTokenizer, BertForNextSentencePrediction
import torch
from nltk.tokenize import sent_tokenize
import nltk# 下載 NLTK 分句模型
nltk.download('punkt')# 初始化 BERT NSP 模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForNextSentencePrediction.from_pretrained('bert-base-uncased')
model.eval()# 判斷兩個句子是否是“語義上連貫”
def is_next_sentence(sent1, sent2, threshold=0.5):inputs = tokenizer.encode_plus(sent1, sent2, return_tensors='pt')with torch.no_grad():logits = model(**inputs).logitsprobs = torch.softmax(logits, dim=1)  # [is_next, not_next]return probs[0, 0].item() >= threshold# NSP 切片邏輯
def split_text_by_nsp(text, threshold=0.5):sentences = sent_tokenize(text)if len(sentences) <= 1:return [text]chunks = []buffer = [sentences[0]]for i in range(1, len(sentences)):if is_next_sentence(buffer[-1], sentences[i], threshold):buffer.append(sentences[i])else:chunks.append(" ".join(buffer))buffer = [sentences[i]]if buffer:chunks.append(" ".join(buffer))return chunks# 示例文本
text = """
Artificial intelligence is transforming industries. Machines can now perform tasks like diagnosing diseases. 
However, many experts worry about job loss. Reskilling workers is becoming essential. 
AI was first proposed in the 1950s. The early expectations were overly optimistic.
"""# 切片結果
chunks = split_text_by_nsp(text, threshold=0.6)
for i, chunk in enumerate(chunks):print(f"\nChunk {i+1}:\n{chunk}")

NSP 切片的優勢

1. 語義感知的邊界

NSP 模型能判斷句子間是否語義連貫,避免誤切語義相關的句群。

2. 切片內容更自然

每個 chunk 更像“自然段”,對語言模型更友好,也更容易被 embedding 捕捉到。

3. 易于集成到 RAG pipeline

只需在原始分句之后添加 NSP 判定邏輯,即可作為 vectorization 之前的預處理。

?潛在問題及優化建議

信息密度不均(Inconsistent information density)

有的 chunk 很短但內容貧乏,有的 chunk 很長且信息密集。解決方法:

  • 控制最小/最大句數限制

  • 對 chunk 加入關鍵詞打分過濾

NSP 偶爾判斷失誤

NSP 本質是二分類,有一定誤判概率。可以通過:

  • 提高閾值(更嚴格地判定“非連貫”)

  • 多模型投票判定

實際應用場景

  • 構建 RAG 系統(文檔問答、法律問答、產品說明 QA)

  • AI 助手的文檔摘要模塊

  • 信息提取、段落重組任務

總結

使用 BERT NSP 實現文本切片是一種兼顧語義完整性和實現簡便性的優秀方法,特別適合構建高質量的文檔檢索系統(如 RAG)。它避免了固定窗口切片的語義割裂問題,生成的 chunk 更自然、上下文更豐富。

搭配向量搜索、chunk scoring、或 reranking 模塊,將進一步提高整體系統的效果。

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

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

相關文章

使用STM32CubeMX生成的STM32CubeIDE工程在更改工程名后編譯失敗問題解決

0 問題描述 使用STM32CubeMX生成STM32CubeIDE工程,然后使用STM32CubeIDE改名后編譯提示如下錯誤: 1 問題原因及解決辦法 1.1 問題原因 原因在于更名后STM32CubeIDE沒有自動更新引用關系,這是因為我們使用STM32CubeMX生成代碼時沒有勾選在根目錄下生成: 取消勾選在根目…

8月3日星期日今日早報簡報微語報早讀

8月3日星期日&#xff0c;農歷閏六月初十&#xff0c;早報#微語早讀。1、廣西防城港&#xff1a;奔馳女司機身份已查清&#xff0c;結果將統一對外發布&#xff1b;2、陳藝文、陳佳包攬游泳世錦賽女子跳水三米板金銀牌&#xff1b;3、九省份保險業已賠付暴雨災害損失5.2億元&am…

wxPython 實踐(六)對話框

wxPython 實踐&#xff08;一&#xff09;概述 wxPython 實踐&#xff08;二&#xff09;基礎控件 wxPython 實踐&#xff08;三&#xff09;頁面布局 wxPython 實踐&#xff08;四&#xff09;事件響應 wxPython 實踐&#xff08;五&#xff09;高級控件 wxPython 實踐&#x…

MATLAB科研數據可視化技術

互聯網的飛速發展伴隨著海量信息的產生&#xff0c;而海量信息的背后對應的則是海量數據。如何從這些海量數據中獲取有價值的信息來供人們學習和工作使用&#xff0c;這就不得不用到大數據挖掘和分析技術。數據可視化分析作為大數據技術的核心一環&#xff0c;其重要性不言而喻…

文明存續的時間博弈:論地球資源枯竭臨界期的技術突圍與行動緊迫性

摘要當地球資源消耗以指數級速度逼近生態承載力極限&#xff0c;人類文明正面臨“存續還是消亡”的終極抉擇。本文基于地球資源枯竭的實證數據與技術突破的可行性分析&#xff0c;揭示文明存續的時間窗口已進入不可逆臨界期&#xff08;2040-2070年&#xff09;&#xff0c;論證…

Elasticsearch 8.19.0 和 9.1.0 中 LogsDB 和 TSDS 的性能與存儲改進

作者&#xff1a;來自 Elastic Martijn Van Groningen 探索 TSDS 和 LogsDB 的最新增強功能&#xff0c;包括優化 I/O、提升合并性能等。 Elasticsearch 帶來了許多新功能&#xff0c;幫助你為你的使用場景構建最佳搜索解決方案。通過我們的示例筆記本深入學習&#xff0c;開始…

cs336之注意pytorch的tensor在哪里?(assert的使用)

問題 記住&#xff1a;無論何時你在pytorch中有一個張量tensor&#xff0c;你應該始終問一個問題&#xff1a;它當前位于哪里&#xff1f; 注意它在CPU還是在GPU中。要判斷它在哪里&#xff0c;可以使用python的assert斷言語句。 assert斷言 在 Python 中&#xff0c;assert 是…

Mysql 分區表

分區表是將一張表分成多張獨立子表&#xff0c;每個子表是一個區&#xff0c;目的是提高查詢效率。 從 server 層來看&#xff0c;只有一張表。但是從引擎層來看&#xff0c;是多張表&#xff0c;對應多個.idb文件。引擎層訪問數據只訪問特定分區表&#xff0c;也只對特定分區表…

Makefile 入門與實踐指南

Makefile 是用于 make 工具的配置文件&#xff0c;它定義了如何編譯和鏈接你的項目&#xff0c;讓構建過程自動化。一、核心概念 make 的核心思想是 “目標”&#xff08;Target&#xff09; 和 “依賴”&#xff08;Dependencies&#xff09;&#xff1a; 目標 (Target)&#…

分布式微服務--Nacos作為配置中心(補)關于bosststrap.yml與@RefreshScope

一、關于bosststrap.yml? bootstrap.yml 和 application.yml 的區別對比項bootstrap.ymlapplication.yml加載時機優先于 application.yml 加載&#xff08;啟動早期&#xff09;程序初始化完成后加載主要用途設置應用的外部配置源、注冊中心信息等設置應用內部配置&#xff0c…

[Qt]QString 與Sqlite3 字符串互動[漢字不亂碼]

環境&#xff1a;Qt C&#xff08;msvc c&#xff09;1.將與數據庫交互的代碼文件編碼轉換為utf-8-bom編碼&#xff0c;&#xff08;可使用notepad 進行轉換&#xff09;2.在代碼文件頭文件中加上下面代碼。//vs2010 版本是 1600 #if defined(_MSC_VER) && (_MSC_VER &…

SpringBoot啟動項目詳解

SpringBoot 的啟動過程是一個整合 Spring 核心容器、自動配置、嵌入式服務器等功能的復雜流程&#xff0c;核心目標是 “簡化配置、快速啟動”。下面從入口類開始&#xff0c;逐步拆解其詳細啟動步驟&#xff1a;一、啟動入口&#xff1a;SpringBootApplication與main方法Sprin…

PCB 控深槽如何破解 5G 基站 120℃高熱魔咒?

5G 基站在高頻通信下的功耗較 4G 基站提升 3-4 倍&#xff0c;射頻模塊、電源單元等核心部件的工作溫度常突破 120℃&#xff0c;遠超設備安全閾值&#xff08;≤85℃&#xff09;&#xff0c;形成制約通信穩定性的 “高熱魔咒”。印制線路板&#xff08;PCB&#xff09;作為熱…

NEXT.js 打包部署到服務器

在網上查了一下&#xff0c;記錄一下1.首先執行打包命令&#xff0c;我這個項目是用的pnpm&#xff0c;可以根據項目需求使用 npm 或者別的pnpm run build2.打包完成后會有一個 .next 的文件夾&#xff0c;需要把下圖的這些文件放到服務器。服務器需要有node環境之后就需要執行…

【AI分析】uv庫自動安裝腳本uv-installer-0.8.3.ps1分析

目錄uv 安裝腳本完整分析報告1. 腳本概述2. 參數解析3. 環境變量控制4. 核心函數詳解a. Install-Binary&#xff08;主控函數&#xff09;b. Get-TargetTriple&#xff08;架構檢測&#xff09;c. Download&#xff08;下載處理&#xff09;d. Invoke-Installer&#xff08;安裝…

etcd 的安裝與使用

介紹 Etcd 是一個 golang 編寫的分布式、高可用的一致性鍵值存儲系統&#xff0c;用于配置共享和服 務發現等。它使用 Raft 一致性算法來保持集群數據的一致性&#xff0c;且客戶端通過長連接 watch 功能&#xff0c;能夠及時收到數據變化通知&#xff0c;相較于 Zookeeper 框…

conda : 無法將“conda”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正

詳細問題 PS C:\Users\wh109> conda init powershell conda : 無法將“conda”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正 確&#xff0c;然后再試一次。 所在位置 行:1 字符: 1conda init pow…

HQChart實戰教程58:K線主圖仿TradingView實現

本文將詳細介紹如何使用HQChart實現類似TradingView風格的K線主圖,包含完整的代碼實現和詳細注釋,適合金融圖表開發者和量化交易愛好者閱讀。 一、TradingView風格特點分析 在開始實現前,我們先分析TradingView的K線主圖核心特點: 簡潔現代的UI設計:深色背景、清晰的網格…

GitPython08-源碼解讀

GitPython08-源碼解讀 1-核心知識 1&#xff09;gitPython核心代碼很多都是對git命令返回的結果進行解析&#xff0c;在此補充git命令的返回內容2&#xff09;git ls-tree -> 查看某個提交或分支所對應的目錄樹3&#xff09;源碼中Tree對應的業務邏輯 -> 獲取git ls-tre…

中科院開源HYPIR圖像復原大模型:1.7秒,老照片變8K畫質

目錄 前言 一、告別“龜速”藝術家&#xff0c;擁抱“閃電”打印機 二、不止是高清&#xff1a;它看得懂文字&#xff0c;更能理解你的心意 2.1 首先&#xff0c;它是位“文字保衛者” 2.2 其次&#xff0c;它還是個“細節創造家” 2.3 最后&#xff0c;它是一個能“聽懂…