????????LlamaIndex 是領先的開發框架,專為結合大型語言模型(LLM)與個性化工作流打造高效的數據驅動型智能代理而設計。一般我們用它來做RAG檢索增強生成。
(1)RAG的介紹
????????大型語言模型(LLM)雖然在海量數據上進行了訓練,但通常并未基于自己的特定數據進行學習。為了解決這一問題,檢索增強生成(Retrieval-Augmented Generation,RAG)技術通過將您的數據整合到 LLM 已有的知識中,實現對模型輸入的個性化增強。

在構建大多數大型應用時,RAG通常包含五個核心階段。這些階段構成了整個流程的基礎:
1. 數據加載(Loading)
????????這是將數據從原始來源導入工作流程的過程。無論數據存儲在文本文件、PDF、網頁、數據庫還是通過 API 提供,LlamaIndex 都提供了豐富的工具來完成這一任務。LlamaHub 更是提供了數百種現成的數據連接器,便于快速集成各類數據源。
2. 索引構建(Indexing)
????????索引階段的目的是創建一種高效的數據結構,以便后續查詢使用。對于 LLM 應用而言,這通常涉及將數據轉化為語義向量(vector embeddings),并結合多種元數據策略,從而實現對上下文相關數據的快速準確檢索。
3.數據存儲(Storage)
????????一旦數據被索引,通常需要將索引結果及相關的元數據持久化存儲下來,以避免重復執行耗時的索引過程。LlamaIndex 支持多種本地和遠程存儲方式,確保數據可復用且易于管理。
4. 查詢處理(Querying)
????????針對不同的索引策略,您可以采用多種方式進行查詢操作。LlamaIndex 提供了靈活的查詢接口,支持子查詢、多步驟查詢、混合檢索策略等,幫助您充分利用 LLM 和底層數據結構的能力。
5. 效果評估(Evaluation)
????????在任何系統中,評估都是不可或缺的一環。它可以幫助您客觀地衡量不同策略的效果,或在進行更改后評估其影響。通過評估機制,您可以量化查詢響應的準確性、信息忠實度以及響應速度,從而持續優化系統性能。

(2)LlamaIndex如何實現RAG?
① 加載HF模型
????????使用 LlamaIndex 中的 HuggingFaceLLM
類來加載一個本地的大規模語言模型(LLM),并利用它來進行對話是必須要掌握的技能。
from llama_index.core.llms import ChatMessage
from llama_index.llms.huggingface import HuggingFaceLLM#使用HuggingFaceLLM加載本地大模型
llm = HuggingFaceLLM(model_name="/home/Qwen/Qwen1.5-1.8B-Chat",tokenizer_name="/home/Qwen/Qwen1.5-1.8B-Chat",model_kwargs={"trust_remote_code":True},tokenizer_kwargs={"trust_remote_code":True}
)
#調用模型chat引擎得到回復
rsp = llm.chat(messages=[ChatMessage(content="llamaindex是什么?")])print(rsp)
② 數據連接器
?????????數據連接器的作用是將不同數據源的數據提取到LlamaIndex中,最簡單易用的閱讀器是內置的 SimpleDirectoryReader
。它可以遍歷指定目錄中的所有文件,并為每個文件創建對應的文檔對象。該閱讀器原生集成于 LlamaIndex 中,支持多種文件格式,包括 Markdown、PDF、Word 文檔、ppt、圖像、音頻以及視頻等。
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex
from llama_index.llms.huggingface import HuggingFaceLLM# 初始化一個HuggingFaceEmbedding對象,用于將文本轉換為向量表示
embed_model = HuggingFaceEmbedding(#指定了一個預訓練的sentence-transformer模型的路徑model_name="/home/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)# 將創建的嵌入模型賦值給全局設置的embed_model屬性,這樣在后續的索引構建過程中,就會使用這個模型
Settings.embed_model = embed_model# 使用HuggingFaceLLM加載本地大模型
llm = HuggingFaceLLM(model_name="/home/Qwen/Qwen1.5-1.8B-Chat",tokenizer_name="/home/Qwen/Qwen1.5-1.8B-Chat",model_kwargs={"trust_remote_code": True},tokenizer_kwargs={"trust_remote_code": True}
)# 設置全局的llm屬性,這樣在索引查詢時會使用這個模型。
Settings.llm = llm# 從指定目錄讀取文檔,將數據加載到內存
documents = SimpleDirectoryReader("/home/data").load_data()
# print(documents)# 創建一個VectorStoreIndex,并使用之前加載的文檔來構建向量索引
# 此索引將文檔轉換為向量,并存儲這些向量(內存)以便于快速檢索
index = VectorStoreIndex.from_documents(documents)# 創建一個查詢引擎,這個引擎可以接收查詢并返回相關文檔的響應。
query_engine = index.as_query_engine()
rsp = query_engine.query("llamaindex是什么?")
print(rsp)