引言
在现代数据驱动的世界中,快速而准确地进行信息检索变得尤为重要。尤其是在处理大量文本数据时,如何高效地进行相似性搜索是一项关键挑战。本文将介绍如何使用 Scikit-learn 与 OpenAI 的嵌入技术结合一种持久化向量存储以实现文档相似性搜索。为了实现这一目标,我们将利用 SKLearnVectorStore 来处理文档数据,并通过 OpenAI 提供的嵌入来提升搜索的准确性。
主要内容
安装所需的库
首先,我们需要安装一些必要的 Python 库来支持我们的向量存储及其持久化选项。
%pip install --upgrade --quiet scikit-learn
%pip install --upgrade --quiet langchain-community
%pip install --upgrade --quiet bson
%pip install --upgrade --quiet pandas pyarrow
这些安装将确保 SKLearnVectorStore 的正常工作,并支持 BSON 和 Parquet 格式的序列化。
加载和处理文档
我们首先加载一个示例文档,并对其进行分割。字符分割器用于将文本分成更小的可以管理的块。
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import SKLearnVectorStore
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
创建向量存储并进行查询
我们创建一个 SKLearnVectorStore 实例,并将文档数据进行索引。然后,通过相似性搜索功能来执行查询。
import tempfile
import os
persist_path = os.path.join(tempfile.gettempdir(), "union.parquet")
vector_store = SKLearnVectorStore.from_documents(
documents=docs,
embedding=embeddings,
persist_path=persist_path,
serializer="parquet"
)
query = "What did the president say about Ketanji Brown Jackson"
docs = vector_store.similarity_search(query)
print(docs[0].page_content)
持久化和加载向量存储
持久化能够让我们保存向量存储以备将来使用。这里我们使用 Parquet 格式进行序列化。
vector_store.persist()
print("Vector store was persisted to", persist_path)
vector_store2 = SKLearnVectorStore(
embedding=embeddings, persist_path=persist_path, serializer="parquet"
)
print("A new instance of vector store was loaded from", persist_path)
docs = vector_store2.similarity_search(query)
print(docs[0].page_content)
常见问题和解决方案
- 网络访问问题: 由于某些地区的网络限制,访问 OpenAI 的 API 可能会产生问题。在这种情况下,开发者可以考虑使用 API 代理服务 提高访问的稳定性。
- 存储格式兼容性问题: 确保在持久化和加载时使用相同的序列化格式(如 Parquet 或 BSON)。
总结和进一步学习资源
通过结合使用 Scikit-learn 的 K 最近邻算法和 OpenAI 的嵌入,我们展示了如何高效实现文档相似性搜索。为了增强应用的稳定性和可扩展性,建议进一步学习如下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---