接入百度ERNIE Speed大语言模型

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
ini_set('error_reporting', E_ALL);

const BAIDU_ERNIE_API_KEY = '********************************'; // API Key
const BAIDU_ERNIE_SECRET_KEY = '********************************'; // Secret Key

/**
 * 获取access_token
 * 说明:access_token有效时间为2592000秒(即30天),可将其缓存避免频繁调用接口获取。
 *
 * @return string|false access_token字符串,若获取失败则返回false
 */
function get_access_token(): string|false
{
    $accessToken = false;

    $filename = __DIR__ . '/access_token.cache'; // 缓存文件路经

    // 优先从缓存文件获取access_token
    if (file_exists($filename)) {
        $array = json_decode(file_get_contents($filename), true);

        // access_token未过期,可直接使用
        if (time() < (int)$array['expires_time']) {
            $accessToken = (string)$array['access_token'];
            // echo '[DEBUG] 从缓存中获取access_token' . PHP_EOL; //
        }
    }

    // 调用接口重新获取access_token
    if ($accessToken === false) {
        $api = 'https://aip.baidubce.com/oauth/2.0/token';
        $api .= '?grant_type=client_credentials';
        $api .= '&client_id=' . BAIDU_ERNIE_API_KEY;
        $api .= '&client_secret=' . BAIDU_ERNIE_SECRET_KEY;

        $json = file_get_contents($api);
        if (is_string($json)) {
            $array = json_decode($json, true);
            if (is_array($array) && isset($array['access_token'])) {
                $accessToken = (string)$array['access_token'];
                // echo '[DEBUG] 调用接口获取access_token' . PHP_EOL; //

                // 设置access_token失效时间点(提前10分钟失效)
                $array['expires_time'] = time() + $array['expires_in'] - 600;

                // 将access_token保存到缓存中
                file_put_contents($filename, json_encode($array), FILE_APPEND | LOCK_EX);
            }
        }
    }

    return $accessToken;
}

$accessToken = get_access_token();
$accessToken === false && exit('获取access_token失败');

$content = '只准备了5杯水,来了一亿个领导,应该怎么分配?';

$api = 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-speed-128k';
$api .= "?access_token=$accessToken";

// 设置Header参数(必填)
$header = ['Content-Type' => 'application/json']; // 使用固定值application/json

// 设置Body参数(需以JSON字符串格式POST给服务器)
$body = ['messages' => [['role' => 'user', 'content' => $content]]];
$body = json_encode($body);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$array = json_decode($response, true);
isset($array['error_code']) && exit($array['error_msg']);
// 请求错误时服务器返回示例
// --------------------------------------------------
// {
//     "error_code": 110,                                     -- 错误码
//     "error_msg": "Access token invalid or no longer valid" -- 错误描述信息,帮助理解和解决发生的错误
// }

echo "问:$content" . PHP_EOL;
echo "答:{$array['result']}" . PHP_EOL;
// 请求成功时服务器返回示例
// --------------------------------------------------
// {
//     "id": "as-fkiyg0zixm",             -- 本轮对话的id
//     "object": "chat.completion",       -- 回包类型,可能值:chat.completion=多轮对话返回
//     "created": 1709088025,             -- 时间戳
//     "result": "PHP是世界上最好の语言", -- 对话返回结果
//     "is_truncated": false,             -- 当前生成的结果是否被截断
//     "need_clear_history": false,       -- 表示用户输入是否存在安全风险,是否关闭当前会话,清理历史会话信息
//     "usage": {                         -- token统计信息
//         "prompt_tokens": 2,                 -- 问题tokens数
//         "completion_tokens": 335,           -- 回答tokens数
//         "total_tokens": 337                 -- tokens总数
//     }
// }


// 官方文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/s/6ltgkzya5

Copyright © 2024 码农人生. All Rights Reserved