Skip to main content

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方案有:

  1. redis:// - 连接到Redis独立服务器,未加密
  2. rediss:// - 连接到Redis独立服务器,使用TLS加密
  3. redis+sentinel:// - 通过Redis Sentinel连接到Redis服务器,未加密
  4. 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"