如何在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)
关键说明
- 目录检查逻辑:通过
os.path.exists和目录内容判断,避免重复生成嵌入。 - 显式保存:调用
db.save(store_dir)确保向量数据被持久化到本地目录。 - 加载失败原因:之前用
DocArrayHnswSearch.load失败,大概率是未传入对应embeddings实例,或路径指向错误。 - 简化检索:直接用
similarity_search方法,内部会自动处理查询向量生成,无需手动调用embed_query。
内容的提问来源于stack exchange,提问作者Linda Lawton - DaImTo
相关产品推荐
相关产品推荐

