如何解决Ollama+Llama3返回多响应/重复系统提示的问题?
解决Langchain调用Ollama Llama3返回多响应/重复提示的问题
出现多响应、重复系统提示的核心原因是手动拼接的prompt格式不规范,且未设置生成终止条件,导致模型误判对话轮次,持续生成多余内容。以下是两种可行的调整方案:
方案一:使用ChatOllama+ChatPromptTemplate(推荐)
用Langchain提供的对话类和模板工具,自动适配Llama3的格式要求,避免手动拼接的错误:
from langchain_community.chat_models import ChatOllama from langchain_core.prompts import ChatPromptTemplate # 改用ChatOllama类,专门适配对话型大模型 llm = ChatOllama(model="llama3") def get_model_response(user_prompt, system_prompt): # 构建标准对话模板,自动生成符合Llama3要求的标记格式 prompt_template = ChatPromptTemplate.from_messages([ ("system", system_prompt), ("user", user_prompt) ]) # 链式调用处理prompt并获取响应 chain = prompt_template | llm response = chain.invoke({}) # 返回助手的单一响应内容 return response.content
方案二:手动调整prompt+设置终止参数
如果坚持手动拼接prompt,需要修正格式并指定生成停止标记:
from langchain_community.llms import Ollama llm = Ollama(model="llama3") def get_model_response(user_prompt, system_prompt): # 移除多余换行空格,保证格式紧凑规范 prompt = f"""<|begin_of_text|> <|start_header_id|>system<|end_header_id|> {system_prompt.strip()} <|eot_id|> <|start_header_id|>user<|end_header_id|> {user_prompt.strip()} <|eot_id|> <|start_header_id|>assistant<|end_header_id|>""" # 设置stop参数,让模型遇到对话结束标记或新头部标记时停止生成 response = llm.invoke(prompt, stop=["<|eot_id|>", "<|start_header_id|>"]) return response.strip()
关键调整点说明
- 格式规范:手动拼接时要避免多余的缩进和换行,否则模型可能无法正确识别对话轮次的边界。
- 终止条件:必须设置
stop参数,指定模型生成到<|eot_id|>(对话结束标记)或新的头部标记时停止,防止继续生成后续对话结构。 - 工具适配:使用
ChatOllama替代基础Ollama类,Langchain会自动处理Llama3的特殊标记逻辑,减少手动出错概率。
内容的提问来源于stack exchange,提问作者Brett Doffing
相关产品推荐
相关产品推荐

