如何使用 LlamaIndex 构建一个 RAG 检索系统
mindmap
((LLamaIndex))
((知识库))
((搜索引擎))
((Agent))
((Workflow))
((大语言模型))LLamaIndex 是一个基于大语言模型的应用的开源框架,可以用于构建 RAG 检索系统和其他基于大语言模型的应用。
本文将从浅及深地介绍如何使用 LlamaIndex 实现一个简单的以向量检索和搜索引擎检索作为基础的 RAG 检索系统。
我们从 VSCode 官网下载并安装 VSCode。
在电脑上新建一个 llamaindex-rag 的文件夹,然后在 VSCode 中打开这个文件夹。

接下来我们安装 VSCode 的 Python 官方插件。

然后我们在 VSCode 使用下面的按键组合打开 VSCode 命令面板:
- Windows/Linux:
Ctrl + Shift + P - Mac:
Cmd + Shift + P

在命令面板中输入 > Python: Create Environment, 回车后选择 Venv 创建一个 Python 虚拟环境。

创建虚拟环境之后,我们可以在打开的目录下看到一个 venv 的文件夹,这个文件夹内包含了 Python 的虚拟环境。同时 VSCode 也会自动激活这个虚拟环境。
从 Ollama 下载并安装 Ollama。

用组合键:
- Windows/Linux:
Ctrl + ` - Mac:
Cmd + `
在 VSCode 中打开终端,输入下面的命令在 Ollama 中安装 llama 3.1 模型:
ollama run llama3.1
在 VSCode 中打开终端,输入下面的命令安装 llama_index.llms.ollama LLamaIndex 的 Ollama 模块:
pip install llama_index.llms.ollama在 VSCode 中新建 rag.py 文件:
from llama_index.llms.ollama import Ollama
llm = Ollama(model="llama3.1:latest", request_timeout=120.0)
resp = llm.complete("Who are you?");
print(resp)点击 VSCode 左上角的三角形的运行按钮,我们可以看到在终端中看到打印出来的模型的输出。


在llamaindex-rag目录下新建一个 knowledge 目录,然后在 knowledge 目录,用于存放我们要检索的原始知识库的文件。
然后在 knowledge 目录下新建一个 example.txt 文件,用于存放我们的知识库示例。
用下面的内容填充 example.txt 文件:
Eson 是一个博客作者. 他的博客链接是 https://blog.eonwong.com.你也可以在 knowledge 目录下面放置其它.txt、.docx、.pdf等格式的文件。
安装 llama_index.core 和 llama_index.embeddings.huggingface 模块。
在命令面板中执行下面的命令:
pip install llama-index llama_index.core llama_index.embeddings.huggingfacellama_index.core模块提供了 LLamaIndex 的核心功能llama_index.embeddings.huggingface模块提供了 HuggingFace 的 embeddings 模型的接入功能。
在 VSCode 中新建 knowledge.py 文件,首先导入 llama_index.core 和 llama_index.embeddings.huggingface 模块:
from llama_index.core import ( SimpleDirectoryReader, Settings, VectorStoreIndex)
from llama_index.embeddings.huggingface import HuggingFaceEmbedding设置 HuggingFace 的 embeddings 模型,我们选择在 HuggingFace 网站上热门的 baai/bge-m3 作为 LLamaIndex 向量化数据的 embedding 模型,在 knowledge.py 文件中添加下面的代码:
# 配置嵌入模型
Settings.embed_model = HuggingFaceEmbedding(model_name="baai/bge-m3")接下来我们使用 SimpleDirectoryReader 读取 knowledge 目录下的文件:
# 读取文件
reader = SimpleDirectoryReader(input_dir="./knowledge")
documents = reader.load_data()然后我们使用 VectorStoreIndex 向量化我们的知识库:
# embedding 向量化
index = VectorStoreIndex.from_documents(documents)向量化之后我们要把向量化的知识库保存到磁盘上,以便后续的检索:
# 保存向量化的知识库
index.storage_context.persist(persist_dir="./storage")运行 knowledge.py 文件,我们可以看到在终端中看,该脚本会先下载 baai/bge-m3 模型。

下载完成之后就会开始向量化知识库,然后保存向量化的数据保存到 storage 目录。

在 rag.py 文件顶部导入 StorageContext 和 load_index_from_storage 模块:
from llama_index.core import (StorageContext, load_index_from_storage)在 rag.py 文件内容替换为下面的代码:
# 导入模块
from llama_index.llms.ollama import Ollama
from llama_index.core import (StorageContext, load_index_from_storage, Settings)
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
# 配置 LLM 和 Embedding 模型
llm = Ollama(model="llama3.1:latest", request_timeout=120.0)
Settings.llm = Ollama(model="llama3.1", request_timeout=360.0)
Settings.embed_model = HuggingFaceEmbedding(model_name="baai/bge-m3")
# 读取知识库
storage_context = StorageContext.from_defaults(persist_dir="./storage")
index = load_index_from_storage(storage_context)
# 配制查询引擎
query_engine = index.as_query_engine(streaming=True)
# 查询
response = query_engine.query("Eson 的博客地址是什么?")
print("输出结果:")
print(response)