深入探索RAG:用LlamaIndex為大語言模型擴展知識,實現智能檢索增強生成

大型語言模型(LLM),如ChatGPT和Llama,在回答問題方面表現出色,但它們的知識僅限于訓練時所獲取的信息。它們無法訪問私有數據,也無法在訓練截止日期之后學習新知識。那么,核心問題就是……我們如何擴展它們的知識范圍?

答案就在于檢索增強生成(RAG)。今天,我們將探討RAG的工作流程,并演示如何使用LlamaIndex構建一個RAG系統。

讓我們開始吧!

Building a RAG Application Using LlamaIndex


檢索增強生成(RAG):基礎知識

LLM是目前最先進的自然語言處理模型,在翻譯、寫作和通用問答方面表現優異。然而,它們在處理特定領域的問題時常常會出現幻覺式的錯誤回答。

在這些場景下,只有極少數文檔可能包含每個查詢所需的相關上下文。為了解決這個問題,我們需要一個高效的系統,能夠在生成回復前快速檢索并整合相關信息——這正是RAG的核心。

預訓練的LLM通過三種主要方式獲取知識,每種方式都有局限性:

  • 訓練:從零開始訓練一個LLM需要在數萬億個標記(token)上訓練龐大的神經網絡,成本高達數億美元——對于大多數人來說并不可行。

  • 微調:這種方式可以讓預訓練模型適應新數據,但耗時且資源消耗大。除非有特定需求,否則并不總是實用。

  • 提示(Prompting):這是最易用的方法,將新信息插入LLM的上下文窗口,使其能基于所提供的數據回答問題;但由于文檔往往超出上下文窗口的容量,僅靠這種方法并不足夠。

RAG通過在查詢時高效地處理、存儲和檢索相關的文檔片段,克服了上述局限。這確保了LLM能夠生成更準確、具備上下文感知的回復,而無需進行昂貴的再訓練或微調。


RAG流程的核心組成部分

RAG系統由幾個關鍵組件組成:

簡易RAG應用架構示意圖 (原文配圖,略)

  • 文本分割器(Text Splitter):將大型文檔拆分為可適應LLM上下文窗口的小塊。

  • 嵌入模型(Embedding Model):將文本轉換為向量表示,以實現高效的相似度搜索。

  • 向量存儲(Vector Store):專用數據庫,用于存儲和檢索文檔嵌入及其元數據。

  • 大語言模型(LLM):核心語言模型,基于檢索到的信息生成答案。

  • 工具函數(Utility Functions):包括網頁檢索器、文檔解析器等工具,用于數據預處理和增強檢索效果。

每個組件在提升RAG系統的準確性和效率方面都起著至關重要的作用。


什么是LlamaIndex?

LlamaIndex(原名GPTIndex)是一個用于構建LLM驅動應用的Python框架。它充當自定義數據源與大型語言模型之間的橋梁,簡化了數據的攝取、索引和查詢過程。

LlamaIndex內置支持多種數據源、向量數據庫和查詢接口,是RAG應用的一體化解決方案。同時,它還可無縫集成LangChain、Flask、Docker等工具,非常適合實際場景的靈活部署。

可在其官方GitHub倉庫查看更多信息。


用LlamaIndex實現簡單的RAG系統

步驟1:環境準備

在實現之前,需要先搭建Python環境并安裝必要依賴。使用虛擬環境有助于高效管理依賴:

python -m venv rag_env
source rag_env/bin/activate ?# Windows系統使用:rag_env\Scripts\activate

現在可以安裝所需庫。LlamaIndex、OpenAI和FAISS是搭建RAG系統的核心依賴:

pip install llama-index openai faiss-cpu

若要讓LlamaIndex能調用OpenAI模型,別忘了配置OpenAI API密鑰:

import os?
os.environ["OPENAI_API_KEY"] = "your-api-key-here"

步驟2:加載文檔

為了實現檢索,首先需將文檔加載到系統中。LlamaIndex提供了SimpleDirectoryReader來高效完成此任務。這次我們以“Attention Is All You Need”論文擴展LLM的知識為例。

from llama_index import SimpleDirectoryReader# 從指定目錄加載文本文件
documents = SimpleDirectoryReader("./data").load_data()print(f"Loaded {len(documents)} documents")

步驟3:文本分割

LLM有上下文窗口限制,無法一次處理完整文檔。因此,需要將文檔拆分為更小、結構化的片段以便高效檢索。

from llama_index.text_splitter import SentenceSplitter# 定義基于句子的文本分割器
text_splitter = SentenceSplitter(chunk_size=512, chunk_overlap=50)# 將文檔進行分割
nodes = text_splitter.split_text([doc.text for doc in documents])print(f"Split into {len(nodes)} chunks")

步驟4:用嵌入索引文檔

要實現語義檢索,必須將文檔片段轉換為向量嵌入,并存儲在索引中。

from llama_index import VectorStoreIndex# 創建索引
index = VectorStoreIndex(nodes)# 持久化索引(可選)
index.storage_context.persist(persist_dir="./storage")

步驟5:用RAG查詢索引

這一步RAG開始發揮作用。我們將對已索引文檔進行檢索并生成由LLM驅動的回復。

from llama_index.query_engine import RetrieverQueryEnginequery_engine = RetrieverQueryEngine.from_args(index.as_retriever())response = query_engine.query("What is attention?")
print(response)

執行上述代碼后,可得到如下回答:

“Attention是一種在深度學習模型中用來關注輸入序列中相關部分的機制。在論文《Attention Is All You Need》中,Vaswani等人提出了Transformer架構,這一架構完全依賴自注意力機制,而非循環或卷積。其核心創新就是自注意力機制,使模型能夠衡量句中不同詞語之間的重要性,從而實現更好的并行化和遠距離依賴建模。”

我們成功了!


結語

借助LlamaIndex構建RAG系統,為LLM突破訓練數據的限制帶來了令人興奮的可能性。通過集成文檔檢索、基于嵌入的索引以及實時查詢,RAG提升了準確性并減少了幻覺現象,非常適合特定領域的應用。

根據本指南的分步實現,你已經擁有一個可擴展的RAG流程。你還可以從以下方向進一步擴展:

  • 用OpenAI、Cohere或Hugging Face等模型自定義嵌入

  • 集成Pinecone、Weaviate或ChromaDB等向量數據庫以實現可擴展檢索

  • 通過Flask、FastAPI或聊天機器人接口將系統部署為API

  • 優化文本切分策略以提升檢索質量

現在輪到你了——大膽嘗試、不斷迭代,探索LlamaIndex的無限可能吧!

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

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

相關文章

【延遲雙刪】簡單解析

使用場景:【高并發】情況下的做【更新操作】 什么是延遲雙刪 首次刪除:當需要更新某個數據項時,首先刪除緩存中的該項。 更新數據庫:接著,更新數據庫中的該項。 短暫延遲:然后等待一段很短的時間&#xff…

解決Windows安全中心顯示空白頁面

1、電腦重裝系統后,發現原本一些軟件打不開了,電腦莫名認為有病毒,自動刪除插件。附圖。 2、第一反應是電腦防火墻的原因,默認威脅防護識別到了病毒軟件,自動刪除。在開始屏幕搜Windows安全中心,打開之后發…

【回眸】error: failed to compile `xxxxxx`重裝rust環境

在ubuntu上安裝軟件報錯 error: failed to compile cxx2flow v0.6.2 Caused by: package cargo-platform v0.1.9 cannot be built because it requires rustc 1.78 or newer, while the currently active rustc version is 1.75.0 Try re-running cargo install with --lo…

算法—冒泡排序—js(教學示例、小數據)

冒泡排序原理 冒泡排序是一種簡單的排序算法,通過重復遍歷數組,比較相鄰元素并交換位置,使較大的元素逐漸“浮”到數組末尾。 特點 時間復雜度:平均 O(n),最優(已有序時)O(n) 空間復雜度&#…

linux sysfs的使用

在Linux內核驅動開發中&#xff0c;device_create_file 和 device_remove_file 用于動態創建/刪除設備的 sysfs 屬性文件&#xff0c;常用于暴露設備信息或控制參數。以下是完整示例及詳細說明&#xff1a; 1. 頭文件引入 #include <linux/module.h> #include <linux/…

利用 Deepseek 和 Mermaid 畫流程圖

提示詞 你是一個產品經理&#xff0c;請繪制一個報名比賽的流程圖&#xff0c;要求生成符合Mermaid語法的代碼&#xff0c;具體要求如下&#xff1a; 1.注冊賬號 2.填寫報名信息 3.參加比賽 4.查看比賽結果 生成的結果 flowchart TDA([開始]) --> B[注冊賬號]B --> C{賬…

【圖像標注技巧】目標檢測圖像標注技巧

介紹一些圖像標注技巧。之前引用過別人的文章 yolo目標檢測 技巧 trick 提升模型性能&#xff0c;deep research檢測調研報告也可以進行參考。 拉框類的標注&#xff0c;如果你不確定哪種方法好&#xff0c;你可以把所標注區域的都剪切出來&#xff0c;然后站在屏幕一米之外瞇…

數字信號處理技術架構與功能演進

數字信號處理&#xff08;DSP&#xff09;是通過數字運算實現信號分析、變換、濾波及調制解調的技術領域&#xff0c;其發展過程與技術應用如下&#xff1a; 一、定義與核心功能 技術定義&#xff1a;通過算法將模擬信號轉換為數字形式進行處理&#xff0c;具有高精度、可編程…

瀏覽器上下文通信

文章目錄 瀏覽器上下文通信同源通信同源通信流程同一瀏覽器上下文通信不同瀏覽器上下文通信 跨域通信前端和前端跨域前端和后端跨域 瀏覽器上下文通信 瀏覽器上下文通信分為兩種&#xff1a;同源和跨源。同樣的同源通信也分為同一瀏覽器上下文和不同的瀏覽器上下文。 同源通信…

Linux 離線部署 Docker 18.06.3 終極指南(附一鍵安裝卸載腳本)

Linux 離線部署 Docker 18.06.3 終極指南&#xff08;附一鍵安裝/卸載腳本&#xff09; 摘要&#xff1a;本文針對無外網環境的 Linux 服務器&#xff0c;提供基于二進制包的 Docker 18.06.3 離線安裝全流程指南。包含自動化腳本設計、服務配置優化及安全卸載方案&#xff0c;…

【前端】跟著maxkb學習logicflow流程圖畫法

文章目錄 背景1. 選定學習對象-maxkb應用邏輯編排2. 確定實現框架3. 關鍵邏輯&#xff1a;查看app-node.js4. 學習開始節點繪制流程數據形式 5. 給節點增加表單輸入框遇到過的問題 背景 看看前端如何繪制流程圖&#xff0c;界面好看點。 "logicflow/core": "1.…

Android 12系統靜態壁紙深度定制指南

1. 需求背景與實現原理 在Android 12系統ROM定制開發中&#xff0c;擴展靜態壁紙功能需要深入理解WallpaperManagerService的架構體系。系統壁紙管理通過雙端協作實現&#xff1a; WallpaperManagerService&#xff08;frameworks層&#xff09;&#xff1a;負責壁紙狀態管理、…

相得益彰 — 基于 GraphRAG 事理圖譜驅動的實時金融行情新聞資訊洞察

*本文為亞馬遜云科技博客文章&#xff0c;僅用于技術分享&#xff0c;不構成投資建議或金融決策支持。文中涉及的公司名稱僅用于技術示例&#xff0c;不代表亞馬遜云科技觀點或與這些公司的商業合作關系。 背景介紹 在當今這個信息爆炸的時代&#xff0c;金融市場每天都在產生…

OpenCV---圖像預處理(四)

OpenCV—圖像預處理&#xff08;四&#xff09; 文章目錄 OpenCV---圖像預處理&#xff08;四&#xff09;九&#xff0c;圖像掩膜9.1 制作掩膜9.2 與運算9.3 顏色替換9.3.19.3.2 顏色替換 十&#xff0c;ROI切割十 一&#xff0c;圖像添加水印11.1模板輸入11.2 與運算11.3 圖像…

【MySQL】:數據庫事務管理

一&#xff1a;學習路徑 &#xff08;1&#xff09;下載安裝mysql &#xff08;2&#xff09;學習語言&#xff1a;SQL(操作數據庫&#xff09; &#xff08;3&#xff09;mysql集群&#xff08;提升數據庫存儲效率&#xff09; &#xff08;4&#xff09;SQL使用&#xff0c;M…

內存函數和動態內存管理

目錄 一、memcpy庫函數介紹 1. memcpy的使用 2. memcpy的模擬 二、memmove庫函數介紹 1. memmove的使用 2. memmove的模擬 三、memset庫函數介紹 四、memcmp庫函數介紹 五、動態內存中malloc和free 1. malloc 2. free 六、動態內存中calloc和realloc 1. calloc 2. realloc 七、…

yarn的基本介紹

1.Hadoop的三大結構及各自的作用&#xff1a; Hadoop是一個開源的分布式計算框架&#xff0c;它主要包括三大核心組件&#xff1a;HDFS&#xff08;Hadoop Distributed File System&#xff09;、YARN&#xff08;Yet Another Resource Negotiator&#xff09;和MapReduce。以…

STM32的啟動方式

目錄 一、從主閃存存儲器啟動&#xff08;Main Flash Memory&#xff09; 二、從系統存儲器啟動&#xff08;System Memory&#xff09; 三、從內置SRAM啟動&#xff08;Embedded SRAM&#xff09; 四、從外掛存儲介質啟動的實現方式 1. 存儲介質選型 2. 硬件連接 3. 引…

STC定時器頻率占空比程序

// // 一、宏定義區 // #include <STC15.H> //頭文件 #include <intrins.h> //庫函數文件 #define FOSC 12000000L //IRC頻率 typedef …

數據庫服務器架構

ORM ORM&#xff08;Object Relational Mapping&#xff09;&#xff1a;對象與關系數據之間的映射 映射關系表&#xff1a; 類&#xff08;class&#xff09;—— 數據庫的表&#xff08;table&#xff09; 對象&#xff08;object&#xff09;——記錄&#xff08;record…