
Andrei • 2024-02-27
使用 llama-index-networks 查询知识网络
RAG 背后的主要前提是向 LLM 注入上下文(或知识),以便从其获得更准确的响应。因此,RAG 系统的一个关键组成部分是其获取知识的数据源。因此,直观地推断,RAG 系统能够利用的知识越多,它最终就会变得越好(在回答可能具有深度和广度的问题方面)。这个概念的精神与基本上所有其他数据驱动学科中的概念并没有太大区别——获取更多(好的)数据,并随后有效利用,通常会带来更好的结果。
在此背景下,我们很高兴宣布发布我们最新的 llama-index
库扩展,名为 llama-index-networks
。这个库扩展使得构建一个基于外部数据源并由外部参与者提供的 RAG 网络成为可能。这种新的网络范例为数据供应商提供了一种新的方式,可以将他们的数据提供给需要这些数据的人,以构建更具知识性的系统!
在这篇博客文章中,我们将介绍新扩展库的主要类,并向您展示如何仅用几行代码,就可以让您的 QueryEngine 准备好作为 RAG 网络的一部分进行贡献。我们还将分享关于在 LLM 的新时代,这对于数据供应商实际如何向消费者提供数据可能意味着什么的一些想法。
术语说明:在这篇文章中,我们使用 llama-index-networks
指代实际的扩展,而 llama-index[networks]
指代安装了 llama-index-networks
扩展的 llama-index
安装。
Alex、Beth 和 Bob 的故事

为了说明 llama-index-networks 包如何使用,我们考虑三个虚构的人物:Alex、Bob 和 Beth,以及以下场景:
- Bob 和 Beth 都拥有自己的一套文档,并且都已经在这些文档之上构建了相当出色的 RAG 系统(当然是使用 llama-index!)
- Alex 听说了 Bob 和 Beth 都拥有的这些富有洞察力的文档,并希望能够查询建立在这两套文档之上的独立 RAG。
- Bob 和 Beth,他们是如此善良(或者,也许他们收到了未披露的金额),同意让 Alex 访问他们的 RAG 系统。
为了促进这种新的知识交流方式,他们同意建立一个 Alex 可以查询的 RAG 网络。
Bob 和 Beth 在他们的 RAG 之上构建了一个 Web 服务

使用 llama-index-networks
包,Bob 和 Beth 只需几行代码,就可以让他们的各自的 QueryEngine
准备好参与网络。
"""Beth's contributor service file.
Beth builds her QueryEngine and exposes it behind the standard
LlamaIndex Network Contributor Service.
NOTE: Bob would probably make use of Docker and cloud
compute services to make this production grade.
"""
from llama_index.networks.contributor import ContributorService
import uvicorn
beth_query_engine = ...
beth_contributor_service = ContributorService.from_config_file(
".env.contributor", # settings/secrets for the service
beth_query_engine
)
if __name__ == "__main__:
uvicorn.run(beth_contributor_service.app, port=8000)
Bob 会使用类似的几行代码让他的 QueryEngine
准备好为任何 LlamaIndex 网络做出贡献。请注意,dotenv 文件 .env.contributor
包含服务的设置以及任何必要的 API 密钥(例如,OPENAI_API_KEY
或 ANTHROPIC_API_KEY
),它在底层是使用 FastAPI 实现的 REST 服务。
Alex 构建了一个 NetworkQueryEngine

就 Alex 而言,他使用 llama-index-networks
扩展的 NetworkQueryEngine
类,以便能够连接到 Beth 和 Bob 的 ContributorService
。
"""Alex's network query engine.
Alex builds a NetworkQueryEngine to connect to a
list of ContributorService’s.
"""
from llama_index.networks.contributor import ContributorClient
from llama_index.networks.query_engine import NetworkQueryEngine
from llama_index.llms.groq import Groq
# Use ContributorClient to connect to a ContributorService
beth_client = ContributorClient.from_config_file(
env_file=".env.beth_contributor.client"
)
bob_client = ContributorClient.from_config_file(
env_file=".env.bob_contributor.client"
)
contributors = [beth_client, bob_client]
# NetworkQueryEngine
llm = Groq()
network_query_engine = NetworkQueryEngine.from_args(
contributors=contributors,
llm=llm
)
# Can query it like any other query engine
network_query_engine.query("Why is the sky blue?")
此处的 dotenv 文件存储了服务参数,例如连接到 ContributorService
所需的 api_url
。
在进入本博客文章的下一节之前,我们将用接下来的几行解释一下 Alex 查询他的 NetworkQueryEngine
时底层发生的情况。当调用 query()
方法时(也支持异步!),查询会发送给所有贡献者。他们的响应被存储为新的 Nodes
,然后合成一个响应(使用相关的 ResponseSynthesizer
)。阅读后,有些人可能会注意到,这与使用我们的 QueryEngine
抽象时的常见模式相同;而这正是我们想要的效果。使用 NetworkQueryEngine
应该与您在我们的库中使用任何其他 QueryEngine
非常相似!
关于 Alex、Bob 和 Beth 的小故事到此结束。在结束这篇博客文章之前,我们首先提供一些通过使用 llama-index-networks
可能出现的潜在机会。
数据供应和消费的新世界

llama-index[networks]
可以轻松赋能的一个潜在世界是 RAG 市场。在这个市场中,数据供应商将其数据打包成 RAG 的形式,提供给希望扩展自己查询系统知识的数据消费者。潜在的 RAG(数据)供应商可能是您当地的报纸、图书出版公司等。
在这种新的数据供应和消费模式中,数据供应商有更大的责任以更易于消费的方式准备数据——具体来说,供应商负责构建查询引擎。这应该会极大地惠及数据消费者,因为通过像 ContributorService
(封装了 QueryEngine
)提供的标准接口,他们可以比以往任何时候都更容易地从数据中获取他们所需的知识(即,相对于交换原始数据的传统数据市场)。
正是带着这样的愿景,我们构建了 llama-index[networks]
,以使其:(i) 数据供应商更容易以新的、可以说是更有效的方式提供其数据中包含的知识,以及 (ii) 数据消费者更容易连接到这些新形式的外部知识。
内部网络:另一个潜在用例
除了赋能 RAG 市场,我们还预见到连接一个总公司可能拥有但未必直接管理的 RAG 的需求。更具体地说,一个特许经营公司可能拥有其所有运营数据的使用权。虽然他们可以在整个数据库上构建一个“中心化”、单一的 RAG,但构建基于各个运营者的 RAG 并查询这些 RAG 可能仍然更高效、更有效。
交换信息以构建更好、更具知识性的系统的想法并不新鲜。然而,使用 RAG 来促进这种交换的想法可能是新的(据我们所知,确实是新的),我们相信无论是现有还是新的需要这种协作的用例都可以从这个概念中受益。
关于隐私的快速说明
数据协作中的一个重要考虑因素是隐私和安全。值得一提的是,上述示例假定网络中共享的数据符合数据隐私和安全法律法规。我们相信,随着这项技术的发展,将开发和整合必要的功能和能力,以促进合规的 RAG 网络。
查看演示以了解更多信息!
要查看连接到一组贡献者的网络的实际演示,请查看 llama-index-networks
的 Github 仓库 代码,并导航到 examples/demo
子文件夹。