**使用DocArray InMemorySearch进行高效文档相似性搜索**

53 阅读4分钟

使用DocArray InMemorySearch进行高效文档相似性搜索

引言

在构建基于文本搜索的应用时,矢量数据库是一项强大的工具,但对于小型数据集,您可能不希望启动一个完整的数据库服务。DocArray InMemorySearch 是由 DocArray 提供的轻量级文档索引解决方案,它将文档存储在内存中,非常适合小型项目。这篇文章将详细介绍如何使用 DocArrayInMemorySearch 与 OpenAI 嵌入进行文本相似性搜索。

主要内容

1. 什么是DocArray InMemorySearch?

DocArray InMemorySearch 是一个内存文档索引工具。它通过将文档表示为向量进行存储,并支持高效的相似性搜索。对于需要快速迭代或小规模实验的应用,它是一个理想的选择。

2. 使用场景

  • 快速验证文本搜索方法
  • 小量数据集的相似性搜索,如产品评论、博客文章
  • 不希望部署复杂数据库的场景

3. 安装和设置

首先,确保您安装了所需的库:

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

此外,如果您计划使用 OpenAI 的嵌入模型,需要获取 OpenAI API 密钥

设置API密钥
import os
from getpass import getpass

# 输入您的 OpenAI API 密钥
OPENAI_API_KEY = getpass("请输入您的 OpenAI API 密钥: ")

# 设置环境变量
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

4. 基本实现步骤

以下是使用 DocArrayInMemorySearch 的完整实现步骤:

  1. 加载文档:使用 TextLoader 加载文本文件。
  2. 分割文档:使用 CharacterTextSplitter 将长文本分割为较小的块。
  3. 生成嵌入:使用 OpenAIEmbeddings 创建文本嵌入。
  4. 创建索引:使用 DocArrayInMemorySearch 构建内存索引。
  5. 执行查询:通过 similarity_searchsimilarity_search_with_score 查找与查询最相关的文档。

以下是代码示例。

代码示例

示例:创建内存搜索并执行相似性搜索

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

# 1. 加载文档
# 示例文件路径,请替换为自己文件的路径
documents = TextLoader("data/state_of_the_union.txt").load()

# 2. 分割文档
# 每块文本大小为1000字符,无重叠
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 3. 生成嵌入
embeddings = OpenAIEmbeddings()

# 4. 创建DocArray InMemorySearch索引
# 使用API代理服务提高访问稳定性
db = DocArrayInMemorySearch.from_documents(docs, embeddings)

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

# 输出第一个匹配结果
print("最相关的文档内容:", result_docs[0].page_content)

# 6. 获取相似性评分
result_with_scores = db.similarity_search_with_score(query)
print("最相关文档及相似性分数:", result_with_scores[0])

输出示例

假设我们对某篇总统演讲内容执行查询,输出可能类似以下:

最相关的文档内容: Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act...
最相关文档及相似性分数: (Document(page_content='Tonight. I call on the Senate to...', metadata={}), 0.8154190158347903)

常见问题和解决方案

问题1:为什么嵌入生成速度较慢?

  • 原因:可能是网络访问 OpenAI API 较慢。
  • 解决方案:尝试使用 API代理服务 来提高请求稳定性。

问题2:内存不足怎么办?

  • 原因:DocArrayInMemorySearch 完全依赖内存,对于特别大的数据集,可能会导致内存不足。
  • 解决方案:考虑迁移到 Jina AI 的更复杂数据库方案.

问题3:查询返回的结果不准确?

  • 检查是否正确加载文档,并确保 query 表达的语义清晰。
  • 调整文本分割策略 (chunk_size 和 chunk_overlap) 可能会改进结果。

总结和进一步学习资源

本文介绍了如何使用 DocArrayInMemorySearch 创建一个简单的相似性搜索工具。对于入门文档搜索的开发者,这是一种高效又易于实施的方案。如果您的项目对性能或数据规模要求更高,可以探索如下资源:

参考资料

  1. DocArray GitHub
  2. OpenAI API 文档
  3. LangChain 项目资源

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