大型語言模型(LLMs)訓練於大量資料上,但它們並沒有訓練私有資料。RAG 通過將個人/公司的私有資料添加到 LLMs 已經能夠訪問的資料中來解決這個問題
RAG 的階段
RAG 有五個關鍵階段,這些階段將成為構建的大多數大型應用程序的一部分 :
加載(Loading):
索引(Indexing):
存儲(Storing):
查詢(Querying):
評估(Evaluation):
以下補充幾個LlamaIndex設計上比較令人困惑卻很重要的基礎元件
LlamaIndex 提供了一個高階介面,用於導入、索引和查詢外部資料
在底層,LlamaIndex 還支持可替換的存儲組件,允你自定義以下內容:
Document/Index stores 依賴於一個通用的 Key-Value 存儲抽象
LlamaIndex 支持將資料持久化到由 fsspec 支持的任何存儲後端。
StorageContext
object 來存放
Vector store workflow from doc to store. Source: deeplearning.ai
索引(Index)是一種資料結構,它允許快速檢索與用戶查詢相關的上下文。對於 LlamaIndex 來說,它是增強生成(Retrieval-Augmented Generation,RAG)使用案例的核心基礎。
從高層次來看,索引是從文檔(Documents)構建而來的。它們被用來構建查詢引擎(Query Engines)和聊天引擎(Chat Engines),從而實現對資料的問答和聊天功能。
在底層,索引將資料存儲在節點對象(Node objects)中(這些節點表示原始文檔的塊),並提供一個檢索器(Retriever)接口,該接口支持額外的配置和自動化。
An Index is a data structure that allows us to quickly retrieve relevant context for a user query.
Document
中的一段文本。LlamaIndex 會接收 Document
對象,並在內部解析/分塊成 Node 對象。Node
即是用來儲存被切塊向量(chunked Embedding)的資料結構
a “chunk” of a source Document, whether that is a text chunk, an image, or other. Similar to Documents, they contain metadata and relationship information with other nodes.
2023.09。Raphael Mansuy。LlamaIndex. Chunk, Index, Query: How LlamaIndex Unlocks Custom LLMs
文件(Document)
a generic container around any data source - for instance, a PDF, an API output, or retrieved data from a database.
metadata
)和關係(relationships
)等metadata
是可以附加到文本的註解字典relationships
是包含與其他文件/節點關係的字典節點(Node)
NodeParser
類將源文件「解析」成節點"By default every Node derived from a Document will inherit the same metadata from that Document (e.g. a 'file_name' filed in the Document is propagated to every Node)"
因此,文件到節點的關係可以理解為從一個泛用的資料容器到其具體內容片段的細化(Refine)。這種細化使得對文件的處理可以更加靈活和高效,特別是在涉及到對大型文檔進行索引、檢索和分析時。節點的概念允許LlamaIndex將文件的不同部分獨立處理,並在需要時重用文件的元資料和關係信息
TextNode與Document間的繼承關係
Document
類是從 TextNode
類繼承來的。由於 TextNode
本身就是 BaseNode
的子類,專門用於處理含有文本內容的節點,Document
類進一步專化了 TextNode
,用於表達一份文檔。Document
類繼承了 TextNode
的所有屬性和方法(如文本內容、元資料處理等),並且可以添加新的屬性和方法,或者覆寫現有方法,以滿足特殊需求。例如,Document
類可能添加了一個唯一的文檔標識符屬性(id_
),以便在索引和檢索時區分不同的文檔。Document
類的設計使其成為處理和表示文檔資料的理想結構。除了包含文檔的內容和元資料,還可能包括一些特定於文檔的方法和邏輯,例如與其他格式或系統的轉換方法。VectorStoreIndex
nodes
參數是一個可選的序列,它可以包含零到多個 llama_index.core.schema.BaseNode
類型的物件。在 llama-index
的核心架構中,BaseNode
是一個基礎類別,代表系統中的一個基本節點,這種節點可能包含文本內容、元資料等信息。BaseNode
類型的物件作為輸入,llama-index
能夠處理多種類型的文本資料,不論是單一文件、文件集合,還是文件的特定部分。這種設計提供了極大的靈活性,使得 llama-index
能夠適應多樣化的文本處理需求。ServiceContext
是LlamaIndex中用於集中配置LLM、嵌入模型和其他處理組件的設定對象
v0.10.0(2024.0213)起service context 廢棄使用
在Building and Evaluating Advanced RAG。建立與評估進階RAG課程內容仍是舊版
在LlamaIndex管Pipeline各階段中,ServiceContext
彙集所需的各種資源和設定。這樣的設計可以方便地重用和修改這些設定,而不必在管線的每個部分都進行個別配置。這在實際操作中顯示為一個簡化的過程,例如在使用VectorStoreIndex.from_documents這樣的方法時,可以通過一行代碼就完成文件的攝取、分塊、嵌入和索引的過程
ServiceContext
code example
參數說明:
llm
:用於生成自然語言回應查詢的LLM。如果未提供,則默認使用OpenAI的gpt-3.5-turbo。如果未設置OpenAI密鑰,則默認使用Llama.cpp的llama2-chat-13Bprompt_helper
:
embed_model
:用於生成文本向量表示的嵌入模型()node_parser
:將文檔轉換為節點(儲存embedding)的解析器callback_manager
:在事件上調用其處理程序的回調管理器對象。提供基本的日誌記錄和跟蹤能力注意,這是用物件導向的class 繼承關係呈現
TextNode
與ImageNode
在同位階
Document
與ImageDocument
在同位階