RAG实战 | 基于LlamaIndex的文档问答系统

引言

小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖沙茶面的小男孩。今天这篇小作文主要介绍如何使用LlamaIndex实现RAG方案的文档问答系统。该本地化的文档问答系统是结合大模型部署框架ollama和LlamaIndex实现的。完整代码可以在微信公众号《小窗幽记机器学习》上添加小编微信获取。

小窗幽记机器学习

记录机器学习过程中的点点滴滴和坑坑洼洼

公众号

依赖安装

pip3 install llama-index EbookLib html2text llama-index-embeddings-huggingface  llama-index-llms-ollama -i https://mirrors.cloud.tencent.com/pypi/simple

基于LlamaIndex构建RAG

基于LlamaIndex 的 RAG(检索增强生成)包括以下几个阶段:

  • 加载:在这个阶段,告诉 LlamaIndex 你的数据存放在哪里以及如何加载它;

  • 索引:在这个阶段,索引已加载的数据以便于查询,例如使用向量嵌入;

  • 查询:在这个阶段,配置一个大语言模型(LLM)作为索引数据的查询接口。

Loading

LlamaIndex 是专门为 RAG 设计的。这一点从其 SimpleDirectoryReader 构造中就可以立刻看出来,它暖心地支持多种多样的文件类型,b比如.epub或者pdf等格式。这里使用的数据是“成武县2023年国民经济和社会发展统计公报.pdf”。

from llama_index.core import SimpleDirectoryReader

loader = SimpleDirectoryReader(
    input_dir="./test_datas/",
    recursive=True,
    required_exts=[".pdf"],
)

documents = loader.load_data()

通过SimpleDirectoryReader.load_data()将电子书转换为一组文档,以便 LlamaIndex 使用。

需要注意的一点是,这些文档在这个阶段还没有被分块,分块操作将在后续的索引阶段进行。

Indexing

加载数据之后,接下来就是对其进行索引。这将使RAG pipeline 能够查找与查询相关的上下文信息,以传递给LLM,从而增强生成的响应。这也是进行文档分块的阶段。

VectorStoreIndex 是 LlamaIndex 中“默认”的索引入口。默认情况下,VectorStoreIndex 使用一个简单的内存字典来存储索引,但 LlamaIndex 还支持各种各样的向量存储解决方案,方便开发者在扩展时使用。

LlamaIndex 使用默认分块大小为 1024,分块重叠为 20。有关更多详细信息,请参见 LlamaIndex 文档。

如前所述,这里将使用 BAAI/bge-base-zh-v1.5来生成嵌入。默认情况下,LlamaIndex 使用 OpenAI(特别是 gpt-3.5-turbo),但考虑到这里的中文场景,而且希望实现一个轻量级、可在本地运行的端到端解决方案,这里并不会使用这个默认的方案。

LlamaIndex 支持通过方便的 HuggingFaceEmbedding 类从 Hugging Face 获取嵌入模型,因此将在这里使用它。

from llama_index.embeddings.huggingface import HuggingFaceEmbedding

embedding_model = HuggingFaceEmbedding(model_name="/model_zoo/embedding/BAAI/bge-base-zh-v1.5/")

# 把它作为嵌入模型传递给 VectorStoreIndex,以取代 OpenAI 的默认嵌入方案。
from llama_index.core import VectorStoreIndex

index = VectorStoreIndex.from_documents(
    documents,
    embed_model=embedding_model,
)

Querying

现在来完成 RAG 的最后一部分:进行查询。在这个示例中,将使用 Qwen1.5 和 Qwen2.5 进行效果的比对。

首先,让启动 Ollama 服务器。在一个单独的终端中运行:ollama serve。然后拉取目标模型,如:

# qwen1.5-4B:latest
ollama run qwen2.5:3b

现在,让我们将 Qwen 连接到 LlamaIndex,并将其用作我们查询引擎的基础。

from llama_index.llms.ollama import Ollama
# qwen1.5-4B:latest
# qwen2.5:1.5b
# qwen2.5:7b
llama = Ollama(
    model="qwen1.5-4B:latest",
    request_timeout=40.0,
)

query_engine = index.as_query_engine(llm=llama)
print(query_engine.query("有多少公务员,一共发了多少退休金?公务员每个月的退休金是多少?"))

各个模型RAG生成结果:

# "qwen:0.5b" -> 公务员每个月的退休金是1869.90元。
# qwen:1.8b -> 效果比较差
# "qwen1.5-4B:latest" -》成武县2023年机关事业单位退休人员8778人,发放养老待遇7.85亿元。
# qwen2.5:0.5b -> 效果差
# "qwen2.5:1.5b" -》根据提供的信息,成武县2023年机关事业单位退休人员的养老金发放总额为7.85亿元。
# qwen2.5:3b -》效果还行
# qwen2.5:7b -》根据提供的信息,2023年机关事业单位退休人员发放的养老待遇为7.85亿元。但是具体每位公务员每个月的退休金是多少没有明确说明。因此无法直接得出公务员每个月的具体退休金额。为了得到准确答案,需要进一步查询具体的退休金标准或总额分配情况。

可以看出,对于Qwen2.5,在3B以上效果才不错,对于Qwen1.5,则需要4B才可以有不错的效果。

总结

本文主要介绍如何使用LlamaIndex实现RAG系统,并以文档问答为实例,介绍如何使用LlamaIndex实现RAG。借助LlamaIndex实现的RAG系统,可以进一步实现本地化的知识库系统的构建。#RAG #LlamaIndex #问答系统 #知识库问答 #RAG实战 #AI入门 #搜索系统

RAG(Retrieval-Augmented Generation)是一种结合了检索和生成技术的模型,它利用预训练的语言模型(如GPT)生成答案,并通过检索系统查找相关信息来增强其响应。RAG知识库需求文档是用于指导构建或维护一个能够支持RAG模型的知识库的文档。这样的文档通常会包含以下内容: 1. 知识库的目标和范围:明确知识库需要覆盖的主题范围、预期的数据量、更新频率等。 2. 数据采集:说明如何收集和整理数据,包括数据来源、数据格式、数据清洗和预处理等步骤。 3. 数据存储和管理:描述知识库的存储结构、索引机制、数据一致性保证、备份策略和安全性要求。 4. 检索系统设计:定义检索系统的工作原理,包括搜索引擎的选择、索引建立、检索算法、相关性评分和检索结果的展示方式。 5. 数据更新和维护:概述数据更新的流程,包括新数据的录入、旧数据的淘汰或更新、数据的验证和测试等。 6. 用户接口:如果知识库将直接与用户交互,需要定义用户接口的设计,包括搜索界面、结果展示、用户反馈机制等。 7. 性能和质量保证:描述如何评估知识库的性能和信息质量,包括准确度、响应时间、容错能力等。 8. 安全和合规性:确保知识库的设计遵循相关的数据保护法规和标准,包括用户数据的隐私保护、数据访问控制和审计日志记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值