0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java開發(fā)者LLM實戰(zhàn)——使用LangChain4j構(gòu)建本地RAG系統(tǒng)

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-07-02 10:32 ? 次閱讀

1、引言

由于目前比較火的chatGPT是預訓練模型,而訓練一個大模型是需要較長時間(參數(shù)越多學習時間越長,保守估計一般是幾個月,不差錢的可以多用點GPU縮短這個時間),這就導致了它所學習的知識不會是最新的,最新的chatGPT-4o只能基于2023年6月之前的數(shù)據(jù)進行回答,距離目前已經(jīng)快一年的時間,如果想讓GPT基于近一年的時間回復問題,就需要RAG(檢索增強生成)技術(shù)了。

wKgZomaDZquAZySvAALANhIlghM326.png

此外,對于公司內(nèi)部的私有數(shù)據(jù),為了數(shù)據(jù)安全、商業(yè)利益考慮,不能放到互聯(lián)網(wǎng)上的數(shù)據(jù),因此GPT也沒有這部分的知識,如果需要GPT基于這部分私有的知識進行回答,也需要使用RAG技術(shù)。

wKgZomaDZq-AGF5DAAMJVqUI0Gw144.png

本文將通過實戰(zhàn)代碼示例,意在幫助沒有大模型實戰(zhàn)經(jīng)驗的Java工程師掌握使用LangChain4j框架進行大模型開發(fā)。

2、基本概念

2.1 什么是RAG

RAG(Retrieval-Augmented Generation)的核心思想是:將傳統(tǒng)的信息檢索(IR)技術(shù)與現(xiàn)代的生成式大模型(如chatGPT)結(jié)合起來。

具體來說,RAG模型在生成答案之前,會首先從一個大型的文檔庫或知識庫中檢索到若干條相關(guān)的文檔片段。再將這些檢索到的片段作為額外的上下文信息,輸入到生成模型中,從而生成更為準確和信息豐富的文本。

RAG的工作原理可以分為以下幾個步驟:

1.接收請求:首先,系統(tǒng)接收到用戶的請求(例如提出一個問題)。

2.信息檢索(R):系統(tǒng)從一個大型文檔庫中檢索出與查詢最相關(guān)的文檔片段。這一步的目標是找到那些可能包含答案或相關(guān)信息的文檔。

3.生成增強(A):將檢索到的文檔片段與原始查詢一起輸入到大模型(如chatGPT)中,注意使用合適的提示詞,比如原始的問題是XXX,檢索到的信息是YYY,給大模型的輸入應該類似于:請基于YYY回答XXXX。

4.輸出生成(G):大模型基于輸入的查詢和檢索到的文檔片段生成最終的文本答案,并返回給用戶。

第2步驟中的信息檢索,不一定必須使用向量數(shù)據(jù)庫,可以是關(guān)系型數(shù)據(jù)庫(如MySQL)或全文搜索引擎(如Elasticsearch, ES),

但大模型應用場景廣泛使用向量數(shù)據(jù)庫的原因是:在大模型RAG的應用場景中,主要是要查詢相似度高的某幾個文檔,而不是精確的查找某一條(MySQL、ES擅長)。

相似度高的兩個文檔,可能不包含相同的關(guān)鍵詞。 例如,句子1: "他很高興。" 句子2: "他感到非常快樂。" 雖然都是描述【他】很開心快樂的心情,但是不包含相同的關(guān)鍵詞;

包含相同的關(guān)鍵詞的兩個文檔可能完全沒有關(guān)聯(lián),例如:句子1: "他喜歡蘋果。" 句子2: "蘋果是一家大公司。" 雖然都包含相同的關(guān)鍵詞【蘋果】,但兩句話的相似度很低。

2.2 LangChain4j簡介

LangChain4j是LangChiain的java版本,

LangChain的Lang取自Large Language Model,代表大語言模型,

Chain是鏈式執(zhí)行,即把語言模型應用中的各功能模塊化,串聯(lián)起來,形成一個完整的工作流。

它是面向大語言模型的開發(fā)框架,意在封裝與LLM對接的細節(jié),簡化開發(fā)流程,提升基于LLM開發(fā)的效率。

更多介紹,詳見: https://github.com/langchain4j/langchain4j/blob/main/README.md?

2.3 大模型開發(fā) vs. 傳統(tǒng)JAVA開發(fā)

大模型開發(fā)——大模型實現(xiàn)業(yè)務邏輯:

開發(fā)前,開發(fā)人員關(guān)注數(shù)據(jù)準備(進行訓練)、選擇和微調(diào)模型(得到更好的效果,更能匹配業(yè)務預期),

開發(fā)過程中(大多數(shù)時候),重點在于如何有效的與大模型(LLM)進行溝通,利用LLM的專業(yè)知識解決特定的業(yè)務問題,

開發(fā)中更關(guān)注如何描述問題(提示工程 Propmt Engineering)進行有效的推理,關(guān)注如何將大模型的使用集成到現(xiàn)有的業(yè)務系統(tǒng)中。

傳統(tǒng)的JAVA開發(fā)——開發(fā)者實現(xiàn)業(yè)務邏輯:

開發(fā)前,開發(fā)人員關(guān)注系統(tǒng)架構(gòu)的選擇(高并發(fā)、高可用),功能的拆解、模塊化等設(shè)計。

開發(fā)過程中(大多數(shù)時候)是根據(jù)特定的業(yè)務問題,設(shè)計特定的算法、數(shù)據(jù)存儲等以實現(xiàn)業(yè)務邏輯,以編碼為主。

3. 實戰(zhàn)經(jīng)驗

3.1 環(huán)境搭建

3.1.1 向量庫(Chroma)

Windows:

先安裝python,參考: https://docs.python.org/zh-cn/3/using/windows.html#the-full-installer

PS:注意需要配置環(huán)境變量

驗證-執(zhí)行:

python --version

wKgaomaDZrCAU7OgAAAXfU9xWxQ204.png

再安裝chroma,參考:https://docs.trychroma.com/getting-started

驗證-執(zhí)行:

chroma run

wKgZomaDZrGAVPT8AAB6U8_1Dr4536.png

Mac:

現(xiàn)先安裝python

brew install python

或者下載安裝: https://www.python.org/downloads/macos/

驗證-執(zhí)行:

python --version

wKgaomaDZrKAVN8hAACFwKUj46Q886.png

安裝chroma(同上),參考:https://docs.trychroma.com/getting-started

驗證-執(zhí)行:

chroma run

wKgZomaDZrOAZIeNAAG22JJ75Y0986.png

?

3.1.2 集成LangChain4j


        0.31.0


	dev.langchain4j
	langchain4j-core
	${langchain4j.version}


	dev.langchain4j
	langchain4j
	 ${langchain4j.version} 


	dev.langchain4j
	langchain4j-open-ai
	 ${langchain4j.version} 


	dev.langchain4j
	langchain4j-embeddings
	 ${langchain4j.version} 


	dev.langchain4j
	langchain4j-chroma
	 ${langchain4j.version} 


	io.github.amikos-tech
	chromadb-java-client
	 ${langchain4j.version} 

3.2 程序編寫

3.2.1 項目結(jié)構(gòu)

LangChain ├── core │ ├── src │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn.jdl.tech_and_data.ka │ │ │ │ ├── ChatWithMemory │ │ │ │ ├── Constants │ │ │ │ ├── Main │ │ │ │ ├── RagChat │ │ │ │ └── Utils │ │ │ ├── resources │ │ │ │ ├── log4j2.xml │ │ │ │ └── 笑話.txt │ │ ├── test │ │ │ └── java │ ├── target ├── pom.xml ├── parent [learn.langchain.parent] ├── pom.xml

?

3.2.2 知識采集

一般是公司內(nèi)網(wǎng)的知識庫中或互聯(lián)網(wǎng)上進行數(shù)據(jù)采集,獲取到的文本文件、WORD文檔或PDF文件,本文使用resources目錄下的【笑話.txt】作為知識采集的結(jié)果文件

URL docUrl = Main.class.getClassLoader().getResource("笑話.txt");
if(docUrl==null){
    log.error("未獲取到文件");
}
Document document = getDocument(docUrl);
if(document==null){
    log.error("加載文件失敗");
}
private static Document getDocument(URL resource) {
    Document document = null;
    try{
        Path path = Paths.get(resource.toURI());
        document = FileSystemDocumentLoader.loadDocument(path);
    }catch (URISyntaxException e){
        log.error("加載文件發(fā)生異常", e);
    }
    return document;
}

3.2.3 文檔切分

使用dev.langchain4j.data.document.splitter.DocumentSplitters#recursize

它有三個參數(shù):分段大小(一個分段中最大包含多少個token)、重疊度(段與段之前重疊的token數(shù))、分詞器(將一段文本進行分詞,得到token)

其中,重疊度的設(shè)計是為了減少按大小拆分后切斷原來文本的語義,使其盡量完整。

wKgaomaDZrSAN4cuAAG9bAJR9OQ826.png

DocumentSplitter splitter = DocumentSplitters.recursive(150,10,new OpenAiTokenizer());
splitter.split(document);

關(guān)于Token(標記)

Token是經(jīng)過分詞后的文本單位,即將一個文本分詞后得到的詞、子詞等的個數(shù),具體取決于分詞器(Tokenizer),

比如:我喜歡吃蘋果,可以拆分成我/喜歡/吃/蘋果,token數(shù)量=4, 也可以拆分成我/喜/歡/吃/蘋果,token數(shù)量=5

chatGPT使用的是BPE(Byte Pair Encoding)算法進行分詞,參見: https://en.wikipedia.org/wiki/Byte_pair_encoding

對于上面文本的分詞結(jié)果如下:

18:17:29.371 [main] INFO  TokenizerTest - 待分詞的文本:我喜歡吃蘋果
18:17:30.055 [main] INFO  cn.jdl.tech_and_data.ka.Utils - 當前的模型是:gpt-4o
18:17:31.933 [main] INFO  TokenizerTest - 分詞結(jié)果:我 / 喜歡 / 吃 / 蘋果

關(guān)于token與字符的關(guān)系:GPT-4o的回復:

wKgZomaDZraAKm17AAQnu5woQdQ880.png

關(guān)于文檔拆分的目的

由于與LLM交互的時候輸入的文本對應的token長度是有限制的,輸入過長的內(nèi)容,LLM會無響應或直接該報錯,

因此不能將所有相關(guān)的知識都作為輸入給到LLM,需要將知識文檔進行拆分,存儲到向量庫,

每次調(diào)用LLM時,先找出與提出的問題關(guān)聯(lián)度最高的文檔片段,作為參考的上下文輸入給LLM。

入?yún)⑦^長,LLM報錯:

wKgaomaDZreAGn0uAAEoBn5eOd8152.png

雖然根據(jù)響應,允許輸入1048576個字符=1024K個字符=1M個字符,

但官網(wǎng)文檔給的32K tokens,而一般1個中文字符對應1-2個Token,因此字符串建議不大于64K,實際使用中,為了保障性能,也是要控制輸入不要過長。

如下是常見LLM給定的token輸入上限:

模型名稱 Token 輸入上限(最大長度)
GPT-3 (davinci) 4096 tokens
GPT-3.5 (text-davinci-003) 4096 tokens
GPT-4 (8k context) 8192 tokens
GPT-4 (32k context) 32768 tokens
LLaMA (7B) 2048 tokens
LLaMA (13B) 2048 tokens
LLaMA (30B) 2048 tokens
LLaMA (65B) 2048 tokens
訊飛星火(SparkDesk) 8192 tokens
文心一言(Ernie 3.0) 4096 tokens
智源悟道(WuDao 2.0) 2048 tokens
阿里巴巴 M6 2048 tokens
華為盤古(Pangu-Alpha) 2048 tokens
言犀大模型(ChatJd) 2048 tokens

文檔拆分的方案langchain4j中提供了6種:

wKgZomaDZriABvhzAAKflZsl2jk436.png

1、基于字符的:逐個字符(含空白字符)分割

2、基于行的:按照換行符(n)分割

3、基于段落的:按照連續(xù)的兩個換行符(nn)分割

4、基于正則的:按照自定義正則表達式分隔

5、基于句子的(使用Apache OpenNLP,只支持英文,所以可以忽略

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104084
  • ChatGPT
    +關(guān)注

    關(guān)注

    28

    文章

    1517

    瀏覽量

    6915
  • LLM
    LLM
    +關(guān)注

    關(guān)注

    0

    文章

    247

    瀏覽量

    279
收藏 人收藏

    評論

    相關(guān)推薦

    LangChain框架關(guān)鍵組件的使用方法

    LangChain開發(fā)者可以輕松構(gòu)建基于RAG或者Agent流水線的復雜應用體系,而目前我們已經(jīng)可以在LangChain的關(guān)鍵組件
    的頭像 發(fā)表于 08-30 16:55 ?262次閱讀
    <b class='flag-5'>LangChain</b>框架關(guān)鍵組件的使用方法

    英特爾開發(fā)套件『哪吒』在Java環(huán)境實現(xiàn)ADAS道路識別演示 | 開發(fā)者實戰(zhàn)

    本文使用來自O(shè)penModelZoo的預訓練的road-segmentation-adas-0001模型。ADAS代表高級駕駛輔助服務。該模型識別四個類別:背景、道路、路緣和標記。硬件環(huán)境此文使用了英特爾開發(fā)套件家族里的『哪吒』(Nezha)開發(fā)板,其為研揚科技針對邊緣A
    的頭像 發(fā)表于 04-29 08:07 ?327次閱讀
    英特爾<b class='flag-5'>開發(fā)</b>套件『哪吒』在<b class='flag-5'>Java</b>環(huán)境實現(xiàn)ADAS道路識別演示 | <b class='flag-5'>開發(fā)者</b><b class='flag-5'>實戰(zhàn)</b>

    使用Redis和Spring?Ai構(gòu)建rag應用程序

    隨著AI技術(shù)的不斷進步,開發(fā)者面臨著如何有效利用現(xiàn)有工具和技術(shù)來加速開發(fā)過程的挑戰(zhàn)。Redis與SpringAI的結(jié)合為Java開發(fā)者提供了一個強大的平臺,以便快速
    的頭像 發(fā)表于 04-29 08:04 ?798次閱讀
    使用Redis和Spring?Ai<b class='flag-5'>構(gòu)建</b><b class='flag-5'>rag</b>應用程序

    【轉(zhuǎn)載】英特爾開發(fā)套件“哪吒”快速部署YoloV8 on Java | 開發(fā)者實戰(zhàn)

    部署到生產(chǎn)系統(tǒng)中。通過簡化的開發(fā)工作流程,OpenVINO可賦能開發(fā)者在現(xiàn)實世界中部署高性能應用程序和算法。 今天我們將基于哪吒開發(fā)者套件平臺來快速部署OpenVI
    的頭像 發(fā)表于 03-23 08:05 ?275次閱讀
    【轉(zhuǎn)載】英特爾<b class='flag-5'>開發(fā)</b>套件“哪吒”快速部署YoloV8 on <b class='flag-5'>Java</b> | <b class='flag-5'>開發(fā)者</b><b class='flag-5'>實戰(zhàn)</b>

    源碼開放,開發(fā)者手機 buff 疊滿

    開發(fā)者手機開源代碼編譯指導 編譯環(huán)境建議: ubuntu20.04 Linux 系統(tǒng)內(nèi)存:最低 16G Pyhon 3.8 安裝必要工具: sudo apt-get update sudo
    發(fā)表于 03-04 14:29

    ServiceNow、Hugging Face 和 NVIDIA 發(fā)布全新開放獲取 LLM,助力開發(fā)者運用生成式 AI 構(gòu)建企業(yè)應用

    ),將為性能、透明度和成本效益樹立新標準。 ? StarCoder2 的聯(lián)合開發(fā)者 BigCode 社區(qū)是由 ServiceNow 和 Hugging Face 共同管理。前者是一家領(lǐng)先的數(shù)字工作流公司,致力
    發(fā)表于 02-29 11:12 ?212次閱讀
    ServiceNow、Hugging Face 和 NVIDIA 發(fā)布全新開放獲取 <b class='flag-5'>LLM</b>,助力<b class='flag-5'>開發(fā)者</b>運用生成式 AI <b class='flag-5'>構(gòu)建</b>企業(yè)應用

    鴻蒙開發(fā)者預覽版如何?

    、原生智能、原生互聯(lián),6大極致原生體驗。 我初步閱讀了鴻蒙的源碼后,基本上可以確定是全自研底座,已經(jīng)看不到Android的身影了。作為開發(fā)者,如果想往鴻蒙方向發(fā)展,就需要系統(tǒng)性學起。鴻蒙的知識體系如下
    發(fā)表于 02-17 21:54

    鴻蒙系統(tǒng)優(yōu)缺點,能否作為開發(fā)者選擇

    星河版已經(jīng)是純血鴻蒙,但是它的發(fā)展一些周期。生態(tài)圈的建立難度大,各大廠商加入鴻蒙原生開發(fā)需要時間累積。 鴻蒙開發(fā)人才空缺,由于鴻蒙作為一款新型的系統(tǒng),程序員們都是從0學起。所以市面上很少有鴻蒙
    發(fā)表于 02-16 21:00

    探索LangChain構(gòu)建專屬LLM應用的基石

    LangChain通過Loader加載外部的文檔,轉(zhuǎn)化為標準的Document類型。Document類型主要包含兩個屬性:page_content 包含該文檔的內(nèi)容。meta_data 為文檔相關(guān)的描述性數(shù)據(jù),類似文檔所在的路徑等。
    發(fā)表于 01-30 10:33 ?515次閱讀
    探索<b class='flag-5'>LangChain</b>:<b class='flag-5'>構(gòu)建</b>專屬<b class='flag-5'>LLM</b>應用的基石

    LangChain 0.1版本正式發(fā)布

    LangChain 由 Harrison Chase 于 2022 年 10 月推出,是一個開源編排框架,用于使用 LLM 開發(fā)應用程序,推出后迅速脫穎而出,截至 2023 年 6 月,它是 GitHub 上增長最快的開源項目。
    的頭像 發(fā)表于 01-10 10:28 ?815次閱讀

    基于OpenVINO和LangChain構(gòu)建RAG問答系統(tǒng)

    隨著生成式 AI 的興起,和大語言模型對話聊天的應用變得非常熱門,但這類應用往往只能簡單地和你“聊聊家常”,并不能針對某些特定的行業(yè),給出非常專業(yè)和精準的答案。這也是由于大語言模型(以下簡稱 LLM
    的頭像 發(fā)表于 12-25 11:10 ?758次閱讀
    基于OpenVINO和<b class='flag-5'>LangChain</b><b class='flag-5'>構(gòu)建</b><b class='flag-5'>RAG</b>問答<b class='flag-5'>系統(tǒng)</b>

    歡迎加入飛騰派開發(fā)者社區(qū),感謝每一位開發(fā)者

    與此同時,飛騰在電子發(fā)燒友論壇構(gòu)建了在飛騰派開發(fā)者社區(qū),期待更多開發(fā)者不斷加入,積極參與社區(qū)貢獻,產(chǎn)出優(yōu)秀的技術(shù)內(nèi)容,讓更多開發(fā)者可以學習參考!飛騰派
    發(fā)表于 12-11 16:11

    如何利用OpenVINO加速LangChainLLM任務

    LangChain 是一個高層級的開源的框架,從字面意義理解,LangChain 可以被用來構(gòu)建 “語言處理任務的鏈條”,它可以讓AI開發(fā)人員把大型語言模型(
    的頭像 發(fā)表于 12-05 09:58 ?688次閱讀

    javaweb從入門到實戰(zhàn)

    JavaWeb是一門使用Java語言開發(fā)Web應用程序的技術(shù),它廣泛應用于各種網(wǎng)站和在線應用程序的開發(fā)。對于想要學習和使用JavaWeb技術(shù)的開發(fā)者來說,從入門到
    的頭像 發(fā)表于 12-03 11:44 ?1351次閱讀

    開發(fā)者福利月】聽開發(fā)者故事,享節(jié)日福利

    以 1024 之名 向開發(fā)者致敬 感謝你們用鍵盤和屏幕構(gòu)建出了 一個又一個令人驚嘆的數(shù)字世界 開發(fā)者們,節(jié)日快樂! 聽見你的故事 開發(fā)者們冷靜沉著的外表下藏著一顆充滿熱情的心,在上篇文
    的頭像 發(fā)表于 10-24 15:45 ?265次閱讀
    【<b class='flag-5'>開發(fā)者</b>福利月】聽<b class='flag-5'>開發(fā)者</b>故事,享節(jié)日福利