LlamaIndex v0.10 发布:拆分 llama-index-core 并弃用 ServiceContext
LlamaIndex v0.10
LlamaIndex 发布 v0.10.0,称其为 Python 包迄今最大更新。核心变化包括:创建不含集成的 llama-index-core 包,数百个集成(150+ 数据加载器。
官方详细说明 v0.10 的包拆分、ServiceContext 弃用与迁移工具,升级 LlamaIndex 的开发者可据此评估改动成本。
今天我们非常激动地推出 LlamaIndex v0.10.0。这是迄今为止我们对 Python 包最大的一次更新(参见这个庞大的 PR),它朝着让 LlamaIndex 成为面向 LLM 应用的下一代、生产就绪的数据框架迈出了一大步。
立即探索我们的免费和付费方案。
LlamaIndex v0.10 包含一些重大更新:
- 我们创建了一个
llama-index-core包,并将所有集成和模板拆分为独立的包:数百个集成(LLM、嵌入、向量存储、数据加载器、回调、代理工具等)现在都作为独立的 PyPI 包进行版本管理和打包,同时保留了命名空间导入:例如,你仍然可以使用from llama_index.llms.openai import OpenAI来调用 LLM。 - LlamaHub 将成为所有集成的中心枢纽:原先的 llama-hub 仓库本身已合并到主 llama_index 仓库中。集成不再分散在核心库和 LlamaHub 之间,而是全部列在 LlamaHub 上。我们正在积极更新网站,敬请期待!
- 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-indexPython 包。
针对这些问题,我们做了以下工作。
- 创建了
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 个文件夹。主要的集成类别有:
llmsembeddingsmulti_modal_llmsreaderstoolsvector_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 传递给所有模块。这很费力,而且用户很容易忘记,导致回调丢失或模型使用不一致。
因此我们做了以下更改:
- ServiceContext 现已弃用:你现在应该直接将相关参数传递给模块,例如用于索引的嵌入模型和用于查询/响应合成的 LLM。
- 你现在可以定义全局设置:定义一次,就不必担心在下游代码中指定任何自定义参数。这对回调特别有用。
我们文档/笔记本中所有对 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,你需要做两件主要的事情:
- 调整导入以适配核心模块/集成的新包结构
- 弃用 ServiceContext
幸运的是,我们创建了一份全面的迁移指南,其中还包含一个 CLI 工具,可以自动将你现有的代码和 notebook 升级到 v0.10!
只需执行
llamaindex-cli upgrade <source-dir>后续步骤
我们煞费苦心地改版了所有的 README、文档和 notebook,以反映 v0.10 的这些变化。查看下面这一节,了解所有资源的汇总列表。
文档
临时 v0.10 包注册表
仓库
示例 Notebook
这些主要是为了展示我们更新后的导入语法。
Bug 报告
我们将积极关注我们的 Github Issues 和 Discord。如果你遇到任何问题,请随时进入这两个渠道!
来源:LlamaIndex:产品、工程与评测 · llamaindex.ai