破解提升 LLMs 性能的黑匣子—— LlamaIndex

news2024/11/19 20:17:36

“可以将 LlamaIndex 视为外部数据和 LLM 连接在一起的黑匣子。”在 Zilliz 组织的网络研讨会中,LlamaIndex 的联合创始人兼首席执行官 Jerry Liu 曾这样说道。

对于 Jerry Liu 的这个比喻,熟悉 LLMs 的开发者会觉得颇为贴切,尤其是对于那些想要用私有数据要训练自己大模型的开发者而言,LlamaIndex 绝对是提升大模型性能,让其更加易用、流畅的不二选择。

为了方便更多开发者了解和使用 LlamaIndex,我们今天将从概念谈起,着重介绍它的索引部分及使用方法。

什么是 LlamaIndex?

在使用 LLMs 的过程中,开发者往往会遇到诸多挑战,例如 LLM 缺乏特定领域的知识。为此,我们引入了 CVP Stack,以便将不同领域的知识注入 LLM 应用之中。和 CVP Stack 一样,LlamaIndex 通过注入数据来帮助解决 LLM 对特定领域认知不足的情况。可以说,LlamaIndex 是开发者和 LLM 交互的一种工具。LlamaIndex 接收输入数据并为其构建索引,随后会使用该索引来回答与输入数据相关的任何问题。不止如此,LlamaIndex 还可以根据手头的任务构建许多类型的索引,例如向量索引、树索引、列表索引或关键字索引。

LlamaIndex 中的各式索引

本质上,LlamaIndex 中的所有索引类型都由“节点”组成,节点代表了文档中的一段文本。接下来,我们可以详细了解一下 LlamaIndex 构建的索引类型、索引工作流程、以及不同索引的适配场景。

  • 列表索引
alt

顾名思义,列表索引是一种以列表形式来表示的索引。首先,输入数据被分成节点;随后这些节点会按顺序排列。如果在查询时未指定其他参数,则会按照同一个节点顺序进行查询。除了基本顺序查询之外,我们还可以使用关键字或 embedding 来查询节点。

列表索引为用户提供了一种根据输入顺序进行查询的方法,即使超出了 LLM 的 token 限制,LlamaIndex 也会提供一种接口,能够自动使用输入数据的所有内容。原理是什么?事实上,LlamaIndex 会使用每个节点的文本进行查询,并根据附加数据逐步优化答案。

  • 向量存储索引
alt

向量存储索引将节点存储为向量嵌入,而 LlamaIndex 可以支持这些向量 embedding 进行本地存储或使用专门的向量数据库(如 Milvus)存储。在查询时,LlamaIndex 会查找与节点最相似的 top_k 节点,并将其返回给响应合成器。

简言之,使用向量存储索引可以为 LLM 应用引入相似性检索,当使用者需要比较文本的语义相似性时,向量存储索引最为合适,例如,对特定类型的开源软件提问[1]。

  • 树索引
alt

LlamaIndex 的树形索引根据用户的输入数据构建树形结构。树形索引从叶节点即原始输入数据块开始自下而上构建,每个父节点包含叶节点。LlamaIndex 用 GPT 对节点进行总结来构建树形结构,在构建响应查询时,树形索引可以从根节点向下遍历到叶节点或直接从选择的叶节点构建。

树形索引不仅对于查询长文本块行之有效,还可以从文本的不同部分提取信息。与列表索引不同,树形索引不需要按顺序查询。

  • 关键词索引
alt

关键词索引是关键词到包含这些关键词的节点的映射。它是多对多的映射,每个关键词可能指向多个节点,每个节点可能有多个映射到它的关键词。在查询时,从查询中提取关键词,只查询映射的节点。

关键词索引适合查询大量数据中的特定关键词,尤其是在知晓用户的查询偏好时颇为适用。例如,用户在查询与健康保健相关的文件进行查询,且只关心与 COVID 19 相关的文档,此时选择关键词索引再合适不过了。

使用 LlamaIndex 的准备工作

首先,获取相关代码,我们把它们放在了 Google Colab[2] 笔记本,大家可以先获取提供的数据或者克隆 LlamaIndex repo[3],并打开 examples/paul_graham_essay 使用提供的示例代码。

其次,需要一个能够访问的 LLM。默认情况下,LlamaIndex 使用 GPT。大家可以从 OpenAI 网站获得 OpenAI API 密钥[4]。在示例代码中,我们是从 .env 文件中加载 OpenAI API 密钥的。不过,大家也可以直接在本地示例中输入密钥。无论上传到任何地方,记得先从代码中删除你的密钥!

from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
from dotenv import load_dotenv
import os
load_dotenv()
open_api_key = os.getenv("OPENAI_API_KEY")

随后,需要从 LlamaIndex 导入两个库,即GPTVectorStoreIndexSimplyDirectoryReader

接下来的示例用的是 LlamaIndex 仓库所提供的 Paul Graham Essay example[5] 的数据和文件夹结构。如果没有克隆该 repo,需要在工作目录中创建一个名为data 的文件夹,以便下面的代码能够正常运行。

加载数据。我们调用 SimplyDirectoryReader 中的 load_data()函数,并传入包含数据的目录名称。在本例中,是 data。可以在此处传入绝对或相对文件路径。

接下来,需要索引。可以通过在刚刚加载的文档上调用 GPTVectorStoreIndex中的from_documents 来创建索引。

documents = SimpleDirectoryReader('data').load_data()
index = GPTVectorStoreIndex.from_documents(documents)

查询 LlamaIndex 向量存储索引

我已经在上文中提到,向量存储索引非常适用于相似性搜索。

例如,我们提出了这样一个问题“作者成长过程中做了什么?”。这需要 LlamaIndex 解读文本并理解“成长过程中”是什么意思,随后再进行查询。

query_engine = index.as_query_engine()
response=query_engine.query("What did the author do growing up?")
print(response)

响应如下:

The author grew up writing short stories, programming on an IBM 1401, and nagging his father to buy a TRS-80 microcomputer. …

保存和加载索引

在实际应用中,大多数情况下都需要用户保存索引。保存索引可以节省 GPT token,并降低 LLM 使用成本。

保存索引非常容易,只需在索引上调用.storage_context.persist()

index.storage_context.persist()
alt

调用后,将创建一个名为storage的文件夹,其中包含三个文件:docstore.jsonindex_store.jsonvector_store.json。这些文件分别包含文档、索引元数据和向量 embedding。如果需要可扩展的版本,可能需要将向量数据库作为向量索引存储。

如果想要加载索引,需要从llama_index导入另外两个模块StorageContextload_index_from_storage,并将持久存储目录传给StorageContext类。一旦加载了存储的上下文,就可以在上面调用load_index_from_storage函数重新加载索引。

from llama_index import StorageContext, load_index_from_storage

# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir="./storage")
# load indexindex = load_index_from_storage(storage_context)

当然,除了在不同场景下构建各式索引,LlamaIndex 还可以构建许多不同类型的项目,例如问答机器人、全栈 Web 应用程序、文本分析项目等。想要了解更多 LlamaIndex 构建的应用程序[6],可参考相关链接进行查询。


  • 如果在使用 Milvus 或 Zilliz 产品有任何问题,可添加小助手微信 “zilliz-tech” 加入交流群。 •
  • 欢迎关注微信公众号“Zilliz”,了解最新资讯。 • alt

本文由 mdnice 多平台发布

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

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

相关文章

Chinese-LLaMA-Alpaca代码实战

文章目录 微调chinese-alpaca部署llama.cpp将FP16模型量化为4-bit 项目地址: https://github.com/ymcui/Chinese-LLaMA-Alpaca 微调chinese-alpaca 本项目基于中文数据 开源了使用中文文本数据预训练的中文LLaMA大模型(7B、13B)开源了进一…

JavaFX【TableView使用详解】

目录 概述 组件 Student ObservableList TableView setCellValueFactory() TableColumn 1. Callback 2. PropertyValueFactory 增加到末行 1、tableView.getItems().add(Student s) 2、list.add(Student s) 删除指定行 1、tableView.getItems().remove(int i) 2、…

软件测试完后,运行后还有BUG,测试人员就应该背锅吗?

测试完成后还有bug,测试人员肯定是有责任的,第一时间要赶紧处理而不是着急甩锅。但是这口锅全部扣测试身上,明显也是不能接受的,关键在于测试人员需要找出足够的证据来保护自己。 或许很多人会说测试不可能发现所有的bug&#xf…

软件测试人的第一个实战项目:web端(视频教程+文档+用例库)

最近很多自学测试的小伙伴在问我,学完基础的知识后面临着项目问题,网上项目大都不全,而且也不知道该怎么做,不知道做哪些项目能帮助自己提升 今天给大家分享一个web软件测试实战项目,该项目对新手十分友好,…

STM32入门100步(第4步~第5步)

第4~5步 STM32内部核心功能 前两节中,我们了解了什么是ARM、什么是STM32系列,接下来就是了解具体的一款STM32单片机的内部功能。单片机就是一种微小型计算机,其核心原理就是计算机原理。对于其他非ARM构架的单片机来说学习过程也是相似的。 我们学习的是STM32F103C8T6这款单…

细说前端打包发布后,浏览器缓存如何清理?其实只需要简单的webpack配置就行

前言 有没有这么一种场景,项目上线后,客户使用过程中发现了bug,你急急忙忙改完,发布。但你发布后 测试人员或者客户会说:“你这改了没用啊”。 你:“清下缓存试试” 客户:“?&am…

c#——WCF和HTTP文件传输实验

(1)掌握HTTP协议下WCF服务应用程序构建方法。 (2)掌握WCF客户端和服务端的消息交换模式。 (3)掌握协定的设计及实现方法。 (4)熟悉WCF和HTTP的相关绑定设置。 (5&#xf…

CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)

文章目录 1、CentOS安装OpenSSL1.1.1(前置环境)2、CentOS安装 Python 3.103、创建虚拟环境4、运行Django项目 1、CentOS安装OpenSSL1.1.1(前置环境) 编译安装Python3.10时需要openssl1.1.1 查看当前版本 & 删除openssl1.0 …

Java高并发核心编程—JUC显示锁原理

注:本笔记是阅读《Java高并发核心编程卷2》整理的笔记! 显示锁 使用Java内置锁时,不需要通过Java代码显式地对同步对象的监视器进行抢占和释放,这些工作由JVM底层完成,而且任何一个Java对象都能作为一个内置锁使用&a…

Apache Kafka - ConsumerInterceptor 实战 (1)

文章目录 概述使用场景实战配置文件配置类自定义ConSumerInterceptor使用 概述 ConsumerInterceptor是Kafka中的一个重要组件,它允许开发人员在Kafka消费者端拦截和修改消息的处理过程。ConsumerInterceptor可以用于实现各种功能,从消息监控到数据转换和…

【Python开发】FastAPI 01:hello world

FastAPI 是一个轻量级的后端框架,对于定制化不高或者功能简单的业务完全可以拿他作为后台。 FastAPI 一个比较重要的特性就是异步,简单来说就是相比 django 和 flask 快,FastAPI 和 flask 的语法类似。本篇文章介绍 FastAPI 运用的简单实例&a…

从索引结点出发探索软、硬链接

索引结点的初步认识 对于整个计算机系统的资源管理,我们可以认为,OS先将这些资源的数据信息,给描述起来构成一个部分,然后再将它们组织起来,就能够实现由OS集中管理。举一个最经典的例子,进程的引入是为了…

Cos上传(腾讯云):图片存储方案

Cos上传(腾讯云) 01.图片存储方案介绍 目标 了解主流的图片存储方案 两种常见方案 方案一:存到自己公司购买的服务器上 优点:好控制 缺点:成本高由于图片都存放到自己的服务器上,占据空间很大 方案二:存到三方…

总结SpringBoot常用读取配置文件的3种方法

文章目录 1、使用 Value 读取配置文件2、 使用 ConfigurationProperties 读取配置文件3、读取配置文件中的List 1、使用 Value 读取配置文件 注:这种方法适用于对象的参数比较少的情况 使用方法: 在类上添加configuration注解,将这个配置对…

Hotbit交易平台停运,百万用户待清退,币圈危机再度蔓延

“币圈”的危机似乎还没有走到尽头。5月22日,加密货币交易平台Hotbit发文宣布,决定从世界标准时间当日4:00停止所有CEX(中心化交易所)操作,希望所有用户在6月21日4:00之前提取剩余资产。据悉,该平台在其任期…

微前端乾坤

1. 乾坤 简介 qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统 官网:https://qiankun.umijs.org/zh/guide 2.使用 背景: vue2.0 , vue-cli 5.0 主应用: 安装乾坤…

基于上下文折扣的多模态医学图像分割证据融合

文章目录 Evidence Fusion with Contextual Discounting for Multi-modality Medical Image Segmentation摘要本文方法Evidential SegmentationMulti-modality Evidence FusionDiscounted Dice Loss 实验结果 Evidence Fusion with Contextual Discounting for Multi-modality …

利用PaddleOCR识别增值税发票平台验证码(开箱即用)

前言:全国增值税发票查验平台验证码没什么好说的,根据指定的颜色识别验证码中的文字,图片如下 下面直接讲解利用paddleocr识别的思路,为什么使用paddleocr,因为paddle中集成了较好的ocr文字识别模型,开箱即用即可,废话不多说,剑指主题,识别思路步骤如下 步骤如下 1、…

BI技巧丨度量值的动态格式字符串

2023年4月版本新增了度量值的动态格式字符串功能。从字面上看可能小伙伴们不是很理解这个功能的用途,这里白茶给大家解释一下。 通俗一点来说,就是可以在数值中加入文本,将其转化为字符串,而不改变其原有的数据类型。 看到这里&…

Java调用第三方库JNA(C/C++)

GitHub - java-native-access/jna: Java Native Access 源代码 在Java 中使用C语言库的传统做法是使用JNI编程。但是现在有更好的替代方案,即JNA(Java Native Access);JNA是一个开源的Java框架,是SUN公司推出的调用本地库方法的技术,是建立在…