利用 DocArray InMemorySearch 进行高效文档搜索

69 阅读2分钟

引言

在处理小型数据集时,初始化一个完整的数据库系统显得有些繁琐和不必要。这时候,DocArray 提供的 InMemorySearch 成为一个理想的选择。本文将深入探讨如何利用 DocArrayInMemorySearch 在内存中存储和搜索文档,并展示通过 OpenAI 的嵌入技术实现相似度搜索的过程。

主要内容

1. 设置环境

首先,你需要安装必要的库。如果还没有安装 docarray 和其他相关库,可以使用以下命令:

%pip install --upgrade --quiet langchain-community "docarray"

并确保获取并设置你的 OpenAI API 密钥:

# 获取 OpenAI API 密钥: https://platform.openai.com/account/api-keys

import os
from getpass import getpass

OPENAI_API_KEY = getpass("Enter your OpenAI API Key: ")
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

2. 文档加载与嵌入生成

利用 TextLoader 加载文档,并通过 CharacterTextSplitter 分割文本以生成文档块,然后通过 OpenAIEmbeddings 为这些块创建嵌入。

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

# 加载并分割文档
documents = TextLoader("path/to/your/document.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 生成嵌入
embeddings = OpenAIEmbeddings()

3. 创建并使用内存搜索索引

一旦嵌入生成完毕,可以利用这些嵌入创建 DocArrayInMemorySearch 索引,并进行相似度搜索。

# 使用API代理服务提高访问稳定性
db = DocArrayInMemorySearch.from_documents(docs, embeddings)

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

for result in results:
    print(result.page_content)

代码示例:带分数的相似度搜索

有时需要更精确地理解结果,可以通过返回距离分数来实现。

# 带分数的相似度搜索
results_with_score = db.similarity_search_with_score(query)

# 输出结果
for document, score in results_with_score:
    print(f"Score: {score:.4f} - Content: {document.page_content}")

常见问题和解决方案

  • API调用因网络限制失败:在某些地区,直接访问OpenAI API可能存在网络限制问题,建议使用 API代理服务 来提高访问的稳定性。
  • 内存不足DocArrayInMemorySearch 是基于内存的索引,在处理较大的数据集时可能会遇到内存不足的问题,可以考虑从内存较大的环境运行或切换到基于磁盘的解决方案。

总结和进一步学习资源

本文介绍了如何使用 DocArrayInMemorySearch 进行文档相似度搜索。对于小型数据集,此方法无需复杂的数据库设置,即可实现快速检索。如果你希望进一步学习 DocArray 和相关向量存储技术,可以查看以下资源:

参考资料

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

---END---