nwilging / laravel-ChatGPT
openai-php/client 的超简单包装器,具有错误处理功能。特别适用于 ChatGPT 对话。
Requires
- php: >=8.1
- guzzlehttp/guzzle: ^7.4
- laravel/framework: >=8
- openai-php/client: ^0.3.5
Requires (Dev)
- dg/bypass-finals: ^1.4
- mockery/mockery: ^1.5
- orchestra/testbench: *
- php-mock/php-mock: ^2.4
- phpunit/phpunit: ^9.5
README
openai-php/client 的超简单包装器,具有错误处理功能。特别适用于 ChatGPT 对话。
关于
此包是用于与 OpenAI Chat Completions (ChatGPT) 交互的非常简单的包装器。在长对话中,一个常见的问题是“token过多”,这发生在向 API 发送包含超过指定模型 token 限制数量的 token 的提示时。
此包将尝试从对话开始处修剪消息,以便最新的对话上下文仍然存在于提示中。此外,如果需要“初始提示”或其他“系统”级别的指令消息,此消息将被锁定到消息堆栈的顶部,使其始终是第一条消息。
安装
先决条件
- Laravel v8+
- PHP 7.4+
- OpenAI API 密钥
使用 Composer 安装
composer require nwilging/laravel-chatgpt
配置
必须为此包工作配置两件事
- OpenAI API 密钥
- OpenAI Tokenizer
.env 设置
首先,从 OpenAI 获取 API 密钥。
将此密钥添加到您的 .env
中,如下所示
OPENAI_API_KEY=sk_your-key
Tokenizer 设置
将分词器文件发布到 storage/app/openai_tokenizer
php artisan vendor:publish --provider=Nwilging\\LaravelChatGpt\\Providers\\ChatGptServiceProvider
这将向 storage/app/openai_tokenizer
目录添加 3 个文件
characters.json
encoder.json
vocab.bpe
这些文件 必须存在 才能使分词器工作!最好将它们提交到您的代码库,因为它们相对较小。您可能还需要将以下内容添加到您的 storage/app/.gitignore
!openai_tokenizer/*.json
!openai_tokenizer/*.bpe
使用方法
您可以使用此包执行聊天完成,同时自动修剪给定 OpenAI 模型无法处理的过大消息负载。此外,您还可以单独使用每个组件,例如,如果您想对提示进行分词。
ChatCompletionMessage 模型
这是一个辅助模型,必须用于生成聊天完成。由于聊天完成 API 支持消息对象,因此此类存在是为了帮助构建消息对象列表。
示例
use Nwilging\LaravelChatGpt\Models\ChatCompletionMessage; $message1 = new ChatCompletionMessage(); $message2 = new ChatCompletionMessage(); $message1->role = ChatCompletionMessage::ROLE_SYSTEM; $message1->name = 'system'; $message1->content = 'Initial prompt provided by system.'; $message2->role = ChatCompletionMessage::ROLE_USER; $message2->name = 'username'; $message2->content = 'The user\'s message';
这些消息可以作为数组发送到 ChatGptService
。
自动聊天完成
向 ChatGptService
发送任意数量的消息,并基于对话上下文自动生成聊天完成,如果发生 token 超出异常,则会自动修剪堆栈顶部的消息。
示例
use Nwilging\LaravelChatGpt\Contracts\Services\ChatGptServiceContract; $service = app(ChatGptServiceContract::class); // Use the messages from above! $messages = [$message1, $message2]; $model = 'gpt-3.5-turbo'; // Create a completion: $result = $service->createChat($model, $messages); // Create a completion that retains the initial prompt: $result = $service->createChatRetainInitialPrompt($model, $messages);
在上面的示例中,当负载太大时,createChat
将从堆栈顶部修剪消息,而忽略初始提示。
如果初始提示有助于定义整个对话的参数,您应将其保留在负载中。使用 createChatRetainInitialPrompt
来执行此操作。
分词器
分词器与 OpenAI 的分词器非常相似,可以用于从提示中提取 tokens。这可以用来确定提示中的 token 数量等。
分词器可以将 ChatCompletionMessage
数组进行分词,或者仅对基本字符串提示进行分词。
分词提示
use Nwilging\LaravelChatGpt\Helpers\Tokenizer; $tokenizer = app(Tokenizer::class); $prompt = 'this is a test prompt!'; $tokens = $tokenizer->tokenize($prompt); dd($tokens); /** * Output: * [ * "this" => 5661 * "Ġis" => 318 * "Ġa" => 257 * "Ġtest" => 1332 * "Ġprompt" => 6152 * "!" => 0 * ] */ // Get token count: $numberOfTokens = count($tokens);
分词 ChatCompletionMessage
稍微复杂一些。分词器将用 ChatGPT 指令封装每条消息,表示消息及其属性。这与简单的提示分词不同,因为消息本身比简单的文本更复杂--例如,它们包括角色、用户名和消息内容。
对于 bot 和 user 消息,格式如下
<|im_start|>role name=username
message content
<|im_end|>
对于用户消息
<|im_start|>user name=TheUserName
hello this is a message from a user!
<|im_end|>
对于 bot 消息
<|im_start|>bot name=TheBotUsername
response from chatgpt!
<|im_end|>
最后,system
消息的处理方式略有不同
<|im_start|>system
This is a system message
<|im_end|>
生成的格式化消息将是需要进行分词的内容。