高效实现本地化搜索:使用DocArray HnswSearch进行文档相似性搜索
引言
在处理文档搜索与相似性分析的任务时,轻量级且高效的工具显得尤为重要。DocArray HnswSearch 提供了一种全本地化的解决方案,非常适合中小规模的数据集。它利用 hnswlib 在磁盘上存储向量,并使用 SQLite 存储其他所有数据。本文将详细介绍如何使用 DocArray HnswSearch 实现文档相似性搜索。
主要内容
1. 环境设置
要使用 DocArray HnswSearch,确保安装了 docarray 和 langchain-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)
常见问题和解决方案
-
访问缓慢或失败:在某些地区访问
OpenAI的服务可能不稳定,建议使用API代理服务来提高访问速度和稳定性。 -
数据存储限制:对于非常大的数据集,使用本地存储可能会受到磁盘空间的限制,可以考虑分批处理数据以优化性能。
总结和进一步学习资源
通过 DocArray HnswSearch,我们可以高效地在本地进行文档相似性搜索,而无需依赖外部大型搜索引擎。若要深入了解向量存储的概念和应用,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---