通义千问接入进阶:流式、文件、图片、上下文

通义千问接入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 和通义千问一样的流式对话

并且支持上下文问答文件问答图片问答等操作

– 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我码玄黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值