在现代自然语言处理(NLP)应用中,高效的信息检索和问答系统变得越来越重要。LlamaIndex(也称为 GPT Index)是一个用于构建和管理文档索引的强大工具,能够与生成模型结合,提供高级的信息检索和问答功能。本文将介绍如何使用 LlamaIndex 来实现一个 Retrieval-Augmented Generation(RAG)系统,并结合具体的代码示例展示其实际应用。
什么是 LlamaIndex?
LlamaIndex 是一个用于构建和管理文档索引的库。它可以高效地将文本数据转化为向量表示,并构建索引以便进行快速检索。LlamaIndex 的主要功能包括:
文档加载和索引构建:从各种格式的文档中提取文本,并构建向量索引。
向量检索:基于查询向量,在索引中检索最相关的文档。
与生成模型结合:与生成模型(如 GPT-3)结合,基于检索到的文档生成答案。
构建一个 RAG 系统
RAG 系统结合了信息检索和生成模型的能力,能够在检索到的相关文档基础上生成上下文相关的答案。以下是使用 LlamaIndex 构建一个 RAG 系统的步骤。
1. 安装必要的库
首先,确保安装了所需的库:
pip install llama-index chromadb
2. 创建 Chroma 客户端和集合
使用 Chroma 数据库来存储向量数据:
import chromadb
from llama_index.vector_stores.chroma import ChromaVectorStore
创建 Chroma 客户端并创建集合
chroma_client = chromadb.EphemeralClient()
chroma_collection = chroma_client.create_collection("example_collection")
设置 ChromaVectorStore
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
3. 指定全局 LLM 与 Embedding 模型
在进行文档处理和索引构建之前,指定全局使用的语言模型和嵌入模型:
from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
指定全局 LLM 和嵌入模型,这是使用的大语言模型是阿里的千问模型,嵌入模型是HuggingFace库中的预训练模型
Settings.llm = DashScope(
model_name=DashScopeGenerationModels.QWEN_MAX, api_key="sk"
)
Settings.embed_model = HuggingFaceEmbedding(
model_name="multi-qa-MiniLM-L6-cos-v1"
)
4. 加载文档和构建索引
使用 LlamaIndex 从本地目录加载文档并构建索引:
from llama_index import SimpleDirectoryReader, VectorStoreIndex
from llama_index.readers.file import PyMuPDFReader
from llama_index.core import StorageContext
加载文档
documents = SimpleDirectoryReader("./data", file_extractor={".pdf": PyMuPDFReader()}).load_data()
创建存储上下文并构建索引
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
5. 定义检索后排序模型
使用 SentenceTransformer 模型对初步检索结果进行重新排序,BAAI/bge-reranker-large 是由北京智源人工智能研究院(BAAI,Beijing Academy of Artificial Intelligence)发布的一个模型,专门用于重新排序任务:
from llama_index.core.postprocessor import SentenceTransformerRerank
reranker = SentenceTransformerRerank(
model="BAAI/bge-reranker-large", top_n=2
)
6. 定义 RAG Fusion 检索器
创建一个融合检索器,结合多个查询结果提高检索性能:
from llama_index.core.retrievers import QueryFusionRetriever
fusion_retriever = QueryFusionRetriever(
[index.as_retriever()],
similarity_top_k=5,
num_queries=3,
use_async=True,
)
- 构建单轮 Query Engine
将融合检索器和重新排序模型结合,构建单轮查询引擎:
from llama_index.core.query_engine import RetrieverQueryEngine
query_engine = RetrieverQueryEngine.from_args(
fusion_retriever,
node_postprocessors=[reranker]
)
8. 创建对话引擎
使用 CondenseQuestionChatEngine 处理多轮对话:
from llama_index.core.chat_engine import CondenseQuestionChatEngine
chat_engine = CondenseQuestionChatEngine.from_defaults(
query_engine=query_engine,
)
9. 运行对话系统
最后,运行对话系统,接受用户输入并生成回答:
while True:
question = input("User: ")
if question.strip().lower() == "q":
break
response = chat_engine.chat(question)
print(f"AI: {response}")
总结
LlamaIndex 提供了一种高效、灵活的方式来构建和管理文档索引,并与生成模型结合,形成强大的 RAG 系统。通过上述步骤,您可以创建一个能够处理复杂查询并生成高质量答案的问答系统。无论是用于学术研究还是企业应用,LlamaIndex 都是一个值得考虑的强大工具。
关键步骤回顾
安装必要的库:确保所有依赖库都已安装。
创建 Chroma 客户端和集合:设置向量数据库来存储和检索向量数据。
指定全局 LLM 和嵌入模型:定义将用于处理和生成文本的模型。
加载文档和构建索引:从本地加载文档并构建高效的向量索引。
定义检索后排序模型:优化检索结果的排序。
定义 RAG Fusion 检索器:通过多次查询和结果融合提高检索性能。
构建 Query Engine:整合检索和排序模型,提供查询能力。
创建对话引擎:处理多轮对话,生成上下文相关的回答。
运行对话系统:实际运行问答系统,响应用户的查询。