构建 FAISS 向量数据库

FAISS 是一个用于高效相似度搜索的库,特别适用于处理大规模向量数据。在自然语言处理任务中,FAISS 常用于构建向量数据库,以便快速检索与查询文本最相似的文档。以下是使用 OpenAI 的 text-embedding-3-large 模型和 FAISS 构建向量数据库的详细步骤。

1. 安装必要的库

确保你已经安装了以下必要的库:

pip install faiss-cpu
pip install langchain
pip install openai

2. 导入必要的模块

在你的 Python 文件中导入以下模块:

import os
import json
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain.schema import Document

3. 加载数据

假设你有包含文档的 JSON 文件,每个文档都有一个 text 字段。加载这些数据并创建 Document 对象:

def load_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    documents = [Document(page_content=item['text']) for item in data]
    return documents

4. 初始化嵌入模型

使用 OpenAI 的 text-embedding-3-large 模型来生成文档的嵌入向量:

embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

5. 创建向量数据库

使用 FAISS 创建向量数据库,并将文档嵌入到数据库中:

def create_vector_db(documents, embeddings, save_path=None):
    vector_db = FAISS.from_documents(documents, embeddings)
    if save_path:
        os.makedirs(save_path, exist_ok=True)
        vector_db.save_local(save_path)
        print(f"向量数据库已保存到 {save_path}")
    return vector_db

6. 保存和加载向量数据库

你可以将向量数据库保存到本地,以便后续使用:

def save_vector_db(vector_db, save_path):
    vector_db.save_local(save_path)
    print(f"向量数据库已保存到 {save_path}")

def load_vector_db(save_path, embeddings):
    return FAISS.load_local(save_path, embeddings)

7. 检索相似文档

使用向量数据库检索与查询文本最相似的文档:

def search_similar_docs(vector_db, query, k=3):
    docs = vector_db.similarity_search(query, k=k)
    return docs

完整示例代码

以下是一个完整的示例代码,展示如何构建和使用 FAISS 向量数据库:

import os
import json
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain.schema import Document

# 加载数据
def load_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    documents = [Document(page_content=item['text']) for item in data]
    return documents

# 创建向量数据库
def create_vector_db(documents, embeddings, save_path=None):
    vector_db = FAISS.from_documents(documents, embeddings)
    if save_path:
        os.makedirs(save_path, exist_ok=True)
        vector_db.save_local(save_path)
        print(f"向量数据库已保存到 {save_path}")
    return vector_db

# 保存向量数据库
def save_vector_db(vector_db, save_path):
    vector_db.save_local(save_path)
    print(f"向量数据库已保存到 {save_path}")

# 加载向量数据库
def load_vector_db(save_path, embeddings):
    return FAISS.load_local(save_path, embeddings)

# 检索相似文档
def search_similar_docs(vector_db, query, k=3):
    docs = vector_db.similarity_search(query, k=k)
    return docs

# 主函数
def main():
    # 配置
    data_file = "./data/documents.json"
    save_path = "./vector_db"
    
    # 初始化嵌入模型
    embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
    
    # 加载数据
    documents = load_data(data_file)
    print(f"加载了 {len(documents)} 个文档")
    
    # 创建向量数据库
    vector_db = create_vector_db(documents, embeddings, save_path)
    print("向量数据库创建完成")
    
    # 检索相似文档
    query = "你的查询文本"
    similar_docs = search_similar_docs(vector_db, query, k=3)
    print("相似文档:")
    for doc in similar_docs:
        print(doc.page_content)

if __name__ == "__main__":
    main()

总结

通过以上步骤,你可以使用 OpenAI 的 text-embedding-3-large 模型和 FAISS 库构建一个高效的向量数据库。这个数据库可以用于多种自然语言处理任务,如语义搜索、文档检索等。你可以根据具体需求调整代码中的参数和功能。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐