Redis
Redis(远程字典服务器)是一个内存数据结构存储,用作分布式、内存中的键值数据库、缓存和消息代理,可选择性地提供持久性。
本笔记本展示了如何使用与Redis向量数据库相关的功能。
作为数据库,支持使用"redis_url"参数连接Redis独立服务器或Redis Sentinel HA设置。有关redis连接url的不同格式的更多信息,请参见LangChain的Redis自述文件。
安装
pip install redis
我们想要使用OpenAIEmbeddings
,所以我们必须获取OpenAI API密钥。
import os
import getpass
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
示例
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.redis import Redis
from langchain.document_loaders import TextLoader
loader = TextLoader("../../../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()
如果您对条目的键不感兴趣,您也可以根据文档创建redis实例。
rds = Redis.from_documents(
docs, embeddings, redis_url="redis://localhost:6379", index_name="link"
)
如果您对条目的键感兴趣,您必须将文档拆分为文本和元数据。
texts = [d.page_content for d in docs]
metadatas = [d.metadata for d in docs]
rds, keys = Redis.from_texts_return_keys(
texts, embeddings, redis_url="redis://localhost:6379", index_name="link"
)
rds.index_name
query = "What did the president say about Ketanji Brown Jackson"
results = rds.similarity_search(query)
print(results[0].page_content)
print(rds.add_texts(["Ankush went to Princeton"]))
query = "Princeton"
results = rds.similarity_search(query)
print(results[0].page_content)
# 从现有索引加载
rds = Redis.from_existing_index(
embeddings, redis_url="redis://localhost:6379", index_name="link"
)
query = "What did the president say about Ketanji Brown Jackson"
results = rds.similarity_search(query)
print(results[0].page_content)
Redis作为检索器
这里我们介绍了使用向量存储作为检索器的不同选项。
我们可以使用三种不同的搜索方法来进行检索。默认情况下,它将使用语义相似性。
retriever = rds.as_retriever()
docs = retriever.get_relevant_documents(query)
我们还可以使用similarity_limit作为搜索方法。只有在相似度足够高时才返回文档。
retriever = rds.as_retriever(search_type="similarity_limit")
# 这里我们可以看到它不返回任何结果,因为没有相关文档
retriever.get_relevant_documents("where did ankush go to college?")
删除键
要删除条目,您必须使用它们的键。
Redis.delete(keys, redis_url="redis://localhost:6379")
Redis连接URL示例
有效的Redis URL方案有:
redis://
- 连接到Redis独立服务器,未加密rediss://
- 连接到Redis独立服务器,使用TLS加密redis+sentinel://
- 通过Redis Sentinel连接到Redis服务器,未加密rediss+sentinel://
- 通过Redis Sentinel连接到Redis服务器,两个连接都使用TLS加密
有关其他连接参数的更多信息,请参见redis-py文档https://redis-py.readthedocs.io/en/stable/connections.html
# 连接到本地主机的redis独立服务器,数据库0,无密码
redis_url = "redis://localhost:6379"
# 连接到主机"redis",端口7379,使用数据库2和密码"secret"(旧的身份验证方案,没有用户名/6.x之前的版本)
redis_url = "redis://:secret@redis:7379/2"
# 连接到主机redis的默认端口,使用用户"joe",密码"secret",使用redis版本6+ ACL
redis_url = "redis://joe:secret@redis/0"
# 连接到本地主机的sentinel,默认组为mymaster,数据库0,无密码
redis_url = "redis+sentinel://localhost:26379"
# 连接到主机redis的默认端口26379,使用用户"joe",密码"secret",默认组为mymaster,数据库0
redis_url = "redis+sentinel://joe:secret@redis"
# 连接到sentinel,无身份验证,使用sentinel监视组"zone-1"和数据库2
redis_url = "redis+sentinel://redis:26379/zone-1/2"
# 连接到本地主机的redis独立服务器,数据库0,无密码,但支持TLS
redis_url = "rediss://localhost:6379"
# 连接到本地主机的redis sentinel,默认端口,数据库0,无密码,但支持TLS,用于sentinel和Redis服务器
redis_url = "rediss+sentinel://localhost"