构建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
相关产品推荐
相关产品推荐

