Upstash 为开发者提供无服务器数据库和消息传递平台,帮助他们构建强大的应用程序,而无需担心大规模运行数据库时的运维复杂性。
Upstash 的一个显著优势是他们的数据库支持 HTTP,并且他们所有的 SDK 均使用 HTTP。 这意味着您可以在不支持 TCP 连接的无服务器平台、边缘计算或其他任何平台上运行此代码。
当前,LangChain 开发框架中可用的 Upstash 集成有两个: Upstash Vector 作为向量嵌入数据库和 Upstash Redis 作为缓存和内存存储。
Upstash Vector
Upstash Vector 是一个无服务器向量数据库,可用于存储和查询向量。
安装
创建一个新的服务器端矢量数据库,请访问 Upstash Console。 根据您的模型选择您偏好的距离度量和维度计数。
安装 Upstash Vector Python SDK,请使用 pip install upstash-vector。
由于 langchain 中的 Upstash Vector 整合是 Upstash Vector Python SDK 的包装器,因此需要安装 upstash-vector 包。
集成
使用控制台中的凭据创建一个 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向量索引能够关联嵌入模型的能力。在这种配置中,我们希望插入的文档或进行搜索的查询只需以文本形式发送到Upstash Vector。在后台,Upstash Vector会对这些文本进行嵌入,并使用这些嵌入执行请求。要使用此功能,请通过选择模型创建一个Upstash向量索引,并简单地传递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 文档 以了解有关嵌入模型的更多详细信息。
Namespaces
您可以使用命名空间来分区索引中的数据。当您希望查询大量数据,并且希望将数据分区以使查询更快时,命名空间非常有用。使用命名空间时,不会对结果进行后过滤,这会使查询结果更加精确。
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
)
查询向量
可以使用文本查询或另一个向量来查询向量。
The returned value is a list of Document objects.
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 向量文档 了解更多关于元数据过滤的信息。
删除向量
可以删除向量,通过它们的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控制台创建
集成
所有 Upstash-LangChain 整合都是基于 upstash-redis Python SDK 作为 LangChain 的封装。
此 SDK 利用 Upstash Redis DB,通过从控制台提供的 UPSTASH_REDIS_REST_URL 和 UPSTASH_REDIS_REST_TOKEN 参数进行。
缓存在
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))
内存
查看 使用示例。
from langchain_community.chat_message_histories import (
UpstashRedisChatMessageHistory,
)