【重構小程序】基于Tika和Langchain4J進行文件解析和文本切片(二)

????????為了將大語言模型植入到小程序中,來支持用戶的問答。那我們首先需要做的是什么呢,不是引入大語言模型,而且為大語言模型搭建一個私有化知識庫,但是這是這節呢,我們先不搭建私有化知識庫,在這之前,我們還需要做一個前置工作,那就是數據準備。

? ? ? ? 小版本的語言模型本身的能力不像大參數量的模型那樣,有用強大的知識庫和泛化能力。我們需要為其提供一個外部的知識庫,為模型提供額外的知識儲備,進而利用模型的推理能力回答用戶的問題。搭建知識庫之前,我們就需要將數據,存儲到知識庫中。那么首先,我們就需要解析文件得到元數據。

一、文本解析

為了解析到元數據,我們采用一個開源的工具,Apache Tika進行文件內容解析,這是一個由java開發的內容分析工具包。

<dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>3.0.0</version>
</dependency>
<dependency><groupId>org.apache.tika</groupId><artifactId>tika-parsers-standard-package</artifactId><version>3.0.0</version>
</dependency>

?我們先創建一個工具類TikaUtil,編寫一個函數用來解析我們傳入的文件內容。

?二、文本切片

?有了向量數據庫后,我們就需要把數據存入向量數據庫中了,在這之前呢,我們需要寫完成一個文件解析的功能,因為,要解釋到元數據,才進行接下來的步驟,我們這里選擇Apache Tika進行文件內容解析,這是一個由java開發的內容分析工具包。

<dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>3.0.0</version>
</dependency>
<dependency><groupId>org.apache.tika</groupId><artifactId>tika-parsers-standard-package</artifactId><version>3.0.0</version>
</dependency>

?我們先創建一個工具類TikaUtil,編寫一個函數用來解析我們傳入的文件內容。

    public String extractText(MultipartFile file) {try {// 創建解析器--在不確定文檔類型時候可以選擇使用AutoDetectParser可以自動檢測一個最合適的解析器Parser parser = new AutoDetectParser();// 用于捕獲文檔提取的文本內容。-1 參數表示使用無限緩沖區,解析到的內容通過此hander獲取BodyContentHandler bodyContentHandler = new BodyContentHandler(-1);// 元數據對象,它在解析器中傳遞元數據屬性---可以獲取文檔屬性Metadata metadata = new Metadata();// 帶有上下文相關信息的ParseContext實例,用于自定義解析過程。ParseContext parseContext = new ParseContext();parser.parse(file.getInputStream(), bodyContentHandler, metadata, parseContext);// 獲取文本return bodyContentHandler.toString();} catch (Exception e) {e.printStackTrace();return null;}}

我們使用該工具即可獲得文件的元數據。但是在問答的時候,我們不能將整個文件全部輸入到大模型中,一方面是模型本身是擁有上上下文窗口大小限制,另一方面是大量的信息可能影響模型的推理時間和準確率。為了解決這種情況,我們需要將文本分塊,把內容切割成一個一個的文本塊,將每個塊作為一個知識單元,再將其轉換為向量表示存入向量數據庫,這樣大模型在檢索的時候只需要將相關的文本塊添加到上下文中,既能保證回答的準確性,也解決了上下文過長的問題。

對于分塊的方法,在Langchain框架中,有多種分塊策略:

  1. 固定大小分塊:按固定字符數或單詞數分割文本,簡單直接,但可能破壞句子或段落的完整性。

  2. 按句子分塊:使用自然語言處理工具(如NLTK、spaCy)按句子邊界分割文本,適合處理句子級別的任務。

  3. 按段落分塊:按段落分割文本,適合處理段落級別的任務,段落通常由換行符分隔。

  4. 重疊分塊:在固定大小分塊的基礎上,允許塊之間有重疊部分,避免信息丟失。

  5. 遞歸分塊:遞歸地將文本分割成更小的部分,直到滿足特定條件,適合處理復雜文本結構。

  6. 語義分塊:根據語義或主題分割文本,通常需要自然語言處理技術識別語義邊界。

在java社區,Langchain4J??旨在為 Java 開發者提供類似于 LangChain(基于 Python)的功能。LangChain4J 的目標是將 LangChain 的核心概念和功能移植到 Java 生態系統中,使 Java 開發者能夠更方便地構建基于大語言模型(LLMs)的應用程序。Langchain4J

Langchain4J也為我們提供了多種文本分塊方法:

  • DocumentByParagraphSplitter
  • DocumentByLineSplitter
  • DocumentBySentenceSplitter
  • DocumentByWordSplitter
  • DocumentByCharacterSplitter
  • DocumentByRegexSplitter
  • Recursive:?DocumentSplitters.recursive(...)

在這之前,我們先新建一個TikaVo類,用作傳輸文檔解析分片后的結果。

@Accessors(chain = true)
@Data
public class TikaVo implements Serializable {private List<String> text;private List<String> metadata;
}

這里,我們采用遞歸分割的方式,將輸入的文本分割成塊。

    private TikaVo splitParagraphs(String content) {DocumentSplitter splitter = DocumentSplitters.recursive(TARGET_LENGTH, LENGTH_TOLERANCE, new OpenAiTokenizer());List<TextSegment> split = splitter.split(Document.document(content));return new TikaVo().setText(split.stream().map(TextSegment::text).toList()).setMetadata(split.stream().map(textSegment -> JSON.toJSONString(textSegment.metadata())).toList());}

到這里,文件處理算是完成了,這里,我們可以寫一個接口來測試一下效果,我這里就不展示了。感興趣的小伙伴,也可以試試其他的切片方法。

后面,我們將介紹,如何將處理好的文本,存儲到數據庫中。

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

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

相關文章

python|exm6-1try-except結構|raise關鍵字|異常類型

目錄 一、try-expect 1. 多個try-expect結構的使用 1.1 捕捉特定異常 1.2 捕捉全部異常 1.3 所有異常合并處理 2. try-except-else-finally 結構 二、raise 關鍵字 一、try-expect try-expect 結構是 Python 中用于異常處理的關鍵機制。它允許你捕獲并處理代碼中可能發生…

小藍的括號串1(棧,藍橋云課)

問題描述 小藍有一個長度為 nn 的括號串&#xff0c;括號串僅由字符 ( 、 ) 構成&#xff0c;請你幫他判斷一下該括號串是否合法&#xff0c;合法請輸出 Yes &#xff0c;反之輸出 No 。 合法括號序列&#xff1a; 空串是合法括號序列。 若 ss 是合法括號序列&#xff0c;則 (…

Centos7配置本地yum源

Centos7配置本地yum源 1、基于iso鏡像的centos源 1.1 準備iso <span style"color:#000000"><span style"background-color:#ffffff"><code class"language-bash"><span style"color:#008000"># 首先看自己使用…

VNA操作使用學習-14 再測晶振特性

再測一下4Mhz晶振&#xff0c;看看特性曲線&#xff0c;熟悉一下vna使用。 s11模式&#xff0c;找遍了各種format都無法顯示&#xff0c;只有這一種&#xff08;s11&#xff0c;Resistance&#xff09;稍微顯示出一個諧振&#xff0c;但是只有一個點。 s21模式 這是201p&#…

Tr0ll2靶機詳解

一、主機發現 arp-scan -l靶機ip&#xff1a;192.168.55.164 二、端口掃描、漏洞掃描、目錄枚舉、指紋識別 2.1端口掃描 nmap --min-rate 10000 -p- 192.168.55.164發現21端口的ftp服務開啟 以UDP協議進行掃描 使用參數-sU進行UDP掃描 nmap -sU --min-rate 10000 -p- 19…

基于開源模型的微調訓練及瘦身打造隨身掃描儀方案__用AI把手機變成文字識別小能手

基于開源模型的微調訓練及瘦身打造隨身掃描儀方案__用AI把手機變成文字識別小能手 一、準備工作&#xff1a;組裝你的"數碼工具箱" 1. 安裝基礎工具&#xff08;Python環境&#xff09; 操作步驟&#xff1a; 訪問Python官網下載安裝包安裝時務必勾選Add Python to…

GitHub 超火的開源終端工具——Warp

Warp 作為近年來 GitHub 上備受矚目的開源終端工具&#xff0c;以其智能化、高性能和協作能力重新定義了命令行操作體驗。以下從多個維度深入解析其核心特性、技術架構、用戶評價及生態影響力&#xff1a; 一、背景與核心團隊 Warp 由前 GitHub CTO Jason Warner 和 Google 前…

使用C#創建安裝Windows服務程序

在實際工作中&#xff0c;如果我們需要開發一個運行在后臺&#xff0c;無需用戶交互&#xff0c;不需要界面的應用程序&#xff0c;我們可以通過Windows服務來實現。 本文主要介紹如何基于C#創建一個Windows服務&#xff0c;來實現西門子PLC的定時讀取保存。 一、Windows服務…

docker、docker-compose常用命令

初學者使用的docker、docker-compose常用命令&#xff0c;日常練習&#xff0c;環境簡單搭建。 一、docker 1.1、安裝docker 1.1.1、yum安裝 #安裝docker的數據存儲驅動包 yum install -y yum-utils device-mapper-persistent-data lvm2 #設置新的安裝源、下載配置文件到…

阿里的MNN源碼如何編譯成so文件,供Android調用

在Ubtuntu下面的編譯&#xff0c;先整理編譯環境 1、安裝環境依賴 # 安裝必要工具 sudo apt update sudo apt install -y cmake ninja-build git wget # 安裝Android NDK&#xff08;建議使用r21版本或更高&#xff09; wget https://dl.google.com/android/repository/a…

吳恩達機器學習筆記復盤(六)梯度下降算法

簡介 梯度下降&#xff08;Gradient Descent&#xff09;是一種常用的優化算法&#xff0c;廣泛應用于機器學習、深度學習等領域&#xff0c;在這里是用于求J&#xff08;w,b&#xff09;局部最小值。 我自己覺得這樣說有點過于抽象。換個直觀點的說法就是&#xff0c;一個人…

使用JAVA-進行維吉尼亞密碼的解密與加密

維吉尼亞密碼 來源于百度百科 維吉尼亞密碼_百度百科 具體代碼 import java.util.*;public class WJMYmm {//常量 26public static final int N 26;//密碼public static void main(String[] args) {//字母String ZM"abcdefghijklmnopqrstuvwxyz";char[] zm ZM.…

Java DelayQueue 延遲隊列

Java DelayQueue 延遲隊列 1. DelayQueue 概述 DelayQueue 是 Java 并發包&#xff08;java.util.concurrent&#xff09;中的一個 無界 阻塞隊列&#xff0c;用于存儲實現了 Delayed 接口的元素。隊列中的元素只有在達到指定的延遲時間后才能被獲取。 2. DelayQueue 的底層…

LeetCode 解題思路 22(Hot 100)

解題思路&#xff1a; 遞歸思路&#xff1a; 傳入當前節點的最小值和最大值&#xff0c;遞歸判斷左右子樹。結束條件&#xff1a; 當前節點為空或不滿足二叉搜索樹。 Java代碼&#xff1a; class Solution {public boolean isValidBST(TreeNode root) {return isValidBST(ro…

樂享數科:政策助推假日經濟,2月普惠金融-景氣指數穩中有升

數據顯示&#xff0c;2025年2月普惠金融-景氣指數達48.99點&#xff0c;較1月上升0.03點。 企業運行持續向好&#xff0c;企業信心預期和經營活力回升。“假日經濟”與“政策效應”相互疊加&#xff0c;市場供求格局有所改善&#xff0c;景氣水平穩步恢復。 普惠金融-景氣指數…

leetcode日記(108)驗證回文串

看上去很簡單&#xff0c;其實很麻煩。 一開始寫的遞歸&#xff0c;但是內存超限……搜了下發現原因是每次遞歸調用都會創建一個新的字符串副本&#xff0c;這在處理長字符串時會占用大量內存。 class Solution { public:bool isPalindrome(string s) {if(s.size()0||s.size(…

用css繪制收銀鍵盤

最近需求說需要自己弄個收銀鍵盤&#xff0c;于是乎直接上手搓 主要基于Vue3寫的&#xff0c;主要是CSS <template><view class"container"><view class"info"><image class"img" src"" mode"">&l…

智能車間管理系統(源碼+文檔+講解+演示)

引言 在現代制造業中&#xff0c;智能車間管理系統正成為推動工業4.0和智能制造的關鍵力量。它通過整合先進的信息技術和自動化技術&#xff0c;優化生產流程&#xff0c;提高生產效率&#xff0c;降低成本&#xff0c;并確保產品質量。 系統概述 智能車間管理系統采用前后端…

Model Context Protocol - Prompts

1. 概述 Model Context Protocol (MCP) 提供了一種標準化的方式&#xff0c;使服務器能夠向客戶端暴露提示模板&#xff08;prompts&#xff09;。Prompts 是服務器提供的結構化消息和指令&#xff0c;用于與語言模型進行交互。客戶端可以發現可用的提示、獲取其內容&#xff…

辦公自動化:使用 Python 生成 Word 文件:自動生成數據庫文檔 Word 文件

簡簡單單 Online zuozuo :本心、輸入輸出、結果 文章目錄 辦公自動化:使用 Python 生成 Word 文件:自動生成數據庫文檔 Word 文件前言一、環境準備二、編寫代碼三、編寫 Word 模版文件接收數據四、運行代碼,生成文件,大功告成五、說明辦公自動化:使用 Python 生成 Word 文…