Rockset
Rockset is a real-time analytics database which enables queries on massive, semi-structured data without operational burden. With Rockset, ingested data is queryable within one second and analytical queries against that data typically execute in milliseconds. Rockset is compute optimized, making it suitable for serving high concurrency applications in the sub-100TB range (or larger than 100s of TBs with rollups).
本笔记本演示了如何在 LangChain 中将 Rockset 用作文档加载器。开始之前,请确保您已拥有 Rockset 账户并具备可用的 API 密钥。
设置环境
- 前往 Rockset 控制台 获取 API 密钥。从 API 参考 中查找您的 API 区域。出于本笔记本的目的,我们假设您正在使用来自
Oregon(us-west-2)的 Rockset。 - 设置环境变量
ROCKSET_API_KEY。 - 安装 Rockset Python 客户端,LangChain 将使用该客户端与 Rockset 数据库进行交互。
%pip install --upgrade --quiet rockset
加载文档
Rockset 与 LangChain 的集成允许您通过 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 列用作页面内容,记录的 id 和 date 列用作元数据(如果您未向 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.",则生成的Document中的page_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
)
生成的 Document 的 page_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.