Python 调用 ChatGPT API
由于chatgpt关闭了中国区域的服务,我们在使用openai的api时需要点自由(f)访问(q)的技能。本人能力不足,在使用了本地1080代理之后,发现库openai v0.27.2无法使用,追踪源码后发现内部使用的requests库。requests在使用时会读取系统的代理信息,替换请求的地址,最后导致访问不到hostname。
在使用postman测试的过程中发现,在本地开启小飞机之后,postman根据协议正常访问即可获取对应结果。如下图,Authorization需要添加密钥。
postman测试成功,就说明一个问题,这是python封装的request库及本地环境的问题。假设我们访问chatgpt 可以自由访问,也就不必设置小飞机,代码里既不需要系统代理也不需要指定代理,甚至可以直接使用官方库openai。但目前没发现代码里停用系统代理,但使用指定代理的方案。
注意resp的内容,正常情况下我们通过json或者content来读取返回的响应。目前的api返回结果不完全如文档中的描述,可能是其他因素的影响,暂无精力继续追查。
1 from urllib.request import ProxyHandler, build_opener, Request 2 3 secret_key = 'sk-****' 4 5 6 proxy = { 7 'http': 'http://127.0.0.1:1080', 8 'https': 'https://127.0.0.1:1080', 9 'ftp': 'ftp://127.0.0.1:1080', 10 } 11 proxy_handler = ProxyHandler(proxy) 12 opener = build_opener(proxy_handler) 13 headers = { 14 'Content-Type': 'application/json', 15 'Authorization': 'Bearer ' + secret_key, 16 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0', 17 } 18 message_log = [ 19 {"content": "你好,我是一个聊天机器人。", "role": "system"}, 20 {"content": "你好,你叫什么名字?", "role": "user"} 21 ] 22 23 def chat(): 24 data = { 25 'model': 'gpt-3.5-turbo', 26 'messages': message_log, 27 } 28 resp = opener.open(Request(url='https://api.openai.com/v1/chat/completions', 29 headers=headers, 30 data=bytes(json.dumps(data), encoding='utf-8') 31 )) 32 if resp: 33 s = resp.fp.readlines() 34 if len(s) >= 2: 35 print(json.loads(str(s[1], encoding='utf-8'))) 36 else: 37 print(json.loads(str(s[0], encoding='utf-8')))
如果你看到这里还没有放弃的话,那就再提供一个更加便捷的,可以使用openAI的方法。首先小飞机飞起来,根据openAI提供的文档写好自己的代码,然后在运行之前添加一个环境变量https_proxy,然后就可以用了。
也可以在pycharm中这样使用。