《AI大模型應知應會100篇》第57篇:LlamaIndex使用指南:構建高效知識庫

第57篇:LlamaIndex使用指南:構建高效知識庫


摘要

在大語言模型(LLM)驅動的智能應用中,如何高效地管理和利用海量知識數據是開發者面臨的核心挑戰之一。LlamaIndex(原 GPT Index) 是一個專為構建大模型知識庫設計的框架,它提供了從數據攝入、索引構建到查詢優化的完整解決方案。

本文將全面介紹 LlamaIndex 的核心功能和技術特點,并通過實戰代碼示例展示如何構建高效的知識庫應用。我們將涵蓋從基礎架構到高級應用開發的全流程,幫助你快速掌握這一強大的工具!


在這里插入圖片描述

核心概念與知識點

1. LlamaIndex基礎架構【實戰部分】

核心概念

LlamaIndex 的核心架構圍繞以下幾個關鍵組件展開:

  • Documents:原始數據源,如文檔、網頁、API 數據等。
  • Nodes:經過分塊和解析后的最小處理單元。
  • Indices:索引結構,用于加速檢索。
  • Retrievers:負責從索引中提取相關節點。
架構設計

LlamaIndex 的工作流程可以分為三個階段:

  1. 數據攝入:從多種數據源加載并解析數據。
  2. 索引構建:將解析后的數據轉化為高效的索引結構。
  3. 查詢執行:通過檢索器和響應合成器生成最終答案。
最新版本特性

最新版本引入了以下高級功能:

  • 高級檢索:支持混合檢索策略,如向量+關鍵詞組合。
  • 響應合成功能:通過多步推理生成更準確的答案。
與LangChain集成

LlamaIndex 可以無縫集成 LangChain,形成優勢互補的工作流。例如,使用 LangChain 的鏈式調用管理復雜業務邏輯,同時利用 LlamaIndex 的高效索引和檢索能力。


2. 數據攝入與處理【實戰部分】

多源數據加載

LlamaIndex 支持多種數據源的加載,包括本地文檔、網頁和 API 數據。

from llama_index.core import SimpleDirectoryReader
from llama_index.readers.web import SimpleWebPageReader# 加載本地文檔
documents = SimpleDirectoryReader("./data").load_data()# 加載網頁內容
web_documents = SimpleWebPageReader().load_data(["https://example.com/page1", "https://example.com/page2"]
)print(f"加載了 {len(documents)} 個本地文檔和 {len(web_documents)} 個網頁文檔。")
文本分塊策略

不同的分塊方法會影響檢索效率和精度。以下是兩種常見分塊器的實現:

from llama_index.core.node_parser import SentenceSplitter, TokenTextSplitter# 基于句子的分塊器
sentence_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
nodes_sentence = sentence_parser.get_nodes_from_documents(documents)# 基于token的分塊器
token_parser = TokenTextSplitter(chunk_size=256, chunk_overlap=20)
nodes_token = token_parser.get_nodes_from_documents(documents)print(f"基于句子的分塊數量:{len(nodes_sentence)}")
print(f"基于token的分塊數量:{len(nodes_token)}")
自定義解析器

對于專業領域文檔(如 PDF 或表格),可以使用自定義解析器提取特定信息。

from llama_index.readers.file import PDFReader# 加載PDF文檔
pdf_reader = PDFReader()
pdf_documents = pdf_reader.load_data(file="./research_paper.pdf")print(f"加載了 {len(pdf_documents)} 頁PDF內容。")
元數據提取

通過提取元數據(如標題、作者、時間戳等),可以增強節點的檢索能力。

from llama_index.core.schema import Document# 添加元數據
document = Document(text="量子計算是一種基于量子力學原理的新型計算方式。",metadata={"title": "量子計算簡介", "author": "張三", "date": "2023-01-01"}
)
print(document.metadata)

3. 索引與檢索技術【實戰部分】

向量索引構建

向量索引是 LlamaIndex 的核心功能之一,適用于大規模文檔的高效檢索。

from llama_index.core import VectorStoreIndex# 創建向量索引
vector_index = VectorStoreIndex.from_documents(documents)# 保存和加載索引
vector_index.storage_context.persist("./storage")
from llama_index.core import StorageContext, load_index_from_storage
storage_context = StorageContext.from_defaults(persist_dir="./storage")
loaded_index = load_index_from_storage(storage_context)
混合檢索策略

混合檢索結合了向量、關鍵詞和知識圖譜等多種方法,能夠顯著提升檢索精度。

from llama_index.core.retrievers import VectorIndexRetriever, BM25Retriever
from llama_index.core.retrievers import EnsembleRetriever# 創建多個檢索器
retriever_vector = VectorIndexRetriever(index=vector_index)
retriever_keyword = BM25Retriever.from_documents(documents)# 組合檢索器
ensemble_retriever = EnsembleRetriever(retrievers=[retriever_vector, retriever_keyword],weights=[0.6, 0.4]
)# 執行混合檢索
nodes = ensemble_retriever.retrieve("量子計算的應用場景有哪些?")
for node in nodes:print(node.text)
上下文壓縮

上下文壓縮技術通過減少冗余信息,提升大規模文檔的檢索效率。

from llama_index.core.postprocessor import LongContextReorder# 使用上下文壓縮
reordered_nodes = LongContextReorder().postprocess_nodes(nodes)
for node in reordered_nodes:print(node.text)
重排序策略

基于相關性的結果優化方法可以進一步提升檢索質量。

from llama_index.core.postprocessor import SimilarityPostprocessor# 應用重排序
similarity_processor = SimilarityPostprocessor(similarity_cutoff=0.8)
filtered_nodes = similarity_processor.postprocess_nodes(reordered_nodes)
for node in filtered_nodes:print(node.text)

4. 高級應用開發【實戰部分】

查詢引擎定制

通過配置響應合成器,可以實現不同查詢模式的靈活切換。

from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.response_synthesizers import CompactAndRefine# 配置響應合成器
synthesizer = CompactAndRefine(llm=llm,verbose=True,streaming=True
)# 創建查詢引擎
query_engine = RetrieverQueryEngine(retriever=ensemble_retriever,response_synthesizer=synthesizer
)# 執行查詢
response = query_engine.query("太陽能技術的最新進展是什么?")
print(response)
代理集成

結合工具使用的知識代理可以實現動態任務分解。

from llama_index.agents import ReActAgent# 定義工具
tools = [{"name": "SearchInternet", "func": search_internet},
]# 創建代理
agent = ReActAgent(tools=tools, query_engine=query_engine)# 執行代理
result = agent.run("查找關于太陽能技術的最新研究論文。")
print(result)
流處理

實時響應生成的流式 API 能夠提升用戶體驗。

from llama_index.core.streaming import StreamingResponse# 使用流式響應
streaming_response = StreamingResponse(query_engine.stream_query("解釋區塊鏈的基本原理。"))
for chunk in streaming_response:print(chunk, end="")
評估框架

通過評估腳本測試系統的性能并進行優化。

from llama_index.evaluation import QueryResponseEvaluator# 初始化評估器
evaluator = QueryResponseEvaluator()# 測試查詢
evaluation_result = evaluator.evaluate(query="什么是人工智能?",response=response,reference="人工智能是模擬人類智能的技術。"
)
print(evaluation_result)

案例與實例:LlamaIndex 實戰應用


1. 企業文檔庫

問題背景:企業需要一個知識庫系統,能夠處理和檢索大規模的 PDF 文檔。以下是完整實現,包括數據加載、索引構建和查詢優化。

完整代碼案例
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.readers.file import PDFReader
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.query_engine import RetrieverQueryEngine# 數據加載:從目錄中加載 PDF 文檔
pdf_reader = PDFReader()
documents = pdf_reader.load_data(file="./corporate_documents/*.pdf")# 數據分塊:將文檔分割為小塊
from llama_index.core.node_parser import SentenceSplitter
parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
nodes = parser.get_nodes_from_documents(documents)# 索引構建:創建向量索引
index = VectorStoreIndex(nodes)# 查詢優化:使用向量檢索器
retriever = VectorIndexRetriever(index=index, similarity_top_k=5)# 創建查詢引擎
query_engine = RetrieverQueryEngine(retriever=retriever)# 執行查詢
response = query_engine.query("公司2023年的主要產品有哪些?")
print(response)
輸出結果
"根據文檔內容,公司2023年的主要產品包括智能客服系統、數據分析平臺和區塊鏈解決方案。"
說明
  • 數據加載PDFReader 支持批量加載 PDF 文件。
  • 數據分塊:通過 SentenceSplitter 將文檔分割為適合模型處理的小塊。
  • 索引構建:使用向量索引加速檢索。
  • 查詢優化:通過 VectorIndexRetriever 提取最相關的節點。

2. 個人知識助手

問題背景:構建一個支持跨會話上下文管理的個人知識助手,幫助用戶高效檢索和記憶信息。

完整代碼案例
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.memory import ChatMemoryBuffer
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.chat_engine import ContextChatEngine# 數據加載:從本地目錄加載文檔
documents = SimpleDirectoryReader("./personal_knowledge").load_data()# 索引構建:創建向量索引
index = VectorStoreIndex.from_documents(documents)# 初始化記憶模塊
memory = ChatMemoryBuffer.from_defaults(token_limit=4096)# 創建上下文感知的聊天引擎
chat_engine = ContextChatEngine(retriever=index.as_retriever(),memory=memory,system_prompt="你是一個個人知識助手,負責回答用戶的問題并記住對話歷史。",
)# 模擬多輪對話
response1 = chat_engine.chat("什么是量子計算?")
print(response1)response2 = chat_engine.chat("它有哪些應用場景?")
print(response2)# 查看對話歷史
print(memory.get())
輸出結果
"量子計算是一種基于量子力學原理的新型計算方式,利用量子比特進行并行計算。""量子計算的應用場景包括密碼學、藥物研發和金融建模等領域。"[{'role': 'assistant', 'content': '量子計算是一種基于量子力學原理的新型計算方式,利用量子比特進行并行計算。'}, {'role': 'assistant', 'content': '量子計算的應用場景包括密碼學、藥物研發和金融建模等領域。'}]
說明
  • 記憶模塊ChatMemoryBuffer 用于存儲對話歷史,支持跨會話的上下文管理。
  • 上下文感知:聊天引擎結合檢索器和記憶模塊,生成更精準的回答。
  • 多輪對話:通過記憶模塊,助手能夠理解上下文并提供連貫的回答。

3. 研究文獻分析器

問題背景:構建一個學術論文智能問答系統,支持關鍵詞檢索和引用分析。

完整代碼案例
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.retrievers import BM25Retriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.response_synthesizers import CompactAndRefine
from llama_index.evaluation import QueryResponseEvaluator# 數據加載:加載學術論文
documents = SimpleDirectoryReader("./research_papers").load_data()# 數據分塊:提取段落和元數據
from llama_index.core.node_parser import TokenTextSplitter
parser = TokenTextSplitter(chunk_size=256, chunk_overlap=20)
nodes = parser.get_nodes_from_documents(documents)# 索引構建:創建向量索引
index = VectorStoreIndex(nodes)# 檢索器:結合 BM25 和向量檢索
bm25_retriever = BM25Retriever.from_documents(documents)
vector_retriever = index.as_retriever(similarity_top_k=5)from llama_index.core.retrievers import EnsembleRetriever
ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, vector_retriever],weights=[0.4, 0.6]
)# 查詢引擎:配置響應合成器
synthesizer = CompactAndRefine(verbose=True)
query_engine = RetrieverQueryEngine(retriever=ensemble_retriever,response_synthesizer=synthesizer
)# 執行查詢
response = query_engine.query("深度學習在自然語言處理中的最新進展是什么?")
print(response)# 引用分析:評估答案質量
evaluator = QueryResponseEvaluator()
evaluation_result = evaluator.evaluate(query="深度學習在自然語言處理中的最新進展是什么?",response=response,reference="參考文獻中提到Transformer架構的改進提升了模型性能。"
)
print(evaluation_result)
輸出結果
"最新的進展包括Transformer架構的改進、預訓練模型的優化以及多模態融合技術的應用。"EvaluationResult(score=0.85, feedback="回答準確且涵蓋了關鍵點。")
說明
  • 關鍵詞檢索BM25Retriever 提供高效的關鍵詞匹配。
  • 引用分析:通過 QueryResponseEvaluator 評估答案的準確性。
  • 混合檢索:結合 BM25 和向量檢索,提升檢索精度。
  • 響應合成:通過 CompactAndRefine 合成更清晰的答案。

以上三個案例展示了 LlamaIndex 在不同場景中的強大能力:

  1. 企業文檔庫:通過向量索引和分塊策略,高效處理大規模 PDF 文檔。
  2. 個人知識助手:結合記憶模塊,支持跨會話的上下文管理。
  3. 研究文獻分析器:利用混合檢索和引用分析,構建學術領域的智能問答系統。

總結與擴展思考

LlamaIndex 憑借其強大的數據處理能力和高效的索引機制,已成為構建大模型知識庫的首選框架。未來,隨著更多高級功能的推出,LlamaIndex 將進一步降低開發門檻,助力企業快速構建智能化應用系統。

擴展思考

  1. 如何選擇適合的框架(LlamaIndex vs. LangChain)?
  2. 大規模知識應用的高可用性和擴展性設計。
  3. 知識庫技術的未來發展趨勢與應用前景。

希望本文能為你打開 LlamaIndex 的大門!如果你有任何問題或想法,歡迎在評論區留言交流!

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

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

相關文章

Sentinel[超詳細講解]-4

🚓 主要講解流控模式的 三種方式中的兩種: 直接、鏈路🚀 1?? 直接模式 🚎 直接模式:對資源本身進行限流,例如對某個接口進行限流,當該接口的訪問頻率超過設定的閾值時,直接拒絕新的…

工作記錄 2017-03-24

工作記錄 2017-03-24 序號 工作 相關人員 1 修改了郵件上的問題。 更新RD服務器。 郝 更新的問題 1、修改了New User時 init的保存。 2、文件的查詢加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的處理。 識別引擎監控 Ps (iCDA LOG :剔除…

裴蜀定理:整數解的奧秘

裴蜀定理:整數解的奧秘 在數學的世界里,裴蜀定理(Bzout’s Theorem)是數論中一個非常重要的定理,它揭示了二次方程和整數解之間的關系。它不僅僅是純粹的理論知識,還在計算機科學、密碼學、算法優化等多個…

python之 “__init__.py” 文件

提示:python之 “init.py” 文件 文章目錄 前言一、Python 中 __init__.py 文件的理解1. What(是什么)2. Why(為什么需要)3. Where(在哪里使用)4. How(如何使用) 二、問題…

Gemini 2.5 Pro與Claude 3.7 Sonnet編程性能對比

AI領域的語言模型競賽日趨白熱化,尤其在編程輔助方面表現突出。 Gemini 2.5 Pro和Claude 3.7 Sonnet作為該領域的佼佼者,本文通過一系列編程測試與基準評估對兩者的編碼功能進行對比分析。 核心結論: ? Gemini 2.5 Pro在SWE Bench硬核編程測試中以63.8%的通過率略勝Clau…

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays論文閱讀

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays 1. 論文的研究目標與實際問題意義1.1 研究目標1.2 解決的實際問題1.3 實際意義2. 論文提出的新方法、模型與公式2.1 核心創新:標量化近似表達式關鍵推導步驟:公式優勢:2.2 與經典方法的對比傳統方…

GIT 撤銷上次推送

注意:在執行下述操作之前先備份現有工作進度,如果不慎未保存,在代碼編輯器中正在修改的文件下,使用CtrlZ 撤銷試試 撤銷推送的方法 情況 1:您剛剛推送到遠程倉庫 如果您的推送操作剛剛完成,并且沒有其他…

透視飛鶴2024財報:如何打贏奶粉罐里的科技戰?

去年乳制品行業壓力還是不小的,尼爾森IQ指出2024年國內乳品市場仍處在收縮區間。但是,總有龍頭能抗住壓力,飛鶴最近交出的2024財報中就有很多亮點。 比如,2024年飛鶴營收207.5億元、同比增長6%,凈利潤36.5億元&#x…

解決STM32CubeMX中文注釋亂碼

本人采用【修改系統環境變量】的方法 1. 使用快捷鍵 win X,打開【系統R】,點擊【高級系統設置】 2. 點擊【環境變量】 3. 點擊【新建】 4.按圖中輸入【JAVA_TOOL_OPTIONS】和【-Dfile.encodingUTF-8】,新建環境變量后重啟CubeMX即可。 解釋…

使用typescript實現游戲中的JPS跳點尋路算法

JPS是一種優化A*算法的路徑規劃算法,主要用于網格地圖,通過跳過不必要的節點來提高搜索效率。它利用路徑的對稱性,只擴展特定的“跳點”,從而減少計算量。 deepseek生成的總是無法完整運行,因此決定手寫一下。 需要注…

Jetpack Compose 狀態管理指南:從基礎到高級實踐

在Jetpack Compose中,界面狀態管理是構建響應式UI的核心。以下是Compose狀態管理的主要概念和實現方式: 基本狀態管理 1. 使用 mutableStateOf Composable fun Counter() {var count by remember { mutableStateOf(0) }Button(onClick { count }) {T…

vant4+vue3上傳一個pdf文件并實現pdf的預覽。使用插件pdf.js

注意下載的插件的版本"pdfjs-dist": "^2.2.228", npm i pdfjs-dist2.2.228 然后封裝一個pdf的遮罩。因為pdf文件有多頁,所以我用了swiper輪播的形式展示。因為用到移動端,手動滑動頁面這樣比點下一頁下一頁的方便多了。 直接貼代碼…

Leetcode hot 100(day 4)

翻轉二叉樹 做法:遞歸即可,注意判斷為空 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(rootnullptr)return nullptr;TreeNode* noderoot->left;root->leftinvertTree(root->right);root->rightinvertTree(node);retu…

C,C++語言緩沖區溢出的產生和預防

緩沖區溢出的定義 緩沖區是內存中用于存儲數據的一塊連續區域,在 C 和 C 里,常使用數組、指針等方式來操作緩沖區。而緩沖區溢出指的是當程序向緩沖區寫入的數據量超出了該緩沖區本身能夠容納的最大數據量時,額外的數據就會覆蓋相鄰的內存區…

大數據(4)Hive數倉三大核心特性解剖:面向主題性、集成性、非易失性如何重塑企業數據價值?

目錄 背景:企業數據治理的困境與破局一、Hive數據倉庫核心特性深度解析1. ?面向主題性(Subject-Oriented):從業務視角重構數據?2. ?集成性(Integrated):打破數據孤島的統一視圖?3. ?非易失…

A股復權計算_前復權數據計算_終結章

目錄 前置: 計算方法推導 數據: 代碼: 視頻: 前置: 1 本系列將以 “A股復權計算_” 開頭放置在“隨想”專欄 2 權息數據結合 “PostgreSQL_” 系列博文中的股票未復權數據,可以自行計算復權日數據 …

Nature:新發現!首次闡明大腦推理神經過程

人類具有快速適應不斷變化的環境的認知能力。這種能力的核心是形成高級、抽象表示的能力,這些表示利用世界上的規律來支持泛化。然而,關于這些表征如何在神經元群中編碼,它們如何通過學習出現以及它們與行為的關系,人們知之甚少。…

Kotlin 集合函數:map 和 first 的使用場景

Kotlin 提供了豐富的集合操作函數,使開發者可以更加簡潔、高效地處理數據。其中,map 和 first 是兩個常用的函數,分別用于轉換集合和獲取集合中的第一個元素。 1. map 的使用場景 場景 1:對象列表轉換 在開發中,我們…

EIR管理中IMEI和IMSI信息的作用

在EIR(設備身份注冊)管理中,IMEI(國際移動設備身份碼)和IMSI(國際移動用戶識別碼)各自具有重要作用,以下是詳細介紹: IMEI的作用 設備身份識別:IMEI是移動設…

MAUI開發第一個app的需求解析:登錄+版本更新,用于喂給AI

vscode中MAUI框架已經搭好,用MAUI+c#webapi+orcl數據庫開發一個app, 功能是兩個界面一個登錄界面,登錄注冊常用功能,另一個主窗體,功能先空著,顯示“主要功能窗體”。 這是一個全新的功能,需要重零開始涉及所有數據表 登錄后檢查是否有新版本程序,自動更新功能。 1.用戶…