当前位置: 首页 > news >正文

php调用大模型应用接口实现流式输出以及数据过滤

最近开发智能客服,需要用php调用已有的大模型应用接口流式输出+vue前端调用打字机效果展示。这里整理了php调用大模型流式输出+业务过滤等的核心实现部分,分享给大家。

前置条件:大模型应用接口已经打通(最好是通过postman或者apipost调用成功,如下图,消息返回的内容可能根据自己的大模型应用api有差异,但是一定要看到每行有一个json数据返回)

php7.0 以上的版本,调用方式如下:

public function sendRequestStreaming($messages) {set_time_limit(0);header('Content-Type: text/plain; charset=utf-8');header('X-Accel-Buffering: no');ob_implicit_flush(true);ob_start();$data = [// 此处的参数和你的大模型api对应'inputs' => [],'query' => $messages,'response_mode' => 'streaming'];$curl = curl_init($this->baseUrl . 'chat-messages'); // 注意地址改成你自己的大模型api地址curl_setopt($curl, CURLOPT_POST, true);curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));$header = ['Content-Type: application/json','Authorization: Bearer ' . $this->apiKey, // 注意改成你的大模型的apiKey'Accept: text/event-stream'];curl_setopt($curl, CURLOPT_HTTPHEADER, $header);curl_setopt($curl, CURLOPT_TIMEOUT, 0); // 永不超时curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); // 禁止直接输出到变量// 全局变量用于跨回调保留状态(如未处理完的缓冲)$buffer = '';curl_setopt($curl, CURLOPT_WRITEFUNCTION, function ($curl, $data) {global $buffer;// 合并缓冲(处理跨块数据)$buffer .= $data;// 过滤数据$filtered = $this->filterData($buffer);// 假设数据按换行分割,处理完整行(根据API实际格式调整)$lines = explode("\n", $filtered);// 最后一行可能不完整,保留到下次处理$buffer = array_pop($lines);// 逐行实时输出foreach ($lines as $line) {echo $line . "\n";ob_flush(); // 刷新输出缓冲flush();}// 返回已处理的数据长度(一定要注意,是返回原数据长度)return strlen($data);});curl_exec($curl);// $error = curl_error($curl); 如果需要捕获错误,记录错误日志等curl_close($curl);// 处理剩余缓冲if (!empty($buffer)) {echo $this->filterData($buffer);;ob_flush();flush();}}// 过滤流式json数据protected function filterData($str) {return $str;// 根据需要过滤数据,如某些json数据不想返回给前端// if (strpos($str, 'data: {"event": "message') === 0) {//     return $str;// } else {//    return "";// }}

以上的方法实现了php调用大模型流式输出,可根据自己的需求修改。

注意:CURLOPT_WRITEFUNCTION内部末尾的return是源数据长度,不要自作聪明改成处理后的新数据长度。


http://www.mrgr.cn/news/97563.html

相关文章:

  • 原子操作(cpp atomic)
  • UE4初学笔记
  • Vue3+Vite+TypeScript+Element Plus开发-06.Header响应式菜单缩展
  • 2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp
  • C++第14届蓝桥杯b组学习笔记
  • xv6-labs-2024 lab2
  • 深入解析嵌入式Linux系统架构:从Bootloader到用户空间 - 结合B站视频教学
  • 【Android Audio】Parameter Framework - pfw
  • LeetCode 解题思路 33(Hot 100)
  • JavaScript基础--20-JavaScript 预编译机制深度解析
  • 【CPP】内存泄漏详解
  • Ollama
  • spring boot + Prometheus + Grafana 实现项目监控
  • Android 学习之 Navigation导航
  • PyTorch 笔记
  • 考研单词笔记 2025.04.07
  • 分割回文串 复原IP地址(Java)
  • 深入理解PCA降维:原理、实现与应用
  • Proteus vs Multisim:电路设计与仿真软件对比
  • Java 三大特性—多态