引言
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 集成,我们可以高效地对大规模数据集进行向量搜索,减少查询响应时间。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---