如何避免大语言模型绕过知识库乱答的情况?LlamaIndex 原理与应用简介

本文首发于博客 LLM 应用开发实践

随着 LangChain + LLM 方案快速普及,知识问答类应用的开发变得容易,但是面对回答准确度要求较高的场景,则暴露出一些局限性,比如向量查询方式得到的内容不匹配,LLM 对意图识别不准。所以 LlamaIndex(也称为 GPT Index)由社区顺势推出,是一个开发者友好的接口,它将外部数据连接到 LLM,提供了一系列工具来简化流程,包括可以与各种现有数据源和格式(如 api、pdf、文档和 SQL 等)集成的数据连接器,极大的改善了上述问题。本文译自 LlamaIndex: How to Use Index Correctly,翻译内容并非原版无对照翻译,有所增减。

LlamaIndex索引

列表索引

它对于综合跨多个数据源的信息的答案非常有用

列表索引是一种简单的数据结构,其中节点按顺序存储。在索引构建期间,文档文本被分块、转换为节点并存储在列表中。

在查询期间,如果没有指定其他查询参数,LlamaIndex只是将列表中的所有node加载到Response Synthesis模块中。

列表索引提供了许多查询列表索引的方法,从基于嵌入的查询中获取前k个邻居,或者添加一个关键字过滤器,如下所示:

img

LlamaIndex为列表索引提供Embedding支持。除了每个节点存储文本之外,每个节点还可以选择存储Embedding。在查询期间,我们可以在调用LLM合成答案之前,使用Embeddings对节点进行最大相似度检索。

索引构建过程中,LlamaIndex不会生成Embedding,而是在查询时生成,这种设计避免了在索引构建期间为所有文本块生成Embeddings,这可能会导致大量数据的开销。

向量存储索引

它是最常见且易于使用的,允许对大型数据语料库回答查询

默认情况下,GPTVectorStoreIndex 使用内存中的 SimpleVectorStore作为默认存储上下文的一部分初始化,基于向量存储的索引在索引构建期间生成Embeddings

img

树状索引

它对总结一组文件很有用

树状索引是树结构索引,其中每个节点是子节点的摘要。在索引构建期间,树以自下而上的方式构建,直到我们最终得到一组根节点。树状索引从一组节点(成为该树中的叶节点)构建层次树。

查询树状索引涉及从根节点向下遍历到叶节点。默认情况下(child_branch_factor=1 ),查询在给定父节点的情况下选择一个子节点。如果child_branch_factor=2,则查询在每个级别选择两个子节点。

img

为了在查询期间构建树状索引,我们需要将retriver_moderesponse_mode添加到查询引擎,并将GPTTreeIndex中的build_tree参数设置为False

index_light = GPTTreeIndex.from_documents(documents, build_tree=False)
query_engine = index_light.as_query_engine(retriever_mode="all_leaf",response_mode='tree_summarize',
)
query_engine.query("What is net operating income?")

关键词表索引

他对于将查询路由到不同的数据源非常有用

关键字表索引从每个Node提取关键字,并构建从每个关键字到该关键字对应的Node的映射。

在查询时,从查询中提取相关关键字,并将其与预提取的Node关键字进行匹配,获取相应的Node。提取的节点被传递到响应合成模块。

img

  • GPTKeywordTableIndex- 使用LLM从每个文档中提取关键字,这意味着它确实需要在构建期间调用LLM

  • GPTSimpleKeywordTableIndex- 使用regex关键字提取器从每个文档中提取关键字,在构建期间不会调用LLM

可组合性图索引

它对于构建知识图谱很有用

使用LlamaIndex,您可以通过在现有索引之上构建索引来创建复合索引。该特性使您能够有效地索引完整的文档层次结构,并为GPT提供量身定制的知识。

通过利用可组合性,可以在多个级别定义索引,例如为单个文档定义低级索引,为文档组定义高级索引。考虑下面的例子:

  • 可以为每个文档中的文本创建树索引。
  • 生成一个列表索引,涵盖所有的树索引为整个文档集合。

通过一个场景来演示可组合性图索引的能力:

  • 从多个文档创建树索引
  • 从树索引生成摘要
  • 接下来在3个树索引的顶部创建一个列表索引的图,因为列表索引适合于合成跨多个数据源组合信息的答案
  • 最后查询图
from llama_index.indices.composability import ComposableGraphfrom langchain.chat_models import ChatOpenAI
from llama_index import LLMPredictor# setting up vector indicies for each year
service_context = ServiceContext.from_defaults(chunk_size_limit=512)
index_set = {}
for year in years:storage_context = StorageContext.from_defaults()cur_index = GPTVectorStoreIndex.from_documents(documents=doc_set[year],service_context=service_context,storage_context=storage_context)index_set[year] = cur_index# store index in the local env, so you don't need to do it over againstorage_context.persist(f'./storage_index/apple-10k/{year}')# define an LLMPredictor set number of output tokens
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, max_tokens=512, model_name='gpt-3.5-turbo'))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
storage_context = StorageContext.from_defaults()\## define a list index over the vector indicies 
## allow us to synthesize information across  each index
index_summary = [index_set[year].as_query_engine().query("Summary this document in 100 words").response for year in years]
graph = ComposableGraph.from_indices(GPTListIndex,[index_set[y] for y in years],index_summaries=index_summary,service_context=service_context,storage_context=storage_context
)root_id = graph.root_id#save to disk
storage_context.persist(f'./storage_index/apple-10k/root')## querying graph
custom_query_engines = {index_set[year].index_id: index_set[year].as_query_engine() for year in years
}query_engine = graph.as_query_engine(custom_query_engines=custom_query_engines
)response = query_engine.query("Outline the financial statement of Q2 2023")
response.response

Pandas索引和SQL索引

它对结构化数据很有用

from llama_index.indices.struct_store import GPTPandasIndex
import pandas as pddf = pd.read_csv("titanic_train.csv")index = GPTPandasIndex(df=df)query_engine = index.as_query_engine(verbose=True
)
response = query_engine.query("What is the correlation between survival and age?",
)

文档摘要索引

这是一个全新的LlamaIndex数据结构,它是为了问答而制作的。

通常,大多数用户以以下方式开发基于LLM的QA系统:

  1. 获取源文档并将其分成文本块。
  2. 然后将文本块存储在矢量数据库中。
  3. 在查询期间,通过使用相似度和/或关键字过滤器进行Embedding来检索文本块。
  4. 执行整合后的响应。

然而,这种方法存在一些影响检索性能的局限性:

  1. 文本块没有完整的全局上下文,这通常限制了问答过程的有效性。
  2. 需要仔细调优top-k /相似性分数阈值,因为过小的值可能会导致错过相关上下文,而过大的值可能会增加不相关上下文的成本和延迟。
  3. Embeddings可能并不总是为一个问题选择最合适的上下文,因为这个过程本质上是分别决定文本和上下文的。

为了增强检索结果,一些开发人员添加了关键字过滤器。然而,这种方法有其自身的挑战,例如通过手工或使用NLP关键字提取/主题标记模型为每个文档确定适当的关键字,以及从查询中推断正确的关键字。

img

这就是 LlamaIndex 引入文档摘要索引的原因,它可以为每份文档提取非结构化文本摘要并编制索引,从而提高检索性能,超越现有方法。该索引比单一文本块包含更多信息,比关键字标签具有更多语义。它还允许灵活的检索,包括基于 LLM 和嵌入的方法。在构建期间,该索引接收文档并使用 LLM 从每个文档中提取摘要。在查询时,它会根据摘要使用以下方法检索相关文档:

  • 基于 LLM 的检索:获取文档摘要集合并请求 LLM 识别相关文档+相关性得分
  • 基于嵌入的检索:利用摘要嵌入相似性来检索相关文档,并对检索结果的数量施加顶k限制。

文档摘要索引的检索类为任何选定的文档检索所有节点,而不是在节点级返回相关块。

知识图谱索引

它通过在一组文档中提取知识三元组(主语、谓语、宾语)来建立索引。
在查询时,它既可以只使用知识图谱作为上下文进行查询,也可以利用每个实体的底层文本作为上下文进行查询。通过利用底层文本,我们可以针对文档内容提出更复杂的查询。

索引成本和索引时间

  • 索引的成本是一个需要考虑的重要因素,在处理海量数据集时,这一点尤为重要。
  • 索引速度,整个解决方案的运行准备时间。索引时间各不相同,但都是一次性的,通常 40 页的 PDF 文件大约需要 5 秒钟。试想一下,如果一个庞大的数据集超过 10 万页,可能需要几天时间,可以利用异步方法来缩短索引时间。

更多内容在公号:LLM 应用全栈开发

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

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

相关文章

【Linux】多线程

文章目录 一.Linux线程概念1.什么是线程2.二级页表3.线程的优点4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个线程共享3.进程和线程的关系 三.Linux线程控制1.POSIX线程库2.线程创建3.线程等待4.线程终止5.分离线程6.线程ID及进程地址空间布局…

手机拍摄的视频噪点很多怎么办,视频怎么做降噪处理?

现如今,智能手机已经成为了我们生活中必不可少的存在。而随着智能手机越来越强大,很多人已经开始使用手机来拍摄各种类型的视频。但是由于手机的限制,很多人会发现自己拍摄的视频存在着很多的噪点。那么,我们该怎样来解决拍摄视频…

N点复序列求2个N点实序列的快速傅里叶变换

一、方法简介 通过一个点复数序列求出两个点实数序列的离散傅里叶变换,进一步提升快速傅里叶变换的效率。 二、方法详解 和是实数序列,且长度都为,定义复数序列: , 则序列和可表示为: 的离散傅…

端到端的机器学习项目(Machine Learning 研习之六)

使用真实数据 当你在研习机器学习时,最好是使用真实世界中的数据,而不是采用人工数据。巧的是,数以千计的数据集可供选择,涵盖了各种领域。 流行的开放数据存储库: OpenML.orgKaggle.compaperswithcode.com UC Irvin…

MAYA教程之模型的UV拆分与材质介绍

什么是UV 模型制作完成后,需要给模型进行贴图,就需要用到UV功能 UV编译器介绍 打开UI编译器 主菜单有一个 UV->UV编译器,可以点击打开 创建一个模型,可以看到模型默认的UV UV编译器功能使用 UV模式的选择 在UV编译器中…

fastjson 1.2.47 远程命令执行漏洞

fastjson 1.2.47 远程命令执行漏洞 文章目录 fastjson 1.2.47 远程命令执行漏洞1 在线漏洞解读:2 环境搭建3 影响版本:4 漏洞复现4.1 访问页面4.2 bp抓包,修改参数 5 使用插件检测漏洞【FastjsonScan】5.1使用説明5.2 使用方法5.2.1 右键菜单中&#xff…

pycharm中快速对比两个.py文件

在学习一个算法的时候,就想着自己再敲一遍代码,结果最后出现了一个莫名其妙的错误,想跟源文件对比一下到底是在哪除了错,之前我都是大致定位一个一个对比,想起来matlab可以快速查找出两个脚本文件(.m文件)的区别&#…

Anylogic 读取和写入Excel文件

1、选择面板-连接-Excel文件,拖入到视图中 然后在excel文件的属性中进行绑定外部excel文件。 绑定完之后,在你需要读取的地方进行写代码, //定义开始读取的行数 //这里设为2,是因为第一行是数据名称 int row12; //读取excel文件信…

23面向对象案例1

目录 1、计算连续表达式的一个过程 2、优化后的代码 为什么不能return resultn? 3、用面向对象的方法可以解决冗余的问题,但是还是不能解决result的值可以被随意修改的问题 4、解决不能被随意修改的问题,可以将类属性改成私有变量吗&…

C++位图,布隆过滤器

本期我们来学习位图,布隆过滤器等相关知识,以及模拟实现,需求前置知识 C-哈希Hash-CSDN博客 C-封装unordered_KLZUQ的博客-CSDN博客 目录 位图 布隆过滤器 海量数据面试题 全部代码 位图 我们先来看一道面试题 给 40 亿个不重复的无符号…

STM32成熟变频逆变器方案

该方案是一款成熟的变频逆变器的方案,主要是把电源从直流到3相交流的转换,包含变频控制板,逆变主板,IO板,变频控制板主控是STM32F103VET6,配套软件。每一块板子都是原理图和PCB一一对应,并且配套…

基于springboot实现音乐网站与分享平台项目【项目源码+论文说明】计算机毕业设计

摘要 本论文主要论述了如何使用JAVA语言开发一个音乐网站与分享平台 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述音乐网站与分享平台的当前背景以及系统开…

Android Studio git 取消本地 commit(未Push)

操作比较简单 1.选中项目然后依次选择:Git->Repository->Reset HEAD 2.然后再to Commit中输入HEAD^,表示退回到上一个版本。

Js高级技巧—拖放

拖放基本功能实现 拖放是一种非常流行的用户界面模式。它的概念很简单:点击某个对象,并按住鼠标按钮不放,将 鼠标移动到另一个区域,然后释放鼠标按钮将对象“放”在这里。拖放功能也流行到了 Web 上,成为 了一些更传统…

【树莓派 picamera】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言https://www.cnblogs.com/uestc-mm/p/7606855.html 一、picamera是什么?二、使用步骤1.引入库2.先要安装opencv 总结 前言 想用树莓派libcamera &a…

AI低代码维格云日历视图怎么用?

日历视图,是一个以天为单位,清晰展示当月所有日程的视图。在团队协作的过程中,我们常常会碰到以下场景: 制作项目日历,让团队成员知道每天需要完成什么任务; 制作排课表,给老师和教室安排课程; 制作会议日历,提醒团队成员进行每周计划与回顾; 制作营销日历,把握全年…

新时代高效记账:自动化智能如何进行财务管理

随着科技的不断发展,自动化智能已经逐渐渗透到我们生活的各个领域。在财务管理中,自动化智能的应用显得尤为重要。它不仅可以提高财务管理的效率和精度,还能帮助我们更好地规划和掌控公司的财务状况 晨曦记账本提供了多种高效财务管理工具。…

单元测试到底是什么?应该怎么做?

我是Java程序员出身,后来因为工作原因转到到了测试开发岗位。测试开发工作很多年后。针对标题的两个问题,我还有些发言权,特来说下: 1、什么是单元测试 2、该怎么做单元测试 一、什么是单元测试? 单元测试&#xff08…

在vs code中创建一个名为 “django_env“ 的虚拟环境报错?!以下或许方法可以解决

# vs code 终端窗口中运行: mkvirtualenv django_env # 拓展: mkvirtualenv django_env 是一个命令,用于创建一个名为 "django_env" 的虚拟环境。虚拟环境是一种用于隔离不同Python项目所需依赖的工具。通过创建虚拟环境&#x…

zabbix监控实战2

4、zabbix添加监控项 nginx监控 在server上安装nginx 添加模板 浏览图形 mysql监控 zabbix自带mysql模板,所以可以在server1上直接做 创建数据库连接用户 percona数据库模板 清理掉mysql的模块链接 安装并配置好percona的数据库模板 测试脚本 删除tmp下的缓存文…