使用Scikit-learn和LangChain实现高效的文本向量存储

92 阅读3分钟

引言

在现代机器学习应用中,文本向量化是不可或缺的一部分。Scikit-learn作为一个强大的机器学习库,提供了多种算法,其中包括k近邻算法。在本篇文章中,我们将探讨如何使用LangChain提供的SKLearnVectorStore来实现文本向量存储,并在此过程中讨论存储的持久化和查询功能。

主要内容

1. 安装必要的库

在开始之前,我们需要安装一些必要的Python库。这些库包括scikit-learnlangchain-community以及根据需求可能需要的bsonpandaspyarrow

# 安装基础库
pip install --upgrade --quiet scikit-learn langchain-community

# 如果使用bson序列化
pip install --upgrade --quiet bson

# 如果使用parquet序列化
pip install --upgrade --quiet pandas pyarrow

此外,如果你计划使用OpenAI的嵌入技术,需要获得一个API密钥。你可以访问OpenAI平台获取密钥。

2. 加载文档和创建向量存储

加载一组文档并将其进行文本拆分,然后利用OpenAI的文本嵌入功能将其转换为向量。

import os
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import SKLearnVectorStore
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

# 设置OpenAI API Key
os.environ["OPENAI_API_KEY"] = "your_openai_api_key_here" # 使用API代理服务提高访问稳定性

# 加载文档
loader = TextLoader("path_to_your_document.txt")
documents = loader.load()

# 拆分文档
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 嵌入向量
embeddings = OpenAIEmbeddings()

3. 存储和查询向量

创建向量存储,并执行简单查询以寻找与查询文本最相似的文档。

import tempfile

# 创建存储路径
persist_path = os.path.join(tempfile.gettempdir(), "union.parquet")

# 创建SKLearnVectorStore
vector_store = SKLearnVectorStore.from_documents(
    documents=docs,
    embedding=embeddings,
    persist_path=persist_path,  # persist_path和serializer是可选的
    serializer="parquet",
)

# 查询向量存储
query = "What did the president say about Ketanji Brown Jackson"
docs = vector_store.similarity_search(query)
print(docs[0].page_content)

4. 存储持久化和加载

可以将向量存储的内容持久化到磁盘,并重新加载。

# 持久化向量存储
vector_store.persist()
print("Vector store was persisted to", persist_path)

# 重新加载向量存储
vector_store2 = SKLearnVectorStore(
    embedding=embeddings, persist_path=persist_path, serializer="parquet"
)
docs = vector_store2.similarity_search(query)
print(docs[0].page_content)

常见问题和解决方案

1. 网络访问问题

由于某些地区的网络限制,访问API时可能需要使用API代理服务来提高稳定性。

2. 持久化格式选择

对于不同的数据持久化需求,可以选择jsonbsonparquet格式。bson适合需要二进制格式的场景,而parquet更适合大规模数据存储。

总结和进一步学习资源

通过本文的教程,我们能够使用LangChain结合Scikit-learn来实现高效的文本向量存储和查询。进一步学习可以参考以下资源:

参考资料

  1. OpenAI API文档
  2. Scikit-learn官方文档
  3. LangChain社区说明文档

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