# 用于大规模数据集搜索的Aerospike Vector Search:快速上手指南
## 引言
Aerospike Vector Search (AVS) 是Aerospike数据库的扩展,旨在对存储在Aerospike中的大规模数据集进行高效搜索。这项新服务通过建立索引来执行搜索,提供了强大的语义搜索能力。本篇文章将介绍如何利用LangChain和Aerospike的VectorStore集成来进行向量搜索。
## 主要内容
### 1. 安装AVS
在使用之前,需要确保有一个正在运行的AVS实例。完成安装后,记下AVS实例的IP地址和端口:
```python
PROXIMUS_HOST = "<avs-ip>" # 示例API代理服务
PROXIMUS_PORT = 5000
2. 安装依赖
安装必要的库,可能需要几分钟时间:
!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
4. 加载数据集
将语录数据加载成文档,以便进行语义搜索:
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))
5. 创建嵌入器
利用HuggingFaceEmbeddings将文档嵌入以便进行向量搜索:
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")
6. 创建Aerospike索引并嵌入文档
在添加文档前,需要在Aerospike数据库中创建索引:
from aerospike_vector_search import AdminClient, Client, HostPort
from langchain_community.vectorstores import Aerospike
seed = HostPort(host=PROXIMUS_HOST, port=PROXIMUS_PORT)
NAMESPACE = "test"
INDEX_NAME = "quote-miniLM-L6-v2"
VECTOR_KEY = "vector"
client = Client(seeds=seed)
admin_client = AdminClient(seeds=seed)
index_exists = False
for index in admin_client.index_list():
if index["id"]["namespace"] == NAMESPACE and index["id"]["name"] == INDEX_NAME:
index_exists = True
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"}
)
admin_client.close()
docstore = Aerospike.from_documents(
documents,
embedder,
client=client,
namespace=NAMESPACE,
vector_key=VECTOR_KEY,
index_name=INDEX_NAME,
distance_strategy=MODEL_DISTANCE_CALC
)
7. 搜索文档
利用向量搜索语句:
query = "A quote about the beauty of the cosmos"
docs = docstore.similarity_search(
query, k=5, index_name=INDEX_NAME, metadata_keys=["_id", "author"]
)
def print_documents(docs):
for doc in docs:
print(doc.metadata["author"], ":", doc.page_content)
print_documents(docs)
常见问题和解决方案
- 网络访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务以增加访问稳定性。
- 性能优化:大数据量时,可考虑分批处理或异步加载以提升效率。
总结和进一步学习资源
通过AVS进行向量搜索可以极大地提升大规模数据集的语义搜索能力。推荐资源:
参考资料
- Aerospike 官方文档
- LangChain 官方文档
- Hugging Face Transformers 文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---