深入了解Aerospike Vector Search:大规模数据集的高效检索

39 阅读2分钟

引言

Aerospike Vector Search (AVS) 是对 Aerospike 数据库的扩展,使得在非常大的数据集上进行搜索成为可能。AVS 作为一个独立服务运行,并通过建立索引来进行搜索。本文将介绍如何使用 LangChain 的 Aerospike VectorStore 集成进行向量搜索。

主要内容

安装 AVS

在使用示例代码之前,需要确保 AVS 实例正常运行。可以使用多种可用安装方法完成 AVS 的安装。之后,记录下 AVS 实例的 IP 地址和端口:

PROXIMUS_HOST = "<avs-ip>"
PROXIMUS_PORT = 5000

安装依赖

!pip install --upgrade --quiet aerospike-vector-search==0.6.1 langchain-community sentence-transformers langchain

下载数据集

下载包含约10万条语录的数据集,并使用其中的一部分进行语义搜索。

!wget https://github.com/aerospike/aerospike-vector-search-examples/raw/7dfab0fccca0852a511c6803aba46578729694b5/quote-semantic-search/container-volumes/quote-search/data/quotes.csv.tgz

加载数据

加载语录数据集,并使用 CSVLoader 文档加载器高效地进行数据切片。

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))

嵌入文档

使用 HuggingFace 的 "all-MiniLM-L6-v2" 模型对文档进行嵌入,以便执行向量搜索。

from langchain_community.embeddings import HuggingFaceEmbeddings
embedder = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")

创建索引并嵌入文档

在 Aerospike 数据库中创建索引,并嵌入文档。

from aerospike_vector_search import AdminClient, Client, HostPort
from aerospike_vector_search.types import VectorDistanceMetric
from langchain_community.vectorstores import Aerospike

seed = HostPort(host=PROXIMUS_HOST, port=PROXIMUS_PORT) # 使用API代理服务提高访问稳定性
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
        print(f"{INDEX_NAME} already exists. Skipping creation")
        break

if not index_exists:
    print(f"{INDEX_NAME} does not exist. Creating index")
    admin_client.index_create(
        namespace=NAMESPACE,
        name=INDEX_NAME,
        vector_field=VECTOR_KEY,
        vector_distance_metric=VectorDistanceMetric.COSINE,
        dimensions=384,
        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=VectorDistanceMetric.COSINE,
)

代码示例

进行文档的向量搜索示例。

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 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")

print_documents(docs)

常见问题和解决方案

  • 访问限制:某些地区可能会遇到网络访问限制,可考虑使用 API 代理服务来提高访问稳定性。
  • 性能优化:对于大型数据集,建议采用并行处理和批量操作以提高效率。

总结和进一步学习资源

通过 Aerospike Vector Search 和 LangChain 集成,我们可以高效地对大规模数据集进行向量搜索,减少查询响应时间。

参考资料

  1. Aerospike 官方文档
  2. LangChain 文档与指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---