宣布我们的 LlamaCloud 正式发布(以及我们的 1900 万美元 A 轮融资)!
LlamaIndex

PostgresML 2024-05-28

使用 LlamaIndex + PostgresML 简化您的 RAG 应用架构

我们很高兴宣布 LlamaIndex 最近与 PostgresML 集成 — PostgresML 是一个基于 PostgreSQL 构建的综合性机器学习平台。PostgresML 托管索引允许 LlamaIndex 用户无缝管理文档存储、分割、嵌入和检索。通过使用 PostgresML 作为后端,用户可以从流线化和优化的检索增强生成 (RAG) 流程中受益。此集成将嵌入、向量搜索和文本生成统一到单个网络调用中,从而实现更快、更可靠且更易于管理的 RAG 工作流。

典型 RAG 工作流的问题

典型的检索增强生成 (RAG) 工作流存在显著缺点,尤其是对用户而言。

性能不佳是一个主要问题,因为这些工作流涉及对不同服务进行多次网络调用来完成嵌入、向量存储和文本生成,从而导致延迟增加。此外,将敏感数据发送给各种 LLM 提供商时还存在隐私问题。这些以用户为中心的问题因其他挑战而加剧:

  • 掌握新技术所需的开发时间增加
  • 由于存在多个故障点,维护和可伸缩性问题变得复杂
  • 需要多个服务提供商,成本高昂

上图展示了复杂性,显示了每个组件如何在不同服务之间交互 — 这加剧了这些问题。

解决方案

PostgresML 托管索引为典型 RAG 工作流的挑战提供了全面的解决方案。

通过在单个系统中管理文档存储、分割、嵌入生成和检索,PostgresML 在您无需使用多个独立解决方案时,显著减少了开发时间、扩展成本和总体支出。最重要的是,它通过将嵌入、向量搜索和文本生成整合到单个网络调用中,从而增强了用户体验 — 提高了性能并减少了延迟。此外,使用开源模型确保了透明度和灵活性,而在数据库内操作解决了隐私问题,并为用户提供了安全高效的 RAG 工作流。

关于 PostgresML

PostgresML [github || 网站 || 文档] 通过将模型移动到您的数据库,而不是不断将数据移动到模型,让用户可以利用数据和模型之间的基本关系。这种数据库内 AI 架构方法可实现更具扩展性、更可靠和更高效的应用程序。在 PostgresML 云上,您可以在数据所在的同一位置,在一个流程中执行向量操作、创建嵌入和生成实时输出。

主要亮点

  • 模型服务 - 用于交互式应用的 GPU 加速推理引擎,无额外的网络延迟或可靠性成本
  • 模型商店 - 访问包括 Hugging Face 最先进 LLM 在内的开源模型,并跟踪版本之间的性能变化
  • 模型训练 - 使用您的应用程序数据训练模型,支持 50 多种回归、分类或聚类任务算法;微调 Llama 和 BERT 等预训练模型以提高性能
  • 特征存储 - 可扩展地访问模型输入,包括向量、文本、分类和数值数据:向量数据库、文本搜索、知识图和应用程序数据全部集成在一个低延迟系统中
  • Python 和 JavaScript SDK - SDK 客户端可以在单个 SQL 请求中执行高级 ML/AI 任务,而无需将额外的数据、模型、硬件或依赖项传输到您的应用程序
  • 无服务器部署 - 享受即时自动扩展,使您的应用程序能够处理峰值负载而无需过度配置

PostgresML 具有一系列功能。在以下部分中,我们将引导您了解一个用例 — RAG — 以及如何在 LlamaIndex 上使用 PostgresML 托管索引来构建更好的 RAG 应用程序。

在 LlamaIndex 中如何工作

让我们看看使用 PostgresML 托管索引的简单问答示例。在此示例中,我们将使用 Paul Graham 的文章。

步骤 1:获取数据库连接字符串

如果您还没有这样做,请创建您的 PostgresML 账户。完成个人资料后,您将获得 100 美元的免费积分。

设置 PGML_DATABASE_URL 环境变量

export PGML_DATABASE_URL="{YOUR_CONNCECTION_STRING}"

或者,您可以在创建索引时传递 pgml_database_url 参数。

步骤 2:创建 PostgresML 托管索引

首先安装 Llama_index 和 PostgresML 托管索引组件

pip install llama_index llama-index-indices-managed-postgresml

然后加载数据

mkdir data
curl -o data/paul_graham_essay.txt https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt

最后创建 PostgresML 托管索引

from llama_index.core.readers import SimpleDirectoryReader
from llama_index.indices.managed.postgresml import PostgresMLIndex


documents = SimpleDirectoryReader("data").load_data()
index = PostgresMLIndex.from_documents(
    documents, collection_name="llama-index-example"
)

请注意,collection_name 用于唯一标识您正在使用的索引。

在这里,我们使用 SimpleDirectoryReader 加载文档,然后从这些文档构建 PostgresMLIndex。

此工作流不需要文档预处理。相反,文档会直接发送到 PostgresML,在那里根据管道规范进行存储、分割和嵌入。有关管道的更多信息,请参阅:https://postgresml.org/docs/api/client-sdk/pipelines 自定义管道可以在创建时传递给 PostgresML 索引,但默认情况下,文档使用 recursive_character 分割器进行分割,并使用 intfloat/e5-small-v2 进行嵌入。

步骤 3:查询

现在我们已经创建了索引,可以使用它进行检索和查询

retriever = index.as_retriever()
docs = retriever.retrieve("Was the author puzzled by the IBM 1401?")
for doc in docs:
    print(doc)

PostgreML 在单个网络调用中完成嵌入和检索。将此查询与 LlamaIndex 的其他常见嵌入和向量存储配置进行比较,您会发现显著的加速。

将 PostgresML 索引用作 query_engine 也同样简单

response = index.as_query_engine().query("Was the author puzzled by the IBM 1401?")
print(response)

再次注意响应速度有多快!PostgresML 托管索引在单个网络调用中完成嵌入、检索和增强生成。流式传输时,速度提升更加明显

query_engine = index.as_query_engine(streaming=True)
results = query_engine.query("Was the author puzzled by the IBM 1401?")
for text in results.response_gen:
    print(text, end="", flush=True)

请注意,query_engine 默认使用 meta-llama/Meta-Llama-3-8B-Instruct,但这是完全可配置的。

主要收获

PostgresML 托管索引独特地将嵌入、向量搜索和文本生成统一到单个网络调用中。LlamaIndex 用户通过使用 PostgresML 作为后端,可以期待更快、更可靠且更易于管理的 RAG 工作流。

要开始使用 PostgresML 和 LlamaIndex,您可以按照 PostgresML 入门指南设置您的账户,并使用您自己的数据运行上面的示例。