探索Aerospike Vector Search和LangChain集成:大数据集的高效语义搜索

72 阅读3分钟
# 探索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进行大规模数据集的语义搜索。您可以进一步探索以下资源来扩展知识:

参考资料

  1. Aerospike Vector Search 官方文档
  2. LangChain 集成指南
  3. Hugging Face 模型介绍

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

---END---