引言
在处理非结构化数据时,尤其是在需要从中进行快速检索的情况下,向量存储是一种广泛使用的技术。通过对数据进行嵌入并存储生成的嵌入向量,我们能够在查询时对非结构化查询进行嵌入,并检索与嵌入查询“最相似”的嵌入向量。本篇文章将帮助您了解如何创建和查询向量存储,并提供实用的代码示例。
主要内容
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)
常见问题和解决方案
-
网络连接不稳定:由于某些地区的网络限制,开发者可能会遇到访问API困难的问题。建议使用API代理服务来提高访问的稳定性。
-
安装依赖问题:确保所有依赖库均已正确安装。若遇到安装失败,检查网络连接或使用虚拟环境进行安装。
总结和进一步学习资源
本文介绍了如何创建和查询向量存储的基本步骤。为了更深入的理解,建议查阅以下资源:
参考资料
- OpenAI API 官方网站
- FAISS 项目文档
- LangChain 向量存储使用指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---