什么是 LlamaIndex?

2024 年 8 月 21 日

作者

Vanna Winland

AI Advocate & Technology Writer

Erika Russi

Data Scientist, IBM

LlaMaindex 是一个开源数据编排框架,可用于构建大型语言模型 (LLM) 应用程序。LlamaIndex 提供 Python 和 TypeScript 两种版本,它会利用各种工具和功能的组合,而这些工具和功能可简化生成式 AI 用例(通过检索增强 (RAG) 管道)的上下文增强流程。

小球在轨道上滚动的三维设计

最新的 AI 新闻 + 洞察分析

在每周的 Think 时事通讯中,发现专家精选的有关 AI、云等的洞察分析和新闻。 

LlamaIndex 的工作原理是什么?

LlamaIndex 允许用户通过数据整合和上下文增强来整理他们的私人或自定义数据。

上下文增强

上下文增强是指将数据提供给 LLM 上下文窗口,以便在本质上使用私有或外部数据来增强 LLM。

广泛使用的开源 LLM 是根据大量公共数据预先训练的。这些大规模 LLM 有助于解决众多现实问题。然而,它们需要大量的时间和资源以针对特定用例进行训练。此外,模型的内部数据仅在预训练期间处于最新状态。根据具体模型,模型需借助上下文增强才能反映对当前事件的实时了解。

眼下,基础模型已变得愈发流行,因为它们属于灵活且可重复使用的 AI 模型,且几乎可应用于任意领域或任务。IBM Granite 系列一类的基础模型是在整理后的数据基础上进行训练的;但是,无论模型是在大型数据集基础上进行训练还是属于预训练的基础模型,它们都可能需在特定于领域的数据的外部来源基础上进行训练。此过程会由一个系统框架来提供支持,而该系统框架可将 LLM 连接到私有数据,以便根据应用程序的用例或总体目标对其进行定制。应用程序堆栈中便于将 LLM 连接到自定义数据源的部分是 LlamaIndex 一类的数据框架。

数据集成

数据来自多种来源且具有多种格式;框架则负责采集、转换和组织这些数据,以供 LLM 使用。数据通常是孤立且非结构化的。为了获取和组织这些数据,LlamaIndex 等数据框架必须通过通常被称为“采集管道”的流程来运行这些数据。

采集完这些数据并将其转换为 LLM 可使用的格式后,下一步便是将此信息转换为用于构建索引的数据结构。相关的常见过程是将非结构化数据转换为矢量嵌入。此流程在自然语言处理 (NLP) 领域被称为“创建嵌入”,但在数据术语中则被称为“创建索引”。1创建索引是必要的步骤,因为它有助于 LLM 按矢量索引查询和检索采集的数据。可根据所选查询策略为这些数据创建索引。

数据整合可通过将私人数据整合到 LLM 的上下文窗口或“知识库”中,来促进了上下文增强。IBM 的 Granite 3B 及 8B 模型的上下文窗口长度最近已扩展至 128,000 个令牌。2更大的上下文窗口可让模型在其工作内存中保留更多文本,从而增强其在长时间对话、冗长对话和代码库中跟踪关键细节的能力。此功能有助于 LLM 聊天机器人在短期内和更长时间内做出一致的响应。

然而,即使扩展了上下文窗口,微调后的模型也可能会在训练和推理方面产生巨大成本。使用特定或私有数据对模型进行微调需借助数据转换和系统,以便促进面向 LLM 提示功能的有效数据检索方法。RAG 方法被视为促进长上下文语言建模的理想选择。3

检索增强生成 (RAG)

RAG 是最知名且最常用的上下文增强方法之一。RAG 有助于 LLM 充分利用专门的知识库,从而提高 LLM 为问题提供更精确答案的能力。4典型的检索增强流程可分为三个步骤:

  1. 分块:将长序列输入分成若干块。
  2. 嵌入:每个块均会编码为可由 LLM 处理的一个嵌入。
  3. 检索:根据查询获取最有用的已嵌入块。

LlamaIndex 等数据框架可通过为 RAG 模式中的每一步提供全面的 API 调用,来简化数据摄取与检索流程。此流程由查询引擎的概念提供支持,而该引擎允许用户对其数据进行提问。借助外部数据查询并利用上下文知识来提示 LLM,可创建特定于领域的 LLM 应用程序。

AI 学院

为什么说基础模型是 AI 的范式转变

了解灵活、可重复使用的一类全新 AI 模型,这些模型可以带来新收入、降低成本并提高工作效率。还可以参阅我们的指南手册,深入了解这些模型。

LlamaIndex 数据工作流

LlamaIndex 使用 RAG 将外部数据添加并连接到 LLM 已有权访问的数据池中。包括查询引擎、聊天机器人和代理在内的应用程序均使用 RAG 技术来完成任务。5

LlamaIndex 的工作流可划分为几个步骤:

  1. 数据摄取(加载)
  2. 创建索引和存储
  3. 查询

该工作流的目标是帮助采集、组织并允许 LLM 访问私有或特定于领域的数据。通过获取更多相关数据,LLM 可更准确地响应提示,而无论它是用于构建聊天机器人还是用作查询引擎。

数据摄取(加载)

数据摄取或“加载”是将外部数据源连接到 LLM 的第一步。LlaMaindex 将“数据摄取”称为“加载这些数据以供应用程序使用”。大多数私有或自定义数据可采用应用程序编程接口 (API)、PDF、图像、结构化查询语言数据库 (SQL) 等格式进行区分。Llama Index 可加载 160 多种不同的数据格式,其中包括结构化、半结构化与非结构化数据集。

数据连接器(也称为数据“加载器”)会从其本地源获取和采集数据。收集到的数据会转化为数据与元数据的集合。这些集合在 LlamaIndex 中被称为“文档”。数据连接器(或 LlamaIndex 中的“读取器”)会采集和加载各种数据格式。LlamaIndex 提供集成式读取器,它可将每个目录中的所有文件转换为文档,包括 Markdown 文件、PDF、Word 文档、PowerPoint 演示文稿、图像、音频文件和视频。6为处理内置功能中未包含的其他数据格式,可通过开源数据加载器的注册表 LlamaHub 获取数据连接器。此工作流中的该步骤会构建一个知识库,以形成针对这些数据的索引,以便 LLM 查询和使用这些数据。

创建索引和存储

一旦采集完这些数据,数据框架便需将这些数据转换并组织为可供 LLM 检索的结构。数据索引可将数据组织为 LLM 可使用的表示形式。LlamaIndex 提供若干索引类型来补充应用程序的查询策略,其中包括:矢量存储索引、摘要索引和知识图谱索引。

加载完这些数据并为其创建索引后,便可存储这些数据。LlamaIndex 支持众多具有不同架构、复杂性和成本的矢量存储。默认情况下,LlamaIndex 仅会将所有索引后的数据存储在内存中。

矢量存储索引

矢量存储索引通常会用于遵循 RAG 模式的 LLM 应用程序,因为它擅长处理自然语言查询。自然语言查询的检索精度取决于语义搜索,或是基于含义的搜索而不是关键字匹配。7通过将输入数据转换为矢量嵌入,可启用语义搜索。矢量嵌入是 LLM 可处理的数据的语义的数字表示形式。不同矢量嵌入之间的数学关系允许 LLM 根据查询词的含义来检索数据,以获得包含更多上下文信息的响应。

“VectorStoreIndex”会获取数据集合或“文档”对象并将其拆分为“节点”,而节点是代表源数据的某个“块”(“文档”)的数据原子单位。将数据集合拆分为块后,便会创建每个块的矢量嵌入。此时,整合后数据的格式便可供 LLM 进行查询。您可以存储这些矢量索引,以免重新索引。存储数据的最简方法是将其持久保存到磁盘,但 LlamaIndex 可与多个矢量数据库和嵌入模型相集成。8

搜索嵌入,用户查询首先会被转换为矢量嵌入。接着,会使用一个数学流程并根据所有嵌入与该查询的语义相似性对所有嵌入进行排名。

矢量存储索引使用 top-k 语义检索,将最相似的嵌入作为相应的文本块进行返回。LlamaIndex 旨在促进大型索引的创建和管理,以实现高效的信息检索。

查询

此工作流的最后一步是实现查询引擎来处理对 LLM 的提示调用。查询由三个不同的阶段组成:检索、后处理和响应合成。检索是指从矢量索引中获取并返回最相关的文档。后处理是指通过重新排序、转换或过滤来选择性地重新调整检索到的嵌入块或“节点”。响应合成是指将最相关的数据和提示组合在一起并发送到 LLM 以返回响应。

查询引擎

查询引擎允许用户针对其数据进行提问,以便采用自然语言查询并返回包含丰富上下文信息的响应。9查询引擎由一个或多个索引和检索器组成。很多查询引擎可同时用于具有多个索引类型的数据集合。LlamaIndex 可为结构化与半结构化数据提供多种查询引擎,例如用于查询 JSON 文档的 JSON 查询引擎。

数据代理

数据代理属于 LLM 驱动型 AI 代理,它们能对数据执行一系列任务,包括读取与写入功能。10LlamaIndex 数据代理是由 LLM 提供支持的知识工具,它们可执行以下操作:

  • 自动搜索和检索不同的数据类型—非结构化、半结构化和结构化
  • 对外部服务的 API 调用可立即处理、编制索引或进行缓存
  • 存储对话历史记录
  • 完成简单与复杂的数据任务

AI 代理可通过一组 API 和工具与其外部环境进行交互。LlamaIndex 支持 OpenAI Function 代理(基于 OpenAI Function API 而构建)和 ReAct 代理。数据代理的核心组件为“推理循环”或代理的推理范式和作为工具本身的“工具抽象”。

推理循环

代理使用推理循环或范式来解决多步骤问题。在 LlamaIndex 中,OpenAI Function 与 ReAct 代理均会按类似的模式来决定要使用的工具,以及调用每个工具的序列和参数。此推理模式被称为 ReAct 或“推理与行动”。此流程既可是简单的一步式工具选择过程,也可是需在每一步选择多个工具的更复杂过程。

代理工具抽象

工具抽象概括了代理如何访问和使用工具。LlamaIndex 提供工具和 ToolSpecs,后者是一个 Python 类,它代表代理可与之交互的完整 API 规范。基础工具抽象定义了一个通用接口,而该接口可接受一系列参数并返回一个可捕获任意响应的通用工具输出容器。LlamaIndex 提供涉及现有数据查询引擎的工具抽象,以及可供工具规范类使用的函数的对应抽象。

  • FunctionTool:将任意函数转换为代理可使用的工具。
  • QueryEngineTool:支持代理使用查询引擎进行搜索和检索。

工具规范支持用户定义完整的服务,而不是用于处理特定任务的单个工具。例如,Gmail 工具规范允许代理读取和起草电子邮件11相关的大致定义示例如下:

class GmailToolSpec(BaseToolSpec):
    “”“从用户帐户加载电子邮件”“”
    spec_functions = [“load_data”, “create_draft”, “send_email”]
    def load_data(self) -> List[Document]:
...

def create_draft(
    self,
    to: List[str],
    subject: [str],
    message: [str],
) -> str: “创建并插入草稿电子邮件”
...

def send_draft(
    self,
    draft_id: str = None
) -> str: “发送草稿电子邮件。”
...

每个函数均会使用 `FunctionTool` 抽象转换为一个工具。

LlamaIndex 会利用 LlamaHub 的 Tool Repository(工具存储库),其中包含 15 种以上的工具规范以供代理与之交互。该列表包括旨在增强和丰富代理执行不同操作的能力。该存储库中包含的部分规范如下:

  • SQL + 矢量数据库规范
  • Gmail 规范
  • Ollama
  • LangChainLLM

实用工具

LlamaIndex 提供可增强现有工具能力的实用工具,其中包括:

  • OnDemandLoaderTool:将任意现有 LlamaIndex 数据加载器转换为可供代理使用的工具。
  • LoadAndSearchToolSpec:接受将现有工具作为输入,并生成加载工具和搜索工具以作为输出。

与 LLM 集成

LlamaIndex 可与 IBM Granite 系列、Llama2 和 OpenAI 等开源基础模型以及其他 LLM 框架(包括 LangChain 和 Ollama)搭配使用。LLM 可通过多种方式以作为独立模块来使用,也可插入到其他核心 LlamaIndex 模块。12LLM 还可用于驱动 AI 代理以充当遵循自主工作流的知识工作者。

AI 智能体

LlamaIndex 已扩展其功能,从而引入使用 LLM 驱动型 AI 代理以充当知识工作者。LlamaIndex AI 代理遵循 ReAct(推理与行动)行为模式。ReAct 代理遵循推理范式,而该范式可指示代理进行计划和推理,同时以迭代方式改进响应。此类 AI 代理可理解为一种思维链提示功能。代理可使用工具与其他 LLM 相集成。例如,LlamaHub 数据连接器与代理工具集合。

用例

LlamaIndex 在其文档中提供了若干用例示例,并附有教程链接。13

  • 聊天机器人:LlamaIndex 为查询引擎(称为“聊天引擎”)提供了一个有状态类比。聊天引擎可为对话(来回交互,而非单次问答)提供一个高级界面。可将聊天引擎视为 ChatGPT 应用程序的更为个性化版本。聊天引擎实施包括一个使用 ReAct 代理的模式。LlamaIndex 提供有关如何构建使用数据代理的聊天机器人的教程。
  • 提示:LlamaIndex 使用 LLM 集成和工作流以作为事件驱动型抽象来链接所有提示调用。提示功能对所有 LLM 应用均至关重要。
  • 问题解答 (RAG):LlamaIndex 能通过自然语言查询对非结构化文档执行 RAG。LlamaIndex 还提供了一种使用“文本转 SQL”和“文本转 Pandas”对结构化数据进行查询的方法。14
  • 结构化数据提取:LLM 可处理自然语言,并提取具有语义意义的重要细节,例如名称、日期、地址和数字,然后以一致的结构化格式呈现它们,而无论其原始来源为何。将这些数据结构化后,即可将其发送到数据库或使用 LlamaParse 等工具进行进一步分析。
  • 自主代理:AI 代理可用于各种 LLM 应用。例如,用户可通过为其数据创建上下文增强型研究助手来构建代理 RAG 应用程序,以便回答简单的问题和复杂的研究任务。15
相关解决方案
基础模型

深入了解 watsonx 组合中基础模型库,从容自信地为您的业务扩展生成式 AI。

了解 watsonx.ai
人工智能 (AI) 解决方案

借助 IBM 业界领先的人工智能专业知识和解决方案组合,让人工智能在您的业务中发挥作用。

深入了解人工智能解决方案
AI 咨询与服务

通过增加 AI 重塑关键工作流程和运营,最大限度提升体验、实时决策和商业价值。

深入了解人工智能服务
采取后续步骤

深入了解 IBM watsonx 产品组合中的 IBM 基础模型库,满怀信心地为您的业务扩展生成式 AI。

深入了解 watsonx.ai 深入了解人工智能解决方案
脚注

1. Elena Lowery,“使用 watsonx.ai 和 LlamaIndex 构建 RAG 应用程序”,2024 年 5 月 28 日,https://community.ibm.com/community/user/watsonx/blogs/elena-lowery/2024/05/28/use-watsonxai-with-llamaindex-to-build-rag-applica

2. Matt Stallone 等人,“Scaling Granite Code Models to 128K Context”,arXiv.org,2024 年 7 月 18 日,https://arxiv.org/abs/2407.13739

3. Matt Stallone 等人,“Scaling Granite Code Models to 128K Context”。

4. Kim Martineau,“什么是检索增强生成 (RAG)?”,IBM Research,2024 年 5 月 1 日,https://research.ibm.com/blog/retrieval-augmented-generation-RAG

5. “High-Level Concepts”,LlamaIndex,https://docs.llamaindex.ai/en/stable/getting_started/concepts/

6.“Loading Data (Ingestion)”,LlamaIndex,https://docs.llamaindex.ai/en/stable/understanding/loading/loading/

7. Elena Lowery,“Use Watsonx.Ai with LlamaIndex to Build Rag Applications”。

8. Elena Lowery,“Use Watsonx.Ai with LlamaIndex to Build Rag Applications”。

9.“Query Engine”,LlamaIndex,https://docs.llamaindex.ai/en/latest/module_guides/deploying/query_engine/

10. Jerry Liu,“Data Agents”,Medium,2023 年 7 月 13 日,https://medium.com/llamaindex-blog/data-agents-eed797d7972f

11.“Google”,LlamaIndex,https://docs.llamaindex.ai/en/stable/api_reference/tools/google/

12.“Using LLMs”,LlamaIndex,https://docs.llamaindex.ai/en/latest/module_guides/models/llms/

13.“Use Cases”,LlamaIndex,https://docs.llamaindex.ai/en/latest/use_cases/

14.“Question-Answering (RAG)”,LlamaIndex,https://docs.llamaindex.ai/en/stable/use_cases/q_and_a/

15.“Agents”,LlamaIndex,https://docs.llamaindex.ai/en/stable/use_cases/agents/