You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LangChain中加载已有向量数据库,避免重复生成嵌入?

解决方案

核心逻辑是先判断向量数据库存储目录是否已有数据,存在则直接加载,不存在再从PDF生成嵌入并存储,彻底避免重复写入。

修改加载函数

调整load_embeddings,加入目录存在性检查逻辑:

import os
from langchain.vectorstores import DocArrayHnswSearch
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter

def load_embeddings(store_dir, pdf_file, embeddings):
    # 检查存储目录是否有已生成的向量库文件
    if os.path.exists(store_dir) and len(os.listdir(store_dir)) > 0:
        # 直接加载已有向量数据库
        return DocArrayHnswSearch.load(store_dir, embeddings)
    else:
        # 无已有数据时,从PDF重新生成嵌入并保存
        loader = PyPDFLoader(pdf_file)
        text_splitter = CharacterTextSplitter(
            separator="\n",
            chunk_size=1000,
            chunk_overlap=200,
            length_function=len,
            is_separator_regex=False,
        )
        pages = loader.load_and_split(text_splitter)
        
        db = DocArrayHnswSearch.from_documents(
            pages, embeddings, work_dir=store_dir, n_dim=768
        )
        db.save(store_dir)  # 显式保存,确保数据持久化
        return db

调整使用代码

先初始化嵌入模型,再传入加载函数,避免重复创建实例:

from langchain.embeddings import GooglePalmEmbeddings

# 初始化嵌入模型
embeddings = GooglePalmEmbeddings()

# 自动判断加载已有库或重新生成
db = load_embeddings("linda_store", "linda.pdf", embeddings)

# 执行检索(简化写法,无需手动生成查询向量)
query = "Have I worked with Oauth?"
docs = db.similarity_search(query)

for i, doc in enumerate(docs):
    print(i, doc.page_content)

关键说明

  1. 目录检查逻辑:通过os.path.exists和目录内容判断,避免重复生成嵌入。
  2. 显式保存:调用db.save(store_dir)确保向量数据被持久化到本地目录。
  3. 加载失败原因:之前用DocArrayHnswSearch.load失败,大概率是未传入对应embeddings实例,或路径指向错误。
  4. 简化检索:直接用similarity_search方法,内部会自动处理查询向量生成,无需手动调用embed_query。

内容的提问来源于stack exchange,提问作者Linda Lawton - DaImTo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:56:04