让php后端具备大模型能力,是不少团队最近在做的事情。华为云的盘古大模型开放了自然语言处理接口,php完全可以通过HTTP请求的方式接入,用来做文本摘要、内容扩写和结构化报告输出。这篇文章从接入准备、接口调用代码、报告生成方案三个层面,把整套流程讲清楚,中间会踩到的坑也会一并说明。

一、接入盘古大模型前的准备工作
盘古大模型的接口托管在华为云上,调用之前需要先在控制台完成几件事。第一步是开通华为云账号并实名认证,第二步进入ModelArts或者盘古大服务的页面,开通对应的NLP服务并创建访问密钥,也就是常说的AK和SK。这两个密钥是接口鉴权的核心,一定要妥善保管,不要写死在代码里提交到仓库。
拿到密钥之后,还需要确认服务区域。华为云不同区域的服务地址域名不同,比如北京四区和上海一区的endpoint就不一样,代码里请求的域名必须和开通服务的区域一致,否则会报找不到服务的错误。另外盘古系列下有多个模型规格,比如面向通用场景的和面向行业场景的,调用参数里的model字段要填具体的模型名称,这个名称在官方文档的服务列表里可以查到。
还有一个容易被忽略的点是配额问题。新开通的服务通常有QPS限制,如果php程序是批量生成报告的场景,比如一次要处理几百篇文档,就需要在客户端做好队列和限速,避免请求被直接拒绝。建议在php侧引入消息队列,把任务拆成小批量逐个提交,这样既不触发限流,也不会因为单次请求时间过长导致php进程超时。
二、php通过cURL调用接口的完整实现
php调用盘古大模型本质上就是发一个带鉴权头的POST请求。华为云的接口鉴权方式比较多,最简单的是使用SDK自动签名,如果不想引入SDK,也可以自己拼接签名头。下面给出一个基于cURL的基础调用示例,使用的是华为云统一身份认证获取token后再请求的方式,这种方式实现简单,适合中小流量场景。
<?php
// 封装一个调用盘古大模型的通用函数
function callPanguModel($prompt, $maxTokens = 2000)
{
$token = getHuaweiToken(); // 获取鉴权token
if ($token === false) {
return ['error' => '获取token失败'];
}
$url = 'https://api-ext.xxx-region.myhuaweicloud.com/v1/infers/xxxx'; // 替换为自己的服务地址
$body = [
'model' => 'pangu-nlp-base',
'messages' => [
[
'role' => 'user',
'content' => $prompt
]
],
'max_tokens' => $maxTokens,
'temperature' => 0.7
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-Auth-Token: ' . $token
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body, JSON_UNESCAPED_UNICODE));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 120); // 大模型生成耗时较长,超时要设够
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode != 200) {
return ['error' => '请求失败,状态码:' . $httpCode, 'body' => $response];
}
$result = json_decode($response, true);
return $result;
}
// 示例:让模型生成一段摘要
$res = callPanguModel('请将以下内容压缩成300字以内的摘要:' . $rawText);
if (!isset($res['error'])) {
echo $res['choices'][0]['message']['content'];
}
?>这段代码里有几个细节需要注意。首先是JSON_UNESCAPED_UNICODE参数,不加的话中文会被转成unicode编码串,部分接口对编码敏感,建议始终带上。其次是CURLOPT_TIMEOUT要设置得宽裕一些,生成一份长报告可能需要几十秒,默认的cURL超时会让请求提前中断。最后是token的缓存问题,token本身有有效期,可以存到Redis里重复使用,避免每次请求都先换取一次token,白白增加几百毫秒的延迟。
如果对时效要求高,还可以用SDK方式。华为云官方提供了多语言SDK,php虽然没有官方重推的版本,但Signature V4签名算法可以自己实现,把签名头拼好后用guzzlehttp发送,代码结构会比原生cURL清晰不少。对于并发量大的场景,建议用Swoole或php-fpm配合连接池来管理请求,减少每次都新建cURL句柄的开销。
三、生成行业报告的提示词设计与结果解析
接口调通之后,报告质量的高低基本取决于提示词怎么写。行业报告通常有固定结构,比如市场概况、竞争格局、发展趋势、风险提示这几个章节。与其让模型自由发挥,不如在提示词里把章节框架和每章的字数要求明确写出来,模型会严格按结构输出,php解析时也方便切分。
<?php
// 构造行业报告生成提示词
function buildReportPrompt($industry, $materials)
{
return <<<EOT
你是一名资深行业分析师。请基于以下资料,撰写一份《{$industry}行业分析报告》,要求:
一、市场概况(300字左右):说明行业规模、增长情况
二、竞争格局(400字左右):列出主要参与者及其优势
三、发展趋势(300字左右):总结未来2到3年的技术与市场方向
四、风险提示(200字左右):指出行业面临的主要不确定因素
语言要求:客观专业,避免夸大表述,数据必须来自给定资料。
参考资料:
{$materials}
EOT;
}
// 解析模型输出并按章节切分
function splitReport($content)
{
$sections = [];
$pattern = '/([一二三四五六])、(.+?)(/';
preg_match_all($pattern, $content, $matches, PREG_OFFSET_CAPTURE);
for ($i = 0; $i < count($matches[0]); $i++) {
$start = $matches[0][$i][1];
$end = ($i + 1 < count($matches[0])) ? $matches[0][$i + 1][1] : strlen($content);
$sections[$matches[2][$i][0]] = substr($content, $start, $end - $start);
}
return $sections;
}
?>拿到分章节的内容后,可以配合PHPWord或者tcpdf这类库把结果渲染成Word或PDF文件,一条从原始资料到成品报告的流水线就打通了。如果原始资料特别长,超过模型单次能处理的token上限,就需要先做分段摘要,再把各段摘要汇总做二次提炼,这种两阶段生成的效果通常比直接截断原文好很多。
最后提一下错误处理。线上环境建议对接口返回做三类容权处理:token过期时自动刷新重试一次,内容审核不通过时把敏感词替换后重新生成,服务端繁忙时按指数退避策略重试。把这些兜底逻辑写进封装函数里,整个集成才算真正稳定可用。
php调用盘古大模型华为云API行业报告生成修改时间:2026-09-09 19:13:00