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

如何解决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()

关键调整点说明

  1. 格式规范:手动拼接时要避免多余的缩进和换行,否则模型可能无法正确识别对话轮次的边界。
  2. 终止条件:必须设置stop参数,指定模型生成到<|eot_id|>(对话结束标记)或新的头部标记时停止,防止继续生成后续对话结构。
  3. 工具适配:使用ChatOllama替代基础Ollama类,Langchain会自动处理Llama3的特殊标记逻辑,减少手动出错概率。

内容的提问来源于stack exchange,提问作者Brett Doffing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:00:07