使用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 的完整实现步骤:
- 加载文档:使用
TextLoader加载文本文件。 - 分割文档:使用
CharacterTextSplitter将长文本分割为较小的块。 - 生成嵌入:使用
OpenAIEmbeddings创建文本嵌入。 - 创建索引:使用
DocArrayInMemorySearch构建内存索引。 - 执行查询:通过
similarity_search或similarity_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 创建一个简单的相似性搜索工具。对于入门文档搜索的开发者,这是一种高效又易于实施的方案。如果您的项目对性能或数据规模要求更高,可以探索如下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!