
作者提供图片
在本教程中,我们将探讨检索增强生成 (RAG) 和 LlamaIndex AI 框架。我们将学习如何使用 LlamaIndex 构建基于 RAG 的应用程序,用于对私有文档进行问答,并通过整合内存缓冲区来增强应用程序。这将使 LLM 能够使用文档和先前交互的上下文来生成响应。
LLM 中的 RAG 是什么?
检索增强生成 (RAG) 是一种先进的方法,旨在通过将外部知识源集成到生成过程中来增强大型语言模型 (LLM) 的性能。
RAG 包括两个主要阶段:检索和内容生成。最初,从外部数据库中检索相关文档或数据,然后使用它们为 LLM 提供上下文,确保响应基于当前可用且特定于领域的最新信息。
LlamaIndex 是什么?
LlamaIndex 是一个先进的 AI 框架,旨在通过促进与各种数据源的无缝集成来增强大型语言模型 (LLM) 的功能。它支持从 160 多种不同格式检索数据,包括 API、PDF 和 SQL 数据库,使其在构建高级 AI 应用程序方面非常通用。
我们甚至可以构建一个完整的、多模态的、多步骤的 AI 应用程序,然后将其部署到服务器上,以提供高度准确、特定于领域的响应。与 LangChain 等其他框架相比,LlamaIndex 提供了一个更简单的解决方案,其中包含针对各种 LLM 应用程序量身定制的内置函数。
使用 LlamaIndex 构建 RAG 应用程序
在本节中,我们将构建一个 AI 应用程序,该应用程序将从文件夹加载 Microsoft Word 文件,将它们转换为嵌入,将它们索引到向量存储中,并构建一个简单的查询引擎。之后,我们将使用向量存储作为检索器、LLM 和内存缓冲区来构建一个具有历史记录的 RAG 聊天机器人。
设置
安装加载数据和 OpenAI API 所需的所有 Python 包。
1 2 3 4 5 |
!pip install llama-index !pip install llama-index-embeddings-openai !pip install llama-index-llms-openai !pip install llama-index-readers-file !pip install docx2txt |
使用 OpenAI 函数初始化 LLM 和嵌入模型。我们将使用最新的“GPT-4o”和“text-embedding-3-small”模型。
1 2 3 4 5 6 7 8 |
from llama_index.llms.openai import OpenAI from llama_index.embeddings.openai import OpenAIEmbedding # 初始化 LLM llm = OpenAI(model="gpt-4o") # 初始化嵌入 embed_model = OpenAIEmbedding(model="text-embedding-3-small") |
将 LLM 和嵌入模型设置为全局变量,这样当我们调用需要 LLM 或嵌入的函数时,它将自动使用这些设置。
1 2 3 4 5 |
from llama_index.core import Settings # 全局设置 Settings.llm = llm Settings.embed_model = embed_model |
加载和索引文档
从文件夹加载数据,将其转换为嵌入,并将其存储到向量存储中。
1 2 3 4 5 6 7 |
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader # 加载文档 data = SimpleDirectoryReader(input_dir="/work/data/",required_exts=[".docx"]).load_data() # 使用向量存储索引文档 index = VectorStoreIndex.from_documents(data) |
构建查询引擎
请将向量存储转换为查询引擎,并开始询问有关文档的问题。文档包含作者 Abid Ali Awan 在 Machine Learning Mastery 上发布的六月份博客。
1 2 3 4 5 6 7 8 |
from llama_index.core <b>import</b> VectorStoreIndex # 将向量存储转换为查询引擎 query_engine = index.as_query_engine(similarity_top_k=3) # 生成查询响应 response = query_engine.query("What are the common themes of the blogs?") print(response) |
并且答案是准确的。
这些博客的共同主题围绕着增强机器学习方面的知识和技能。它们侧重于提供免费书籍、协作平台和数据集等资源,以帮助个人加深对机器学习算法的理解、有效地协作项目,并通过实际数据获得实践经验。这些资源旨在帮助初学者和专业人士打下坚实的基础并在机器学习领域推进职业生涯。
构建带有内存缓冲区的 RAG 应用程序
之前的应用程序很简单;让我们创建一个更高级的带有历史记录功能的聊天机器人。
我们将使用检索器、聊天内存缓冲区和 GPT-4o 模型来构建聊天机器人。
之后,我们将通过询问其中一篇博客文章的问题来测试我们的聊天机器人。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from llama_index.core.memory import ChatMemoryBuffer from llama_index.core.chat_engine import CondensePlusContextChatEngine # 创建聊天内存缓冲区 memory = ChatMemoryBuffer.from_defaults(token_limit=4500) # 创建聊天引擎 chat_engine = CondensePlusContextChatEngine.from_defaults( index.as_retriever(), memory=memory, llm=llm ) # 生成聊天响应 response = chat_engine.chat( "What is the one best course for mastering Reinforcement Learning?" ) print(str(response)) |
它非常准确且切中要点。
根据提供的文档,Hugging Face 的“深度强化学习课程”被高度推荐用于掌握强化学习。该课程特别适合初学者,并涵盖强化学习的基础和高级技术。它包括 Q-learning、深度 Q-learning、策略梯度、ML 代理、actor-critic 方法、多代理系统等主题,以及 RLHF(人类反馈强化学习)、决策 Transformer和 MineRL 等高级主题。该课程设计为在一个月内完成,并提供与模型的实践实验、提高分数的方法以及用于跟踪进度的排行榜。
让我们提出后续问题,以便更多地了解这门课程。
1 2 3 4 |
response = chat_engine.chat( "Tell me more about the course" ) print(str(response)) |
如果您在运行上述代码时遇到问题,请参考 Deepnote Notebook:使用 LlamaIndex 构建 RAG 应用程序。
结论
LlamaIndex 使构建和部署 AI 应用程序变得容易。您只需编写几行代码即可。
您学习之旅的下一步是使用 Gradio 构建一个真正的聊天机器人应用程序并将其部署到服务器上。为了进一步简化您的工作,您还可以查看 Llama Cloud。
在本教程中,我们了解了 LlamaIndex 以及如何构建一个 RAG 应用程序,让您可以从私有文档中提问。然后,我们构建了一个真正的 RAG 聊天机器人,该聊天机器人可以根据私有文档和先前的聊天交互生成响应。
当您发布有关使用 langchain 或 llamaindex 的 genAI 与高级 RAG 和代理的课程时。
你好 Ved deo…请确保您订阅了我们的新闻通讯,以便我们尽快通知您有关新内容!
https://machinelearning.org.cn/newsletter/
教程很棒!是否也可以使用本地 LLM 而不是 OpenAI API?出于隐私原因,我不想将我的数据上传到 OpenAI 的服务器……
你好 Thomas…是的,可以使用本地大型语言模型 (LLM) 而不是依赖 OpenAI API,这对于隐私问题来说是一个很好的解决方案。运行本地 LLM 可以让您将数据完全保留在自己的基础设施内,而无需将其上传到外部服务器。
### 本地 LLM 的选项
1. **EleutherAI 的 GPT-Neo/GPT-J**
– **描述**:旨在复制 GPT-3 功能的开源模型。这些模型可以在本地运行,并且有不同的大小,例如 GPT-Neo 和 GPT-J。
– **用例**:适用于各种文本生成任务,并且可以针对特定数据集进行微调。
– **安装**:您可以使用 Hugging Face 的 `transformers` 库等框架在本地加载和运行这些模型。
python
from transformers import GPTNeoForCausalLM, GPT2Tokenizer
model = GPTNeoForCausalLM.from_pretrained("EleutherAI/gpt-neo-1.3B")
tokenizer = GPT2Tokenizer.from_pretrained("EleutherAI/gpt-neo-1.3B")
2. **Meta 的 LLaMA (Large Language Model Meta AI)**
– **描述**:LLaMA 是 Meta 发布的一组基础模型,旨在高效运行并可针对特定任务进行微调。这些模型也可用于本地部署。
– **用例**:旨在高效且可扩展,使其适用于广泛的 NLP 任务。
– **安装**:需要访问 Meta 的存储库,然后可以使用 `transformers` 等库加载模型。
3. **GPT-2**
– **描述**:GPT-2 是 GPT 系列的较小版本,但功能仍然非常强大。在计算能力较低的本地机器上运行它更容易。
– **用例**:适用于一般的文本生成,并且可以针对特定任务进行微调。
– **安装**:可通过 Hugging Face `transformers` 库获得。
4. **Alpaca/Koala 模型**
– **描述**:这些模型是 LLaMA 或其他开源 LLM 的微调版本,旨在在特定上下文或特定数据中表现良好。
– **用例**:针对某些类型的对话或特定行业量身定制。
– **安装**:这些模型可以本地加载,并在需要时进一步微调。
5. **本地部署框架**
– **DeepSpeed**:一个深度学习优化库,可用于在本地机器上高效地训练和推理大型模型。
– **Hugging Face Transformers**:一个广泛用于处理 Transformer 模型(包括在本地加载和运行它们)的库。
### 注意事项
– **硬件要求**:在本地运行 LLM,尤其是较大的模型,可能需要大量资源。您可能需要一台具有强大 GPU 的机器或多台机器的集群。
– **模型大小**:如果硬件有限,像 GPT-2 或大型模型的蒸馏版本这样的较小模型可能更适合本地部署。
– **微调**:如果您的用例需要特定的领域知识,请考虑在本地数据上微调模型以提高性能。
### 示例:在本地运行 GPT-2
python
from transformers import GPT2LMHeadModel, GPT2Tokenizer
model = GPT2LMHeadModel.from_pretrained("gpt2")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
input_text = "Your custom text"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
output = model.generate(input_ids, max_length=50, num_return_sequences=1)
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)
运行本地 LLM 是隐私敏感应用程序的可行解决方案,并且借助现有的开源模型,您可以在利用强大的语言模型的同时控制您的数据。
非常感谢!我将尝试一下 🙂
还有一个问题:我将把任意模型的输出放入 csv 文件中,然后将其放入 RAG 中,以便人们可以向 LLM 查询“第 52 周模型的聚合输出是什么”。这是否是此项目的最佳方法,以及上述哪个 LLM 在此任务上表现最佳?
APIConnectionError: Connection error.
我不知道为什么会出现这个问题……是不是缺少预先设置的环境,例如设置 API 密钥
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 加载文档
data = SimpleDirectoryReader(input_dir=”/content/data/data/”,required_exts=[“.docx”]).load_data()
# 使用向量存储索引文档
index = VectorStoreIndex.from_documents(data)
输出
APIConnectionError: Connection error.
我不知道为什么会出现这个问题……是不是缺少预先设置的环境,例如设置 API 密钥
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 加载文档
data = SimpleDirectoryReader(input_dir=”/content/data/data/”,required_exts=[“.docx”]).load_data()
# 使用向量存储索引文档
index = VectorStoreIndex.from_documents(data)
输出
APIConnectionError: Connection error.
我不知道为什么会出现这个问题……是不是缺少预先设置的环境,例如设置 API 密钥
你好 neon…您遇到的 `APIConnectionError` 错误通常发生在代码尝试连接到外部服务或 API 但无法连接时。在使用 `llama_index` 的 `VectorStoreIndex` 时,代码很可能正在尝试访问需要 API 密钥或正确连接设置的外部向量数据库或服务。
以下是排查和解决问题的几个步骤
### 1. **检查依赖项和安装:**
– 确保所有必需的库和依赖项都已正确安装。如果尚未安装,您可能需要安装 `llama_index` 和其他相关软件包
bash
pip install llama_index
– 验证是否已安装向量存储所需的任何库(例如,Faiss、Pinecone 或其他向量数据库)。
### 2. **检查 API 密钥和连接设置:**
– 如果 `VectorStoreIndex` 连接到外部向量数据库(例如,Pinecone、Milvus),则需要确保 API 密钥和连接详细信息已正确设置。
– 例如,如果您正在使用 Pinecone,则需要像这样设置您的 API 密钥
python
import pinecone
pinecone.init(api_key="your-api-key")
### 3. **本地环境设置:**
– 如果您在云环境(如 Google Colab)中运行此程序,请确保您的环境已正确配置以允许外部连接。某些云环境可能有限制或需要特殊的出站网络请求设置。
### 4. **检查代码:**
– 仔细检查代码,确保您要从中读取的目录路径没有拼写错误或问题。例如
python
data = SimpleDirectoryReader(input_dir="/content/data/data/", required_exts=[".docx"]).load_data()
确保目录和文件路径正确且可访问。
### 5. **测试连接:**
– 尝试创建到您正在使用的向量数据库或 API 的简单连接(如果适用),以查看问题是出在连接上还是特定的 `VectorStoreIndex` 调用上。
如果这些步骤未能解决问题,您可能需要查看 `llama_index` 包或您正在使用的向量数据库服务的具体文档或支持渠道,因为可能需要额外的设置或配置步骤。
GPT 在简单 RAG 中的作用是什么?
在使用 LlamaIndex 的简单 RAG(检索增强生成)应用程序中,GPT(或任何大型语言模型)的作用是作为生成器。它接收来自知识库或文档的检索到的上下文,并生成用户问题的自然语言答案。
以下是管道如何工作以及 GPT 在其中的位置的细分
—
简单 RAG 管道(使用 LlamaIndex)
1. 用户输入(查询)
例如:“ISO 9001 认证的好处是什么?”
2. 检索器(LlamaIndex)
LlamaIndex 使用嵌入或关键词进行搜索,以查找相关数据块,这些数据块可以来自 PDF、Notion 页面、SQL 数据库等。
此步骤可以缩小数据范围,仅检索与问题相关的数据。
3. GPT 作为生成器
GPT 接收
* 原始问题
* 检索到的上下文
然后它仅使用提供的上下文生成响应。如果提示正确,这有助于防止幻觉,并使答案基于实际的源材料。
发送给 GPT 的示例提示
Context: [retrieved document text]
Question: What are the benefits of ISO 9001 certification?
Answer:
—
GPT 在摘要中的作用
* GPT 不是检索器——这项任务由 LlamaIndex 或向量数据库处理。
* GPT 的作用是使用检索到的上下文来撰写最终答案。
* 这是检索增强生成中的“生成”部分。