使用LlamaIndex构建RAG应用程序

2025年04月22日 由 alex 发表 2682 0

像 ChatGPT 和 Llama 这样的大型语言模型 (LLM) 擅长回答问题,但仅限于它们接受训练的知识。他们无法访问私人数据,也无法在培训截止时间之后学习。所以,主要是......我们如何扩展他们的知识?


答案在于检索增强生成 (RAG)。今天,我们将探索 RAG 管道,并演示如何使用 LLama 索引构建一个管道。


Retrieval Augmented Generation:基础知识

LLM 是当今最先进的 NLP 模型,在翻译、写作和一般问答方面表现出色。但是,他们难以处理特定于领域的查询,经常产生幻觉。


在这种情况下,每个查询可能只有少数文档包含相关上下文。为了解决这个问题,我们需要一个简化的系统,在生成响应之前有效地检索和集成相关信息——这就是 RAG 的本质。


预先训练的 LLM 通过三种主要方法获取知识,每种方法都有局限性:

  1. 训练:从头开始构建 LLM 需要在数万亿个代币上训练大规模神经网络,耗资数亿美元,这对大多数人来说都是不可行的
  2. 微调:这使预训练模型适应新数据,但时间和资源成本高昂。除非有特定需求,否则这并不总是可行的
  3. 提示:最容易访问的方法,提示将新信息插入 LLM 的上下文窗口,使其能够根据提供的数据回答查询;但是,由于文档大小经常超过上下文限制,因此仅靠此方法是不够的


RAG 通过在查询时高效处理、存储和检索相关文档段来克服这些限制。这可确保 LLM 生成更准确、上下文感知的响应,而无需昂贵的重新训练或微调。


RAG 管道的关键组件

RAG 系统由几个基本组件组成:


3


  • 文本拆分器:将大型文档分解为适合 LLM 上下文窗口的较小块
  • Embedding Model:将文本转换为矢量表示,实现高效的相似性搜索
  • Vector Store:存储和检索文档嵌入以及元数据的专用数据库
  • LLM:根据检索到的信息生成答案的核心语言模型
  • 实用功能:包括 Web 检索器和文档解析器等工具,用于预处理和增强数据检索


这些组件中的每一个在使 RAG 系统准确和高效方面都起着至关重要的作用。


什么是 LlamaIndex?

LlamaIndex(以前称为 GPTIndex)是一个 Python 框架,旨在构建由 LLM 提供支持的应用程序。它充当自定义数据源和大型语言模型之间的桥梁,简化了数据摄取、索引和查询。


LlamaIndex 内置了对各种数据源、矢量数据库和查询接口的支持,可作为 RAG 应用程序的一体化解决方案。它还与 LangChain、Flask 和 Docker 等工具无缝集成,使其在实际实施方面具有高度的灵活性。


使用 LlamaIndex 实现一个简单的 RAG 系统


第 1 步:设置环境

在深入研究实施之前,我们需要设置 Python 环境并安装必要的依赖项。使用虚拟环境有助于有效地管理依赖项:


python -m venv rag_env
source rag_env/bin/activate  # On Windows, use: 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
# Load text files from a directory
documents = SimpleDirectoryReader("./data").load_data()
print(f"Loaded {len(documents)} documents")

 

第 3 步:创建文本拆分

LLM 具有上下文窗口限制,因此我们不能一次传递整个文档。相反,我们将它们拆分为更小的结构化块,以便高效检索。


from llama_index.text_splitter import SentenceSplitter
# Define a sentence-based text splitter
text_splitter = SentenceSplitter(chunk_size=512, chunk_overlap=50)
# Apply text splitting to documents
nodes = text_splitter.split_text([doc.text for doc in documents])
print(f"Split into {len(nodes)} chunks")

 

第 4 步:使用嵌入为文档编制索引

要执行语义搜索,我们必须将文档块转换为向量嵌入并将它们存储在索引中。


from llama_index import VectorStoreIndex
# Create an index
index = VectorStoreIndex(nodes)
# Persist the index (optional)
index.storage_context.persist(persist_dir="./storage")

 

第 5 步:使用 RAG 查询索引

这就是 RAG(终于)发挥作用的地方。我们将查询索引文档以检索相关信息并生成 LLM 支持的响应。


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

 

如果我们执行上述作,我们将获得以下内容:


Attention is a mechanism used in deep learning models to focus on relevant parts of the input sequence while processing data. In the paper 'Attention Is All You Need,' Vaswani et al. introduced the Transformer architecture, which relies entirely on self-attention mechanisms instead of recurrence or convolution. The key innovation is the self-attention mechanism, which allows the model to weigh the importance of different words in a sentence relative to each other, enabling better parallelization and long-range dependencies.


我们成功了!


总结

使用 LlamaIndex 构建 RAG 系统为在训练数据之外利用 LLM 开辟了令人兴奋的可能性。通过集成文档检索、基于嵌入的索引和实时查询,RAG 提高了准确性并减少了幻觉,使其成为特定于域的应用程序的强大解决方案。


文章来源:https://www.kdnuggets.com/building-a-rag-application-using-llamaindex
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消