跳到正文
原文
LlamaIndex:产品、工程与评测·· 2 小时前精选AI 评分68

LlamaIndex v0.10 发布:拆分 llama-index-core 并弃用 ServiceContext

LlamaIndex v0.10

AI 导读

LlamaIndex 发布 v0.10.0,称其为 Python 包迄今最大更新。核心变化包括:创建不含集成的 llama-index-core 包,数百个集成(150+ 数据加载器。

推荐理由

官方详细说明 v0.10 的包拆分、ServiceContext 弃用与迁移工具,升级 LlamaIndex 的开发者可据此评估改动成本。

正文 · AI 翻译

今天我们非常激动地推出 LlamaIndex v0.10.0。这是迄今为止我们对 Python 包最大的一次更新(参见这个庞大的 PR),它朝着让 LlamaIndex 成为面向 LLM 应用的下一代、生产就绪的数据框架迈出了一大步。

立即探索我们的免费和付费方案。

LlamaIndex v0.10 包含一些重大更新:

  1. 我们创建了一个 llama-index-core 包,并将所有集成和模板拆分为独立的包:数百个集成(LLM、嵌入、向量存储、数据加载器、回调、代理工具等)现在都作为独立的 PyPI 包进行版本管理和打包,同时保留了命名空间导入:例如,你仍然可以使用from llama_index.llms.openai import OpenAI来调用 LLM。
  2. LlamaHub 将成为所有集成的中心枢纽:原先的 llama-hub 仓库本身已合并到主 llama_index 仓库中。集成不再分散在核心库和 LlamaHub 之间,而是全部列在 LlamaHub 上。我们正在积极更新网站,敬请期待!
  3. ServiceContext 已弃用:每位 LlamaIndex 用户都熟悉 ServiceContext,随着时间的推移,它已成为一个笨重且不必要的抽象层,用于管理 LLM、嵌入、分块大小、回调等。因此我们将其完全弃用;你现在可以直接指定参数或设置默认值。

将代码库升级到 LlamaIndex v0.10 可能会导致一些破坏性变更,主要涉及我们的集成/打包变更,但幸运的是,我们提供了一些脚本,尽可能轻松地将你的代码库迁移到使用 LlamaIndex v0.10。

查看以下各节了解更多详情,并前往最后一节获取所有资源的链接。

拆分为 `llama-index-core` 和集成包

我们做出的第一个也是最大的改变是一次大规模的打包重构。

LlamaIndex 已发展成为一个包含数百个集成的广泛工具包:

  • 150+ 数据加载器
  • 35+ 代理工具
  • 50+ LlamaPack 模板
  • 50+ LLM
  • 25+ 嵌入
  • 40+ 向量存储

以及 llama_index 和 llama-hub 仓库中的更多内容。我们生态系统的快速增长令人惊叹,但也伴随着成长的烦恼:

  • 许多集成缺乏适当的测试
  • 用户需要自行解决依赖关系
  • 如果某个集成更新,用户将不得不更新整个 llama-index Python 包。

针对这些问题,我们做了以下工作。

  • 创建了 llama-index-core:这是一个精简的包,包含 LlamaIndex 的核心抽象和组件,不包含任何集成。
  • 为所有集成/模板创建了独立的包:每个集成现在都作为独立的包提供。这包括所有集成,包括 LlamaHub 上的那些!请查看我们的 Notion 注册表页面获取所有包的完整列表。

llama-index 包仍然存在,它导入了 llama-index-core 和一组最小的集成。由于我们默认使用 OpenAI,这包括 OpenAI 包(llama-index-llms-openai、llama-index-embeddings-openai 以及 OpenAI 程序/问题生成/多模态),以及我们钟爱的 SimpleDirectoryReader(位于 llama-index-readers-file 中)。

注意:如果你还不想迁移到 v0.10,并希望继续使用当前的 LlamaIndex 抽象,我们将在可预见的未来维护 llama-index-legacy(固定为最新版本 0.9.48)。

重构后的文件夹结构

我们彻底改造了 llama_index 仓库中的文件夹结构。你最需要关注的重要文件夹有:

  • llama-index-core:此文件夹包含所有核心 LlamaIndex 抽象。
  • llama-index-integrations:此文件夹包含针对 19 个 LlamaIndex 抽象的第三方集成。这包括数据加载器、LLM、嵌入模型、向量存储等。详情见下文。
  • llama-index-packs:此文件夹包含我们的 50 多个 LlamaPack,这些是旨在帮助用户快速启动应用程序的模板。

其他文件夹:

  • llama-index-legacy:包含旧版 LlamaIndex 代码。
  • llama-index-experimental:包含实验性功能。目前基本未使用(除参数调优外)。
  • llama-index-finetuning:包含 LlamaIndex 微调抽象。这些仍相对处于实验阶段。

integrations 和 packs 中的子目录代表各个独立的包。文件夹名称与包名相对应。例如,llama-index-integrations/llms/llama-index-llms-gemini 对应 llama-index-llms-gemini PyPI 包。

在每个包文件夹内,源文件的排列路径与你导入它们时使用的路径相同。例如,在 Gemini LLM 包中,你会看到一个名为 llama_index/llms/gemini 的文件夹,其中包含源文件。这种文件夹结构让你能够在导入时保留顶层 llama_index 命名空间。对于 Gemini LLM,你需要先 pip install llama-index-llms-gemini,然后使用 from llama_index.llms.gemini import Gemini 进行导入。

这些子文件夹中的每一个都包含将其打包所需的资源:pyproject.toml、poetry.lock 和一个 Makefile,以及一个自动创建包的脚本。

如果你想贡献一个集成或包,不用担心!我们有一份完整的贡献指南,旨在让这一过程尽可能顺畅,请务必查看。

集成

所有第三方集成现在都位于 llama-index-integrations 下。这里有 19 个文件夹。主要的集成类别有:

  • llms
  • embeddings
  • multi_modal_llms
  • readers
  • tools
  • vector_stores

为完整起见,以下是所有其他类别:agent、callbacks、evaluation、extractors、graph_stores、indices、output_parsers、postprocessor、program、question_gen、response_synthesizers、retrievers、storage、tools。

最常见类别中的集成可以在我们临时的Notion 包注册表页面中找到。所有集成都可以在我们的 Github 仓库中找到。每个集成包的文件夹名称与包名相对应——所以如果你找到了喜欢的集成,现在就知道如何 pip install 它了!

我们正在积极努力使所有集成都能在 LlamaHub 上查看。我们对 LlamaHub 的愿景是成为所有第三方集成的中心枢纽。

如果你有兴趣贡献一个包,请参阅下方的 contributing 部分!

使用示例

以下是一个安装和使用 Anthropic LLM 的简单示例。

pip install llama-index-llms-anthropic

from llama_index.llms.anthropic import Anthropic
llm = Anthropic(api_key="<api_key>")

以下是一个使用数据加载器的示例。

pip install llama-index-readers-notion

from llama_index.readers.notion import NotionPageReader
integration_token = os.getenv("NOTION_INTEGRATION_TOKEN")
page_ids = ["<page_id>"]
reader = NotionPageReader(integration_token=integration_token)
documents = reader.load_data(page_ids=page_ids)

以下是一个使用 LlamaPack 的示例:

pip install llama-index-packs-sentence-window-retriever

from llama_index.packs.sentence_window_retriever import SentenceWindowRetrieverPack


sentence_window_retriever_pack = SentenceWindowRetrieverPack(
  documents
)
response = sentence_window_retriever_pack.run("Tell me a bout a Music celebritiy.")

处理破坏性变更

本次更新带来了破坏性变更,主要涉及导入方式。对于所有集成,你不能再使用以下任何一种方式:


from llama_index.llms import OpenAI

from llama_index.vector_stores import PineconeVectorStore

from llama_hub.slack.base import SlackReader

取而代之,你可以使用以下方式:

from llama_index.llms.openai import OpenAI
from llama_index.vector_stores.pinecone import PineconeVectorStore

from llama_index.readers.slack import SlackReader

更多详情请参阅我们的迁移指南(下文也有描述)。

LlamaHub 作为集成的中心枢纽

通过这些打包更新,我们正在扩展 LlamaHub 的概念,使其成为所有 LlamaIndex 集成的中心枢纽,以实现其成为 LLM 生态系统中心集成站点的愿景。这超越了其现有的加载器、工具、包和数据集领域,扩展至包括 LLM、嵌入、向量存储、回调等。

这项工作仍在进行中。如果你现在访问 llamahub.ai,你会看到网站尚未更新,仍然包含当前的集成集合(数据加载器、工具、LlamaPacks、数据集)。请放心,我们将在几周内更新网站;在此期间,请查看我们的 Notion 包注册表 / 仓库 以获取所有集成/包的列表。

停用 llama-hub 仓库

由于所有集成已迁移到 llama_index 仓库,我们正在停用 llama-hub 仓库(但 LlamaHub 本身仍然存在!)。我们完成了迁移和打包所有现有 llama-hub 集成的艰巨工作。对于未来所有贡献,请直接提交到 llama_index 仓库!

`download` 语法

通过 LlamaHub 获取集成的一个流行用户体验是 download 语法:download_loader、download_llama_pack 等。

这仍然有效,但行为有所不同。请查看以下详细信息:

  • download_llama_pack:将 llama-index-packs 下的包下载到磁盘上的本地文件。这允许你直接使用和修改模板中的源代码。
  • 其他所有下载函数 download_loader、download_tool:这将直接对相关集成包运行 pip install。

弃用 ServiceContext

最后但同样重要的是,我们正在弃用 ServiceContext 构造,从而改善 LlamaIndex 的开发者体验。

我们的 ServiceContext 对象曾作为一个通用配置容器,包含 LLM、嵌入模型、回调等;它是在我们拥有适当的 LLM、嵌入、提示抽象之前创建的,旨在作为面向用户的中间层,让用户定义这些参数。

然而随着时间的推移,这个对象变得越来越难以使用。将整个 service_context 容器传递给任何模块(索引、检索器、后处理器等)都让人难以推断实际使用的是哪个组件。由于所有模块默认使用 OpenAI,用户被要求不必要地指定他们的 OpenAI 密钥,即使在想要使用本地模型的情况下也是如此(因为嵌入模型默认仍然是 OpenAI)。导入和输入它也很费力。

另一个相关的痛点是,如果你有自定义模型或特别是自定义回调,你必须手动将 service_context 传递给所有模块。这很费力,而且用户很容易忘记,导致回调丢失或模型使用不一致。

因此我们做了以下更改:

  1. ServiceContext 现已弃用:你现在应该直接将相关参数传递给模块,例如用于索引的嵌入模型和用于查询/响应合成的 LLM。
  2. 你现在可以定义全局设置:定义一次,就不必担心在下游代码中指定任何自定义参数。这对回调特别有用。

我们文档/笔记本中所有对 ServiceContext 的引用都已删除,并改为使用直接模块或全局设置对象。另请参阅下面的用法示例。

用法示例

要构建一个 VectorStoreIndex 然后查询它,你现在可以直接传入嵌入模型和 LLM

from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core.callbacks import CallbackManager

embed_model = OpenAIEmbedding()
llm = OpenAI()
callback_manager = CallbackManager()
index = VectorStoreIndex.from_documents(
 documents, embed_model=embed_model, callback_manager=callback_manager
)
query_engine = index.as_query_engine(llm=llm)

或者你可以定义一个全局设置对象

from llama_index.core.settings import Settings
Settings.llm = llm
Settings.embed_model = embed_model
Settings.callback_manager = callback_manager
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()

为 LlamaIndex v0.10 做贡献

v0.10 使 llama_index 仓库成为所有社区贡献的中心场所,无论你是有兴趣贡献核心重构,还是集成/包!

如果你要贡献一个集成/包,v0.10 让你更容易贡献可以独立进行版本管理、测试和打包的内容。

我们提供了实用脚本,让集成或包的创建过程变得毫不费力:

# create a new pack
cd ./llama-index-packs
llamaindex-cli new-package --kind "packs" --name "my new pack"

# create a new integration
cd ./llama-index-integrations/readers
llamaindex-cli new-pacakge --kind "readers" --name "new reader"

查看我们更新后的贡献指南以了解更多详情。

如果你想使用 LlamaIndex v0.10,你需要做两件主要的事情:

  1. 调整导入以适配核心模块/集成的新包结构
  2. 弃用 ServiceContext

幸运的是,我们创建了一份全面的迁移指南,其中还包含一个 CLI 工具,可以自动将你现有的代码和 notebook 升级到 v0.10!

只需执行

llamaindex-cli upgrade <source-dir>

在此查看完整的迁移指南。

后续步骤

我们煞费苦心地改版了所有的 README、文档和 notebook,以反映 v0.10 的这些变化。查看下面这一节,了解所有资源的汇总列表。

文档

v0.10 文档

v0.10 安装指南

v0.10 快速开始

更新后的贡献指南

临时 v0.10 包注册表

v0.10 迁移指南

仓库

仓库 README

llama-index-integrations

llama-index-packs

示例 Notebook

这些主要是为了展示我们更新后的导入语法。

Bug 报告

我们将积极关注我们的 Github Issues 和 Discord。如果你遇到任何问题,请随时进入这两个渠道!

来源:LlamaIndex:产品、工程与评测 · llamaindex.ai