yihong0618 / xiaogpt

Play ChatGPT and other LLM with Xiaomi AI Speaker
MIT License
5.86k stars 817 forks source link

第四次提问,通义千问提示错误 #436

Closed wuhunyu closed 5 months ago

wuhunyu commented 5 months ago

问题描述

第四次回答开始,控制台无法正常返回 通义千问 的回复,重启 docker 容器之后也是第四次回答错误

--------------------
问题:1+1等于多少?
以下是小爱的回答:  答案是二
以下是 Qian Wen 的回答: 1+1=2回答完毕
--------------------
问题:1+2等于多少?
以下是小爱的回答:  答案是三
以下是 Qian Wen 的回答: 1+2=3回答完毕
--------------------
问题:1+3等于多少?
以下是小爱的回答:  答案是四
以下是 Qian Wen 的回答: 1+3=4回答完毕
--------------------
问题:1+4等于多少?
以下是小爱的回答:  答案是五
以下是 Qian Wen 的回答: Request id: 2f31f74c-12a9-9db6-a5f4-30f98b0ab474, Status code: 
HTTPStatus.INTERNAL_SERVER_ERROR, error code: InvalidParameter, error message: 
User and assistant need to appear alternately in the message
回答完毕
--------------------
问题:1+5等于多少?
以下是小爱的回答:  答案是六
以下是 Qian Wen 的回答: Request id: 6e27daac-39cc-9ef2-bb39-4a8acf907cb0, Status code: 
HTTPStatus.INTERNAL_SERVER_ERROR, error code: InvalidParameter, error message: 
Role must be user or assistant and Content length must be greater than 0
回答完毕
--------------------
问题:1+3等于多少?
以下是小爱的回答:  答案是四
以下是 Qian Wen 的回答: Request id: f3909027-2acf-9e9c-b85b-c37a9df1d06c, Status code: 
HTTPStatus.INTERNAL_SERVER_ERROR, error code: InvalidParameter, error message: 
Role must be user or assistant and Content length must be greater than 0
回答完毕

环境

docker 镜像 yihong0618/xiaogpt 音箱是小爱音箱mini

启动命令

docker run -d --name xiaogpt -v /etc/localtime:/etc/localtime:ro -v xiaogptConf:/config yihong0618/xiaogpt:latest --use_qwen --config=/config/config.json

config.json

xxx 的部分已填入,这里脱敏处理了

{
  "hardware": "LX01",
  "account": "xxx",
  "password": "xxx",
  "openai_key": "",
  "glm_key": "",
  "gemini_key": "",
  "qwen_key": "xxx",
  "bard_token": "",
  "serpapi_api_key": "",
  "cookie": "",
  "mi_did": "xxx",
  "use_command": false,
  "mute_xiaoai": true,
  "verbose": false,
  "bot": "chatgptapi",
  "tts": "mi",
  "edge_tts_voice": "zh-CN-XiaoxiaoNeural",
  "prompt": "请用100字以内回答",
  "keyword": ["请"],
  "change_prompt_keyword": ["中文"],
  "start_conversation": "开始持续对话",
  "end_conversation": "结束持续对话",
  "stream": true,
  "proxy": "",
  "gpt_options": {},
  "bing_cookie_path": "",
  "bing_cookies": {},
  "api_base": "https://dashscope.aliyuncs.com/api/v1",
  "deployment_id": ""
}

问题查找

image
yihong0618 commented 5 months ago

@wuhunyu 有可能是 history 的问题,我今晚看看,如果你能 fix PR welcome 哈

wuhunyu commented 5 months ago

@wuhunyu 有可能是 history 的问题,我今晚看看,如果你能 fix PR welcome 哈

我不会 python [/doge]

从我看的作者的文档以及使用情况,大致的原理是不是这样子

  1. 每一秒轮询获取小爱音箱的历史问答列表
  2. 如果获取到了有效的文本,就下发给语言模型,并等待回复
  3. 如果回复成功,则让小爱音箱播报语言模型的回复

我有几个题外的问题

  1. 我的服务器时间比网络时间落后了几分钟,我在纳闷配置哪里有问题的时候,结果小爱音箱自己播报了我几分钟之前问题答复。这个问题只要服务器时间同步到也没啥。但历史消息获取作者是怎么避免重复获取的,每次查询只查询最近的一秒吗?由于小爱音箱识别也要时间,我倒是没办法在1秒内录入多个不连续的问题
  2. 语言模型的回答总是会在小爱音箱默认回答的后面,所以只要触发了语言模型的回答,总是会打断默认回答然后播报。我想大多数人应该是想要直接替换掉默认回答的。看了作者的文档之后,大概意思是现阶段不破解不行是吗?文档中写了作者有去抓过包,放弃了这个策略的原因是传输内容加密?我设想如果可以拦截问题请求,判断是需要走语言模型的问题,就截获请求,然后换成去请求语言模型,是可以解决两次回复的问题
yihong0618 commented 5 months ago
  1. 1s 内应该没办法。
  2. 语言模型的回答总是会在小爱音箱默认回答的后面,所以只要触发了语言模型的回答,总是会打断默认回答然后播报。我想大多数人应该是想要直接替换掉默认回答的。看了作者的文档之后,大概意思是现阶段不破解不行是吗?文档中写了作者有去抓过包,放弃了这个策略的原因是传输内容加密?我设想如果可以拦截问题请求,判断是需要走语言模型的问题,就截获请求,然后换成去请求语言模型,是可以解决两次回复的问题

这个不破解是解决不了的,因为不在小米那落盘你是拿不到 history 的。

  1. 你可以先试试 ChatGLM
frostming commented 5 months ago

2. 我设想如果可以拦截问题请求

小爱有自己的耳朵(监听器),自己的嘴巴(默认TTS),以及中枢大脑。 现在开放的程度,只能进入它的大脑。于是得等信息监听到了,存到大脑之后我们才能看到,偏这个大脑还是在远程服务器上。 现在就是耳朵的问题,不破解的情况下,没法换成我们自己的耳朵。

wuhunyu commented 5 months ago
  1. 你可以先试试 ChatGLM

使用 ChatGLM 提示了 GLM do not support stream,实际用起来还是比较难受的,文本量稍微多一点就容易让人产生是不是回答不了的错觉 话说,我看了 glm-3-turboglm-4 模型的开放接口,都是支持 sse 的,为啥 glmask_stream 方法没有实现呢 [/doge]

frostming commented 5 months ago

为啥 glmask_stream 方法没有实现呢

因为没有人提PR

wuhunyu commented 5 months ago

因为没有人提PR

好吧,如果是 java,我还能出点力

yihong0618 commented 5 months ago

@wuhunyu fixed and added glm stream please check