Redis向量数据库简介及LangChain集成指南

Redis向量数据库简介及LangChain集成指南

老铁们,今天咱们来聊聊Redis在向量数据库(Vector Database)上的使用以及如何与LangChain集成。Redis大家应该都不陌生,它不仅仅是个简单的key-value存储,还能作为缓存、消息代理以及数据库来使用。选择Redis的原因之一就是其飞快的速度和庞大的生态圈。

Redis是什么?

说白了,Redis就是一个开源的key-value存储,广泛应用于缓存、消息代理和数据库场景。由于其速度快、支持多种客户端库,并且大型企业已经使用多年,所以开发者们普遍青睐它。在这些传统用例的基础上,Redis还提供了搜索和查询功能,能够在Redis中创建二级索引结构,这让Redis以缓存的速度充当向量数据库。

Redis作为向量数据库

Redis用压缩的倒排索引进行快速索引,同时内存占用较低。它支持多种高级功能,例如:

  • Redis哈希和JSON的多字段索引
  • 向量相似度搜索(通过HNSW(ANN)或FLAT(KNN))
  • 向量范围搜索(例如,寻找距离查询向量一定半径内的所有向量)
  • 增量索引而不损失性能
  • 文档排名(使用tf-idf,可选的用户权重)
  • 字段加权
  • 复杂布尔查询(AND, OR, NOT操作符)
  • 前缀匹配、模糊匹配和精确短语查询
  • 双语音音素匹配支持
  • 自动完成建议(带有模糊前缀建议)
  • 多语言的基于词干的查询扩展(使用Snowball)
  • 中文分词与查询支持(使用Friso)
  • 数值过滤和范围
  • 使用Redis地理空间索引进行地理空间搜索
  • 强大的聚合引擎
  • 支持所有UTF-8编码的文本
  • 检索完整文档、选定字段或仅文档ID
  • 结果排序(例如,按创建日期)

客户端

由于Redis不仅仅是一个向量数据库,许多用例需要使用Redis客户端,包括LangChain集成。可以使用任何标准的Redis客户端库运行搜索和查询命令,但使用封装了搜索和查询API的库更容易。以下是一些例子:

项目语言授权作者
jedisJavaMITRedis
redisvlPythonMITRedis
redis-pyPythonMITRedis
node-redisNode.jsMITRedis
nredisstack.NETMITRedis

部署选项

有很多方法可以部署Redis和RediSearch。最简单的方法是使用Docker,但也有许多其他潜在的部署选项,如:

  • Redis Cloud
  • Docker (Redis Stack)
  • 云市场:AWS Marketplace、Google Marketplace或Azure Marketplace
  • 本地部署:Redis Enterprise Software
  • Kubernetes:Redis Enterprise Software on Kubernetes

实战部署与初始化

本地部署Redis

要在本地部署Redis,可以运行以下命令:

docker run -d -p 6379:6379 -p 8001:8001 redis/redis-stack:latest

如果运行正常,你应该能够通过http://localhost:8001访问Redis UI。

初始化Redis VectorStore实例

有多种方法可以初始化Redis VectorStore实例。下面我们用Redis.__init__方法来演示。

from langchain_community.vectorstores.redis import Redis

vector_store = Redis(
    redis_url="redis://localhost:6379",
    embedding=embeddings,
    index_name="users",
)

管理向量存储

一旦创建了向量存储,我们可以通过添加和删除不同的项与其交互。

向向量存储中添加项目

from uuid import uuid4
from langchain_core.documents import Document

document_1 = Document(
    page_content="I had chocolate chip pancakes and scrambled eggs for breakfast this morning.",
    metadata={"source": "tweet"},
)
# 类似地定义更多的文档...
documents = [document_1, document_2, document_3, ...]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)

从向量存储中删除项目

vector_store.delete(ids=[uuids[-1]])

查询向量存储

创建向量存储并添加文档后,很可能在链或代理的运行过程中需要查询它。可以进行简单的相似性搜索,甚至可以附带分数的搜索。

results = vector_store.similarity_search("LangChain provides abstractions to make working with LLMs easy", k=2)
for res in results:
    print(f"* {res.page_content} [{res.metadata}]")

补充说明与总结

为了更进一步的整合和自动化模型调用的追踪,可以将LangSmith API key设置在环境变量中。Redis作为向量数据存储的能力,加上LangChain的灵活集成,为开发者在AI和数据处理上提供了强有力的支持。

今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值