使用DocArray HnswSearch实现本地化的高效文档索引

引言

在处理小到中等规模的数据集时,使用本地化的文档索引可以大大提高查询的响应速度和效率。DocArray的HnswSearch正是这样一个轻量级的文档索引实现,它将向量存储在磁盘上的hnswlib中,并将所有其他数据存储在SQLite中。本文将介绍如何使用DocArray HnswSearch进行文档索引和相似性搜索,并提供实用的代码示例。

主要内容

安装和设置

在开始之前,确保安装所需的库。你需要使用以下命令安装docarraylangchain-community

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

此外,你还需要设置OpenAI API密钥以使用嵌入功能:

# import os
# from getpass import getpass

# OPENAI_API_KEY = getpass()

# os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。

使用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

# 加载文档
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()

# 创建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)

结果返回最相关的文档片段。

带有得分的相似性搜索

有时,我们需要知道相似度得分以进行更精确的分析:

docs_with_score = db.similarity_search_with_score(query)

doc, score = docs_with_score[0]
print(doc.page_content)
print("Score:", score)

得分采用余弦距离,得分越低表示两个向量越相似。

常见问题和解决方案

数据持久化问题

如果你发现存储在hnswlib中的数据无法正确持久化,检查你的工作目录设置是否正确。此外,始终在删除临时数据后清理目录:

import shutil
shutil.rmtree("hnswlib_store")

网络访问问题

在访问OpenAI API时遇到网络问题,建议使用代理服务。

总结与进一步学习资源

本文介绍了如何使用DocArrayHnswSearch进行高效的本地文档索引和相似性搜索。对于需要处理小到中型数据集的开发者,这是一个非常有用的工具。为了进一步学习,建议查看以下资源:

参考资料

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值