文本形式的一问一答,公众号这种场景还是不错。今天就尝试用 laravel10 接入一个 chatgpt 的功能。并使用到公众号上。
使用 chatgpt,我们需要使用下边这个包。
https://packagist.org/packages/geekr/openai-laravel
开始
composer create-project laravel/laravel gzh.com --prefer-dist
# 查看当前 laravel 版本 (Laravel Framework 10.3.3)
php artisan --version
# 添加到版本控制
git init -b main
git add .
git commit -m 'laravel initialize'
# 安装 geekr/openai-laravel
composer require geekr/openai-laravel
如果报 Could not find a version of package geekr/openai-laravel matching your minimum-stability (stable). Require it with an explicit version constraint allowing its desired stability. 这个错误。 可以这么操作。这个包对框架版本限定的死死的,通过这个方式来安装。
rm -rf composer.lock
# 在 composer.json 中增加配置
"require": {
…
"geekr/openai-laravel": "dev-master"
},
composer install
# 添加到版本控制
git add .
git commit -m '安装 geekr/openai-laravel'
如果上边步骤都 ok 了,继续。
# 生成配置文件
php artisan vendor:publish --provider="GeekrOpenAI\Laravel\ServiceProvider"
上边命令,会在 config 目录下,生成一个 openai.php
的配置文件。
然后要配置 OPENAI_API_KEY 。这个 key, 我们在 https://platform.openai.com/account/api-keys 这里申请。
到写这里,已经过去了 2 个多小时。饭也没吃,好难啊。不仅要绿色上网,还要有一些特定国家的手机号码接收短信。接受短信后,询问你用这个来干啥,然后就一直 502,死活过不去。后来用 postman,将 token 以及 body 复制过去请求还是不行。再后来快要放弃的时候,尝试着将 postman body 里边的中文改成字母,竟奇迹般的创建成功了。再然后进入首页,进入 keys 列表。点击创建,马上就可以生成 key 了。
话说为了接受短信,还花了 7 块人民币。
关于接受短信
https://www.hztdst.com/9514.html
https://sms-activate.org/getNumber
上边这种方式是花钱的,花钱的果然好使,好用。后来找啊找,好像也有免费这种服务的。
https://sms24.info/en/messages/OpenAI
既然拿到了 key。那就继续。我们在 .env.example 中创建 key 和 url 的配置。这样做是因为 .env.example 参与版本控制,.env 是不参与的。
# chatgpt 配置
OPENAI_API_KEY=
OPENAI_BASE_URI=open.aiproxy.xyz/v1
然后,我们在 .env 中配置好上边的配置。填入 key 和 url。
先用 tinker 进行调试。有问有答就好。
# 打开 tinker
php artisan tinker
# 敲入下边的命令
use GeekrOpenAI\Laravel\Facades\OpenAI;
$content = '中国有多少个王朝,最古老的王朝是哪个王朝';
$messages[] = ['role' => 'user', 'content' => $content];
$response = OpenAI::chat()->create([
'model' => 'gpt-3.5-turbo',
'messages' => $messages
]);
坐等结果。看到是有结果返回的。如下图所示。
这仅仅是一个测试,需要多多测试。不过总得持有怀疑的态度。这个接口接的就是 chatgpt,不是其他的接口。给个错误的 key 试试,看是否能有正常的反馈。
只要有问有答,接入公众号就简单的。用户给公众号输入文本信息(如果所有文本信息都用 chatgpt来处理),那就在服务端将接到的信息作为 GeekrOpenAI\Laravel\Facades\OpenAI
的请求参数来直接请求,再将请求结果解析,再处理,拿到结果。然后按照公众号的规则,输出给用户就可以了。
如果你的文本信息还有其他用途。那就得让用户带上标志了。比如让用户在问之前加上前缀 gpt xxxx 这样的。服务端拿到后,再做特殊处理。
话是这么说,可是真正做起来又会出现意外。
gpt 的请求时间太长了。复杂的问题会超出 10 秒,简单的问题也比较久。这个就会引发微信公众号里的异常机制。
腾讯个坑爹货,用户给服务端发送消息,只要 5 秒内,没回复,腾讯会再继续调用,一直调用三次。三次后,还没返回或有错误解构都会显示 “该公众号提供的服务出现故障,请稍后再试”。 网上也有很多解决方法,说直接返回一个空字符串或”success“字符串或使用客服消息。都试过,没有用。空字符串和”success“是没有用,客服消息是有用,只是这玩意不能阻止它连续请求三次的问题。
一直在挣扎。在入口那,用 redis 对请求做一次记录,下次重复请求过滤掉。只是这样做,太不好看了。
还是使用 Redis::setex($key, 20, $key)
来标记。哎。
体验效果如下图。