AI系列:大语言模型的RAG(检索增强生成)技术(下)-- 使用LlamaIndex

目录

  • 前言
  • 什么是LlamaIndex?
  • LlamaIndex代码
    • 设置embedding模型
    • 设置LLM模型
    • 索引
    • 查询机
  • 验证
  • 使用感受
  • 参考资料

前言

继上一篇文章AI系列:大语言模型的RAG(检索增强生成)技术(上),这篇文章主要以LlamaIndex为案例来实现RAG技术。如对背景知识感兴趣,请移步大语言模型的RAG(检索增强生成)技术(上)。

什么是LlamaIndex?

从LlamaIndex官网,可以找到如下的介绍:

LlamaIndex is a framework for building context-augmented LLM applications.
LlamaIndex provides tooling to enable context augmentation. A popular example is Retrieval-Augmented Generation (RAG) which combines context with LLMs at inference time. Another is
finetuning.
翻译成中文:
如LlamaIndex 是一个用于构建上下文增强型大型语言模型(LLM)应用的框架。
LlamaIndex 提供了工具来实现上下文增强。一个流行的例子是检索增强生成(RAG),它在推理时将上下文与大型语言模型结合起来。另一个例子是微调(finetuning)。

LlamaIndex为实现RAG技术提供了很多工具,详细信息可以参考官网。这里列出了一种实现方式,跟下方的代码示例相匹配,图示如下:

Reader
阅读器
Retriever
检索器

生成
Documents
pdf等资料
Index
向量索引
Embedding Model
嵌入模型
query
问题查询
queryEngine
查询器
LLM
大语言模型

LlamaIndex代码

本部分代码参考了LlamaIndex官网的RAG Starter Tutorial (OpenAI) 和Starter Tutorial (Local Models)等文档。

RAG Starter Tutorial (OpenAI) 中提到了一个使用OpenAI服务的例子,只需5行代码即可实现RAG。
如果使用OpenAI服务,则可以跳过下方embedding模型和LLM模型的设置,配好OPENAI_API_KEY环境变量即可。

设置embedding模型

因为没有OpenAI的token,采用HuggingFace服务器上的北京智源bge-small-en-v1.5作为嵌入模型。

from llama_index.core import Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
Settings.embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")

设置LLM模型

对于大型语言模型(LLM),我使用的是本地运行的Ollama服务器上的gemma:2b模型。由于我的个人笔记本配置较低(M1芯片,8G内存),我只能运行参数最低的模型。尽管如此,这并不影响我们演示RAG流程的基本原理:

from llama_index.llms.ollama import Ollama
gemma_2b = Ollama(model="gemma:2b", request_timeout=30.0)
Settings.llm = gemma_2b

LlamaIndex官网也提供了使用Hugging Face模型(本地及远程)及其他类型模型的代码示例,参见Hugging face LLMs。

索引

这部分代码参考了官网RAG Starter Tutorial (OpenAI) 中的例子。不同的是,我使用的是本地硬盘上的一篇介绍llama2的pdf文档,之后我会做关于llama2的提问。

这里包括嵌入向量索引的创建和持久化。如果去掉持久化这个非必需的部分,其实只需要两行代码。

PERSIST_DIR = "./storage"
if not os.path.exists(PERSIST_DIR):
    documents = SimpleDirectoryReader("./articles").load_data()
    # store docs into vector DB 将文档切块,计算嵌入向量,并索引
    index = VectorStoreIndex.from_documents(documents)
    # store it for later 持久化数据到本地磁盘
    index.storage_context.persist(persist_dir=PERSIST_DIR)
else:
    # load the existing index 直接读取本地磁盘数据到索引中
    storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
    index = load_index_from_storage(storage_context)

查询机

LlamaIndex提供了query engine,它可以通过retriever检索到index索引中语义相近的文档,与初始问题合并提供给大语言模型。
这里也只需要两行代码。

# 
query_engine = index.as_query_engine()
response = query_engine.query("Is there Llama 2 70B?")
print(response) 

如果你想获得更大的灵活性,也可以显示的定义retriever检索器。

验证

提问:

Is there Llama 2 70B?

gemma:2b大模型实在是个玩具,只能提问这样简单的问题。复杂点的问题它回答的乱七八糟。

执行程序,gemma:2b基于检索获得的增强上下文,回答正确:

Yes, Llama2 70B is mentioned in the context information. It is a large
language model that outperforms all open-source models.
在这里插入图片描述

如果不使用上述程序,而直接提问它相同的问题,得到的答案则是无法回答相关问题:

I am unable to access external sources or provide real-time
information, therefore I cannot answer this question.
在这里插入图片描述

使用感受

LlamaIndex使得RAG的实现变得简单。结构看起来非常简洁和优雅。
但是实际生产中可能涉及到的细节则很多,比如切块的粒度,检索的各种特性,提示语的自定义,等等。很多在Llama index是支持的,但使用效果有待验证。
LlamaIndex的设计理念及其发展值得持续关注。

参考资料

  • 什么是LlamaIndex?
    -https://docs.llamaindex.ai/en/stable/
  • LlamaIndex RAG Starter Tutorial (OpenAI) https://docs.llamaindex.ai/en/stable/getting_started/starter_example/
  • LlamaIndex RAG Starter Tutorial (Local Models) https://docs.llamaindex.ai/en/stable/getting_started/starter_example_local/
  • LlamaIndex query engine
    https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/
  • LlmaIndex [Hugging face LLMs]
    https://docs.llamaindex.ai/en/stable/examples/llm/huggingface/)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/624535.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024最新网络安全零基础入门学习路线,学网安看这篇就够了!

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“ 安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与…

高通QCC3071 ANC调试录音新方法

1, 从QCC307X和QCC517X的芯片开始ANC调试录音不再使用QACT软件了,而是使用Qualcomm ANC Filter Designer使用耳机进入Recording模式,再使用第三方的音频编辑软件来播放和录取声音。 2, 本文以QCC3071做Hybrid ANC,FF MIC使用数字MIC FB MIC使用模拟MEMS MIC为例来讲解具体…

IDEA里面数据库编辑数据库链接/重命名库的操作

选中数据库图标,点击号,打开MySql 图片的每一处都可以修改,改完再点test connection,没问题再点确定按钮就可以

4万字一文带你看懂车载摄像头技术、市场、发展前景

1、小孔成像 在战国初期,我国学者墨子(公元前468年-公元前376年)和弟子们完成了世界上第一个小孔成像的实验,并记录在《墨经》中:“景到,在午有端,与景长。说在端。”“景。光之人,煦…

从旺店通·企业奇门到金蝶云星空通过接口配置打通数据

从旺店通企业奇门到金蝶云星空通过接口配置打通数据 接通系统:旺店通企业奇门 慧策最先以旺店通ERP切入商家核心管理痛点——订单管理,之后围绕电商经营管理中的核心管理诉求,先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策的…

Spring事务和事务传播机制(@Transactional)

文章目录 Spring事务(Transactional详解)什么是事务为什么需要事务事务的操作(sql) Spring中的事务实现Spring编程式事务Spring声明式事务 TransactionalTransactional可以用来修饰方法或类对异常进行捕获细节: Transactional详解三个属性1. …

牛客NC363 开锁【中等 BFS Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/e7cbabbf7e0a41ec98055ee5f3d33bbe https://www.lintcode.com/problem/796 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改&#x…

在PyQt5中实现点击按钮打开新窗口功能—窗口的跳转功能实现

百度搜索“pyqt5中如何点击按钮打开新的窗口”,自动生成以下参考代码。 在PyQt5中,要实现点击按钮打开新窗口,你需要定义一个新的窗口类,并在按钮的点击信号(clicked)处理函数中创建并显示这个新窗口。以下…

Eclipse 里如何建立SAP应用服务层的CDS

关于Core Data Service(CDS) CDS:Core Data Ser vice.核心数据服务。CDS 是使用基于 SQL的数据定义语言(DDL)定义的,该语言基于标准 SQL 并带有一些附加概念。使用类似 SQL的灵活表达式可以进行复杂的数据建模。有两种类型的 CDS:ABAP CDS 和 HANA CDS。 S/4 HANA…

安装HTTPS证书后,网站安全性会有哪些提升?

在当今数字化时代,网络安全已成为一个不可忽视的话题。随着网络攻击的日益频繁,保护网站和用户数据的安全变得尤为重要。HTTPS作为一种加密的HTTP协议,为我们提供了一种安全的网络数据传输方式。本文将详细介绍HTTPS的工作原理、端口号以及如…

测试docker GPU性能损失

NVIDIA 3090 利用HSOpticalFlow代码测试docker GPU性能损失 docker介绍图如下: 形象生动展示了他们之间的关系 今天要测试docker容器运行HSOpticalFlow算法的性能损失,包括CPU和GPU 上一篇博客 http://t.csdnimg.cn/YW5kE 我已经介绍了使用docker和nvid…

如何判断海外住宅ip的好坏?

在海外IP代理中,住宅IP属于相对较好的资源,无论是用于工作、学习、还是娱乐,都能得到较好的使用效果。作为用户,该如何判断海外住宅IP的好坏呢? 稳定性与可靠性:海外住宅IP相比动态IP地址,通常具…

国际数字影像产业园近期活动一览

一、4月23日,在数媒大厦的春日里,我们共同迎来了第29个“世界读书日"。由数字影像联合工会委员会、树莓科技(成都)集团有限公司工会委员会主办,成都树莓信息技术有限公司、四川聚能文化传播公司承办的「共沐书香 …

“AI换脸”“一键脱衣” AI诈骗正在进行

这两年AI技术快速发展,从AI变声到AI换脸,AI技术在给我们带来震撼的同时,也有心术不正的人利用它做坏事。比如,近来媒体常报道的“一键脱衣”案件,一位广州女生在地铁拍的美照,被个别网友,用AI一…

(值得拥有)项目框架构建之7:提供工业互联网的框架基础,本文附带框架基础源码

很多读者,可能只是匆匆一看,感觉没啥东西。 但我要特意提醒各位读者:此源码,可是非常有价值的东西。我不一定会一直开放。 前述文章曾讲解了大概如何构建一个项目框架,本意是好的,无奈框架这种思想性的东西…

react18【系列实用教程】组件 (2024最新版 | 含父子组件传值、兄弟组件传值、越层组件传值、“插槽“)

什么是组件? 一个组件就是用户界面的一部分,它可以有自己的逻辑和外观。 组件之间可以互相嵌套,也可以复用多次 为什么要用组件? 组件能让开发者像搭积木一样快速构建一个完整的庞大应用,大大提升了开发效率&#xff…

【MySQL数据库】丨高可用之MHA集群部署

一、准备工作 1.1 修改主机名 vim /etc/hosts# 添加对应主机 192.168.28.128 mha1 192.168.28.131 mha2 192.168.28.132 mha31.2 关闭防火墙及修改selinux # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭自启动# 修改selinux vim /etc/sy…

EasyImage2.0 图床源码

EasyImage2.0 是一个简单图床的源码,它支持以下功能: 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …

基于STC12C5A60S2系列1T 8051单片机实现一主单片机发送数据给一从单片机接收并返回数据给主单片机的串口通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机发送数据给一从单片机接收并返回数据给主单片机的串口通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片…

langchain_community切分各种文档数据;加载向量模型;使用向量库

参考: https://github.com/langchain-ai/langchain https://api.python.langchain.com/en/latest/community_api_reference.html https://github.com/shibing624/ChatPilot/blob/384f18e4f10f87e10f104f9ff57f02c655588035/chatpilot/apps/rag_app.py 安装: pip instal…