
LlamaIndex • 2024-02-12
LlamaIndex v0.10
今天,我们很高兴地发布 LlamaIndex v0.10.0。这是迄今为止我们 Python 包的最大更新(参见这个巨大的 PR),它向着使 LlamaIndex 成为一个下一代、生产就绪的数据框架,用于您的 LLM 应用迈出了巨大一步。
LlamaIndex v0.10 包含一些重大更新
- 我们创建了一个
llama-index-core
包,并将所有集成和模板拆分到单独的包中: 数百个集成(LLMs、嵌入、向量存储、数据加载器、回调、代理工具等)现在作为单独的 PyPI 包进行版本控制和打包,同时保留命名空间导入:例如,您仍然可以使用from llama_index.llms.openai import OpenAI
用于 LLM。 - LlamaHub 将成为所有集成的中心: 原来的 llama-hub 仓库本身已合并到主 llama_index 仓库中。集成不再分散在核心库和 LlamaHub 之间,每个集成都将列在 LlamaHub 上。我们正在积极更新网站,敬请关注!
- ServiceContext 已弃用: 每个 LlamaIndex 用户都熟悉 ServiceContext,随着时间的推移,它已成为一个笨重、不必要的抽象,用于管理 LLMs、嵌入、块大小、回调等。因此,我们完全弃用它;您现在可以直接指定参数或设置默认值。
将您的代码库升级到 LlamaIndex v0.10 可能会导致一些中断,主要围绕我们的集成/打包更改,但幸运的是,我们提供了一些脚本,以使将您的代码库迁移到使用 LlamaIndex v0.10 变得尽可能容易。
查看以下部分了解更多详情,并转到最后一节查看所有资源的链接。
拆分为 `llama-index-core` 和集成包
我们所做的第一个也是最大的改变是进行了一次大规模的打包重构。
LlamaIndex 已发展成为一个包含数百个集成的广泛工具包
- 150+ 数据加载器
- 35+ 代理工具
- 50+ LlamaPack 模板
- 50+ LLMs
- 25+ 嵌入
- 40+ 向量存储
以及 llama_index
和 llama-hub
仓库中的更多内容。看到我们生态系统的快速发展令人兴奋,但也伴随着成长中的烦恼
- 许多集成缺乏适当的测试
- 用户需要自行解决依赖关系
- 如果一个集成更新,用户将不得不更新整个
llama-index
Python 包。
为此,我们采取了以下措施。
- 创建了
llama-index-core
: 这是一个精简的包,包含 LlamaIndex 的核心抽象和组件,不包含任何集成。 - 为所有集成/模板创建了单独的包: 现在每个集成都可以作为一个单独的包使用。这包括 所有 集成,包括 LlamaHub 上的集成!请参阅我们的 Notion 注册表页面,查看所有包的完整列表。
The llama-index
package still exists, and it imports llama-index-core
and a minimal set of integrations. Since we use OpenAI by default, this includes OpenAI packages (llama-index-llms-openai
, llama-index-embeddings-openai
, and OpenAI programs/question generation/multimodal), as well as our beloved SimpleDirectoryReader (which is in llama-index-readers-file
). -> 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 抽象的第三方集成。这包括数据加载器、LLMs、嵌入模型、向量存储等。详见下文。llama-index-packs
:此文件夹包含我们的 50 多个 LlamaPacks,这些是旨在帮助用户快速启动其应用的模板。
其他文件夹
llama-index-legacy
:包含旧版 LlamaIndex 代码。llama-index-experimental
:包含实验性功能。目前大部分未使用(参数调整除外)。llama-index-finetuning
:包含 LlamaIndex 微调抽象。这些仍然相对处于实验阶段。
The sub-directories in integrations
and packs
represent individual packages. The name of the folder corresponds to the package name. For instance, llama-index-integrations/llms/llama-index-llms-gemini
corresponds to the llama-index-llms-gemini
PyPI package. -> integrations
和 packs
中的子目录代表单独的包。文件夹名称对应于包名称。例如,llama-index-integrations/llms/llama-index-llms-gemini
对应于 llama-index-llms-gemini
PyPI 包。
Within each package folder, the source files are arranged in the same paths that you use to import them. For example, in the Gemini LLM package, you’ll see a folder called llama_index/llms/gemini
containing the source files. This folder structure is what allows you to preserve the top-level llama_index
namespace during importing. In the case of Gemini LLM, you would pip install llama-index-llms-gemini
and then import using from llama_index.llms.gemini import Gemini
. -> 在每个包文件夹内,源文件按照您用于导入它们的相同路径排列。例如,在 Gemini LLM 包中,您会看到一个名为 llama_index/llms/gemini
的文件夹,其中包含源文件。正是这种文件夹结构允许您在导入时保留顶层 llama_index
命名空间。 对于 Gemini LLM,您将使用 pip 安装 llama-index-llms-gemini
,然后使用 from llama_index.llms.gemini import Gemini
进行导入。
Every one of these subfolders also has the resources needed to packagify it: pyproject.toml
, poetry.lock
, and a Makefile
, along with a script to automatically create a package. -> 这些子文件夹中的每一个还拥有将其打包所需的资源:pyproject.toml
、poetry.lock
和 Makefile
,以及一个自动创建包的脚本。
If you’re looking to contribute an integration or pack, don’t worry! We have a full contributing guide designed to make this as seamless as possible, make sure to check it out. -> 如果您想贡献集成或包,请不要担心!我们有一个完整的贡献指南,旨在使这尽可能无缝,务必查看。
集成
所有 第三方集成现在都在 llama-index-integrations
下。这里有 19 个文件夹。主要的集成类别是
LLMs
嵌入
多模态 LLMs
阅读器
工具
向量存储
For completeness here are all the other categories: agent
, callbacks
, evaluation
, extractors
, graph_stores
, indices
, output_parsers
, postprocessor
, program
, question_gen
, response_synthesizers
, retrievers
, storage
, tools
. -> 为了完整性,这里列出了所有其他类别:agent
、callbacks
、evaluation
、extractors
、graph_stores
、indices
、output_parsers
、postprocessor
、program
、question_gen
、response_synthesizers
、retrievers
、storage
、tools
。
The integrations in the most common categories can be found in our temporary Notion 包注册表页面中找到。所有集成都可以在我们的 Github 仓库中找到。每个集成包的文件夹名称对应于包的名称——所以如果您找到了喜欢的集成,现在就知道如何使用 pip 安装它了!
我们正在积极努力,使所有集成都可以在 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
# create the pack
# get documents from any data loader
sentence_window_retriever_pack = SentenceWindowRetrieverPack(
documents
)
response = sentence_window_retriever_pack.run("Tell me a bout a Music celebritiy.")
处理重大更改
此更新包含重大更改,主要涉及导入。对于所有集成,您不能再执行以下任何操作
# no more using `llama_index.llms` as a top-level package
from llama_index.llms import OpenAI
# no more using `llama_index.vector_stores` as a top-level package
from llama_index.vector_stores import PineconeVectorStore
# llama_hub imports are now no longer supported.
from llama_hub.slack.base import SlackReader
您可以改为执行以下操作
from llama_index.llms.openai import OpenAI
from llama_index.vector_stores.pinecone import PineconeVectorStore
# NOTE: no longer import a separate llama_hub package
from llama_index.readers.slack import SlackReader
请参阅我们的迁移指南(下文也有描述)了解更多详情。
LlamaHub 作为集成的中心枢纽
随着这些打包更新,我们正在扩展 LlamaHub 的概念,使其成为所有 LlamaIndex 集成的中心枢纽,以实现其成为 LLM 生态系统中心集成站点的愿景。这超出了其现有的加载器、工具、包和数据集领域,涵盖了 LLMs、嵌入、向量存储、回调等。
这项工作仍在进行中。 如果您今天访问 llamahub.ai,您会发现该网站尚未更新,并且仍包含当前的集成集(数据加载器、工具、LlamaPacks、数据集)。请放心,我们将在几周内更新该网站;在此期间,请查看我们的Notion 包注册表 / 仓库以获取所有集成/包的列表。
终止使用 llama-hub 仓库
Since all integrations have been moved to the llama_index repo, we are sunsetting the llama-hub repo (but LlamaHub itself lives on!). We did the painstaking work of migrating and packaging all existing llama-hub integrations. For all future contributions please submit directly to the llama_index repo! -> 由于所有集成都已移至 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"
请参阅我们更新的贡献指南了解更多详情。
迁移到 v0.10
如果您想使用 LlamaIndex v0.10,您需要做两件主要的事情
- 调整导入以适应核心模块/集成的新包结构
- 弃用 ServiceContext
幸运的是,我们创建了一个全面的迁移指南,其中还包含一个 CLI 工具,可以自动将您现有的代码和笔记本升级到 v0.10!
只需执行
llamaindex-cli upgrade <source-dir>
下一步
我们不遗余力地修改了所有 README、文档和笔记本,以反映这些 v0.10 的更改。请查看下面的部分,了解所有资源的汇总列表。
文档
临时 v0.10 包注册表
仓库
示例笔记本
这些主要用于展示我们更新的导入语法。
Bug 报告
我们将积极监控我们的Github Issues 和 Discord。如果您遇到任何问题,请随时加入这两个渠道!