《向量数据库指南》让「引用」为 RAG 机器人回答增加可信度

在之前的文章中,我们已经介绍了如何用 Milvus 向量数据库以及 LlamaIndex 搭建基础的聊天机器人《Chat Towards Data Science |如何用个人数据知识库构建 RAG 聊天机器人?书接上回,如何用 LlamaIndex 搭建聊天机器人?》。

本文将继续使用 LlamaIndex,并在前两篇文章的基础上,修改代码来为我们的结果添加引用。TruEra 在他们的一篇 RAG 评估博客介绍了结果依据(Groundness),有兴趣的朋友可以点击链接查看。
 

  • 准备步骤

首先,安装 llama-index、python-dotenv、pymilvus 和 openai
 。

! pip install llama-index python-dotenv openai pymilvus

接着,设置 OpenAI 和 Zilliz Cloud (全托管的 Milvus 向量数据库),用 load_dotenv 函数拉取存储在.env 文件中的环境变量。随后,传入环境变量,使用os获取变量值。我们用 OpenAI 作为 LLM,Zilliz Cloud(https://zilliz.com.cn/cloud) 作为向量数据库。本例中,我们用 Zilliz Cloud 及 Collection 实现数据持久化。

import osfrom dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
zilliz_uri = os.getenv("ZILLIZ_URI")
zilliz_token = os.getenv("ZILLIZ_TOKEN")

  • 设置参数

接下来,定义 RAG 聊天机器人的参数。我们必须设置 3 个参数:Embedding 模型、Milvus向量数据库和 LlamaIndex 数据传入。

首先,设置我们的 Embedding 模型。在本例中,我们用在之前的文章中用到的HuggingFace MiniLM L12 模型来抓取数据并转换为 Embedding 向量,同时可以通过 LlamaIndex 使用 HuggingFaceEmbedding 模块来加载这些数据。
 

from llama_index.embeddings import HuggingFaceEmbedding
embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L12-v2")

其次,设置向量数据库。由于 Zilliz Cloud 可以提供全托管的 Milvus 服务,我们可以使用MilvusVectorStore模块来连接 Zilliz Cloud。在此过程中,需要提供 URI、token 并定义 Collection名称、相似度类型和文本键。

此前,我们已经通过环境变量获取了 Zilliz Cloud URI 和 token,Collection 名称、相似度类型和文本键则沿用之前文章中的设置。

from llama_index.vector_stores import MilvusVectorStore
vdb = MilvusVectorStore(uri = zilliz_uri,token = zilliz_token,collection_name = "tds_articles",similarity_metric = "L2",text_key="paragraph"
)

最后,整合 LlamaIndex 数据抽象。我们需要的两个原生组件是服务上下文(service context)以及向量存储索引(vector store index),服务上下文用于传入一些预定义的服务,向量存储索引用于从向量数据库创建一个 LlamaIndex “索引”。在本例中,我们用服务上下文来传入 Embedding 模型,用现有的 Milvus 向量数据库和创建的服务上下文来创建向量索引。

from llama_index import VectorStoreIndex, ServiceContext
service_context = ServiceContext.from_defaults(embed_model=embed_model)
vector_index = VectorStoreIndex.from_vector_store(vector_store=vdb, service_context=service_context)

  • 为聊天机器人回答添加引用

引用和注释(Citation and attribution)能够进一步优化我们的 RAG 应用,可以通过引用和注释,了解回答的数据来源,并依此评估获得的回答有多准确。

LlamaIndex 通过其CitationQueryEngine模块提供了一种实现引用的简便方法,这个模块非常容易上手。用from_args并传入向量索引,便可创建一个引用查询引擎。由于之前在向量索引中定义了文本字段,所以不需要再额外添加任何东西。

from llama_index.query_engine import CitationQueryEngine
query_engine = CitationQueryEngine.from_args(vector_index
)

搭建了查询引擎后,便可以开始发送查询问题了。例如,我们向聊天机器人提问:“What is a large language model?(什么是大语言模型?)”。预期中,我们应该可以从 Towards Data Science 数据集中获取这个问题的答案。

res = query_engine.query("What is a large language model?")
from pprint import pprint
pprint(res)

下图为响应示例,响应中包含了回答和来源文本,我们可以根据来源判断得到的回答的准确性。

  • 总结

本文采用了引用和注释的方法来为机器人的回答增加可信度。可以说,引用和注释解决了 RAG 的两个常见问题,通过引用和注释,我们能够知道数据来源。同时,我们还能根据数据来源评估获得的回答有多准确。此外,我们在文章中还使用了 LlamaIndex 和 Zilliz Cloud,LlamaIndex 能帮我们轻松创建获取来源的引擎,而 Zilliz Cloud 帮我们轻松实现数据持久化。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FlinkCDC的分析和应用代码

前言:原本想讲如何基于Flink实现定制化计算引擎的开发,并以FlinkCDC为例介绍;发现这两个在表达上不知以谁为主,所以先分析FlinkCDC的应用场景和技术实现原理,下一篇再去分析Flink能在哪些方面,做定制化计算…

个人网站制作 Part 4 添加响应式设计 | Web开发项目

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加响应式设计🔨移动优先的响应式样式🔧步骤 1: 添加媒体查询 🔨图片和布局调整🔧步骤 2: 使用响应式图片🔧步…

vue3-计算属性

计算属性 模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。 根据作者今年是否看过书展示不同信息 <script lang"ts" setup> import { ref, reactive } from "…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《与新能源互补和独立参加多级市场的抽蓄电站容量分配策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到抽蓄电站在能源系统中的角色&#xff0c;特别是在多级市场中的参与&#xff0c;并强调了新能源的互补性以及抽蓄电站的独立性。下面我将…

Spring Boot 整合支付宝实现在线支付方案(沙箱环境)

文章目录 1.理解沙箱环境2.沙箱环境接入准备2.1 访问开发者控制台2.2 获取重要信息2.3 处理秘钥 3.接入支付宝支付的流程4.实现支付4.1 添加 SDK 依赖4.2 创建配置类4.3 支付宝订单管理接口实现流程4.4 支付宝支付接口实现流程 5.支付宝支付功能演示7.总结 TIP&#xff1a;对于…

网络协议与攻击模拟_04ICMP协议与ICMP重定向

ICMP协议是网络层协议&#xff0c; 利用ICMP协议可以实现网络中监听服务和拒绝服务&#xff0c;如 ICMP重定向的攻击。 一、ICMP基本概念 1、ICMP协议 ICMP是Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制消息&#xff0c;控制消息指网络通不通、主机是…

Git LFS 大文件存储

Git 碰到大文件的困境 Git 是业界流行的分布式版本控制工具&#xff0c;本地仓库与远端仓库同样保存了全量的文件和变更历史&#xff0c;这样让代码协作变得简单和高效。但也正因为如此&#xff0c;Git针对大型文件&#xff08;例如图片、视频或其他二进制文件&#xff09;的版…

序章 熟悉战场篇—了解vue的基本操作

了解vue 的基本目录&#xff1a; dist 是打包后存放的目录(后续可以改)node_modules 是依赖包public 是静态index页面src 是存放文件的目录assets 是存放静态资源的目录components 是存放组件的目录views 是存放页面文件的目录&#xff08;没有views 自己新建一个&#xff09;A…

Jetpack Compose -> 声明式UI Modifier

前言 本章主要介绍下 Compose 的声明式 UI 以及初级写法&#xff1b; 什么是声明式UI 传统UI 传统 UI 方式来声明UI <androidx.appcompat.widget.LinearLayoutCompat android:layout_width"match_parent" android:layout_height"match_parent&quo…

YOLOv5改进 | 二次创新篇 | 结合iRMB和EMA形成全新的iEMA机制(全网独家创新)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,为什么这么说,从去年的三月份开始对于图像领域的论文发表其实是变难的了,在那之前大家可能搭搭积木的情况下就可以简单的发表一篇论文,但是从去年开始单纯的搭积木其实发表论…

C# 图解教程 第5版 —— 第24章 预处理指令

文章目录 24.1 什么是预处理指令24.2 基本规则24.3 符号指令&#xff08;#define、#undef &#xff09;24.4 条件编译&#xff08;#if、#else、#elif、#endif&#xff09;24.5 条件编译结构24.6 诊断指令&#xff08;#warning、#error&#xff09;24.7 行号指令&#xff08;#li…

【C++入门到精通】智能指针 [ C++入门 ]

阅读导航 引言一、什么是智能指针二、为什么需要智能指针三、内存泄漏1. 什么是内存泄漏&#xff0c;内存泄漏的危害2. 内存泄漏的示例&#xff0c;以及解决方法3. 内存泄漏分类&#xff08;1&#xff09;堆内存泄漏(Heap leak)&#xff08;2&#xff09;系统资源泄漏 4. 如何检…

Sqoop的增量数据加载策略与示例

当使用Apache Sqoop进行数据加载时&#xff0c;增量数据加载策略是一个关键的话题。增量加载可以仅导入发生变化的数据&#xff0c;而不必每次都导入整个数据集&#xff0c;这可以显著提高任务的效率。本文将深入探讨Sqoop的增量数据加载策略&#xff0c;提供详细的示例代码&am…

大语言模型面试问题

自己在看面经中遇到的一些面试题&#xff0c;结合自己和理解进行了一下整理。 transformer中求和与归一化中“求和”是什么意思&#xff1f; 求和的意思就是残差层求和&#xff0c;原本的等式为y H(x)转化为y x H(x)&#xff0c;这样做的目的是防止网络层数的加深而造成的梯…

管理软件供应链中网络安全工具蔓延的三种方法

软件开发组织不断发展&#xff0c;团队成长&#xff0c;项目数量增加。技术堆栈发生变化&#xff0c;技术和管理决策变得更加分散。 在这一演变过程中&#xff0c;该组织的 AppSec 工具组合也在不断增长。在动态组织中&#xff0c;这可能会导致“工具蔓延”。庞大的 AppSec 工…

Java--RSA非对称加密的实现(使用java.security.KeyPair)

文章目录 前言实现步骤测试结果 前言 非对称加密是指使用不同的两个密钥进行加密和解密的一种加密算法&#xff0c;调用方用使用服务方提供的公钥进行加密&#xff0c;服务方使用自己的私钥进行解密。RSA算法是目前使用最广泛的公钥密码算法。Java提供了KeyPairGenerator类要生…

2024年AMC8模拟考试实测流程、注意事项和常见问题

和往年的AMC8比赛一样&#xff0c;在正式比赛的前一周左右会开放两天的模拟考试时间&#xff0c;AMC8的主办方建议所有的参赛选手重视且参加模拟考试&#xff0c;以测试设备、熟悉流程&#xff0c;避免将来正式考试不小心违规&#xff0c;或者设备不给力。 2024年的AMC8模拟考…

OFBiz RCE漏洞复现(CVE-2023-51467)

漏洞名称 Apache OFBiz 鉴权绕过导致命令执行 漏洞描述 Apache OFBiz是一个非常著名的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0c;提供了创建基于最新J2EE/XML规范和技术标准&#xff0c;构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式…

五、带登录窗体的demo

做了一个简单的带登录窗体的demo&#xff0c;有用户名和密码不能为空的验证&#xff0c;原理是在main.cpp的主函数入口处&#xff1a; 1、将默认的MainWindow主窗体注释。 2、新建一个formlogin登录窗体&#xff0c;在主函数中先运行登录窗体。 3、在登录窗体中引用MainWind…

Android json功能解析

1. 简介 JAVAScript Object Notation是一种轻量级的数据交换格式具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;。  JSON采用兼容性很高的文本格式&#xf…