探索Aerospike Vector Search:大规模数据集的语义搜索新世界

57 阅读3分钟

引言

在大数据时代,如何高效地进行语义搜索成为一项关键需求。Aerospike Vector Search (AVS) 扩展了Aerospike数据库的功能,使开发者能够在大型数据集中进行搜索。本文将深入探讨如何使用LangChain与Aerospike VectorStore集成,实现高效的向量搜索。

主要内容

AVS安装

要开始使用AVS,首先需要部署一个运行中的AVS实例。可以选择合适的安装方式并记录下AVS实例的IP地址和端口,供后续使用:

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

安装依赖

在使用此功能前,需要安装相关的Python依赖。sentence-transformers是一个较大的依赖项,安装可能需要几分钟:

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

下载和加载数据集

我们将下载一个包含约100,000条名言的数据集,并使用其中的一部分进行语义搜索:

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

向量嵌入及索引创建

我们利用HuggingFaceEmbeddings和"all-MiniLM-L6-v2"模型对文档进行嵌入:

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

创建Aerospike索引并嵌入文档:

from aerospike_vector_search import AdminClient, Client, HostPort
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 = any(
    index["id"]["namespace"] == NAMESPACE and index["id"]["name"] == INDEX_NAME
    for index in admin_client.index_list()
)

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

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, metadata_keys=["_id", "author"])

def print_documents(docs):
    for i, doc in enumerate(docs):
        print(f"~~~~ Document {i} ~~~~")
        print("auto-generated id:", doc.metadata["_id"])
        print("author:", doc.metadata["author"])
        print(doc.page_content)
        print("~~~~~~~~~~~~~~~~~~~~\n")

print_documents(docs)

常见问题和解决方案

挑战:大数据集处理

处理大型数据集时,内存和计算效率是关键挑战。通过流式加载文档和使用惰性加载技术,可以大幅度提高效率。

挑战:API访问限制

在某些地区,访问API可能会受到限制。建议使用API代理服务来提高访问的稳定性。

总结和进一步学习资源

通过本文的介绍,你已经掌握了如何使用Aerospike Vector Search进行高效的语义搜索。建议进一步学习以下资源:

参考资料

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