Skip to main content
Open on GitHub

Upstash 为开发者提供无服务器数据库以及消息传递平台,帮助他们构建强大的应用程序,而无需担心大规模运行数据库的运维复杂性。

Upstash 的一个显著优势是其数据库支持 HTTP,并且所有 SDK 都使用 HTTP。 这意味着您可以在无服务器平台、边缘计算或任何不支持 TCP 连接的平台上运行它。

目前,LangChain 提供了两个 Upstash 集成: Upstash Vector 作为向量嵌入数据库,Upstash Redis 作为缓存和内存存储。

Upstash Vector

Upstash Vector 是一个无服务器向量数据库,可用于存储和查询向量。

安装

Upstash Console 创建一个新的无服务器向量数据库。 根据您的模型选择首选的距离度量和维度数量。

使用 pip install upstash-vector 安装 Upstash Vector Python SDK。 Langchain 中的 Upstash Vector 集成是 Upstash Vector Python SDK 的封装。因此需要 upstash-vector 包。

集成

使用来自 Upstash Console 的凭证创建一个 UpstashVectorStore 对象。 您还需要传递一个 Embeddings 对象,该对象可以将文本转换为向量嵌入。

from langchain_community.vectorstores.upstash import UpstashVectorStore
import os

os.environ["UPSTASH_VECTOR_REST_URL"] = "<UPSTASH_VECTOR_REST_URL>"
os.environ["UPSTASH_VECTOR_REST_TOKEN"] = "<UPSTASH_VECTOR_REST_TOKEN>"

store = UpstashVectorStore(
embedding=embeddings
)
API Reference:UpstashVectorStore

UpstashVectorStore 的另一种用法是将 embedding=True 作为参数传入。这是 UpstashVectorStore 的独特功能,得益于 Upstash Vector 索引可以关联嵌入模型的强大能力。在此配置下,我们想要插入的文档或想要搜索的查询将作为文本直接发送到 Upstash Vector。在后台,Upstash Vector 会嵌入这些文本并使用这些嵌入执行请求。要使用此功能,请通过选择模型创建 Upstash Vector 索引并直接传入 embedding=True

from langchain_community.vectorstores.upstash import UpstashVectorStore
import os

os.environ["UPSTASH_VECTOR_REST_URL"] = "<UPSTASH_VECTOR_REST_URL>"
os.environ["UPSTASH_VECTOR_REST_TOKEN"] = "<UPSTASH_VECTOR_REST_TOKEN>"

store = UpstashVectorStore(
embedding=True
)
API Reference:UpstashVectorStore

有关嵌入模型的更多详细信息,请参阅 Upstash Vector 文档

命名空间

您可以使用命名空间对索引中的数据进行分区。当您想要查询大量数据并希望对数据进行分区以加快查询速度时,命名空间非常有用。使用命名空间时,不会对结果进行后过滤,这将使查询结果更加精确。

from langchain_community.vectorstores.upstash import UpstashVectorStore
import os

os.environ["UPSTASH_VECTOR_REST_URL"] = "<UPSTASH_VECTOR_REST_URL>"
os.environ["UPSTASH_VECTOR_REST_TOKEN"] = "<UPSTASH_VECTOR_REST_TOKEN>"

store = UpstashVectorStore(
embedding=embeddings
namespace="my_namespace"
)
API Reference:UpstashVectorStore

插入向量

from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings

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

# 创建一个新的 embeddings 对象
embeddings = OpenAIEmbeddings()

# 创建一个新的 UpstashVectorStore 对象
store = UpstashVectorStore(
embedding=embeddings
)

# 将文档嵌入插入到 store 中
store.add_documents(docs)

插入文档时,首先使用 Embeddings 对象对其进行嵌入。

大多数嵌入模型可以一次嵌入多个文档,因此文档会分批并并行嵌入。 批次大小可以通过 embedding_chunk_size 参数控制。

嵌入的向量随后存储在 Upstash Vector 数据库中。发送时,会将多个向量分批处理以减少 HTTP 请求的数量。 批次大小可以通过 batch_size 参数控制。在免费套餐中,Upstash Vector 对每个批次的向量限制为 1000 个。

store.add_documents(
documents,
batch_size=100,
embedding_chunk_size=200
)

查询向量

向量可以通过文本查询或另一个向量进行查询。

返回值是 Document 对象的列表。

result = store.similarity_search(
"The United States of America",
k=5
)

或者使用向量:

vector = embeddings.embed_query("Hello world")

result = store.similarity_search_by_vector(
vector,
k=5
)

搜索时,您还可以利用 filter 参数,该参数允许您根据元数据进行过滤:

result = store.similarity_search(
"The United States of America",
k=5,
filter="type = 'country'"
)

有关元数据过滤的更多详细信息,请参阅 Upstash Vector 文档

删除向量

向量可以按其 ID 删除。

store.delete(["id1", "id2"])

获取有关 store 的信息

您可以使用 info 函数获取有关数据库的信息,例如距离度量维度。

当发生插入时,数据库会进行索引。在索引进行时,新的向量无法被查询。pendingVectorCount 表示当前正在索引的向量数量。

info = store.info()
print(info)

# Output:
# {'vectorCount': 44, 'pendingVectorCount': 0, 'indexSize': 2642412, 'dimension': 1536, 'similarityFunction': 'COSINE'}

Upstash Redis

此页面介绍如何将 Upstash Redis 与 LangChain 结合使用。

安装和设置

  • 可以使用 pip install upstash-redis 安装 Upstash Redis Python SDK
  • 可以在 Upstash Console 创建一个全球分布式、低延迟且高可用的数据库

集成

所有 Upstash-LangChain 集成都基于 upstash-redis Python SDK,该 SDK 被用作 LangChain 的包装器。 此 SDK 通过提供控制台中 UPSTASH_REDIS_REST_URL 和 UPSTASH_REDIS_REST_TOKEN 参数来利用 Upstash Redis DB。

缓存

Upstash Redis 可用作 LLM 提示和响应的缓存。

导入此缓存:

from langchain.cache import UpstashRedisCache
API Reference:UpstashRedisCache

与您的 LLM 一起使用:

import langchain
from upstash_redis import Redis

URL = "<UPSTASH_REDIS_REST_URL>"
TOKEN = "<UPSTASH_REDIS_REST_TOKEN>"

langchain.llm_cache = UpstashRedisCache(redis_=Redis(url=URL, token=TOKEN))

内存

请参阅 用法示例

from langchain_community.chat_message_histories import (
UpstashRedisChatMessageHistory,
)