引言
在处理小型数据集时,初始化一个完整的数据库系统显得有些繁琐和不必要。这时候,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---