You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

本地部署Ollama调用chat()方法重复回答历史问题求助

Ollama对话历史重复回答问题排查与解决

问题原因

  1. 对话历史格式错误:Ollama的chat()方法要求对话历史是包含roleuser/assistant)和content的字典数组,若你只是单纯存储提问文本,模型会把所有内容当成新提问,导致重复回答。
  2. 自定义模型模板缺失角色区分:你的Jarvis模型文件可能没有明确对话轮次的角色标识,模型无法区分历史提问、回答,进而重复处理所有内容。

解决办法

1. 修正对话历史结构

确保conversationHistory的每一项都符合Ollama要求的格式,示例:

# 正确的对话历史结构
conversationHistory = [
    {"role": "user", "content": "你好Jarvis"},
    {"role": "assistant", "content": "您好,先生,有什么可以帮您的?"},
    {"role": "user", "content": "今天天气怎么样?"}
]

每次交互时,先追加用户提问,调用chat()后再追加模型回答,让模型能识别对话轮次。

2. 检查并修复自定义模型模板

打开你的Jarvis模型文件(通常为.modelfile),确保模板包含明确的角色分隔规则,示例:

FROM llama2
SYSTEM """
你是钢铁侠的助手Jarvis,语气冷静严谨,用专业简洁的风格回应。
对话规则:
用户:[用户的问题]
Jarvis:[你的回答]
"""

缺失这类规则会导致模型无法区分上下文层级,重复处理所有输入内容。

3. 修正Python代码逻辑

以下是修正后的核心代码:

import ollama
import speech_recognition as sr

# 初始化符合格式的对话历史
conversationHistory = []

def speech_to_text():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("请说话...")
        audio = r.listen(source)
    try:
        return r.recognize_google(audio, language='zh-CN')
    except sr.UnknownValueError:
        return "抱歉,我没听清内容"
    except sr.RequestError:
        return "语音识别服务不可用"

while True:
    user_input = speech_to_text()
    if user_input.lower() in ["退出", "结束"]:
        break
    # 追加用户提问到历史
    conversationHistory.append({"role": "user", "content": user_input})
    # 调用Ollama对话接口
    response = ollama.chat(model='jarvis', messages=conversationHistory)
    assistant_reply = response['message']['content']
    print(f"Jarvis: {assistant_reply}")
    # 追加模型回答到历史
    conversationHistory.append({"role": "assistant", "content": assistant_reply})

验证效果

修正后,模型会结合历史上下文仅回应最新提问,不会重复回答所有历史问题。

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

火山引擎 最新活动