本节将带领您使用一个易上手的框架——LlamaIndex,快速搭建并运行一个最基础的RAG应用。我们的目标是体验RAG从数据加载、索引构建到查询响应的核心流程,而不是构建一个生产级应用。
目标
我们将创建一个简单的RAG应用,它可以:
- 加载一个本地文本文件作为知识源。
- 基于该文件内容构建向量索引。
- 接受用户提问,并从索引中检索相关信息来回答问题。
环境准备与工具安装
-
Python环境: 确保您已安装Python,建议版本为3.8或更高。您可以从 Python官网 下载并安装。
-
创建项目文件夹并激活虚拟环境(推荐):
mkdir my_simple_rag cd my_simple_rag python -m venv venv # Windows venv\Scripts\activate # macOS/Linux source venv/bin/activate
-
安装核心库:
我们需要安装
llama-index
来构建RAG流程,以及
openai
库,因为默认情况下LlamaIndex会使用OpenAI的Embedding模型和LLM。
pip install llama-index openai
注意:如果您使用的是其他LLM或Embedding模型(例如开源模型),安装和配置方式会有所不同,可以查阅LlamaIndex官方文档。
-
设置OpenAI API Key:
您需要一个OpenAI API Key。获取API Key后,最简单的方式是将其设置为环境变量。在您的终端中执行(或者将其添加到您的
.bashrc
,.zshrc
, 或系统环境变量中):# macOS/Linux export OPENAI_API_KEY="sk-YourActualApiKey" # Windows (PowerShell) $env:OPENAI_API_KEY="sk-YourActualApiKey"
请将
sk-YourActualApiKey
替换为您真实的API Key。切勿将API Key直接硬编码到代码中或公开分享。
数据准备
在您的项目文件夹 (my_simple_rag
) 中,创建一个名为 data
的子文件夹,并在其中创建一个文本文件,例如 my_knowledge.txt
。文件内容可以简单一些,例如:
# my_simple_rag/data/my_knowledge.txt
检索增强生成 (RAG) 是一种人工智能技术,旨在通过从外部知识库中检索相关信息来增强大型语言模型 (LLM) 的能力。
RAG的核心优势在于能够提供更准确、更新、且可溯源的答案。
它通过结合检索系统和生成模型,有效解决了LLM可能存在的知识陈旧和幻觉问题。
一个典型的RAG流程包括:数据加载、文本切分、嵌入、索引、查询、检索、增强提示和最终生成答案。
LlamaIndex 和 LangChain 是实现RAG的常用框架。
RAG技术在智能客服、企业知识管理和内容创作等领域有广泛应用。
这个文件将作为我们RAG应用的“知识库”。
RAG流程搭建 (使用LlamaIndex)
在您的项目根目录 (my_simple_rag
)下,创建一个Python脚本,例如 app.py
,并粘贴以下代码:
# my_simple_rag/app.py
import logging
import sys
# 配置日志记录,方便观察LlamaIndex内部流程
logging.basicConfig(stream=sys.stdout, level=logging.INFO) # 可以改为 logging.DEBUG 获取更详细信息
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings
from llama_index.embeddings.openai import OpenAIEmbedding # 明确指定使用OpenAI Embedding
from llama_index.llms.openai import OpenAI # 明确指定使用OpenAI LLM
def main():
print("开始RAG应用...")
# 0. (可选) 配置全局的LLM和Embedding模型
# 如果不设置,LlamaIndex会尝试使用默认的OpenAI模型(gpt-3.5-turbo 和 text-embedding-ada-002)
# 为了代码清晰,我们显式指定
Settings.llm = OpenAI(model="gpt-3.5-turbo")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-ada-002")
# Settings.chunk_size = 512 # 可以调整切块大小等参数
# 1. 加载文档
# SimpleDirectoryReader会加载指定目录下的所有支持的文件
# 我们这里指定input_files,只加载我们创建的 my_knowledge.txt
print("\n步骤1: 加载文档...")
try:
documents = SimpleDirectoryReader(input_dir="./data", required_exts=[".txt"]).load_data()
# 或者更精确地指定文件:
# documents = SimpleDirectoryReader(input_files=["./data/my_knowledge.txt"]).load_data()
if not documents:
print("错误:未能加载任何文档。请检查 './data/my_knowledge.txt' 是否存在且包含内容。")
return
print(f"成功加载 {len(documents)} 个文档片段(初始加载时可能是一个大文档)。")
except Exception as e:
print(f"加载文档时出错: {e}")
return
# 2. 创建索引 (内部会自动处理文本切分和嵌入)
# VectorStoreIndex.from_documents 会将加载的文档进行切分 (Chunking),
# 然后为每个切块生成嵌入向量 (Embedding),
# 最后将这些向量存储在内存中的向量存储里并构建索引。
print("\n步骤2: 创建索引 (这可能需要一点时间,具体取决于文档大小和网络)...")
try:
index = VectorStoreIndex.from_documents(documents, show_progress=True)
print("索引创建成功!")
except Exception as e:
print(f"创建索引时出错: {e}")
# 常见错误可能是OpenAI API Key未设置或无效,或者网络问题
print("请确保OPENAI_API_KEY环境变量已正确设置,并且网络连接正常。")
return
# 3. 创建查询引擎
# 查询引擎封装了从索引中检索信息并传递给LLM进行回答的逻辑
print("\n步骤3: 创建查询引擎...")
query_engine = index.as_query_engine(
similarity_top_k=3, # 指定检索最相关的3个文本块
# streaming=True # 如果LLM支持流式输出,可以开启
)
print("查询引擎创建成功!")
# 4. 执行查询
print("\n步骤4: 执行查询...")
user_query = "RAG技术有什么优势?它能解决什么问题?"
print(f"用户问题: {user_query}")
try:
response = query_engine.query(user_query)
print("\n查询完成!")
# 5. 打印结果
print("\n步骤5: LLM生成的回答:")
print("========================")
print(response) # response对象包含答案文本和源节点等信息
print("========================")
# (可选) 查看检索到的源文本块
if response.source_nodes:
print("\n检索到的相关源文本块:")
for i, source_node in enumerate(response.source_nodes):
print(f"--- 源文本块{i+1} (相似度: {source_node.score:.4f}) ---")
print(source_node.get_content()[:200] + "...") # 打印部分内容
print(f"来源文件: {source_node.metadata.get('file_name', 'N/A')}")
print("--------------------------------------")
except Exception as e:
print(f"执行查询时出错: {e}")
print("\nRAG应用执行完毕。")
if __name__ == "__main__":
main()
代码解释
-
import logging, sys
: 用于设置日志,方便观察LlamaIndex内部的运行情况。 -
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings
-
SimpleDirectoryReader
: 用于从指定目录加载文档。 -
VectorStoreIndex
: LlamaIndex中核心的索引类型,用于将文档转换为可查询的向量索引。 -
Settings
: 用于全局配置LLM、Embedding模型、切块大小等。 -
from llama_index.embeddings.openai import OpenAIEmbedding
: 明确导入并使用OpenAI的Embedding服务。 -
from llama_index.llms.openai import OpenAI
: 明确导入并使用OpenAI的LLM服务。 -
Settings.llm = OpenAI(model="gpt-3.5-turbo")
: 全局设置使用的LLM为gpt-3.5-turbo。 -
Settings.embed_model = OpenAIEmbedding(model="text-embedding-ada-002")
: 全局设置使用的Embedding模型为text-embedding-ada-002。 -
documents = SimpleDirectoryReader(input_dir="./data", ...).load_data()
: 这行代码会读取./data
文件夹下(根据required_exts
筛选,这里是所有.txt
文件,实际上我们只有一个my_knowledge.txt
)的内容,并将其加载为LlamaIndex的Document
对象列表。 -
index = VectorStoreIndex.from_documents(documents, show_progress=True)
: 这是核心步骤。LlamaIndex会自动完成:
- 文本切分 (Chunking): 将加载的
documents
切分成小的文本块。 - 文本嵌入 (Embedding): 使用
Settings.embed_model
(即OpenAIEmbedding)为每个文本块生成向量表示。 - 索引构建: 将这些向量存储在一个内存中的向量存储里(默认),并构建索引以便快速检索。
show_progress=True
会显示处理进度。
- 文本切分 (Chunking): 将加载的
-
query_engine = index.as_query_engine(similarity_top_k=3)
: 从创建好的索引index
派生出一个查询引擎。查询引擎负责接收用户问题,从索引中检索(默认使用向量相似度搜索,similarity_top_k=3
表示检索最相关的3个块),然后将问题和检索到的上下文一起传递给Settings.llm
(即OpenAI LLM)来生成答案。 -
response = query_engine.query("RAG技术有什么优势?它能解决什么问题?")
: 使用查询引擎执行用户的提问。 -
print(response)
: 打印LLM生成的最终答案。response
对象实际上还包含更多信息,比如response.source_nodes
可以让你看到哪些文本块被检索并用于生成答案。
运行与预期结果
保存好 app.py
和 data/my_knowledge.txt
文件后,在您的终端(确保虚拟环境已激活且API Key已设置)中运行:
python app.py
您应该会看到类似以下的输出(具体措辞可能因LLM版本略有不同):
开始RAG应用...
步骤1: 加载文档...
INFO:llama_index.core.readers.file.base:> [SimpleDirectoryReader] Total files added: 1
成功加载 1 个文档片段(初始加载时可能是一个大文档)。
步骤2: 创建索引 (这可能需要一点时间,具体取决于文档大小和网络)...
Parsing files: 100%|██████████| 1/1 [00:00<00:00, 123.45it/s]
Generating embeddings: 100%|██████████| N/N [00:0X<00:00, X.XXit/s] # N取决于切块数量
索引创建成功!
步骤3: 创建查询引擎...
查询引擎创建成功!
步骤4: 执行查询...
用户问题: RAG技术有什么优势?它能解决什么问题?
INFO:llama_index.core.chat_engine. ಕೊಟ್ಟQueryEngine:Retrieved 3 nodes below:
... (这里会显示检索到的节点信息) ...
查询完成!
步骤5: LLM生成的回答:
========================
RAG技术的主要优势在于能够提供更准确、更新且可溯源的答案。它通过结合检索系统和生成模型,有效解决了大型语言模型(LLM)可能存在的知识陈旧和幻觉问题。
========================
检索到的相关源文本块:
--- 源文本块1 (相似度: 0.8XXX) ---
RAG的核心优势在于能够提供更准确、更新、且可溯源的答案。...
来源文件: my_knowledge.txt
--------------------------------------
--- 源文本块2 (相似度: 0.7XXX) ---
它通过结合检索系统和生成模型,有效解决了LLM可能存在的知识陈旧和幻觉问题。...
来源文件: my_knowledge.txt
--------------------------------------
...
RAG应用执行完毕。
您可以看到,LLM的回答是基于您在 my_knowledge.txt
中提供的内容生成的,并且还打印出了用于生成答案的源文本块。这清晰地展示了RAG“检索-增强-生成”的流程。
强调与后续探索
恭喜您成功运行了第一个极简RAG应用!
- 这只是一个最基础的示例,用于帮助您理解RAG的基本工作流。实际的企业级RAG应用会涉及更复杂的文档处理、更高级的切分和嵌入策略、更强大的向量数据库、更精细的检索算法(如混合搜索、重排序)、更优化的Prompt工程以及效果评估等。
- 您可以尝试修改
data/my_knowledge.txt
的内容,或者改变user_query
中的问题,观察输出结果的变化,进一步体会RAG的运作。 - 鼓励您深入阅读LlamaIndex(或LangChain)的官方文档,探索更多高级功能和定制选项。
通过这个简单的实战,相信您对RAG的理解已经从理论迈向了实践。
那么,如何系统的去学习大模型LLM?
作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。
所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。
由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
👉大模型学习指南+路线汇总👈
我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
👉①.基础篇👈
基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
👉②.进阶篇👈
接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
👉③.实战篇👈
实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
👉④.福利篇👈
最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!