使用 Scikit-learn 和 OpenAI 实现高效的文档相似性搜索

108 阅读2分钟

引言

在现代数据驱动的世界中,快速而准确地进行信息检索变得尤为重要。尤其是在处理大量文本数据时,如何高效地进行相似性搜索是一项关键挑战。本文将介绍如何使用 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---