LangChain构建RAG时LLM输出含提示与上下文的问题解决
解决LangChain中开源模型冗余输出与答案截断问题
1. 适配模型的自定义Prompt模板
针对Mixtral-8x7B-Instruct、Bloom这类指令微调模型,需明确约束输出格式,避免冗余内容:
- ConversationalRetrievalChain:替换默认的QA提示和问题浓缩提示,强制仅输出答案:
from langchain.prompts import PromptTemplate # 核心QA提示模板 QA_PROMPT = PromptTemplate( template="""基于以下上下文回答问题,**仅输出答案内容,禁止重复问题、提示词或上下文**: 上下文:{context} 问题:{question} 答案:""", input_variables=["context", "question"], ) # 构建链时替换prompt chain = ConversationalRetrievalChain.from_llm( llm=your_model_instance, retriever=document_retriever, qa_prompt=QA_PROMPT, verbose=False # 关闭verbose避免额外输出 ) - RetrievalQAChain:直接将上述
QA_PROMPT传入链的构造参数。
2. 调整模型生成参数解决截断
调大max_new_tokens并设置精准的停止符,避免答案截断和冗余输出:
from langchain.llms import HuggingFacePipeline from transformers import pipeline # 配置生成管道 text_gen_pipeline = pipeline( "text-generation", model="mistralai/Mixtral-8x7B-Instruct-v0.1", model_kwargs={ "temperature": 0.1, "max_new_tokens": 2048, # 根据需求调整,如4096 "do_sample": False }, stop=["\n\n", "###"] # 匹配模型输出的终止标记,阻止冗余内容 ) llm = HuggingFacePipeline(pipeline=text_gen_pipeline)
3. 遵循模型专属指令格式
Mixtral和Bloom有官方指定的指令格式,严格遵循可提升模型对输出要求的理解:
# Mixtral专属格式模板 MIXTRAL_QA_PROMPT = PromptTemplate( template="<s>[INST]基于以下上下文回答问题,仅输出答案,不要重复输入内容:\n上下文:{context}\n问题:{question}[/INST]", input_variables=["context", "question"], )
4. 输出后处理过滤冗余
若上述方案仍有残留,添加后处理逻辑提取纯答案:
def clean_output(raw_answer): # 针对自定义模板的截断 if "答案:" in raw_answer: return raw_answer.split("答案:")[-1].strip() # 针对Mixtral格式的截断 elif "[/INST]" in raw_answer: return raw_answer.split("[/INST]")[-1].strip() # 针对Bloom的通用截断 elif "回答:" in raw_answer: return raw_answer.split("回答:")[-1].strip() return raw_answer # 使用链获取结果后处理 response = chain({"question": user_question, "chat_history": chat_history}) final_answer = clean_output(response["answer"])
内容的提问来源于stack exchange,提问作者phluviophilee
相关产品推荐
相关产品推荐

