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的库更容易。以下是一些例子:
项目 | 语言 | 授权 | 作者 |
---|---|---|---|
jedis | Java | MIT | Redis |
redisvl | Python | MIT | Redis |
redis-py | Python | MIT | Redis |
node-redis | Node.js | MIT | Redis |
nredisstack | .NET | MIT | Redis |
部署选项
有很多方法可以部署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—