AI系列:大語言模型的RAG(檢索增強生成)技術(下)-- 使用LlamaIndex

目錄

  • 前言
  • 什么是LlamaIndex?
  • LlamaIndex代碼
    • 設置embedding模型
    • 設置LLM模型
    • 索引
    • 查詢機
  • 驗證
  • 使用感受
  • 參考資料

前言

繼上一篇文章AI系列:大語言模型的RAG(檢索增強生成)技術(上),這篇文章主要以LlamaIndex為案例來實現RAG技術。如對背景知識感興趣,請移步大語言模型的RAG(檢索增強生成)技術(上)。

什么是LlamaIndex?

從LlamaIndex官網,可以找到如下的介紹:

LlamaIndex is a framework for building context-augmented LLM applications.
LlamaIndex provides tooling to enable context augmentation. A popular example is Retrieval-Augmented Generation (RAG) which combines context with LLMs at inference time. Another is
finetuning.
翻譯成中文:
如LlamaIndex 是一個用于構建上下文增強型大型語言模型(LLM)應用的框架。
LlamaIndex 提供了工具來實現上下文增強。一個流行的例子是檢索增強生成(RAG),它在推理時將上下文與大型語言模型結合起來。另一個例子是微調(finetuning)。

LlamaIndex為實現RAG技術提供了很多工具,詳細信息可以參考官網。這里列出了一種實現方式,跟下方的代碼示例相匹配,圖示如下:

Reader
閱讀器
Retriever
檢索器

生成
Documents
pdf等資料
Index
向量索引
Embedding Model
嵌入模型
query
問題查詢
queryEngine
查詢器
LLM
大語言模型

LlamaIndex代碼

本部分代碼參考了LlamaIndex官網的RAG Starter Tutorial (OpenAI) 和Starter Tutorial (Local Models)等文檔。

RAG Starter Tutorial (OpenAI) 中提到了一個使用OpenAI服務的例子,只需5行代碼即可實現RAG。
如果使用OpenAI服務,則可以跳過下方embedding模型和LLM模型的設置,配好OPENAI_API_KEY環境變量即可。

設置embedding模型

因為沒有OpenAI的token,采用HuggingFace服務器上的北京智源bge-small-en-v1.5作為嵌入模型。

from llama_index.core import Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
Settings.embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")

設置LLM模型

對于大型語言模型(LLM),我使用的是本地運行的Ollama服務器上的gemma:2b模型。由于我的個人筆記本配置較低(M1芯片,8G內存),我只能運行參數最低的模型。盡管如此,這并不影響我們演示RAG流程的基本原理:

from llama_index.llms.ollama import Ollama
gemma_2b = Ollama(model="gemma:2b", request_timeout=30.0)
Settings.llm = gemma_2b

LlamaIndex官網也提供了使用Hugging Face模型(本地及遠程)及其他類型模型的代碼示例,參見Hugging face LLMs。

索引

這部分代碼參考了官網RAG Starter Tutorial (OpenAI) 中的例子。不同的是,我使用的是本地硬盤上的一篇介紹llama2的pdf文檔,之后我會做關于llama2的提問。

這里包括嵌入向量索引的創建和持久化。如果去掉持久化這個非必需的部分,其實只需要兩行代碼。

PERSIST_DIR = "./storage"
if not os.path.exists(PERSIST_DIR):documents = SimpleDirectoryReader("./articles").load_data()# store docs into vector DB 將文檔切塊,計算嵌入向量,并索引index = VectorStoreIndex.from_documents(documents)# store it for later 持久化數據到本地磁盤index.storage_context.persist(persist_dir=PERSIST_DIR)
else:# load the existing index 直接讀取本地磁盤數據到索引中storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)index = load_index_from_storage(storage_context)

查詢機

LlamaIndex提供了query engine,它可以通過retriever檢索到index索引中語義相近的文檔,與初始問題合并提供給大語言模型。
這里也只需要兩行代碼。

# 
query_engine = index.as_query_engine()
response = query_engine.query("Is there Llama 2 70B?")
print(response) 

如果你想獲得更大的靈活性,也可以顯示的定義retriever檢索器。

驗證

提問:

Is there Llama 2 70B?

gemma:2b大模型實在是個玩具,只能提問這樣簡單的問題。復雜點的問題它回答的亂七八糟。

執行程序,gemma:2b基于檢索獲得的增強上下文,回答正確:

Yes, Llama2 70B is mentioned in the context information. It is a large language model that outperforms all open-source models.
在這里插入圖片描述

如果不使用上述程序,而直接提問它相同的問題,得到的答案則是無法回答相關問題:

I am unable to access external sources or provide real-time information, therefore I cannot answer this question.
在這里插入圖片描述

使用感受

LlamaIndex使得RAG的實現變得簡單。它的結構看起來非常簡潔和優雅。
但是實際生產中可能涉及到的細節則很多,比如切塊的粒度,檢索的各種特性,提示語的自定義,等等。很多在Llama index是支持的,但使用效果有待驗證。
LlamaIndex的設計理念及其發展值得持續關注。

參考資料

  • 什么是LlamaIndex?
    -https://docs.llamaindex.ai/en/stable/
  • LlamaIndex RAG Starter Tutorial (OpenAI) https://docs.llamaindex.ai/en/stable/getting_started/starter_example/
  • LlamaIndex RAG Starter Tutorial (Local Models) https://docs.llamaindex.ai/en/stable/getting_started/starter_example_local/
  • LlamaIndex query engine
    https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/
  • LlmaIndex [Hugging face LLMs]
    https://docs.llamaindex.ai/en/stable/examples/llm/huggingface/)

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

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

相關文章

銀行業數據運營場景下的數據埋點方案

1、引言 隨著金融科技的快速發展,銀行業的數據運營變得日益重要。數據埋點作為數據收集的重要手段,對于銀行業務的精細化運營、風險管理和產品迭代等方面起著至關重要的作用。本方案將針對銀行業數據運營場景,設計一套完整的數據埋點方案&am…

【生信技能樹】GEO數據挖掘全流程

R包的安裝,每次做分析的時候先運行這段代碼把R包都安裝好了,這段代碼不需要任何改動,每次分析直接運行。 options("repos""https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packag…

思源筆記如何結合群暉WebDav實現云同步數據

文章目錄 1. 開啟群暉WebDav 服務2. 本地局域網IP同步測試3. 群暉安裝Cpolar4. 配置遠程同步地址5. 筆記遠程同步測試6. 固定公網地址7. 配置固定遠程同步地址 在數字化時代,信息的同步與共享變得尤為重要。無論是個人用戶還是企業團隊,都渴望能夠實現跨…

nginx 代理java 請求報502

情況:nginx代理java 請求 后端返回正常,但是經過nginx 時報502 經過多次對比其他接口發現可能是返回的請求頭過大,導致nginx 報錯:如下 2024/05/13 02:57:12 [error] 88#88: *3755 upstream sent too big header while reading r…

創建存儲過程

一、DDL與DML CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,createDate DATETIME NOT NULL,userName VARCHAR(255) NOT NULL,phone VARCHAR(20) NOT NULL,age INT NOT NULL,sex ENUM(男, 女) NOT NULL,introduce TEXT ); INSERT INTO student (createDate, userN…

透明加密軟件推薦:哪款實用又高效?

透明加密軟件是一種專門針對文件保密需求的計算機加密工具。 其核心在于“透明”二字,意味著整個加密過程對于使用者來說是無形且無感知的。 當用戶進行文件的日常操作,如打開、編輯或保存時,透明加密軟件會在后臺自動進行加密和解密工作&a…

【算法刷題day52】Leetcode:300. 最長遞增子序列、674. 最長連續遞增序列、718. 最長重復子數組

文章目錄 Leetcode 300. 最長遞增子序列解題思路代碼總結 Leetcode 674. 最長連續遞增序列解題思路代碼總結 Leetcode 718. 最長重復子數組解題思路代碼總結 草稿圖網站 java的Deque Leetcode 300. 最長遞增子序列 題目:300. 最長遞增子序列 解析:代碼隨…

Keil編程不同驅動文件引用同一個常量的處理方法

基礎不牢,地動山搖,最近單片機編程又遇到一個基礎問題。 我在頭文件中定義了一個常量同時給兩個驅動文件使用,封裝的時候編譯沒問題,但是在main函數中引用驅動函數的時候就出現了重定義的問題,如下如所示。 解決方法很…

Windows 11 下 kafka 的安裝踩坑

安裝 windows系統kafka小白入門篇——下載安裝,環境配置,入門代碼書寫(推薦) kafka在windows下安裝和使用入門教程 問題1 參考鏈接 運行kafka集成的zookeeper時,命令:bin\windows\zookeeper-server-star…

05. 【Java教程】第一個 Java 程序

本節我們將以Windows操作系統為例,編寫并執行第一個Java程序。在這之前,請確保你的操作系統上已經安裝了JDK 1. 編譯程序 大家可能有個疑問,為什么需要編譯程序呢?計算機不能直接執行我們編寫的源代碼嗎? 這是由于計…

指針由淺入深

1.變量與地址 2.指針與指針變量 3.直接訪問和間接訪問 4.空指針與野指針 5.空類型 6.定義與初始化的書寫規則 7.指針運算 8.指針與數組 指針與一維數組 指針與二維數組 指針與字符數組 9.const與指針 10.指針數組和數組指針 11.多級指針 #include<stdio.h> #include<…

CPU利用率使用教程

本文主要參考&#xff1a; 一文讓你學到 nmon最詳盡的用法 Linux性能監控命令_nmon 安裝與使用 如果你是在Ubuntu上安裝nmon&#xff0c;使用&#xff1a; apt install nmon安裝好后&#xff0c;直接運行 $:nmon #運行如果是后臺抓數據&#xff1a; -f 參數: 生成文件,文件…

python 虛擬環境多種創建方式

【一】說明介紹 &#xff08;1&#xff09;什么是虛擬環境 在Python中&#xff0c;虛擬環境&#xff08;Virtual Environment&#xff09;是一個獨立的、隔離的Python運行環境&#xff0c;它擁有自己的Python解釋器、第三方庫和應用程序。通過創建虛擬環境&#xff0c;可以確…

【刷題(2)】矩陣

一、矩陣問題基礎 遍歷&#xff1a; for i in range(len(matrix[0])): for j in range(len(matrix): while 倒序遍歷&#xff1a; for i in range(right,left,-1) 臨時存儲&#xff1a;temp w,h:len(matrix[0])-1 len(matrix)-1 left,right,top,bottom:0 len(matrix[0])-1 0 l…

Cesium 3DTileset Style 原理簡析

Cesium 3DTileset Style 原理簡析 應用層會看到這樣的使用。那么原理是什么, 為啥寫 height, 除了這個還有啥? const tileset await Cesium.Cesium3DTileset.fromUrl("../../public/tileset/building/tileset.json"); tileset.style new Cesium.Cesium3DTileSty…

HarmonyOS應用模型Stage基本介紹

文章目錄 <font colorcoral> HarmonyOS應用模型概況<font colorcoral> Stage模型基本概念<font colorcoral> Stage模型UIAbiliry的生命周期<font colorcoral> Stage模型的配置文件<font colorcoral> 寫在后面的話<font colorcoral>Referen…

學校NTP時鐘系統(時間同步系統)方案助力建設智慧校園

學校NTP時鐘系統&#xff08;時間同步系統&#xff09;方案助力建設智慧校園 學校NTP時鐘系統&#xff08;時間同步系統&#xff09;方案助力建設智慧校園 建設智慧校園也意味著校內網絡設備和服務器劇增&#xff0c;如何保障智慧校園內各數字系統時序一致、維穩運行成為一大難…

【八大排序算法】插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序、歸并排序、計數排序

文章目錄 一、排序的相關概念二、排序類型三、排序算法實現插入排序1.直接插入排序2.希爾排序 選擇排序3.簡單選擇排序4.堆排序 交換排序5.冒泡排序6.快速排序遞歸實現非遞歸實現 7.歸并排序遞歸實現非遞歸實現 8.計數排序 四、總結 一、排序的相關概念 排序&#xff1a;根據數…

WebLogic問題集

console登錄后&#xff0c;頁面顯示卡頓 解決方法&#xff1a; 將Java的配置文件JAVA_HOME\jre\lib\securetty\java.security中的 securerandom.sourcefile:/dev/random修改為 securerandom.sourcefile:/dev/./random修改后&#xff0c;重啟WLS即可。