如何解决LangChain调用LoRA微调Llama模型的Pipeline推断错误?
问题描述
我用PEFT和LoRA对llama-7b-hf模型微调后,将模型上传到了HF仓库。现在尝试结合LangChain和Chroma向量数据库使用时,出现错误:Pipeline cannot infer suitable model classes from,同时在HF页面运行API也报相同错误。之前因为模型缺少config.json,直接复制了基础模型的config.json,怀疑是这个原因导致的问题。
相关代码如下:
from langchain.embeddings import HuggingFaceHubEmbeddings from langchain import PromptTemplate, HuggingFaceHub, LLMChain from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain.vectorstores import Chroma repo_id = "sentence-transformers/all-mpnet-base-v2" embedder = HuggingFaceHubEmbeddings( repo_id=repo_id, task="feature-extraction", huggingfacehub_api_token="XXXXX", ) comments = ["foo", "bar"] embeddings = embedder.embed_documents(texts=comments) docsearch = Chroma.from_texts(comments, embedder).as_retriever() #docsearch = Chroma.from_documents(texts, embeddings) llm = HuggingFaceHub(repo_id='lucas0/empath-llama-7b', huggingfacehub_api_token='XXXXX') qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=docsearch, return_source_documents=False) q = input("input your query:") result = qa.run(query=q) print(result["result"])
我有两个疑问:
- 如何在不获取原始Llama权重的情况下生成正确的config.json?
- 是否存在无需使用向量数据库即可向自定义HF模型加载多条语句的方法?
解决方案
一、生成正确的config.json(无需原始Llama权重)
- 利用PEFT库导出完整模型时自动生成配置:微调完成后,不要直接复制基础模型的config.json,而是用PEFT的
merge_and_unload()方法合并LoRA权重到基础模型,再保存模型,此时会自动生成匹配的config.json。示例代码:
from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer # 加载基础模型和LoRA权重 base_model = AutoModelForCausalLM.from_pretrained("decapoda-research/llama-7b-hf") peft_model = PeftModel.from_pretrained(base_model, "你的本地LoRA微调路径") # 合并权重并保存 merged_model = peft_model.merge_and_unload() merged_model.save_pretrained("合并后的模型路径") tokenizer = AutoTokenizer.from_pretrained("decapoda-research/llama-7b-hf") tokenizer.save_pretrained("合并后的模型路径")
- 若已上传模型到HF仓库,可在仓库的config.json中手动补充关键字段:添加
"model_type": "llama",同时确保architectures字段设置为["LlamaForCausalLM"],让Hugging Face的Pipeline能正确识别模型类型。
二、无需向量数据库加载多条语句的方法
直接通过LangChain的LLMChain结合自定义Prompt模板实现,把多条语句拼接成上下文传入Prompt,示例代码:
from langchain import PromptTemplate, HuggingFaceHub, LLMChain # 定义包含多条语句的上下文 context = "\n".join(["foo", "bar"]) # 构建Prompt模板 prompt_template = """基于以下上下文回答问题: {context} 问题:{question} 回答:""" prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"]) llm = HuggingFaceHub(repo_id='lucas0/empath-llama-7b', huggingfacehub_api_token='XXXXX') llm_chain = LLMChain(prompt=prompt, llm=llm) q = input("input your query:") result = llm_chain.run(context=context, question=q) print(result)
这种方式直接将所有语句作为上下文传入模型,无需依赖向量数据库,适合语句数量不多、上下文长度在模型窗口范围内的场景。
内容的提问来源于stack exchange,提问作者Lucas Azevedo
相关产品推荐
相关产品推荐

