# 探索Aerospike Vector Search和LangChain集成:大数据集的高效语义搜索
## 引言
在大数据时代,快速有效地搜索和分析数据变得至关重要。Aerospike Vector Search (AVS) 与 LangChain 的结合提供了一种强大的解决方案,能够在超大规模数据集上执行语义搜索。本文将详细介绍如何使用 Aerospike Vector Search 和 LangChain 集成进行数据存储和检索,并提供完整的代码示例。
## 主要内容
### 1. 安装Aerospike Vector Search
在开始使用此功能之前,我们需要确保在系统上运行AVS实例。可以使用官方提供的安装方法进行设置。记得保存AVS实例的IP地址和端口,以便稍后在代码中使用:
```python
PROXIMUS_HOST = "<avs-ip>"
PROXIMUS_PORT = 5000
2. 安装依赖项
安装以下Python包以使用Aerospike和LangChain组合:
!pip install --upgrade --quiet aerospike-vector-search==0.6.1 langchain-community sentence-transformers langchain
3. 下载和加载数据集
我们将下载并加载大约10万条引用数据集的一个子集用于语义搜索:
!wget https://github.com/aerospike/aerospike-vector-search-examples/raw/7dfab0fccca0852a511c6803aba46578729694b5/quote-semantic-search/container-volumes/quote-search/data/quotes.csv.tgz
将数据文件解压并加载:
import itertools
import os
import tarfile
from langchain_community.document_loaders.csv_loader import CSVLoader
filename = "./quotes.csv"
if not os.path.exists(filename) and os.path.exists(filename + ".tgz"):
with tarfile.open(filename + ".tgz", "r:gz") as tar:
tar.extractall(path=os.path.dirname(filename))
NUM_QUOTES = 5000
documents = CSVLoader(filename, metadata_columns=["author", "category"]).lazy_load()
documents = list(itertools.islice(documents, NUM_QUOTES))
4. 嵌入和索引文档
使用 Hugging Face 提供的 "all-MiniLM-L6-v2" 模型对文档进行向量化,然后在 Aerospike 数据库中创建索引:
from aerospike_vector_search import AdminClient, Client, HostPort
from aerospike_vector_search.types import VectorDistanceMetric
from langchain_community.embeddings import HuggingFaceEmbeddings
MODEL_DIM = 384
MODEL_DISTANCE_CALC = VectorDistanceMetric.COSINE
embedder = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
seed = HostPort(host=PROXIMUS_HOST, port=PROXIMUS_PORT) # 使用API代理服务提高访问稳定性
client = Client(seeds=seed)
admin_client = AdminClient(seeds=seed)
NAMESPACE = "test"
INDEX_NAME = "quote-miniLM-L6-v2"
VECTOR_KEY = "vector"
# 检查并创建新索引
index_exists = False
for index in admin_client.index_list():
if index["id"]["namespace"] == NAMESPACE and index["id"]["name"] == INDEX_NAME:
index_exists = True
print(f"{INDEX_NAME} already exists. Skipping creation")
break
if not index_exists:
admin_client.index_create(
namespace=NAMESPACE,
name=INDEX_NAME,
vector_field=VECTOR_KEY,
vector_distance_metric=MODEL_DISTANCE_CALC,
dimensions=MODEL_DIM,
index_meta_data={
"model": "miniLM-L6-v2",
"date": "05/04/2024",
"dim": str(MODEL_DIM),
"distance": "cosine",
},
)
admin_client.close()
5. 搜索文档
嵌入后,可以执行语义搜索:
docstore = Aerospike.from_documents(
documents,
embedder,
client=client,
namespace=NAMESPACE,
vector_key=VECTOR_KEY,
index_name=INDEX_NAME,
distance_strategy=MODEL_DISTANCE_CALC,
)
query = "A quote about the beauty of the cosmos"
docs = docstore.similarity_search(query, k=5, index_name=INDEX_NAME)
for i, doc in enumerate(docs):
print("~~~~ Document", i, "~~~~")
print("auto-generated id:", doc.metadata["_id"])
print("author: ", doc.metadata["author"])
print(doc.page_content)
print("~~~~~~~~~~~~~~~~~~~~\n")
常见问题和解决方案
- 数据集大小问题:对于超大型数据集,可以考虑分批次进行加载和处理,以避免内存占用过多。
- 网络访问限制:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。
总结和进一步学习资源
通过本次实践,您已经了解了如何使用Aerospike和LangChain进行大规模数据集的语义搜索。您可以进一步探索以下资源来扩展知识:
参考资料
- Aerospike Vector Search 官方文档
- LangChain 集成指南
- Hugging Face 模型介绍
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---