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

构建RAG pipeline后无法保存RetrievalQAWithSourcesChain,求解决方案

解决RetrievalQAWithSourcesChain无法保存的问题

RetrievalQAWithSourcesChain本身未实现save方法,因此会抛出NotImplementedError,可以通过以下几种方式实现流水线的本地保存:

方法1:使用LangChain内置序列化工具(推荐)

利用LangChain的dumpd和loads方法将链转为可序列化的字典,再保存为JSON文件:

保存代码

from langchain.load import dumpd
import json

# 将RAG流水线转为字典格式
chain_dict = dumpd(rag_pipeline)

# 保存到JSON文件
with open("llama_rag_modell.json", "w") as f:
    json.dump(chain_dict, f, indent=2)

加载代码

from langchain.load import loads
import json

# 从JSON文件加载字典
with open("llama_rag_modell.json", "r") as f:
    chain_dict = json.load(f)

# 恢复RAG流水线
rag_pipeline = loads(chain_dict)

方法2:使用Pickle序列化

直接将整个流水线对象序列化为二进制文件,注意仅加载来自可信来源的文件:

保存代码

import pickle

with open("llama_rag_modell.pkl", "wb") as f:
    pickle.dump(rag_pipeline, f)

加载代码

import pickle

with open("llama_rag_modell.pkl", "rb") as f:
    rag_pipeline = pickle.load(f)

方法3:拆分组件分别保存后重新组装

将流水线拆解为Prompt、LLM、向量数据库等独立组件,分别保存后,后续通过代码重新构建流水线:

保存组件

import json

# 保存Prompt
prompt.save("rag_prompt.json")

# 保存向量数据库(以Chroma为例,调用persist持久化到本地目录)
vectordb.persist()

# 保存LLM配置(根据你的LLM类型调整参数)
llm_config = {
    "model_name": model.model_name,
    "temperature": model.temperature,
    # 补充你的LLM其他关键参数
}
with open("llm_config.json", "w") as f:
    json.dump(llm_config, f)

重新构建流水线

from langchain.prompts import PromptTemplate
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
# 替换为你的LLM导入路径
from langchain.llms import LlamaCpp
from langchain.chains import RetrievalQAWithSourcesChain
import json

# 加载Prompt
prompt = PromptTemplate.load("rag_prompt.json")

# 加载向量数据库
embeddings = HuggingFaceEmbeddings(model_name="你的嵌入模型名称")
vectordb = Chroma(persist_directory="你的Chroma持久化目录", embedding_function=embeddings)

# 加载LLM
llm_config = json.load(open("llm_config.json"))
model = LlamaCpp(**llm_config)

# 重新构建RAG流水线
chain_type_kwargs = {"prompt": prompt}
rag_pipeline = RetrievalQAWithSourcesChain.from_chain_type(
    llm=model, chain_type='stuff',
    retriever=vectordb.as_retriever(),
    chain_type_kwargs=chain_type_kwargs,
)

注意事项

  • 使用dumpd/loads时,确保所有组件都支持LangChain的序列化标准,自定义组件可能需要额外适配。
  • Pickle序列化存在安全风险,禁止加载未知来源的.pkl文件。
  • 不同向量数据库的保存方式不同:Chroma支持本地持久化,Pinecone等云端向量库无需本地保存,只需保存连接配置。

内容的提问来源于stack exchange,提问作者Maxl Gemeinderat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:14:55