Skip to main content
Open In ColabOpen on GitHub

Rockset

Rockset is a real-time search and analytics database built for the cloud. Rockset uses a Converged Index™ with an efficient store for vector embeddings to serve low latency, high concurrency search queries at scale. Rockset has full support for metadata filtering and handles real-time ingestion for constantly updating, streaming data.

本笔记本演示了如何在LangChain中将 Rockset 用作向量存储。在开始之前,请确保您能够访问 Rockset 账户并拥有可用的API密钥。立即开始免费试用。

您需要使用 pip install -qU langchain-community 安装 langchain-community 才能使用此集成

设置你的环境

  1. 利用 Rockset 控制台,以 Write API 作为数据源创建一个 集合。在此教程中,我们将创建一个名为 langchain_demo 的集合。

    配置以下数据摄取转换以标记您的嵌入字段并利用性能和存储优化:

    (我们使用了OpenAI text-embedding-ada-002作为示例,其中向量嵌入的长度为1536)

SELECT _input.* EXCEPT(_meta), 
VECTOR_ENFORCE(_input.description_embedding, #length_of_vector_embedding, 'float') as description_embedding
FROM _input
  1. 在创建您的集合后,使用控制台检索一个 API 密钥。为了本笔记本的目的,我们假设您正在使用 Oregon(us-west-2) 区域。

  2. 安装 rockset-python-client 以启用 LangChain 直接与 Rockset 通信。

%pip install --upgrade --quiet  rockset

LangChain 教程

在您自己的 Python 笔记本中跟随操作,生成并存储向量嵌入到 Rockset 中。开始使用 Rockset 搜索与您的查询相似的文档。

1. 定义关键变量

import os

import rockset

ROCKSET_API_KEY = os.environ.get(
"ROCKSET_API_KEY"
) # Verify ROCKSET_API_KEY environment variable
ROCKSET_API_SERVER = rockset.Regions.usw2a1 # Verify Rockset region
rockset_client = rockset.RocksetClient(ROCKSET_API_SERVER, ROCKSET_API_KEY)

COLLECTION_NAME = "langchain_demo"
TEXT_KEY = "description"
EMBEDDING_KEY = "description_embedding"

2. 准备文档

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Rockset
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

3. 插入文档

embeddings = OpenAIEmbeddings()  # Verify OPENAI_API_KEY environment variable

docsearch = Rockset(
client=rockset_client,
embeddings=embeddings,
collection_name=COLLECTION_NAME,
text_key=TEXT_KEY,
embedding_key=EMBEDDING_KEY,
)

ids = docsearch.add_texts(
texts=[d.page_content for d in docs],
metadatas=[d.metadata for d in docs],
)

4. 搜索相似文档

query = "What did the president say about Ketanji Brown Jackson"
output = docsearch.similarity_search_with_relevance_scores(
query, 4, Rockset.DistanceFunction.COSINE_SIM
)
print("output length:", len(output))
for d, dist in output:
print(dist, d.metadata, d.page_content[:20] + "...")

##
# output length: 4
# 0.764990692109871 {'source': '../../../state_of_the_union.txt'} Madam Speaker, Madam...
# 0.7485416901622112 {'source': '../../../state_of_the_union.txt'} And I’m taking robus...
# 0.7468678973398306 {'source': '../../../state_of_the_union.txt'} And so many families...
# 0.7436231261419488 {'source': '../../../state_of_the_union.txt'} Groups of citizens b...

5. 使用过滤器搜索相似文档

output = docsearch.similarity_search_with_relevance_scores(
query,
4,
Rockset.DistanceFunction.COSINE_SIM,
where_str="{} NOT LIKE '%citizens%'".format(TEXT_KEY),
)
print("output length:", len(output))
for d, dist in output:
print(dist, d.metadata, d.page_content[:20] + "...")

##
# output length: 4
# 0.7651359650263554 {'source': '../../../state_of_the_union.txt'} Madam Speaker, Madam...
# 0.7486265516824893 {'source': '../../../state_of_the_union.txt'} And I’m taking robus...
# 0.7469625542348115 {'source': '../../../state_of_the_union.txt'} And so many families...
# 0.7344177777547739 {'source': '../../../state_of_the_union.txt'} We see the unity amo...

6. [可选] 删除插入的文档

您必须拥有与每个文档关联的唯一ID,才能从您的集合中删除它们。 在插入文档时定义ID为Rockset.add_texts()。Rockset将为每个文档生成一个唯一的ID。无论如何,Rockset.add_texts()会返回插入文档的ID。

要删除这些文档,请简单地使用 Rockset.delete_texts() 函数。

docsearch.delete_texts(ids)

摘要

在这个教程中,我们成功创建了一个 Rockset 集合、inserted 个文档并使用 OpenAI 嵌入,同时在有和没有元数据过滤器的情况下搜索了相似的文档。

关注 https://rockset.com/ 以获取此领域的未来更新。