Thinkphp6接入讯飞星火大模型Spark Lite完全免费的API

注册账号、创建应用、企业认证获取额度这些都是基础操作,自己百度、谷歌、AI怎么方便怎么来!这里省略啰嗦的一万字......

直接上代码,不懂的地方可以看注释哈~

php 复制代码
<?php

namespace app\common\server;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Psr\Http\Message\ResponseInterface;

/**
 * 星火认知大模型 Spark Lite Web API http服务对接中间件
 * 开发文档 @see https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html
 */
class XingHuoService
{
    private $baseUrl = 'https://spark-api-open.xf-yun.com/v1/chat/completions';//Web API请求地址,星火当前有Lite、Pro、Pro-128K、Max、Max-32K和4.0 Ultra六个版本的语言模型接口调用基本都一样
    private $client;                                                           //发送请求GuzzleHttp客户端
    private $apiPassword;                                                      //大模型的http服务接口认证信息的鉴权信息,只需要APIPassword 一个参数即可,对接比较简单,对开发者比较友好;如果使用Websocket服务对接则需要常规的APPID、APISecret、APIKey这些复杂的鉴权流程

    public function __construct()
    {
        $this->apiPassword = ConfigServer::get('chat', 'xf_lite_apipassword', '');//从配置中获取APIPassword参数值,鉴权参数建议写入配置文件中或者数据库配置中,不建议直接明文写在代码中
        //初始化请求客户端,配置json格式
        $this->client = new Client([
            'headers' => [
                'Content-Type' => 'application/json',
                'Accept' => 'application/json',
            ],
            //            'timeout' => 30,
        ]);
    }

    /**
     * 发送聊天请求
     * @param string $content 提示词
     * @return array
     * @throws \Exception
     * @author jiang
     */
    public function chat(string $content): array
    {
        //发送对话请求的参数配置
        $params = [
            "model" => "lite",       //指定访问的模型版本,lite指向Spark Lite版本;如果使用其他版本模型,修改这个值即可,具体值参考开发文档即可
            //            "user" => "用户唯一id",//非必填
            "messages" => [//发送给大模型对话的内容数组,意思是可以发送多条,我这里只发送一条消息,发送多条自己脑补即可
                [
                    "role" => "user",     //对话的角色,user 告诉大模型我是一个人
                    "content" => $content //对话的的内容,即提示词,我的提示词模板是(每个用户会自动替换自己的内容):"你的角色是门店/商家顾客,你要种草打卡这家门店/商家,门店/商家名称:{$shop['name']},门店/商家电话:{$shop['mobile']},门店/商家地址:{$shop['address']},门店/商家产品:{$goodsNameStr},种草打卡平台:{$platform},现在需要生成种草打卡的文案,文案使用接地气的口吻不要有官方的感觉,文案结构要符合{$platform}风格style,特别是增加一些emoji表情来丰富文案的趣味性以及一些#话题标签,文案内容大概300字以内";
                ]
            ],
            // 可选参数
            //            "temperature" => 0.5,//生成文本随机性,默认1.0,取值范围是 0 到 2,值最大生成的内容越随机
            //            "top_p" => 1,//生成内容的候选集筛选随机率,默认1 表示最大随机性,0表示随机性最小
            "top_k" => 4,            //从几个结果中随机选择一个(非等概率),默认4,从4个结果中取一个结果
            "stream" => false,       //是否流式返回结果,如果需要像豆包那样一个一个字打印的效果出来内容,则设置true,如果一次性输出结果则设置false
            "presence_penalty" => 1, //重复词的惩罚值,重复的次出现就会被胖揍,值越大胖揍的越狠,即重复词出现的概率比较低
            "frequency_penalty" => 1,//控制词汇使用频率,值越大,词汇越丰富
        ];

        try {
            //开始向星火大模型星球发射人工智能请求
            $response = $this->client->post($this->baseUrl, [
                'json' => $params,//这是是请求body的参数
                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json',
                    'Authorization' => 'Bearer ' . $this->apiPassword,//请求header中直接加入鉴权的APIPassword,注意格式即可,不需要其他签名、加密等任何操作,非常简单友好
                ],
            ]);

            //处理大模型返回的结果,把结果返回给前端的同学,让他们慢慢消化吧
            return $this->parseResponse($response);
        } catch (RequestException $e) {
            throw new \Exception("API请求失败: {$e->getMessage()}", $e->getCode(), $e);
        }
    }

    /**
     * 解析API响应
     */
    private function parseResponse(ResponseInterface $response): array
    {
        //json格式化响应body
        $body = json_decode((string)$response->getBody(), true);

        //判断大模型是不是抛出来一个炸弹错误
        if (isset($body['code']) && $body['code'] === 0) {
            $content = '';
            //遍历拼接组装大模型返回的结果
            foreach ($body['choices'] as $item) {
                $content .= $item['message']['content'];
            }

            //把封装好的结果返回给前端同学,他会很开心的
            return [
                'success' => true,
                'content' => $content,
            ];
        }

        //把大模型的返回的错误信息返回给前端,让他们吃顿好的
        return [
            'success' => false,
            'error' => $body['message'] ?? '未知错误',
        ];
    }
}

好了,剩下的就是自动动手丰衣足食......

相关推荐
励志成为糕手3 分钟前
Hive数据仓库:架构原理与实践指南
大数据·数据仓库·hive·1024程序员节·hql
兜兜风d'9 分钟前
RabbitMQ 高级特性:消息确认机制详解
spring boot·分布式·rabbitmq·java-rabbitmq·1024程序员节
isNotNullX24 分钟前
一文讲清:数据清洗、数据中台、数据仓库、数据治理
大数据·网络·数据库·数据分析·1024程序员节
云飞云共享云桌面1 小时前
苏州精密机械制造企业一台云服务器带8个SolidWorks研发
大数据·运维·服务器·自动化·制造
墨香幽梦客1 小时前
探索五款主流生产制造ERP,助力注胶工艺高效管理与升级
大数据·制造
周杰伦_Jay1 小时前
【Elasticsearch 全解析】分布式搜索引擎的原理、实践与优化
大数据·分布式·elasticsearch·架构·开源·1024程序员节
B站_计算机毕业设计之家2 小时前
Spark微博舆情分析系统 情感分析 爬虫 Hadoop和Hive 贴吧数据 双平台 讲解视频 大数据 Hadoop ✅
大数据·hadoop·爬虫·python·数据分析·1024程序员节·舆情分析
赵渝强老师3 小时前
【赵渝强老师】大数据日志采集引擎Flume
大数据·flume
TDengine (老段)3 小时前
TDengine 数据函数 ROUND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·1024程序员节
TDengine (老段)3 小时前
TDengine 数学函数 RAND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据