LLM之RAG实战(三):LlamaIndex解锁自定义LLM关键步骤分块、索引、查询介绍

news2024/11/23 10:27:55

一、LLamaIndex介绍

        LLamaIndex是一个由Jerry Liu创建的Python库,它可以使用语言模型对大型文档集进行高效的文本搜索和摘要。开发人员可以使用LLamaIndex快速添加私有/自定义数据,以增强现有的LLM。它不需要对大模型进行再训练,即可提供个性化和数据驱动的响应。

图片

       由于大模型的上下文有限,处理超大文档的成本很高,而通过对原始文本上进行关键词搜索的效率是非常低的。为了克服这些挑战,LLamaIndex采用了两种关键策略。首先,它将文档分为较小的上下文,如句子或段落,这些上下文被称为节点。语言模型可以有效地处理这些节点。其次,LLamaIndex使用向量嵌入对这些节点进行索引,从而实现快速和语义搜索。

功能示例

  • 通过查询摘要来汇总1GB的数据集。LLamaIndex检索相关节点并合成摘要;
  • 通过嵌入姓名并检索类似的节点来查找提及某人的文档;
  • 通过查询从数据集中提取类似位置的实体;
  • 通过查询问题的答案来记录QA;
  • 通过查询对用户消息的响应来增强数据聊天机器人;
  • LLamaIndex使知识代理能够在大型文档集合上使用高效的语义搜索自主检索和做出明智的决策;
  • 通过查询表、CSV文件、数据库等结构化数据进行结构化分析。

二、如何使用LLamaIndex

       LLamaIndex通过将文档分块到更小的节点中,为它们建立索引以实现高效检索,并使用语言模型生成响应,实现可扩展的文本搜索和摘要。

        使用LLamaIndex的大致步骤如下所示:

图片

       关键步骤是将数据加载为文档,解析为节点,在文档/节点上构建索引,查询索引以检索相关节点,然后解析响应对象。索引也可以持久化并从磁盘重新加载。

图片

示例代码,如下所示:

pip install llama-index
"""This module provides an example of using the llama_index library to load and query documents."""from llama_index import VectorStoreIndex, SimpleDirectoryReader# Load in data as Document objects, either manually or through a data loaderdocuments = SimpleDirectoryReader('data').load_data()# Parse Document objects into Node objects to represent chunks of dataindex = VectorStoreIndex.from_documents(documents)# Build an index over the Documents or Nodesquery_engine = index.as_query_engine()# The response is a Response object containing the text response and source Nodessummary = query_engine.query("What is the text about")print("What is the data about:")print(summary)person = query_engine.query(    "Extract all the person in the content, format as JSON with a lastname"    " and first_name property")print(person)location = query_engine.query(    "Extract all the location in the content, format as JSON with a name"    " and the country")print(location)

PS:数据来自:https://github.com/raphaelmansuy/digital_palace/blob/main/01-articles/llama_index/data/paul_graham_essay.txt

输出:

The context does not provide any information about what the author did growing up.What is the data about:The text is about the author's experiences and reflections during their time at art school and their decision to pursue a career in painting.{"persons": [  {"last_name": "Graham", "first_name": "Paul"},  {"last_name": "McCarthy", "first_name": "John"}]}{"locations": [  {"name": "New York City", "country": "United States"},  {"name": "Upper East Side", "country": "United States"},  {"name": "Yorkville", "country": "United States"},  {"name": "Cambridge", "country": "United States"},  {"name": "England", "country": "United Kingdom"},  {"name": "Florence", "country": "Italy"},  {"name": "Piazza San Felice", "country": "Italy"},  {"name": "Pitti", "country": "Italy"},  {"name": "Orsanmichele", "country": "Italy"},  {"name": "Duomo", "country": "Italy"},  {"name": "Baptistery", "country": "Italy"},  {"name": "Via Ricasoli", "country": "Italy"},  {"name": "Piazza San Marco", "country": "Italy"}]}

三、LLamaIndex基本原理

3.1 Chunking过程

        LLamaIndex将输入文档分解为节点的较小块。这个分块是由NodeParser完成的。默认情况下,使用SimpleNodeParser,它将文档分块成句子。

分块过程如下

  1. NodeParser接收一个Document对象列表;

  2. 使用spaCy的句子分割将每个文档的文本分割成句子;

  3. 每个句子都包装在一个TextNode对象中,该对象表示一个节点;

  4. TextNode包含句子文本,以及元数据,如文档ID、文档中的位置等;

  5. 返回TextNode对象的列表。

图片

3.2 将Chunks转换为Embeddings和Nodes

然后将TextNode对象的列表传递给索引以进行嵌入。

  1. 对于每个TextNode,使用像all-mpnet-base-v2类似的句子transformer模型将文本编码为embedding;

  2. 将此embedding存储在TextNode对象中;

  3. TextNode及其embedding和元数据可以在Node对象中被索引。

3.3 建立索引

在Node对象列表上简历索引。

  1. 对于VectorStoreIndex,节点上的文本embedding会存储在FAISS索引中,可以节点上快速进行相似性搜索;

  2. 索引还存储每个节点上的元数据,如文档ID、位置等;

  3. 节点可以检索某个文档的内容,也可以检索特定文档。

       FAISS(Facebook AI相似度搜索)是Facebook AI开发的一个库,可实现高效的相似度搜索和密集向量聚类。它包含的算法可以搜索任何大小的向量集,最多可达数十亿个向量。FAISS是围绕一个索引类型构建的,该索引类型存储一组向量,并提供一个函数,用于通过L2(欧几里得)和/或点积向量比较在其中进行搜索。

图片

3.4 查询索引

要查询索引,将使用QueryEngine。

  1. Retriever从查询的索引中获取相关节点。例如,VectorIndexRetriever检索embedding与查询embedding最相似的节点;

  2. 检索到的节点列表被传递给ResponseSynthesizer以生成最终输出;

  3. 默认情况下,ResponseSynthesizer按顺序处理每个节点,每个节点都会调用一次LLM API;

  4. LLM输入查询和节点文本来得到最终的输出;

  5. 这些每个节点的响应被聚合到最终的输出字符串中。

      总之,该索引允许使用embedding快速检索相关节点,然后使用LLM将embedding合成为最终的输出。该架构允许自定义每个组件,如分块、嵌入、检索和合成。

图片

参考文献:

[1] https://medium.com/@raphael.mansuy/llamaindex-chunk-index-query-how-llamaindex-unlocks-custom-llms-329d543a06b7

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

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

相关文章

Todesk、向日葵等访问“无显示器”主机黑屏问题解决

我的环境是 ubuntu 22.04 安装 要安装 video dummy,请在终端中运行以下命令: sudo apt install xserver-xorg-video-dummy配置 video dummy 的配置文件请自行搜索 使用任何文本编辑器打开此文件。 我的是 /etc/X11/xorg.conf 默认配置文件包含以下内…

每日一练【长度最小的子数组】

一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 二、题目解析 经…

在我们日常生活有哪些东西是激光切割机做的

激光加工技术是当前最先进的切割技术,在工业生产中,能解决许多常规方法无法解决的难题,而且应用非常广。让人意想不到的是,很多生活中常见的物品,都是靠激光切割完成的。 它具备精密制造、柔性切割、异形加工、一次成型…

数据取证工具MemProcFS

MemProcFS 是一种将物理内存视为虚拟文件系统中的文件的简便方法。简单的点击内存分析,无需复杂的命令行参数!通过安装的虚拟文件系统中的文件或通过功能丰富的应用程序库访问内存内容和工件以包含在您自己的项目中。 链接GitHub - ufrisk/MemProcFS: M…

nodejs+vue+微信小程序+python+PHP的外卖数据分析-计算机毕业设计推荐django

构建一种完全可实现、可操作的开放源代码信息收集系统,帮助记者完成工作任务。采编人员仅需输入所收集到的网址及题目即可迅速启动收集工作并进行信息归类。 2.根据新的数据收集要求,采用云计算技术实现新的收集器的迅速部署。对于资料采集点的改版&…

深度学习 Day11——T11优化器对比实验

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU(如果使用的是CPU可以忽略这步)3.导入数据4.查…

WordPress插件你好多莉( Hello Dolly )可否卸載

什么是你好多莉Hello Dolly WordPress插件 你好多莉是 WordPress插件 简单的预装在 WordPress 上。 如果您激活后者,它将显示出名曲的歌词“ 你好,多莉 “要 路易斯阿姆斯特朗. 您可能已经注意到,在阅读插件说明时,还不够清楚。 …

系列十五、搭建redis集群

一、概述 上篇文章介绍了redis集群的相关知识,本章实战演示redis的集群环境的详细搭建步骤。如果帮助到了你,请点赞 收藏 关注!有疑问的话也可以评论区交流。 二、搭建步骤 2.1、预备知识 判断一个集群中的节点是否可用,是集群…

办公教程分享:网址/文本/电子名片如何批量生成二维码?

日常办公时,我们经常会需要批量生成很多二维码,比如做会议问卷调查、为同事制作名片,再比如策划市场活动、制作设备标签…等都会需要用到大量的二维码。这时候,如果手动一个一个生成二维码,会非常浪费时间和精力。 为…

香港高才通计划申请被拒了?很可能是因为这五个原因!

香港高才通计划申请被拒了?很可能是因为这五个原因! 据统计,截止今年10月31日,香港各项输入人才计划共收到超过18万宗申请,超过11万宗已被批准,已有7万人到港。其中,高才通计划一共收到约55,000…

在Java中如何实现一个呼吸动画效果

前言 这里用到了数学中的正弦函数, y s i n ( x ) y sin(x) ysin(x),sin的周期为2pi 下面的类中实现了一个圆,圆的半径根据 s i n ( x ) sin(x) sin(x)函数的值不断变化和修改,x取值范围[0-2pi],onTick方法负责修改…

17.(vue3.x+vite)组件间通信方式之作用域插槽

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 作用域插槽 父组件中的插槽内容是无法访问到子组件中的数据的,而作用域插槽就是解决获取子组件数据。 父组件代码 <template><div><div>父组件--Hello World!</div><Child>

短视频怎么批量添加水印logo

在现代数字化时代&#xff0c;视频内容已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;当我们辛辛苦苦制作的视频在网络上分享时&#xff0c;常常会遇到被他人盗用或未经授权使用的情况。为了保护我们的创作成果&#xff0c;给视频添加水印logo成为了一种常见的手段…

QX320F28335,DSP,国产芯片崛起之路

QX320F28335 32位单核CPU 主频150MHz 单精度浮点运算FPU 12位ADC 采样率 4MSPS 12个ePWM 6个HRPWM

网络工程师常用命令,后续还会进行增补

网络工程师常用命令 一、ping命令二、ipconfig命令三、arp命令&#xff08;地址转换协议&#xff09;四、traceroute命令五、route命令六、nslookup命令七、nbtstat命令八、netstat命令九、net命令 一、ping命令 ping ping是最常用的实用程序之一&#xff0c;用来确定网络的连…

基于ssm连锁经营商业管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本连锁经营商业管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

deepface:实现人脸的识别和分析

deepface介绍 deepface能够实现的功能 人脸检测&#xff1a;deepface 可以在图像中检测出人脸的位置&#xff0c;为后续的人脸识别任务提供基础。 人脸对齐&#xff1a;为了提高识别准确性&#xff0c;deepface 会将检测到的人脸进行对齐操作&#xff0c;消除姿态、光照和表…

硕士论文写的重复率 PaperBERT

大家好&#xff0c;今天来聊聊硕士论文写的重复率&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 硕士论文写的重复率 1. 硕士论文的重要性 硕士论文是硕士阶段最重要的学术成果之一&#xff0c;它不仅…

【普中开发板】基于51单片机电子钟闹钟设计( proteus仿真+程序+设计报告+讲解视频)

【普中开发板】基于51单片机电子钟闹钟数码管显示设计( proteus仿真程序设计报告讲解视频&#xff09; Proteus 仿真&#xff1a;Proteus 8.16 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P03 51单片机电子钟闹钟 1. 主要功能&a…

RK3568驱动指南|第八篇 设备树插件-第74章 虚拟文件系统ConfigFS介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…