本地部署Ollama调用chat()方法重复回答历史问题求助
Ollama对话历史重复回答问题排查与解决
问题原因
- 对话历史格式错误:Ollama的
chat()方法要求对话历史是包含role(user/assistant)和content的字典数组,若你只是单纯存储提问文本,模型会把所有内容当成新提问,导致重复回答。 - 自定义模型模板缺失角色区分:你的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




