那曲檬骨新材料有限公司

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

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

3天內不再提示

Java開發者LLM實戰——使用LangChain4j構建本地RAG系統

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

1、引言

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

wKgZomaDZquAZySvAALANhIlghM326.png

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

wKgZomaDZq-AGF5DAAMJVqUI0Gw144.png

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

2、基本概念

2.1 什么是RAG

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

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

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

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

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

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

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

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

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

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

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

2.2 LangChain4j簡介

LangChain4j是LangChiain的java版本,

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

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

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

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

2.3 大模型開發 vs. 傳統JAVA開發

大模型開發——大模型實現業務邏輯:

開發前,開發人員關注數據準備(進行訓練)、選擇和微調模型(得到更好的效果,更能匹配業務預期),

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

開發中更關注如何描述問題(提示工程 Propmt Engineering)進行有效的推理,關注如何將大模型的使用集成到現有的業務系統中。

傳統的JAVA開發——開發者實現業務邏輯:

開發前,開發人員關注系統架構的選擇(高并發、高可用),功能的拆解、模塊化等設計。

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

3. 實戰經驗

3.1 環境搭建

3.1.1 向量庫(Chroma)

Windows:

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

PS:注意需要配置環境變量

驗證-執行:

python --version

wKgaomaDZrCAU7OgAAAXfU9xWxQ204.png

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

驗證-執行:

chroma run

wKgZomaDZrGAVPT8AAB6U8_1Dr4536.png

Mac:

現先安裝python

brew install python

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

驗證-執行:

python --version

wKgaomaDZrKAVN8hAACFwKUj46Q886.png

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

驗證-執行:

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 項目結構

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 知識采集

一般是公司內網的知識庫中或互聯網上進行數據采集,獲取到的文本文件、WORD文檔或PDF文件,本文使用resources目錄下的【笑話.txt】作為知識采集的結果文件

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("加載文件發生異常", e);
    }
    return document;
}

3.2.3 文檔切分

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

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

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

wKgaomaDZrSAN4cuAAG9bAJR9OQ826.png

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

關于Token(標記)

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

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

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

對于上面文本的分詞結果如下:

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 - 分詞結果:我 / 喜歡 / 吃 / 蘋果

關于token與字符的關系:GPT-4o的回復:

wKgZomaDZraAKm17AAQnu5woQdQ880.png

關于文檔拆分的目的

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

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

每次調用LLM時,先找出與提出的問題關聯度最高的文檔片段,作為參考的上下文輸入給LLM。

入參過長,LLM報錯:

wKgaomaDZreAGn0uAAEoBn5eOd8152.png

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

但官網文檔給的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、基于段落的:按照連續的兩個換行符(nn)分割

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

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

審核編輯 黃宇

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

    關注

    19

    文章

    2974

    瀏覽量

    105139
  • ChatGPT
    +關注

    關注

    29

    文章

    1568

    瀏覽量

    8057
  • LLM
    LLM
    +關注

    關注

    0

    文章

    299

    瀏覽量

    400
收藏 人收藏

    評論

    相關推薦

    開發者的開源鴻蒙故事

    近日,在以“一切為了開發者”為主題的“2024開放原子開發者大會暨首屆開源技術學術大會”上,開源鴻蒙5.0 Release版本正式發布,備受各方關注。該版本在系統完備度、分布式創新、開發者
    的頭像 發表于 01-06 10:28 ?177次閱讀

    《HarmonyOS第一課》煥新升級,賦能開發者快速掌握鴻蒙應用開發

    注重理論與實踐的結合,提供讓開發者快速上手的codelab編程練習,開發者能在實戰中鞏固所學,系統掌握核心開發技能。完成課程后,
    發表于 01-02 14:24

    RAG的概念及工作原理

    檢索增強型生成(RAG系統正在重塑我們處理AI驅動信息的方式。作為架構師,我們需要理解這些系統的基本原理,從而有效地發揮它們的潛力。 什么是RAG? 總體而言,
    的頭像 發表于 12-17 13:41 ?453次閱讀
    <b class='flag-5'>RAG</b>的概念及工作原理

    使用OpenVINO和LlamaIndex構建Agentic-RAG系統

    RAG 系統的全稱是 Retrieval-augmented Generation,本質上是 Prompt Engineering,通過在 Prompt 中注入檢索得到的外部數據,可以有效地
    的頭像 發表于 10-12 09:59 ?338次閱讀
    使用OpenVINO和LlamaIndex<b class='flag-5'>構建</b>Agentic-<b class='flag-5'>RAG</b><b class='flag-5'>系統</b>

    KaihongOS 4.1.2開發者預覽版正式上線,誠邀開發者免費試用!

    獨特的搶先體驗機會,涵蓋了原生應用開發、分布式能力、原子化服務等核心功能特性,助力開發者探索國產操作系統的更多可能性。此次發布的預覽版適配RK3568、RK358
    的頭像 發表于 09-28 08:07 ?390次閱讀
    KaihongOS 4.1.2<b class='flag-5'>開發者</b>預覽版正式上線,誠邀<b class='flag-5'>開發者</b>免費試用!

    OpenVINO? C++ 在哪吒開發板上推理 Transformer 模型|開發者實戰

    使用OpenVINO定制你的AI助手丨開發者實戰作者:王國強蘇州嘉樹醫療科技有限公司算法工程師指導:顏國進英特爾邊緣計算創新大使研揚科技針對邊緣AI行業開發者推出的『哪吒』(Nezha)開發
    的頭像 發表于 09-28 08:01 ?433次閱讀
    OpenVINO? C++ 在哪吒<b class='flag-5'>開發</b>板上推理 Transformer 模型|<b class='flag-5'>開發者</b><b class='flag-5'>實戰</b>

    KaihongOS 4.1.2開發者預覽版正式上線,誠邀開發者免費試用!

    開發者提供了獨特的搶先體驗機會,涵蓋了原生應用開發、分布式能力、原子化服務等核心功能特性,助力開發者探索國產操作系統的更多可能性。 此次發布的預覽版適配RK3568、RK3588、ES
    的頭像 發表于 09-26 15:59 ?510次閱讀

    LangChain框架關鍵組件的使用方法

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

    英特爾開發套件『哪吒』在Java環境實現ADAS道路識別演示 | 開發者實戰

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

    使用Redis和Spring?Ai構建rag應用程序

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

    【轉載】英特爾開發套件“哪吒”快速部署YoloV8 on Java | 開發者實戰

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

    源碼開放,開發者手機 buff 疊滿

    開發者手機開源代碼編譯指導 編譯環境建議: ubuntu20.04 Linux 系統內存:最低 16G Pyhon 3.8 安裝必要工具: sudo apt-get update sudo
    發表于 03-04 14:29

    ServiceNow、Hugging Face 和 NVIDIA 發布全新開放獲取 LLM,助力開發者運用生成式 AI 構建企業應用

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

    鴻蒙開發者預覽版如何?

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

    鴻蒙系統優缺點,能否作為開發者選擇

    星河版已經是純血鴻蒙,但是它的發展一些周期。生態圈的建立難度大,各大廠商加入鴻蒙原生開發需要時間累積。 鴻蒙開發人才空缺,由于鴻蒙作為一款新型的系統,程序員們都是從0學起。所以市面上很少有鴻蒙
    發表于 02-16 21:00
    百家乐官网返水1.2不限| 全讯网跑狗图| 百家乐官网单机游戏免费| 怎么赌百家乐能赢| 百家乐官网怎么玩呀| 柬埔寨百家乐的玩法技巧和规则| 百家乐官网赌场网| 棋牌评测网| 沙龙百家乐怎申请| 大佬百家乐官网现金网| 在线百家乐作| 澳门百家乐官网真人斗地主| 易发棋牌官网| 百家乐板路| 百家乐官网大娱乐场开户注册| 网络轮盘| 金世豪百家乐的玩法技巧和规则| 任你博百家乐官网的玩法技巧和规则| 京城国际娱乐城| 百家乐路有几家| 荷规则百家乐官网的玩法技巧和规则| 破解百家乐| 百家乐合作| 做生意放什么东西招财| 百家乐官网翻天片尾曲| 在线玩轮盘| 百家乐技巧经| 永利高百家乐开户| 百家乐官网玩法介绍图片| 亚洲博彩网| 威尼斯人娱乐网反| 现场百家乐百家乐| 百家乐官网有公式| 百家乐官网天天赢钱| 赢钱的棋牌游戏| 狮威百家乐娱乐场| 三公百家乐官网在线哪里可以| 哪里有百家乐官网赌博网站 | 百家乐官网百博亚洲| 肯博百家乐官网现金网| 大发888娱乐城下载|