Rockset
Rockset 是一个实时分析数据库,可以在几乎无操作负担的情况下对海量半结构化数据进行查询。使用 Rockset,导入的数据在一秒钟内即可进行查询,并且针对这些数据的分析查询通常在毫秒级执行。Rockset 计算优化,使其适用于在小于100TB范围(或大于100TBs时通过聚合)的高并发应用程序中提供服务。
本笔记本演示了如何在 langchain 中使用 Rockset 作为文档加载器。要开始使用,请确保您拥有一个 Rockset 账户和可用的 API 密钥。
设置环境
- Go to the Rockset 控制台 和 获取一个 API 密钥。从 API 参考 中找到您的 API 区域。为了本笔记本的目的,我们假设您将使用 Rockset 从
Oregon(us-west-2)。 - 设置环境变量
ROCKSET_API_KEY。 - 安装 Rockset Python 客户端,langchain 将使用它与 Rockset 数据库进行交互。
%pip install --upgrade --quiet rockset
加载文档
The Rockset integration with LangChain allows you to load documents from Rockset collections with SQL queries. In order to do this you must construct a RocksetLoader object. Here is an example snippet that initializes a 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
The 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 的 "2" 会是:
This is the first sentence.
This is the second sentence.
您可以自定义函数以通过设置RocksetLoader构造函数中的content_columns_joiner参数来合并内容列。content_columns_joiner是一个方法,它接受一个List[Tuple[str, Any]]]作为参数,表示(column name, column value)的元组列表。默认情况下,此方法是将每个列值用新的一行连接起来的方法。
例如,如果你想用空格而不是换行来连接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
)
The page_content of the resulting Document would be:
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.