书接上回,如何用 LlamaIndex 搭建聊天机器人?

news2024/11/7 22:46:14

02d436e27c869cf3f03f9cef1cdcefb8.png

LlamaIndex 是领先的开源数据检索框架,能够在各种应用中发挥优势,其中一个典型的应用就是在企业内部搭建聊天机器人。

对于企业而言,随着文档数量不断增多,文档管理会变得愈发困难。因此,许多企业会基于内部知识库搭建聊天机器人。在搭建过程中,需要关注三个要点:如何切割数据、保存哪些元数据以及如何路由查询。

01.

为什么要用 LlamaIndex 搭建聊天机器人?

在上一篇文章中,我们使用 Zilliz Cloud(全托管的 Milvus 云服务)搭建了一个最基本的检索增强生成(RAG)(https://zilliz.com/use-cases/llm-retrieval-augmented-generation)聊天机器人。在本教程中我们可以继续使用 Zilliz Cloud 免费版,大家也可以使用自己的 Milvus(https://milvus.io/) 实例,在 notebook 中快速启动并使用 Milvus Lite(https://milvus.io/docs/milvus_lite.md)。

上一篇文章中我们将文章进行切割,获取许多小的文本块。当输入问题“什么是大型语言模型?”进行简单的检索时,得到的返还文本块在语义上与问题相似,但并没有得到问题的答案。因此,在本项目中,我们使用同样的向量数据库作为后端,但使用不同的检索过程来进一步获得更好的问答结果。在项目中,我们将使用 LlamaIndex 来实现高效的检索。

LlamaIndex(https://zilliz.com/product/integrations/Llamaindex)是一个框架,可以帮助我们在大型语言模型之上处理数据。LlamaIndex 提供的一个主要抽象是“索引”。索引是数据分布的模型。在此基础上,LlamaIndex 还提供了将这些索引转化为查询引擎的能力,查询引擎利用大型语言模型和 embedding 模型来组织高效的查询并检索相关结果。

02.

LlamaIndex 和 Milvus 对于 Chat Towards Data Science 的作用

那么,LlamaIndex 是如何帮助我们协调数据检索?Milvus 又如何帮助搭建聊天机器人的呢?我们可以用 Milvus 作为后端,用于 LlamaIndex 的持久性向量存储(persistent vector store)。使用 Milvus 或 Zilliz Cloud 实例后,可以从一个 Python 原生且没有协调的应用程序转换到由 LlamaIndex 驱动的检索应用程序。

  • 设置 notebook,使用 Zilliz 和 LlamaIndex

正如之前文章所提到的,对于这一系列的项目 Chat Towards Data Science |如何用个人数据知识库构建 RAG 聊天机器人?(上),我们选择 Zilliz Cloud。连接到 Zilliz Cloud 和连接到 Milvus 的步骤基本上完全相同。关于如何连接到 Milvus 并将 Milvus 作为本地向量存储,可参见示例比较向量 embedding。

在 notebook 中我们需要安装三个库,通过 pip install llama-index python-dotenv openai来安装,使用python-dotenv管理环境变量。

获取导入后,需要用load_dotenv()加载.env文件。这个项目需要的三个环境变量是 OpenAI API key、Zilliz Cloud 集群的URI 以及 Zilliz Cloud 集群的 token。

! pip install llama-index python-dotenv openai
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")
  • 将现有的 Collection 带入 LlamaIndex

将现有的 collection 带入 LlamaIndex 这一步骤中有些小挑战。LlamaIndex 有其自己创建和访问向量数据库 collection 的结构,但是此处不直接使用。原生的 LlamaIndex 向量存储接口和带入自己的模型之间的主要区别是 embedding 向量和元数据的访问方式。为了实现本教程,我还写了一些代码并贡献到了 LlamaIndex (https://github.com/run-llama/llama_index/commit/78ed06c95313e933cc255ac17bcd592e3f4b2be1)项目中!

LlamaIndex 默认使用 OpenAI 的 embedding,但我们使用 HuggingFace 模型生成了 embedding。因此,必须传入正确的 embedding 模型。此外,本次使用了一个不同的字段来存储文本,我们使用 “paragraph”,而 LlamaIndex 默认使用“_node_content”。

这一部分需要从 LlamaIndex 导入四个模块。首先,需要 MilvusVectorStor来使用 Milvus 与 LlamaIndex。我们还需要VectorStoreIndex模块来用 Milvus 作为向量存储索引,用 ServiceContext 模块来传入我们想要使用的服务。最后导入HuggingFaceEmbedding模块,这样就可以使用来自 Hugging Face 的开源 embedding 模型了。

至于获取embedding模型,我们只需要声明一个 HuggingFaceEmbedding 对象并传入模型名称。本教程中使用的是 MiniLM L12 模型。接下来,创建一个 ServiceContext 对象,以便可以传递 embedding 模型。

from llama_index.vector_stores import MilvusVectorStore
from llama_index import VectorStoreIndex, ServiceContext
from llama_index.embeddings import HuggingFaceEmbedding

embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L12-v2")
service_context = ServiceContext.from_defaults(embed_model=embed_model)

当然,我们还需要连接到 Milvus 向量存储。这一步我们传递 5 个参数:我们的 Collection 的 URI、访问我们的 Collection 的 token、使用的 Collection 名称(默认是“Llamalection”)、使用的相似度类型,以及对应于哪个元数据字段存储文本的 key。

vdb = MilvusVectorStore(
    uri = zilliz_uri,
    token = zilliz_token,
    collection_name = "tds_articles",
    similarity_metric = "L2",
    text_key="paragraph"
)
  • 使用 LlamaIndex 查询 Milvus Collection

现在,我们已经连接至现有的 Milvus Collection 并拉取了需要的模型,接下来讲讲如何进行查询。

首先,创建一个 ServiceContext 对象,以便可以传递 Milvus 向量数据库。然后,将 Milvus Collection 转化为向量存储索引。这也是通过上面创建的 ServiceContext 对象传入 embedding 模型的地方。

有了一个初始化的向量存储索引对象后,只需要调用as_query_engine()函数将其转化为查询引擎。本教程中,通过使用与之前相同的问题 “什么是大型语言模型?”来比较直接的语义搜索和使用 LlamaIndex 查询引擎的区别。

vector_index = VectorStoreIndex.from_vector_store(vector_store=vdb, service_context=service_context)
query_engine = vector_index.as_query_engine()
response = query_engine.query("What is a large language model?")

为了使输出更易于阅读,我导入了pprint并用它来打印响应。

from pprint import pprint
pprint(response)

下方是我们使用 LlamaIndex 进行检索得到的响应,这比简单的语义搜索得到的结果要好得多:

8b6b181c458734da3e240e28eda5821e.png

03.

总结

本次,我们使用了 LlamaIndex 和现有的 Milvus Collection 来改进上一篇文章中搭建的聊天机器人。上一个版本使用了简单的语义相似性通过向量搜索来寻找答案,但结果并不是很好。相较之下,用 LlamaIndex 搭建查询引擎返回的结果更好。

本项目最大的挑战是如何带入已有的 Milvus Collection。现有的 Collection 并没有使用 embedding 向量维度的默认值,也没有使用用于存储文本的元数据字段的默认值。这两点的解决方案是通过 ServiceContext 传递特定的 embedding 模型和在创建 Milvus Vector Store 对象时定义正确的文本字段。

创建向量存储对象后,使用 Hugging Face embedding 将其转化为索引,然后将该索引转化为查询引擎。查询引擎利用 LLM 来理解问题、收集响应和返回更好的响应。

本文作者

5d7ceb3b17a445bd5fdd3d898e9f4648.jpeg

Yujian Tang
Zilliz 开发者布道师

推荐阅读

733367d477acced38b1cfba15f6220e7.jpeg

1ee55088b52795823190cb7a13c9928a.png

d19e8acebf6de02de008b34f5171dab4.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频增强和修复工具 Topaz Video AI mac中文版功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频,包括低分辨率视频、老旧影片、手机录制的视频等。 使用Topaz Video AI非常简单&#xff0c…

动态创建链表

动态创建链表的好处 相比于之前链表的几种功能介绍,都是在设定好的链表基础之上进行插入、删除等,那么如果我们要创建链表元素很多,就得去定义很多个元素结构体,非常不方便,这个时候应该用到动态创建链表。 动态创建…

MySQL在CentOS7环境下的安装

自己由于换了新的服务器,所以打算顺手编写此篇文章记录下来整个环境的重新安装过程 注意:切换为root身份进行操作 -->指令 su root 1、如果存在老安装包,将其卸载 这里我们使用管道grep进行过滤,查看是否之前已经安装过安装包…

【电路笔记】-相量图和相量代数

相量图和相量代数 文章目录 相量图和相量代数1、概述2、相量图3、相量代数3.1 加减3.2 差异化与整合 4、总结 1、概述 交流电信号可以用三种不同的方法来表示,以便表征和实现代数运算。 前面的文章中已经介绍了两种方法,本文稍后将介绍一种新的图形方法…

STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出

1. 课程概述(297.1) 课程要求:C语言熟练,提前学完 C51 2. 开发软件Keil5的安装(298.2) 开发环境的安装 编程语言:C语言需要安装的软件有两个:Keil5 和 STM32CubeMX Keil5 的安装…

使用pinia报错:setriderList()not a function

setriderList是我定义的事件,引用没有问题,但是就是请求不到,刷新就没有了,但是一会又开始报错了,进行排查吧 1:首先,需要确认报错信息是这样的: setriderList() not a function …

rwkv模型lora微调之accelerate和deepspeed训练加速

目录 一、rwkv模型简介 二、lora原理简介 三、rwkv-lora微调 1、数据整理 2、环境搭建 a、Dockerfile编写 b、制造镜像 c、容器启动 3、训练代码修改 四、模型推理 1、模型推理 2、lora权重合并 3、推理web服务 五、总结 由于业务采用的ChatGLM模型推理成本太大了…

短视频账号矩阵系统saas源码搭建/技术

一、短视频矩阵系统建模----技术api接口--获取用户授权 技术文档分享: 本系统采用MySQL数据库进行存储,数据库设计如下: 1.用户表(user): - 用户ID(user_id) - 用户名&#xff08…

【C/C++笔试练习】new和deleted底层原理、静态数据成员、运算符重载、只能使用new创建的类、模版声明、另类加法、走方格的方案数

文章目录 C/C笔试练习选择部分(1)new和deleted底层原理(2)静态数据成员(3)运算符重载(4)程序分析(5)静态数据成员(6)只能使用new创建的…

LeetCode----25. K 个一组翻转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示…

算法之【时间复杂度】与【空间复杂度】

目录 一、算法 1、算法定义 2、两种算法的比较 3、算法的特性 4、算法设计的要求 二、算法的复杂度 1、时间复杂度 1.1定义 1.2大O的渐近表示法 1.3推导大O阶方法 1.4最坏情况与平均情况 1.5常见的时间复杂度计算示例 🍂常数阶: &#x1f3…

Pinia的十个简答小案例

1. 使用Pinia进行状态管理: import { defineStore } from piniaexport const useCounterStore defineStore({id: counter,state: () > ({count: 0}),actions: {increment() {this.count},decrement() {this.count--}} }) 2. 在组件中使用Pinia: &…

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署,并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner,并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库,教程中使用的是阿里云的Docker…

Docker Tomcat 搭建文件服务器

本文基于openwrt上进行。 步骤 1: 安装 Docker 如果尚未安装Docker,首先需要安装Docker。根据你的操作系统,参考Docker官方文档来完成安装, 这里不做详细介绍。 步骤 2: 拉去docker Tomcat镜像 进入openwrt管理界面,docker选项中 拉取最新…

《算法设计与分析》 蛮力法实验报告一

1.(洛谷 P1008)将 1,2...9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数构成 1:2:3 的比例,试求出所有满足条件的三个三位数。 输入格式: 无 输出格式: 若干行,每行 3 个数字。按照每行第 1 个数字升序…

Run, Don‘t Walk: Chasing Higher FLOPS for Faster Neural Networks(CVPR2023)

文章目录 AbstractIntroduction过去工作存在的不足我们的工作主要贡献(待参考) Related workCNNViT, MLP, and variants Design of PConv and FasterNetPreliminaryPartial convolution as a basic operatorPConv followed by PWConvFasterNet as a gene…

【下载器】NDM和IDM介绍(含安装包和教程)

1 IDM(增强型下载管理器) 1.1 IDM介绍 官网:Internet Download Manager (IDM) 优缺点: 高速下载: IDM通过多线程下载和分段下载技术,能够显著提高下载速度,从而节省用户的时间。暂停和恢复功…

关于网络编程的3个问题

一、TCP 和 UDP 可以同时绑定相同的端口吗? 答案:可以的 在数据链路层中,通过 MAC 地址来寻找局域网中的主机。在网络层中,通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口进行寻址&#xff0…

【DP】最长上升公共子序列

一.题目来源 272. 最长公共上升子序列 - AcWing题库 二.简要思路 这道题易知是最长上升子序列(LIS)和最长公共子序列(LCS)的综合应用。我们可以先求最长公共子序列,然后再内循环最长上升子序列即可,直接看…

【ES专题】ElasticSearch搜索进阶

目录 前言阅读导航前置知识特别提醒笔记正文一、分词器详解1.1 基本概念1.2 分词发生的时期1.3 分词器的组成1.3.1 切词器&#xff1a;Tokenizer1.3.2 词项过滤器&#xff1a;Token Filter1.3.3 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 <font color…