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

一、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.hqwc.cn/news/277275.html

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

相关文章

Windows10之wsl-Linux子系统安装JDK、Maven环境

Windows10之wsl-Linux子系统安装JDK、Maven环境 文章目录 1.环境2.安装2.1安装JDK2.1安装maven 3.配置setting.xml4.下载编译项目插件5.总结 1.环境 首先需要在windwos10上安装wsl的Linux子系统,我选择的是CentOs的操作系统的镜像(之前的文章中采用的是docker拉取一…

Linux篇:信号

一、信号的概念: ①进程必须识别能够处理信号,信号没有产生,也要具备处理信号的能力---信号的处理能力属于进程内置功能的一部分 ②进程即便是没有收到信号,也能知道哪些信号该怎么处理。 ③当进程真的受到了一个具体的信号的时候…

气象监测与流程分析大屏,更有效地保护人们的生命和财产安全!

气象变化与我们的生活息息相关,随着时代的变迁和科技的飞速发展,气象监测正逐渐迈入数字化的时代。传统的气象观测方式已经无法满足日益增长的需求,数字化的气象监测成为了必然的选择。通过数字化技术的应用,气象数据的采集、传输…

Tomcat从认识安装到详细使用

文章目录 一.什么是Tomact?二.Tomcat的安装1.下载安装包2.一键下载3.打开Tomcat进行测试4.解决Tomcat中文服务器乱码 三.Tomcat基本使用1.启动与关闭Tomcat2.Tomcat部署项目与浏览器访问项目 四.Tomcat操作中的常见问题1.启动Tomcat后,启动窗口一闪而过&#xff1f…

computed 和 watch 的奇妙世界:让数据驱动你的 Vue 应用(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

【开发工具】最新VMWare无法识别USB设备,驱动错误,未知错误【2023.12.15】

解决方案1:在这里改下连接方式 多试试 解决方案2 控制面板卸载程序,进行VMWare的修复 解决方案3 对于Windows7系统,切换解决方案1的usb类型为3.1,并下载这个intel的驱动包到虚拟机里 https://www.intel.com/content/www/us/en/do…

C++类型转换

写C/C代码的时候,有时候不可避免的会使用类型转换,良好的编码风格中应该避免隐式转换,隐式转换会有时候产生不易察觉的问题。 隐式转换类型 C定义了一套标准数据类型转换的规则,在必要时C会用这套转换规则进行数据类型的转换。这…

服务器被攻击宕机的一些小建议

现在网络攻击屡有发生,任何网站服务器都面临这样的危险,服务器被攻击造成的崩溃宕机是损失是我们无法估量的。网络攻击我们无法预测,但做好防御措施是必须的,建议所有的网站都要做好防范措施,准备相应的防护预案&#…

GD32F4标准外设库

学习目标 了解标准库来源熟悉模板搭建流程掌握在已有模板基础下进行开发学习内容 标准外设库获取 标准固件库获取我们可以从官网进行下载。 下载链接:兆易创新GigaDevice-资料下载兆易创新GD32 MCU 找到 GD32F4xx Firmware Library 这个压缩包 下载完成后,进行解压,解压…

自然语言处理阅读第一弹

Transformer架构 encoder和decoder区别 Embeddings from Language Model (ELMO) 一种基于上下文的预训练模型,用于生成具有语境的词向量。原理讲解ELMO中的几个问题 Bidirectional Encoder Representations from Transformers (BERT) BERT就是原生transformer中的Encoder两…

前端常用的几种算法的特征、复杂度、分类及用法示例演示

算法(Algorithm)可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤,或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。算法代表着用系统的方法描述解决问题的策略机制&#xff0c…

中医处方软件西医电子处方系统,一键生成处方单可设置配方模板教程

一、前言 有的诊所是中医和西医都有,医师是全科医师,那么所使用的软件既要能开中药处方也要能开西药处方,而且可以通过一键生成配方,则可以节省很多时间。 下面就以 佳易王诊所卫生室电子处方为例说明 如上图,如果是…