Skip to main content
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
)
另一种使用 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
)
有关嵌入模型的更多详情,请参阅 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"
)

插入向量

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 = OpenAIEmbeddings()

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

# 将文档嵌入向量插入存储
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"])

获取存储信息

你可以使用 info 函数获取数据库相关信息,例如距离度量和维度。 当插入发生时,数据库会进行索引。在此过程中,新向量无法被查询。pendingVectorCount 表示当前正在被索引的向量数量。
info = store.info()
print(info)

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

Upstash Redis

本页介绍如何在 LangChain 中使用 Upstash Redis

安装与设置

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

集成

所有 Upstash-LangChain 集成均基于 upstash-redis Python SDK 作为 LangChain 封装。该 SDK 通过控制台提供的 UPSTASH_REDIS_REST_URL 和 UPSTASH_REDIS_REST_TOKEN 参数使用 Upstash Redis DB。

缓存

Upstash Redis 可用作 LLM 提示和响应的缓存。 导入此缓存:
from langchain.cache import 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))