Write the Code. Change the World.

3月 11

文本形式的一问一答,公众号这种场景还是不错。今天就尝试用 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

https://onlinesim.io/

既然拿到了 key。那就继续。我们在 .env.example 中创建 keyurl 的配置。这样做是因为 .env.example 参与版本控制,.env 是不参与的。

# chatgpt 配置
OPENAI_API_KEY=
OPENAI_BASE_URI=open.aiproxy.xyz/v1

然后,我们在 .env 中配置好上边的配置。填入 keyurl

先用 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) 来标记。哎。

体验效果如下图。

参考

https://geekr.dev/posts/chatgpt-website-by-laravel-10