Skip to main content
⚠️ 弃用公告:Rockset 集成已停用
截至 2024 年 6 月,Rockset 已被 OpenAI 收购关闭了其公共服务 Rockset 曾是一个以世界级索引与检索能力著称的实时分析数据库。现在,其核心团队和技术正被整合到 OpenAI 的基础设施中,以支持未来的 AI 产品。 此 LangChain 集成已无法使用,仅作为历史存档保留。
Rockset 是一个实时分析数据库,可在海量半结构化数据上执行查询而无需运维负担。通过 Rockset,数据在摄取后一秒内即可查询,针对该数据的分析查询通常在毫秒级完成。Rockset 针对计算进行了优化,适用于 100TB 以下(或通过 rollup 超过 100TB)的高并发应用。
本文档演示如何在 LangChain 中使用 Rockset 作为文档加载器。开始之前,请确保您拥有 Rockset 账户和可用的 API 密钥。

环境设置

  1. 前往 Rockset 控制台 获取 API 密钥。在 API 参考 中查找您的 API 区域。本文档假设您使用的是 Oregon(us-west-2) 区域的 Rockset。
  2. 设置环境变量 ROCKSET_API_KEY
  3. 安装 Rockset Python 客户端,LangChain 将通过它与 Rockset 数据库交互。
pip install -qU  rockset

加载文档

LangChain 与 Rockset 的集成允许您通过 SQL 查询从 Rockset 集合中加载文档。为此,需要构建一个 RocksetLoader 对象。以下是初始化 RocksetLoader 的示例代码:
from langchain_community.document_loaders import RocksetLoader
from rockset import Regions, RocksetClient, models

loader = RocksetLoader(
    RocksetClient(Regions.usw2a1, "<api key>"),
    models.QueryRequestSql(query="SELECT * FROM langchain_demo LIMIT 3"),  # SQL query
    ["text"],  # content columns
    metadata_keys=["id", "date"],  # metadata columns
)
在这里,您可以看到执行了以下查询:
SELECT * FROM langchain_demo LIMIT 3
集合中的 text 列用作页面内容,记录的 iddate 列用作元数据(如果不向 metadata_keys 传入任何内容,则整个 Rockset 文档将被用作元数据)。 执行查询并获取结果 Document 的迭代器,请运行:
loader.lazy_load()
执行查询并一次性获取所有结果 Document,请运行:
loader.load()
以下是 loader.load() 的示例响应:
[
    Document(
        page_content="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas a libero porta, dictum ipsum eget, hendrerit neque. Morbi blandit, ex ut suscipit viverra, enim velit tincidunt tellus, a tempor velit nunc et ex. Proin hendrerit odio nec convallis lobortis. Aenean in purus dolor. Vestibulum orci orci, laoreet eget magna in, commodo euismod justo.",
        metadata={"id": 83209, "date": "2022-11-13T18:26:45.000000Z"}
    ),
    Document(
        page_content="Integer at finibus odio. Nam sit amet enim cursus lacus gravida feugiat vestibulum sed libero. Aenean eleifend est quis elementum tincidunt. Curabitur sit amet ornare erat. Nulla id dolor ut magna volutpat sodales fringilla vel ipsum. Donec ultricies, lacus sed fermentum dignissim, lorem elit aliquam ligula, sed suscipit sapien purus nec ligula.",
        metadata={"id": 89313, "date": "2022-11-13T18:28:53.000000Z"}
    ),
    Document(
        page_content="Morbi tortor enim, commodo id efficitur vitae, fringilla nec mi. Nullam molestie faucibus aliquet. Praesent a est facilisis, condimentum justo sit amet, viverra erat. Fusce volutpat nisi vel purus blandit, et facilisis felis accumsan. Phasellus luctus ligula ultrices tellus tempor hendrerit. Donec at ultricies leo.",
        metadata={"id": 87732, "date": "2022-11-13T18:49:04.000000Z"}
    )
]

使用多列作为内容

您可以选择使用多列作为内容:
from langchain_community.document_loaders import RocksetLoader
from rockset import Regions, RocksetClient, models

loader = RocksetLoader(
    RocksetClient(Regions.usw2a1, "<api key>"),
    models.QueryRequestSql(query="SELECT * FROM langchain_demo LIMIT 1 WHERE id=38"),
    ["sentence1", "sentence2"],  # TWO content columns
)
假设 “sentence1” 字段值为 "This is the first sentence.",“sentence2” 字段值为 "This is the second sentence.",则结果 Documentpage_content 将为:
This is the first sentence.
This is the second sentence.
您可以通过在 RocksetLoader 构造函数中设置 content_columns_joiner 参数来自定义内容列的拼接方式。content_columns_joiner 是一个接收 List[Tuple[str, Any]]] 参数的方法,表示 (列名, 列值) 的元组列表。默认情况下,该方法将每个列值用换行符连接。 例如,若希望将 sentence1 和 sentence2 用空格而非换行符连接,可以这样设置 content_columns_joiner
RocksetLoader(
    RocksetClient(Regions.usw2a1, "<api key>"),
    models.QueryRequestSql(query="SELECT * FROM langchain_demo LIMIT 1 WHERE id=38"),
    ["sentence1", "sentence2"],
    content_columns_joiner=lambda docs: " ".join(
        [doc[1] for doc in docs]
    ),  # join with space instead of /n
)
结果 Documentpage_content 将为:
This is the first sentence. This is the second sentence.
如果希望在 page_content 中包含列名,可以这样实现:
RocksetLoader(
    RocksetClient(Regions.usw2a1, "<api key>"),
    models.QueryRequestSql(query="SELECT * FROM langchain_demo LIMIT 1 WHERE id=38"),
    ["sentence1", "sentence2"],
    content_columns_joiner=lambda docs: "\n".join(
        [f"{doc[0]}: {doc[1]}" for doc in docs]
    ),
)
这将产生如下 page_content
sentence1: This is the first sentence.
sentence2: This is the second sentence.