nwilging/laravel-ChatGPT

openai-php/client 的超简单包装器,具有错误处理功能。特别适用于 ChatGPT 对话。

1.0.0 2023-05-11 22:11 UTC

This package is auto-updated.

Last update: 2024-08-28 17:32:14 UTC


README

openai-php/client 的超简单包装器,具有错误处理功能。特别适用于 ChatGPT 对话。

Tests Coverage Latest Stable Version License Total Downloads

关于

此包是用于与 OpenAI Chat Completions (ChatGPT) 交互的非常简单的包装器。在长对话中,一个常见的问题是“token过多”,这发生在向 API 发送包含超过指定模型 token 限制数量的 token 的提示时。

此包将尝试从对话开始处修剪消息,以便最新的对话上下文仍然存在于提示中。此外,如果需要“初始提示”或其他“系统”级别的指令消息,此消息将被锁定到消息堆栈的顶部,使其始终是第一条消息。

安装

先决条件

  1. Laravel v8+
  2. PHP 7.4+
  3. OpenAI API 密钥

使用 Composer 安装

composer require nwilging/laravel-chatgpt

配置

必须为此包工作配置两件事

  1. OpenAI API 密钥
  2. 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 个文件

  1. characters.json
  2. encoder.json
  3. 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 指令封装每条消息,表示消息及其属性。这与简单的提示分词不同,因为消息本身比简单的文本更复杂--例如,它们包括角色、用户名和消息内容。

对于 botuser 消息,格式如下

<|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|>

生成的格式化消息将是需要进行分词的内容。