php中使用hyperf框架調(diào)用訊飛星火大模型實(shí)現(xiàn)國內(nèi)版chatgpt功能示例
swoole  /  管理員 發(fā)布于 1年前   1976
最近公司有需要批量創(chuàng)作一些信息,所以我找找相關(guān)產(chǎn)品體驗(yàn)一下,比如阿里的通義千問、科大訊飛的訊飛星火等,下面主要說說訊飛星火的使用流程步驟及示例代碼
全稱訊飛星火認(rèn)知大模型,是科大訊飛的產(chǎn)品
新一代認(rèn)知智能大模型,擁有跨領(lǐng)域知識(shí)和語言理解能力,能夠基于自然對(duì)話方式理解與執(zhí)行任務(wù)
訊飛開放平臺(tái)官網(wǎng)
https://www.xfyun.cn/
訊飛星火大模型申請(qǐng)
https://xinghuo.xfyun.cn/
訊飛開放平臺(tái)開發(fā)web文檔:
https://www.xfyun.cn/doc/spark/Web.html
ps:
當(dāng)然申請(qǐng)之前你要注冊(cè)好賬號(hào),創(chuàng)建應(yīng)用,拿到appkey等api鑒權(quán)信息
這里就不過多介紹,自行進(jìn)開發(fā)文檔查閱。
訊飛星火大模型請(qǐng)求地址:
星火大模型API當(dāng)前有V1.5和V2兩個(gè)版本,兩個(gè)版本獨(dú)立計(jì)量tokens;
另兩個(gè)版本的請(qǐng)求參數(shù)domain(詳見下方請(qǐng)求參數(shù))也需保持對(duì)應(yīng)!
星火V1.5請(qǐng)求地址:
ws(s)://spark-api.xf-yun.com/v1.1/chat
星火V2請(qǐng)求地址:
ws(s)://spark-api.xf-yun.com/v2.1/chat
ps:
免費(fèi)額度的只有星火V1.5有,所以下面以星火V1.5進(jìn)行測(cè)試開發(fā)
來一張訊飛星火大模型申請(qǐng)成功進(jìn)入后臺(tái)的截圖
話不多說進(jìn)入步驟
打開開發(fā)文檔
文檔中心->星火認(rèn)知大模型->開放能力->星火認(rèn)知大模型Web文檔
里面有一些詳細(xì)的接口說明信息
最底部有一個(gè)
訊飛星火大模型各個(gè)語言調(diào)用demo,我這用php,所以下載一個(gè)php示例看看
demo中它用textalk/websocket擴(kuò)展包的WebSocket\Client客戶端連接訊飛星火大模型請(qǐng)求地址;
因?yàn)槲矣玫絟yperf 2.2框架,所以要改成hyperf適配的方式;
本身hyperf 2.2框架有自己的WebSocket協(xié)程客戶端封裝,所以只需要安裝一下就ok了
安裝命令:
composer require hyperf/websocket-client
創(chuàng)建控制器:
<?php
declare(strict_types=1);
namespace App\Controller;
use Hyperf\WebSocketClient\ClientFactory;
use Hyperf\DbConnection\Db;
use Hyperf\HttpServer\Annotation\AutoController;
/**
* @AutoController()
*/
class XfxhController extends BaseController
{
private $config = [
'appid' => 'xxx',
'apikey' => 'xxx',//密鑰信息,在開放平臺(tái)-控制臺(tái)中獲?。篽ttps://console.xfyun.cn/services/cbm
'apisecret' => 'xxx',
'addr' => 'ws://aichat.xf-yun.com/v1/chat',
];
/**
* @var ClientFactory
*/
protected $clientFactory;
public function __construct(ClientFactory $clientFactory)
{
$this->clientFactory = $clientFactory;
}
public function index()
{
$q = $this->request->input('q');
if (!isset($q)) { return ['code'=>400,'msg'=>"請(qǐng)輸入提問,在url上以?q=xx的格式"]; };
if (empty($q)) { return ['code' => 400, 'msg' => "請(qǐng)輸入信息,在url上以?q=xx的格式"];};
$authUrl = $this->assembleAuthUrl("GET",$this->config['addr'],$this->config['apikey'],$this->config['apisecret']);
// 創(chuàng)建ws連接對(duì)象
$client = $this->clientFactory->create($authUrl);
// 連接到 WebSocket 服務(wù)器
if ($client) {
// 發(fā)送數(shù)據(jù)到 WebSocket 服務(wù)器
// 數(shù)據(jù)格式
//$data = $this->getBody($Appid,"請(qǐng)你作為SEO撰寫達(dá)人,寫一篇有關(guān)".$q."的SEO文章,包括語言口語化,具有獨(dú)特見解,原創(chuàng)性高。");
//五糧液高端系列酒親身體驗(yàn)感受為題寫一篇文章,要突出分別說出五糧液高端系列的普五、1618、交杯的體驗(yàn)感受,并且能說出競(jìng)品的區(qū)別
$data = $this->getBody($this->config['appid'],$q);
$client->push($data);
// 從 WebSocket 服務(wù)器接收數(shù)據(jù)
$answer = "";
while (true) {
$response = $client->recv();
//$resp = json_decode($response, true);
$resp = json_decode($response->data,true);
$code = $resp["header"]["code"];
echo "從服務(wù)器接收到的數(shù)據(jù): " . $response;
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'];
print("\n本次消耗token用量:\n");
print($total_tokens);
break;
}
} else {
echo "服務(wù)返回報(bào)錯(cuò)" . $response;
break;
}
}
print("\n返回結(jié)果為:\n");
print($answer);
return $answer;
} else {
return "無法連接到 WebSocket 服務(wù)器";
}
}
//構(gòu)造參數(shù)體
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(
// 需要聯(lián)系上下文時(shí),要按照下面的方式上傳歷史對(duì)話
// array("role" => "user", "content" => "你是誰"),
// array("role" => "assistant", "content" => "....."),
// ...省略的歷史對(duì)話
array("role" => "user", "content" => $question)
)
)
);
$json_string = json_encode(array(
"header" => $header,
"parameter" => $parameter,
"payload" => $payload
));
return $json_string;
}
//鑒權(quán)方法
function assembleAuthUrl($method, $addr, $apiKey, $apiSecret) {
if ($apiKey == "" && $apiSecret == "") { // 不鑒權(quán)
return $addr;
}
$ul = parse_url($addr); // 解析地址
if ($ul === false) { // 地址不對(duì),也不鑒權(quán)
return $addr;
}
// // $date = date(DATE_RFC1123); // 獲取當(dāng)前時(shí)間并格式化為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");
// 對(duì)簽名字符串進(jìn)行排序,確保順序一致
// ksort($signString);
// 將簽名字符串拼接成一個(gè)字符串
$sgin = implode("\n", $signString);
print( $sgin);
// 對(duì)簽名字符串進(jìn)行HMAC-SHA256加密,得到簽名結(jié)果
$sha = hash_hmac('sha256', $sgin, $apiSecret,true);
print("signature_sha:\n");
print($sha);
$signature_sha_base64 = base64_encode($sha);
// 將API密鑰、算法、頭部信息和簽名結(jié)果拼接成一個(gè)授權(quán)URL
$authUrl = "api_key=\"$apiKey\", algorithm=\"hmac-sha256\", headers=\"host date request-line\", signature=\"$signature_sha_base64\"";
// 對(duì)授權(quán)URL進(jìn)行Base64編碼,并添加到原始地址后面作為查詢參數(shù)
$authAddr = $addr . '?' . http_build_query(array(
'host' => $ul['host'],
'date' => $rfc1123_format,
'authorization' => base64_encode($authUrl),
));
return $authAddr;
}
}
ps:
構(gòu)造參數(shù)體、鑒權(quán)方法直接從官方的demo中復(fù)制過來,連接到WebSocket服務(wù)器基本一樣,
主要修改的地方的就是發(fā)送數(shù)據(jù)到WebSocket服務(wù)器的send方法改成push;
運(yùn)行測(cè)試一下,傳參進(jìn)來
http://127.0.0.1:9501/xfxh/index?q=你是誰
后話
對(duì)接進(jìn)來,后面就可以進(jìn)行其他場(chǎng)景的開發(fā),比如根據(jù)關(guān)鍵詞等自動(dòng)生成相關(guān)信息,太多的話搞成定時(shí)任務(wù)方式等等。
路人 2023-08-22 09:07:03 贊 (1)
教程很詳細(xì),如果加個(gè)前端chatgpt對(duì)話頁面就完美了
123 在
Clash for Windows作者刪庫跑路了,github已404中評(píng)論 按理說只要你在國內(nèi),所有的流量進(jìn)出都在監(jiān)控范圍內(nèi),不管你怎么隱藏也沒用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最簡(jiǎn)單的方法中評(píng)論 好久好久都沒看友情鏈接申請(qǐng)了,今天剛看,已經(jīng)添加。..博主 在
佛跳墻vpn軟件不會(huì)用?上不了網(wǎng)?佛跳墻vpn常見問題以及解決辦法中評(píng)論 @1111老鐵這個(gè)不行了,可以看看近期評(píng)論的其他文章..1111 在
佛跳墻vpn軟件不會(huì)用?上不了網(wǎng)?佛跳墻vpn常見問題以及解決辦法中評(píng)論 網(wǎng)站不能打開,博主百忙中能否發(fā)個(gè)APP下載鏈接,佛跳墻或極光..路人 在
php中使用hyperf框架調(diào)用訊飛星火大模型實(shí)現(xiàn)國內(nèi)版chatgpt功能示例中評(píng)論 教程很詳細(xì),如果加個(gè)前端chatgpt對(duì)話頁面就完美了..
Copyright·? 2019 侯體宗版權(quán)所有·
粵ICP備20027696號(hào)