如何对接讯飞的星火大模型并生成文章

首先你要得到讯飞的api接口 然后尼就可以开始对接 查看讯飞的对接方式文档 发现该方式是以这样方式相连接 那需要链接WebSocket 服务器WebSocket...

首先你要得到讯飞的api接口

然后尼就可以开始对接 查看讯飞的对接方式文档

发现该方式是以这样方式相连接 那需要链接WebSocket 服务器WebSocket 服务器

ws(s)://spark-api.xf-yun.com/v1.1/chat

WebSocket 服务器WebSocket 服务器项目地址

https://github.com/Textalk/websocket-php

 

安装

使用composer一键安装WebSocket 服务器

在类中引入了

require('vendor/autoload.php');
use WebSocket\Client;

封装类库

我是这样封装的 使用了某cms方法

<?php
// +----------------------------------------------------------------------
// | Site:  [ http://www.yzmcms.com]
// +----------------------------------------------------------------------
// | Copyright: 袁志蒙工作室,并保留所有权利
// +----------------------------------------------------------------------
// | Author: YuanZhiMeng <214243830@qq.com>
// +---------------------------------------------------------------------- 
// | Explain: 这不是一个自由软件,您只能在不用于商业目的的前提下对程序代码进行修改和使用,不允许对程序代码以任何形式任何目的的再发布!
// +----------------------------------------------------------------------
defined('IN_YZMPHP') or exit('Access Denied');
require(APP_PATH.ROUTE_M.'/vendor/autoload.php');
use WebSocket\Client;
class model_client 
{
    /**
    * @构造配置参数
    * @author zhaosong
    * @date 2023-11-03
    */
	public function __construct($data)
	{
		$this->APPID = $data['appid'];
	    $this->APISecret = $data['apisecret'];
		$this->APIKey = $data['apikey'];
		$this->APIURL = $data['apiurl'];
	}

	/**
    * @发送数据到 WebSocket 服务器
    * @author zhaosong
    * @date 2023-11-03
    */
	public function iflytek_cation($problem) {
    	$addr = $this->APIURL;
    	$Appid = $this->APPID;
    	$Apikey = $this->APIKey;
    	$ApiSecret = $this->APISecret;
    	
    	$authUrl = $this->assembleAuthUrl("GET",$addr,$Apikey,$ApiSecret);
    	//创建ws连接对象
    	$client = new Client($authUrl);
    	// 连接到 WebSocket 服务器
    	if ($client) {
    		// 发送数据到 WebSocket 服务器
    		$data = $this->getBody($Appid,$problem);
    		$client->send($data);
    		// 从 WebSocket 服务器接收数据
    		$answer = "";
    		while(true) {
    			$response = $client->receive();
    			$resp = json_decode($response,true);
    			$code = $resp["header"]["code"];
    			if(0 == $code) {
    				$status = $resp["header"]["status"];
    				if($status != 2) {
    					$content = $resp['payload']['choices']['text'][0]['content'];
    					$answer .= $content;
    				} else {
    					$content = $resp['payload']['choices']['text'][0]['content'];
    					$answer .= $content;
    					$total_tokens = $resp['payload']['usage']['text']['total_tokens'];
    					break;
    				}
    			} else {
    				return ['status'=>0,'msg'=>"服务返回报错".$response];
    				break;
    			}
    		}
    		return ['status'=>1,'msg'=>$answer];
    	} else {
    		return ['status'=>0,'msg'=>"无法连接到 WebSocket 服务器"];
    	}
    }
    

	/**
    * @鉴定参数
    * @author zhaosong
    * @date 2023-11-03
    */
	private function assembleAuthUrl($method, $addr, $apiKey, $apiSecret) {
    	if ($apiKey == "" && $apiSecret == "") {
    		// 不鉴权
    		return $addr;
    	}
    	$ul = parse_url($addr);
    	// 解析地址
    	if ($ul === false) {
    		// 地址不对,也不鉴权
    		return $addr;
    	}
    	// // $date = date(DATE_RFC1123); // 获取当前时间并格式化为RFC1123格式的字符串
    	$timestamp = time();
    	$rfc1123_format = gmdate("D, d M Y H:i:s \G\M\T", $timestamp);
    	// $rfc1123_format = "Mon, 31 Jul 2023 08:24:03 GMT";
    	// 参与签名的字段 host, date, request-line
    	$signString = array("host: " . $ul["host"], "date: " . $rfc1123_format, $method . " " . $ul["path"] . " HTTP/1.1");
    	// 对签名字符串进行排序,确保顺序一致
    	// ksort($signString);
    	// 将签名字符串拼接成一个字符串
    	$sgin = implode("\n", $signString);
    	
    	// 对签名字符串进行HMAC-SHA256加密,得到签名结果
    	$sha = hash_hmac('sha256', $sgin, $apiSecret,true);
    	
    	$signature_sha_base64 = base64_encode($sha);
    	// 将API密钥、算法、头部信息和签名结果拼接成一个授权URL
    	$authUrl = "api_key=\"$apiKey\", algorithm=\"hmac-sha256\", headers=\"host date request-line\", signature=\"$signature_sha_base64\"";
    	// 对授权URL进行Base64编码,并添加到原始地址后面作为查询参数
    	$authAddr = $addr . '?' . http_build_query(['host' => $ul['host'],'date' => $rfc1123_format,'authorization' => base64_encode($authUrl),]);
    	return $authAddr;
    }
    
    
    /**
	 * 发送post请求
	 * @param string $url 请求地址
	 * @param array $post_data post键值对数据
	 * @return string
	 */  
	public  function http_request($url, $post_data, $headers) {		 
		  $postdata = http_build_query($post_data);
		  $options = array(
		    'http' => array(
		      'method' => 'POST',
		      'header' => $headers,
		      'content' => $postdata,
		      'timeout' => 15 * 60 // 超时时间(单位:s)
		    ));
		  $context = stream_context_create($options);
		  $result = file_get_contents($url, false, $context);
 
		  return $result; 
			
		  return "success";
	}


	/**
    * @构造参数体
    * @author zhaosong
    * @date 2023-11-03
    */
    private function getBody($appid,$question) {
    	$header = array("app_id" => $appid,"uid" => "12345");
    	$parameter = array("chat" => array("domain" => "general","temperature" => 0.5,"max_tokens" => 1024));
    	$payload = array(
    					"message" => array(
    						"text" => array(
    							// 需要联系上下文时,要按照下面的方式上传历史对话
    	// array("role" => "user", "content" => "你是谁"),
    	// array("role" => "assistant", "content" => "....."),
    	// ...省略的历史对话
    	array("role" => "user", "content" => $question))));
    	$json_string = json_encode(array("header" => $header,"parameter" => $parameter,"payload" => $payload));
    	return $json_string;
    }

}

然后在控制中使用这个类库 一键生成AI的文章

我采用循环的办法来批量生成文章

	/**
    * @生成AI
    * @author zhaosong
    * @date 2023-11-03
    */
	private function ai_articles($data) 
	{
		$iflytek = $this->is_data();
		for ($i = 1; $i <= $data['num']; $i++) {
			$res = new model_client($iflytek);
			$content = $res->iflytek_cation($data['content']);
			if(!empty($content['status']) == 0){
			    return_json(array('status'=>$content['status'], 'message'=>$content['msg']));
			}
			if(!empty($content['status']) == 1) {
				$article = [];
				$article['issystem']  = 1;
				$article['title'] = $this->get_title($content['msg']);
				$article['inputtime'] = $data['is_time'] ? $this->is_time() : SYS_TIME;
				$article['description'] = str_cut(strip_tags($content['msg']),250);
				$article['username'] = $_SESSION['adminname'];
				$article['userid'] = $_SESSION['adminid'];
				$article['catid'] = intval($data['catid']);
				$article['status'] = 0;
				$article['content'] = $content['msg'];
				$article['click'] = $data['is_click'] ? rand(10,100) :0;
				$article['updatetime'] = SYS_TIME;
				$content_tabname = D(get_model($data['modelid']));
				$id = $content_tabname->insert($article);
				if(empty($article['url'])) {
					$url = get_content_url($data['catid'], $id);
					$content_tabname->update(array('url' => $url), array('id' => $id));
				}
				//写入全部模型表
				$article['siteid'] = get_siteid();
				$article['modelid'] = $data['modelid'];
				$article['id'] = $id;
				$article['url'] = $url;
				D('all_content')->insert($article);
			}
			return_json(array('status'=>1, 'message'=>"文章生成成功!"));
		}
	}

如果有不懂的可以q我 我给你解答你的疑惑

分享结束 下次再见!!!