高效实现本地化搜索:使用DocArray HnswSearch进行文档相似性搜索

67 阅读2分钟

高效实现本地化搜索:使用DocArray HnswSearch进行文档相似性搜索

引言

在处理文档搜索与相似性分析的任务时,轻量级且高效的工具显得尤为重要。DocArray HnswSearch 提供了一种全本地化的解决方案,非常适合中小规模的数据集。它利用 hnswlib 在磁盘上存储向量,并使用 SQLite 存储其他所有数据。本文将详细介绍如何使用 DocArray HnswSearch 实现文档相似性搜索。

主要内容

1. 环境设置

要使用 DocArray HnswSearch,确保安装了 docarraylangchain-community 包:

!pip install --upgrade --quiet "docarray[hnswlib]"
!pip install -qU langchain-community

2. 使用DocArray HnswSearch

接下来,我们将配置环境以利用 OpenAI 的嵌入模型,并创建一个 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

# 加载文本并分割
documents = TextLoader("../../how_to/state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 创建嵌入及数据库
embeddings = OpenAIEmbeddings()
db = DocArrayHnswSearch.from_documents(
    docs, embeddings, work_dir="hnswlib_store/", n_dim=1536
)

3. 执行相似性搜索

我们可以通过简单的查询获得最相似的文档:

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

print(docs[0].page_content)

代码示例

以下是一个完整的示例代码,展示如何将上述步骤结合以实现文档相似性搜索。

# -*- coding: utf-8 -*-
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import DocArrayHnswSearch
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

# 加载和分割文档
documents = TextLoader("../../how_to/state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 创建嵌入对象
embeddings = OpenAIEmbeddings()

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

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

# 输出结果
print(docs[0].page_content)

常见问题和解决方案

  1. 访问缓慢或失败:在某些地区访问 OpenAI 的服务可能不稳定,建议使用API代理服务来提高访问速度和稳定性。

  2. 数据存储限制:对于非常大的数据集,使用本地存储可能会受到磁盘空间的限制,可以考虑分批处理数据以优化性能。

总结和进一步学习资源

通过 DocArray HnswSearch,我们可以高效地在本地进行文档相似性搜索,而无需依赖外部大型搜索引擎。若要深入了解向量存储的概念和应用,可以参考以下资源:

参考资料

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

---END---