之前我们已经打通了Python微信公众号和服务器之间的数据流通路,可以添加我们自己的业务了。
如果还没有打通环境的同学,请参考我的【微信公众号开发】专栏,或下面系列文章:
【超详细!超多图!】Python微信公众号开发(1)
【超详细!】Python微信公众号开发(2)
【超详细!超多图!】【代码管理】服务器代码上传Github
本篇文章将小试牛刀,将时下爆火的OpenAI GPT大模型能力接入进来,完成公众号内与用户的自动对话。
题外话:ChatGPT与OpenAI的关系与区别
因为我注意到好多人都分不清ChatGPT和OpenAI,遂解释下:
- OpenAI是个公司,它有GPT系列大模型及对外开发的接口
- ChatGPT是个对话软件,底层是调用的OpenAI的GPT系列大模型
- 开发者想自己实现对话软件功能,是去仿照ChatGPT,需要调用OpenAI的API接口
接入OpenAI,是通过调用OpenAI API的方式。在这之前,你首先需要一个OpenAI的Key。
由于众所周知的原因,OpenAI是不对国内用户正式开放的。所以如果你想使用ChatGPT或调用OpenAI的接口,要么搭梯子,要么使用国内代理。
如果想先免费体验一下ChatGPT的功能,可以点这里去体验ChatGPT3.5,这里去体验ChatGPT4
这种方式就是搭梯子,去OpenAI官方注册账号,申请Key。网上教程很多,也很详细,但是也很繁琐。尤其是注册账号需要国外的手机号、需要特定的邮箱,这两个限制就堵死了绝大多数人的路。如果你想通过此种方式获取,本文不作详细教程,你可以参考以下文章:
做OpenAI国内代理的很多,我这里使用的是DevAGI。别问为什么,也是被别人推荐的,也没有过其它的… DevAGI用起来比较简单,它提供给你一个虚拟的API key,支持原生OpenAI的API,用起来和原生的没区别。
(1)注册DevAGI账号
(2)登录后,点击“获取key”
(3)应该能看到你的Key了,首次注册应该会赠送一定的免费次数,用多了之后可能就需要花钱了… 没办法,毕竟人家代理服务器也需要成本(自己搭梯子也要花钱,还不稳定…)。如果你有更好的方式,欢迎私信或评论告诉我,我也很想知道有没有白嫖的方式,毕竟比较穷…
有了key,让我们来真正开始自己的第一个OpenAI程序!
(1)确保你已经有了Python环境可用,我这里直接在之前的服务器中写代码。
(2)打开VSCode —> 远程打开刚才创建的“文件夹”,不会远程的请参考这篇文章:【新人必会】远程开发可视化 - VSCode篇
(4)在.env文件中输入下列信息:
OPENAI_API_KEY="sk-xxx" # <-------- 你的原生 OpenAI API Key
OPENAI_API_KEY="sk-xxx" # <-------- 你的原生 OpenAI API Key
OPENAI_BASE_URL="https://api.fe8.cn/v1" # 注意:一个字母都不要错
.env文件的作用就是配置一些Key或URL或一些环境变量,在程序运行时通过 load_dotenv 加载。这样也避免了将一些重要的信息暴露在代码中。
(5)安装OpenAI相关库
pip install python-dotenv openai
(6)新建一个文件名为"openai_test.py",填入以下代码:
from openai import OpenAI
# 加载 .env 到环境变量
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo-1106",
messages=[
{
"role": "user",
"content": "你是谁?"
}
],
)
print(response.choices[0].message.content)
以上这段代码的意思就是调用OpenAI的接口,发送“你是谁?”,然后收到回复“我是一个AI助手,能为您提供帮助和回答您的问题。有什么我可以帮到您的吗?”
如果你遇到下面的错误:
说明你的原生OpenAI Key没有科学上网,无法链接OpenAI网络。或者你的DevAGI的.env文件中的虚拟Key和Base没有配置对。请仔细检查。
上面我们的OpenAI API已经成功调用了,接下来只需要将用户的对话内容传入就可以了。
(1)将上面OpenAI的调用封装成函数
from openai import OpenAI
# 加载 .env 到环境变量
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = OpenAI()
###### 这里封装成函数 #######
def get_chat_completion(prompt, model = "gpt-3.5-turbo-1106"):
messages = [{
"role": "user",
"content": prompt
}]
response = client.chat.completions.create(
model = "gpt-3.5-turbo-1106",
messages=messages
)
return response.choices[0].message.content
(2)在用户发送消息过来时,调用以上接口获取大模型生成结果,然后将结果封装成回复xml格式
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask, request, make_response
...... # 请参照之前教程
from openai_test import openai_test
...... # 请参照之前教程
@app.route('/wechatai', methods=['GET', 'POST'])
def wechatai():
if request.method == 'GET':
return verify_wechat(request)
else:
# 处理POST请求
print("user request data: ", request.data)
printXML(request.data)
# 解析用户信息
user_message_content, from_user_name, to_user_name = getUserMessageContentFromXML(request.data)
print("user message content: ", user_message_content)
# 调用OpenAI接口生成回复内容 # <---------- 这里接入!!!
response_content = openai_test.get_chat_completion(user_message_content)
print("response content: ", response_content)
# 生成回复信息并返回
return generate_response_xml(from_user_name, to_user_name, response_content)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=True)
(3)运行程序,测试一下,已经可以愉快的对话了
至此,我们将OpenAI大模型基础对话能力接入了微信公众号中,实现了简单的与用户对话的功能。
功能比较简单,就是用户发一句话,大模型回一句话。没有记忆能力和上下文关联能力等。但是原理已经走通了。
从今天开始,持续学习,开始搞事情。踩坑不易,欢迎关注我,围观我!
有任何问题,欢迎+vx:jasper_8017,我也是个小白,想与志同道合的朋友一起讨论,共同进步!