Upstash 为开发者提供无服务器数据库和消息传递平台,以构建强大的应用程序,而无需担心大规模运行数据库的操作复杂性。
Upstash 的一个显著优势是他们的数据库支持 HTTP,并且所有的 SDK 都使用 HTTP。 这意味着你可以在无服务器平台、边缘或任何不支持 TCP 连接的平台上运行它。
目前,LangChain 提供了两种 Upstash 集成: Upstash Vector 作为向量嵌入数据库,Upstash Redis 作为缓存和内存存储。
Upstash Vector
Upstash Vector 是一个无服务器向量数据库,可用于存储和查询向量。
安装
在Upstash 控制台创建一个新的无服务器向量数据库。 根据您的模型选择首选的距离度量和维度数量。
使用pip install upstash-vector
安装Upstash Vector Python SDK。
langchain中的Upstash Vector集成是对Upstash Vector Python SDK的封装。这就是为什么需要upstash-vector
包的原因。
集成
使用来自Upstash控制台的凭据创建一个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)
# Create a new embeddings object
embeddings = OpenAIEmbeddings()
# Create a new UpstashVectorStore object
store = UpstashVectorStore(
embedding=embeddings
)
# Insert the document embeddings into the 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"])
获取商店信息
您可以使用info函数获取有关数据库的信息,例如距离度量维度。
当发生插入时,数据库会进行索引操作。在此过程中,新的向量无法被查询。pendingVectorCount
表示当前正在被索引的向量数量。
info = store.info()
print(info)
# Output:
# {'vectorCount': 44, 'pendingVectorCount': 0, 'indexSize': 2642412, 'dimension': 1536, 'similarityFunction': 'COSINE'}
Upstash Redis
本页面介绍了如何将Upstash Redis与LangChain结合使用。
安装与设置
- Upstash Redis Python SDK 可以通过
pip install upstash-redis
安装 - 可以在Upstash Console上创建一个全球分布、低延迟且高可用的数据库。
集成
所有的Upstash-LangChain集成都是基于upstash-redis
Python SDK,该SDK被用作LangChain的封装器。
这个SDK通过从控制台提供UPSTASH_REDIS_REST_URL和UPSTASH_REDIS_REST_TOKEN参数来利用Upstash Redis数据库。
缓存
Upstash Redis 可以用作LLM提示和响应的缓存。
要导入此缓存:
from langchain.cache import UpstashRedisCache
与您的LLMs一起使用:
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,
)