深入探索向量存储:创建和查询的权威指南

126 阅读3分钟

引言

在处理非结构化数据时,尤其是在需要从中进行快速检索的情况下,向量存储是一种广泛使用的技术。通过对数据进行嵌入并存储生成的嵌入向量,我们能够在查询时对非结构化查询进行嵌入,并检索与嵌入查询“最相似”的嵌入向量。本篇文章将帮助您了解如何创建和查询向量存储,并提供实用的代码示例。

主要内容

1. 向量存储简介

向量存储(Vector Store)提供了一种存储嵌入数据和执行向量搜索的方案。它的核心是生成用于存储的向量,这些向量通常通过嵌入模型生成。

2. 生成嵌入向量

在使用向量存储之前,我们需要加载数据并初始化嵌入模型。以下示例将使用OpenAI的嵌入服务。

import os
import getpass
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:') # 获取OpenAI API密钥

# 加载文档,拆分成块,并为每个块创建嵌入向量
raw_documents = TextLoader('state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)

3. 选择向量存储

在本例中,我们考虑几种本地化的向量存储选项:Chroma、FAISS 和 LanceDB。

Chroma 向量存储

pip install langchain-chroma
from langchain_chroma import Chroma

db = Chroma.from_documents(documents, OpenAIEmbeddings())

FAISS 向量存储

pip install faiss-cpu
from langchain_community.vectorstores import FAISS

db = FAISS.from_documents(documents, OpenAIEmbeddings())

LanceDB 向量存储

pip install lancedb
from langchain_community.vectorstores import LanceDB
import lancedb

db = lancedb.connect("/tmp/lancedb")
table = db.create_table(
    "my_table",
    data=[
        {
            "vector": OpenAIEmbeddings().embed_query("Hello World"), # 使用API代理服务提高访问稳定性
            "text": "Hello World",
            "id": "1",
        }
    ],
    mode="overwrite",
)
db = LanceDB.from_documents(documents, OpenAIEmbeddings())

4. 执行相似性搜索

所有向量存储均提供similarity_search方法,用于查找与查询最相似的文档。

query = "What did the president say about Ketanji Brown Jackson"
docs = db.similarity_search(query)
print(docs[0].page_content)

代码示例

以下展示了一个完整的示例,展示如何通过向量存储执行相似搜索:

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

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:') # 获取OpenAI API密钥

raw_documents = TextLoader('state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)

db = FAISS.from_documents(documents, OpenAIEmbeddings())

query = "What did the president say about Ketanji Brown Jackson"
docs = db.similarity_search(query)
print(docs[0].page_content)

常见问题和解决方案

  1. 网络连接不稳定:由于某些地区的网络限制,开发者可能会遇到访问API困难的问题。建议使用API代理服务来提高访问的稳定性。

  2. 安装依赖问题:确保所有依赖库均已正确安装。若遇到安装失败,检查网络连接或使用虚拟环境进行安装。

总结和进一步学习资源

本文介绍了如何创建和查询向量存储的基本步骤。为了更深入的理解,建议查阅以下资源:

参考资料

  1. OpenAI API 官方网站
  2. FAISS 项目文档
  3. LangChain 向量存储使用指南

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

---END---