探索DocArray HnswSearch:轻量级本地文档索引解决方案

122 阅读2分钟

引言

在大数据时代中,如何高效地管理和查询文档成为了一个重要的问题。DocArray HnswSearch 是一种轻量级的文档索引实现,适用于小到中型数据集的本地操作。它利用 hnswlib 将向量存储在磁盘中,并将所有其他数据存储在 SQLite 数据库中。本文将详细介绍如何使用 DocArray HnswSearch 来实现文档的高效相似性搜索。

主要内容

设置环境

首先,我们需要确保安装了 langchain-community 包以及 docarray 库。可以通过以下命令完成安装:

pip install --upgrade --quiet "docarray[hnswlib]"

如果你还没有获取 OpenAI 的 API Key,可以访问 OpenAI API Keys 获取。

使用 DocArrayHnswSearch

为了使用 DocArrayHnswSearch,我们需要导入相关库并加载文档数据。以下是一个基本的使用流程:

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

# Step 1: Load documents
documents = TextLoader("../../how_to/state_of_the_union.txt").load()

# Step 2: Split documents into chunks
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# Step 3: Generate embeddings
embeddings = OpenAIEmbeddings()

# Step 4: Create a DocArrayHnswSearch instance
db = DocArrayHnswSearch.from_documents(
    docs, embeddings, work_dir="hnswlib_store/", n_dim=1536  # 使用API代理服务提高访问稳定性
)

相似性搜索

一旦数据库准备好,我们便可以执行相似性搜索。例如:

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

print(docs[0].page_content)

带分数的相似性搜索

返回的距离分数是余弦距离,因此分数越低,结果越相似:

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

清理

在完成所有操作后,我们可以清理存储目录:

import shutil

# 删除目录
shutil.rmtree("hnswlib_store")

常见问题和解决方案

  • 访问限制:由于网络限制,尤其是在某些地区,访问OpenAI API时可能需要使用API代理服务以提高访问稳定性。
  • 资源管理:确保在操作完成后,正确清理资源以避免磁盘空间占用过大。

总结和进一步学习资源

DocArray HnswSearch 提供了一种高效、本地的文档索引和搜索解决方案,非常适合处理中小规模的数据集。通过结合使用向量存储和SQLite,你可以快速实现高效的文档查询。

如果你对向量存储概念或具体实现有更深入的兴趣,可以参考以下资源:

参考资料

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

---END---