之前的文章介绍了有关小爱音箱如何接入ChatGPT,但是大家遇到了很多问题,我在解决其中一些问题的过程中总结了一些关键的注意点和大家分享。但仍有一些同学的问题未能解决,请大家见谅。



再简单的说一下原理,你需要一台电脑(X86、ARM的都可以),你的电脑上需要跑一个程序,这个程序和米家服务交互获取你向小爱同学的最后一次的提问,然后将这个提问送往ChatGPT,获得GPT的结果后,把结果文字送往米家服务,通知音箱语音播放ChatGPT的回答。

关键注意点1:科学上网后后能访问米家服务吗

答案是:不能。至少我和多位同学的测试是这样

关键注意点2:不科学上网能访问ChatGPT吗

答案是:不能。

从这两个问题我们看出,这不是存在矛盾了吗,我要访问GPT要科学上网,而访问米家服务不能科学上网。这应该是很多人不能连接成功的主要原因之一。

解决方案

声明一下会编程的小伙伴应该不需要这个解决方案


电脑1和电脑2要处于同一个局域网内。

1电脑1配置

首先电脑1必须科学上网,电脑1 安装一个http服务,用来访问GPT,并提供本地接口给电脑2的MiChatGUI程序调用,不会编程的同学可以在Github,MiChatGUI下载我打包好的桌面程序直接使用,注意在config.ini文件中输入你的openai key。

main.py代码如下,

from flask import  Flask,request
from flask_cors import CORS
import  configparser
import openai
app = Flask("cmmServer")  # web server
cors = CORS(app, supports_credentials=True) 
@app.route('/ask', methods=['post', 'get'])
def ask():
    try:
        msg   =  request.args.get('msg')
        result=Uchatgpt.ask(msg)
        if result=="-1":
            return   "不能连接GPT"
        return result
    except Exception as e:
            return  "不能连接GPT"
class ChatGPTBot():
    def __init__(self, openai_key, api_base=None):
        self.history = []
        self.api_base = api_base
        self.openai_key = openai_key
    def clear(self):
        self.history=[]
    def ask(self, query):
        try:
            openai.api_key = self.openai_key
            if self.api_base:
                openai.api_base = self.api_base
            ms = []
            for h in self.history:
                ms.append({"role": "user", "content": h[0]})
                ms.append({"role": "assistant", "content": h[1]})
            ms.append({"role": "user", "content": f"{query}"})
            completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=ms)
            message = (
                completion["choices"][0]
                .get("message")
                .get("content")
                .encode("utf8")
                .decode()
            )
            self.history.append([f"{query}", message])
            self.history = self.history[-5:]
            return message
        except Exception as e:
            return "-1"
if __name__=="__main__":
        cfgfile = "./config.ini"
        configp = configparser.ConfigParser()
        configp.read(cfgfile)
        APIKEY= configp["app"]["apikey"]
        print("你的API Key是:",APIKEY)
        Uchatgpt=ChatGPTBot(APIKEY)
        app.run(host='0.0.0.0',port=12345)

config.ini文件如下

[app]
apikey= sk-123123kk12k3k12k3k12k31k23k1k23k

此代码主要作用是访问ChatGPT API,并提供一个本地接口给电脑2的小爱程序MiChatGUI访问,同时请注意将你的openai key输入到config.ini文件中

直接使用我打包好的程序的同学,在电脑1运行flask_gpt_server.exe,出现如下效果代表成功。


2 确认你的电脑1的服务有效

在电脑2的浏览器中输入如下网址,浏览器显示ChatGPT的回答,代表电脑1的配置有效

http://电脑1的IP:12345/ask?msg=你好GPT

如何找到你的电脑1的IP呢,使用WIN+R命令,输入cmd,在cmd中输入ipconfig ,找到你的正确网卡的IP。

3 电脑2配置

首先电脑12必须禁止科学上网,电脑2 运行小爱访问程序MiChatGUI,注意必须使用你的自定义服务选项来访问。同时在服务代码输入框内输入如下代码,在这段代码中"电脑1的IP"请替换为你电脑1的ip,如果你的电脑1有多个网卡,请选择那个和电脑1 在同一个局域网内的网卡的IP。

url="http://电脑1的IP:12345/ask?msg="+query
response = requests.get(url=url)
UserCustomBot.result=response.content.decode('utf8')

详细的看下图MiChatGUI配置

配置完毕后点击开始按钮,如果调试框内滚动你的小爱的最后一条提问代表连接米家成功,这时你可以向小爱同学提问。

总结

本文是对于遇到无法使用小爱同学调用ChatGPT的一种解决方式,解决方法需要两台电脑,可能不是最优的解决方案,有更好的方式的欢迎在评论区讨论。