Skip to content
\n

这段代码能在串口进行AI问答,但是有几个问题想请教一下:

\n
    \n
  1. \n

    大佬打算写一个SSE版本的吗?我看官方也推荐这个,可以实现流式传输,感觉快很多。我能照猫画虎照着您的代码改出SSE的版本吗?

    \n
  2. \n
  3. \n

    怎么解析JSON获取content比较好,我用的是处理字符串的方法,感觉比较方便,没用解析JSON的方式

    \n
  4. \n
\n
DeserializationError error_id = deserializeJson(doc, responseMessage);\nString AssistantMessage = responseMessage.substring(responseMessage.indexOf('[')+35,responseMessage.lastIndexOf(']')-4);\nSerial.println(\"AI:\" + AssistantMessage);\n
\n
    \n
  1. \n

    content比较长时有回车换行符号“\\n\\n”那些,怎么处理比较好呢?

    \n
  2. \n
  3. \n

    我用轮询的方式0.5秒HTTP GET读取一次结果请求响应的task_status,当读取到它是SUCCESS时再读取content内容,这样是正确的做法吗?总感觉有点笨比,代码片段如下:

    \n
  4. \n
\n
while(true){\n  // 循环GET获取服务器处理状态\n  int httpResponseIDCode = http_id.GET();\n  if (httpResponseIDCode > 0) {\n    responseMessage = http_id.getString();\n    DeserializationError error_id = deserializeJson(doc, responseMessage);\n    String task_status = doc[\"data\"][\"task_status\"];\n    if(task_status == \"PROCESSING\"){\n      // 等待\n      delay(500);\n      continue;\n    }else{\n      // 查询到状态是SUCCESS时打印content的内容\n      break;\n    }\n  } else {\n      responseMessage = \"Error: External API request failed!\";\n  }\n}\n
\n
    \n
  1. \n

    今天突然遇到一个情况:响应内容的task_status长时间处于PROCESSING的状态,卡很久都拿不到content,等个几分钟才能得到响应结果,昨天还没这个情况的,可能是被限流还是什么原因呢,但是我用python的API例程去问它又嘎嘎快。

    \n
  2. \n
  3. \n

    最后,还有一个bug:发送要问的问题后,偶尔会直接显示上一个问题的回复,我记得您的版本和我改出来的版本都出现过这个问题。

    \n
  4. \n
\n

问题有点多,大佬您有空的时候再回复我吧,期待您的回复😋。

","upvoteCount":2,"answerCount":2,"acceptedAnswer":{"@type":"Answer","text":"
    \n
  1. 问:我能照猫画虎照着您的代码改出SSE的版本吗?
  2. \n
\n
\n

流式传输我是没有计划写的,我觉得异步算是很快的了,所以没有考虑SSE的版本(主要是好写)

\n
\n
    \n
  1. 问:怎么解析JSON获取content比较好,我用的是处理字符串的方法,感觉比较方便,没用解析JSON的方式?
  2. \n
\n
\n

对于这个问题的话,我这里将答案先通过单片机接受,再发送到网页上面去,显示出来。官方的显示比较奇怪,我的处理比较基础。我已经简单处理了一下,如果带 \\n\\n 就是你的文本太长了,一般情况下应该是不会显示出来的才是对的呀。因为我在index.h换掉这个了(官方的返回有的很奇怪,我是使用的正则表达式来处理这个事情的)

\n
\n
    \n
  1. 结果请求响应的task_status,当读取到它是SUCCESS时再读取content内容,这样是正确的做法吗
  2. \n
\n
\n

因为我是采用异步的做法,如果没有使用异步的话,同步的做法我记得有的时候内容太长有时候又不返回啥的,而且为了减少单片机压力,减少请求的次数,你轮询的话我也做过,没啥笨比的。你的代码如果斜杆插入内容没错的话那是正确的。

\n
\n
    \n
  1. 问:响应内容的task_status长时间处于PROCESSING的状态,卡很久都拿不到content
    \n以及发送要问的问题后,偶尔会直接显示上一个问题的回复,我记得您的版本和我改出来的版本都出现过这个问题。
  2. \n
\n
\n

这个问题我之前好像也遇到过,我那时候网络不好或者是服务器原因,我自己怀疑过是官方的问题,至于偶尔会显示之前的问题这个问题我也一直都没办法解决,我目前也在寻找对应的方法,我用 Postman 试过但是,一切又都正常,但是我自己不知道为啥,不知道是我写的问题还是?因为我自己也研究了很久,但是还是会有这个问题,难道是代码设计的问题? 🤔 💡

\n
","upvoteCount":2,"url":"https://github.com/blueokanna/ESP32-ChatGLM/discussions/2#discussioncomment-7316563"}}}

大佬您好,我又来了,想来讨论一下一些问题。 #2

Answered by blueokanna
sarakii asked this question in Q&A
Discussion options

You must be logged in to vote
  1. 问:我能照猫画虎照着您的代码改出SSE的版本吗?

流式传输我是没有计划写的,我觉得异步算是很快的了,所以没有考虑SSE的版本(主要是好写)

  1. 问:怎么解析JSON获取content比较好,我用的是处理字符串的方法,感觉比较方便,没用解析JSON的方式?

对于这个问题的话,我这里将答案先通过单片机接受,再发送到网页上面去,显示出来。官方的显示比较奇怪,我的处理比较基础。我已经简单处理了一下,如果带 \n\n 就是你的文本太长了,一般情况下应该是不会显示出来的才是对的呀。因为我在index.h换掉这个了(官方的返回有的很奇怪,我是使用的正则表达式来处理这个事情的)

  1. 结果请求响应的task_status,当读取到它是SUCCESS时再读取content内容,这样是正确的做法吗

因为我是采用异步的做法,如果没有使用异步的话,同步的做法我记得有的时候内容太长有时候又不返回啥的,而且为了减少单片机压力,减少请求的次数,你轮询的话我也做过,没啥笨比的。你的代码如果斜杆插入内容没错的话那是正确的。

  1. 问:响应内容的task_status长时间处于PROCESSING的状态,卡很久都拿不到content
    以及发送要问的问题后,偶尔会直接显示上一个问题的回复,我记得您的版本和我改出来的版本都出现过这个问题。

这个问题我之前好像也遇到过,我那时候网络不好或者是服务器原因,我自己怀疑过是官方的问题,至于偶尔会显示之前的问题这个问题我也一直都没办法解决,我目前也在寻找对应的方法,我用 Postman 试过但是,一切又都正常,但是我自己不知道为啥,不知道是我写的问题还是…

Replies: 2 comments 4 replies

Comment options

You must be logged in to vote
3 replies
@sarakii
Comment options

@blueokanna
Comment options

@blueokanna
Comment options

Answer selected by blueokanna
Comment options

You must be logged in to vote
1 reply
@blueokanna
Comment options

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Q&A
Labels
None yet
2 participants