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

通义千问接入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同名

相关推荐

  1. 测试

    2024-07-10 19:52:05       52 阅读
  2. golang调用阿里接口

    2024-07-10 19:52:05       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 19:52:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 19:52:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 19:52:05       58 阅读
  4. Python语言-面向对象

    2024-07-10 19:52:05       69 阅读

热门阅读

  1. MySQL篇七:复合查询

    2024-07-10 19:52:05       26 阅读
  2. [GDOUCTF 2023]Tea writeup

    2024-07-10 19:52:05       27 阅读
  3. 软件开发C#(Sharp)总结(续)

    2024-07-10 19:52:05       17 阅读
  4. CSS 样式链接的多方面应用与最佳实践

    2024-07-10 19:52:05       22 阅读
  5. 西门子7MB2335-0AL00-3AA1

    2024-07-10 19:52:05       19 阅读
  6. How to Describe Figures in a Research Article

    2024-07-10 19:52:05       17 阅读