通义千问接入SSE
接入流式对话
、上下文对话
、图片对话
、文件对话
上篇文章有很多小伙伴再问:开启了流式(SSE)
如何以API
的形式返回数据呢?
这篇文章就来给大家解惑。
实现过程
如何生成key和模型类型请翻找之前的文章,这里就不一一讲述了,直接上代码
流式问答 上下文问答 千问long文件问答
php 代码封装
/** * qwlong流式输出 * @param $message * @param $fileId * @return void */ public function dashChat($message, $fileId=null, $messageList=null) { try { $api_key = env("QwLongKey","输入自己的key"); $url = env("QwLongUrl") ?? 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions'; $data = [ 'model' => 'qwen-long', 'messages' => [ [ 'role' => 'system', 'content' => 'You are a helpful assistant.' ], ], 'stream' => true ]; //可以根据逻辑传入上下文问答 if ($messageList) { foreach ($messageList as $val){ if ($val->type == 2){ $data['messages'][] = [ 'role' => 'system', 'content' => 'fileid://' . $val->file_id ]; } else { $data['messages'][] = [ 'role' => 'user', 'content' => $val->question ]; $data['messages'][] = [ 'role' => 'assistant', 'content' => $val->answer ]; } } } //文件回答 需要先把文件传到阿里云接口 将返回的文件id传入即可 if ($fileId) { $data['messages'][] = [ 'role' => 'system', 'content' => 'fileid://' . $fileId ]; } $data['messages'][] = [ 'role' => 'user', 'content' => $message ]; // 创建一个变量来存储流式传输的数据 $response = ''; $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $api_key, 'Content-Type: application/json' ]); curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($curl, $data) use (&$response) { //$resData = json_decode($data); $result = processStreamedData($data); $response .= $result; //流式信息打印 echo $result; ob_flush(); flush(); return strlen($data); }); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 执行请求 $success = curl_exec($ch); // 检查是否有错误发生 if (!$success) { echo "data: {\"error\": \"" . curl_error($ch) . "\"}\n\n"; ob_flush(); flush(); } curl_close($ch); return $response; } catch (\Exception $exception) { echo "data: {\"error\": \"服务器错误: " . $exception->getMessage() . "\"}\n\n"; ob_flush(); flush(); } }
流式信息返回
public function gainFlow(Request $request) { $response = new StreamedResponse(function (){ //发起会话 $result = $this->dashChat('输入需要提问的问题'); }); //设置流式返回的header头 $response->headers->set('Content-Type', 'text/event-stream'); $response->headers->set('Cache-Control', 'no-cache'); $response->headers->set('Connection', 'keep-alive'); $response->headers->set('X-Accel-Buffering', 'no'); return $response; }
这样我们就实现流式回答
返回结果截图
结论
根据上文可以实现类似于 chatgpt
和通义千问一样的流式对话
。
并且支持上下文问答
,文件问答
,图片问答
等操作