Eson Wong's Blog

生活随想、学习笔记、读书总结、创作记录

0%

如何使用 LlamaIndex 构建一个 RAG 检索系统

mindmap
  ((LLamaIndex))
    ((知识库))
    ((搜索引擎))
    ((Agent))
    ((Workflow))
    ((大语言模型))

LLamaIndex 是一个基于大语言模型的应用的开源框架,可以用于构建 RAG 检索系统和其他基于大语言模型的应用。

本文将从浅及深地介绍如何使用 LlamaIndex 实现一个简单的以向量检索和搜索引擎检索作为基础的 RAG 检索系统。

准备工作

安装 VSCode,准备 Python 环境

我们从 VSCode 官网下载并安装 VSCode。

在电脑上新建一个 llamaindex-rag 的文件夹,然后在 VSCode 中打开这个文件夹。

打开目录

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

安装 VSCode 的 Python 官方插件

然后我们在 VSCode 使用下面的按键组合打开 VSCode 命令面板:

  • Windows/Linux: Ctrl + Shift + P
  • Mac: Cmd + Shift + P

打开命令面板

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

创建 Python 虚拟环境

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

接入大语言模型

Ollama 本地运行 llama 3.1 模型

Ollama 下载并安装 Ollama。

下载 Ollama

用组合键:

  • Windows/Linux: Ctrl + `
  • Mac: Cmd + `

在 VSCode 中打开终端,输入下面的命令在 Ollama 中安装 llama 3.1 模型:

1
ollama run llama3.1

使用 LlamaIndex 接入 Ollama

安装 LlamaIndex

在 VSCode 中打开终端,输入下面的命令安装 llama_index.llms.ollama LLamaIndex 的 Ollama 模块:

1
pip install llama_index.llms.ollama

在 VSCode 中新建 rag.py 文件:

1
2
3
4
5
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 左上角的三角形的运行按钮,我们可以看到在终端中看到打印出来的模型的输出。

运行 rag.py

构建和接入知识库

准备知识库示例文件

创建知识库目录

llamaindex-rag目录下新建一个 knowledge 目录,然后在 knowledge 目录,用于存放我们要检索的原始知识库的文件。

然后在 knowledge 目录下新建一个 example.txt 文件,用于存放我们的知识库示例。

用下面的内容填充 example.txt 文件:

1
Eson 是一个博客作者. 他的博客链接是 https://blog.eonwong.com.

你也可以在 knowledge 目录下面放置其它.txt.docx.pdf等格式的文件。

使用 LlamaIndex 构建知识库

安装 llama_index.corellama_index.embeddings.huggingface 模块。

在命令面板中执行下面的命令:

1
pip install llama-index llama_index.core llama_index.embeddings.huggingface
  • llama_index.core 模块提供了 LLamaIndex 的核心功能
  • llama_index.embeddings.huggingface 模块提供了 HuggingFace 的 embeddings 模型的接入功能。

在 VSCode 中新建 knowledge.py 文件,首先导入 llama_index.corellama_index.embeddings.huggingface 模块:

1
2
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 文件中添加下面的代码:

1
2
# 配置嵌入模型
Settings.embed_model = HuggingFaceEmbedding(model_name="baai/bge-m3")

接下来我们使用 SimpleDirectoryReader 读取 knowledge 目录下的文件:

1
2
3
# 读取文件
reader = SimpleDirectoryReader(input_dir="./knowledge")
documents = reader.load_data()

然后我们使用 VectorStoreIndex 向量化我们的知识库:

1
2
# embedding 向量化
index = VectorStoreIndex.from_documents(documents)

向量化之后我们要把向量化的知识库保存到磁盘上,以便后续的检索:

1
2
# 保存向量化的知识库
index.storage_context.persist(persist_dir="./storage")

运行 knowledge.py 文件,我们可以看到在终端中看,该脚本会先下载 baai/bge-m3 模型。

运行 knowledge.py

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

向量化知识库

检索知识库

rag.py 文件顶部导入 StorageContextload_index_from_storage 模块:

1
from llama_index.core import (StorageContext, load_index_from_storage)

rag.py 文件内容替换为下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 导入模块
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)

接入搜索引擎

为大语言模型输入提供检索结果

请我喝杯咖啡吧!

欢迎关注我的其它发布渠道