文档首页/ 华为云Astro轻应用/ 最佳实践/ 智能化专项/ 在华为云Astro轻应用中调用流式报文接口实现智能助手聊天对话
更新时间:2025-08-14 GMT+08:00
分享

在华为云Astro轻应用中调用流式报文接口实现智能助手聊天对话

应用场景

开发者使用华为云Astro轻应用开发标准页面时,如果需要通过智能助手组件或其他组件对接外部大模型接口,可以直接在脚本或自定义连接器中配置对大模型接口的调用,支持以流式报文的形式获取大模型接口的返回值。最终在组件中,可实时接收接口返回信息,用户无需等待接口完成全部数据传输即可查看返回数据。

流式报文是指在数据传输过程中,数据不是一次性全部传输完毕,而是以流的形式逐步传输。

本实践将为您介绍,如何在脚本中调用大数据模型接口,实现在应用中接入大数据模型能力,开发AI应用。

方案优势

通过对大模型接口流式报文的支持,增强了智能助手等AI对话组件中调用大模型接口的页面会话体验。用户能够实时获得大模型接口的输出,实现流畅的AI对话。

约束与限制

表1 约束与限制说明

限制类别

具体限制

脚本中参数限制

通过脚本直接调用SSE协议的URL时,需要传入参数“isStream:true”,否则不会走流式的处理逻辑。

连接器配置中动作的限制

动作中的返回类型必须设置为text/event-stream,否则自定义连接器的执行逻辑不会走流式的处理逻辑。

开放接口中参数的限制

如果使用开放接口调用SSE协议的脚本,需要将接口信息中的API类型配置为STREAM(默认是REST),同时URL的前缀应该为/service-stream(会根据api类型自动显示),否则不会走流式的处理逻辑,接口执行会报错。

操作流程

在华为云Astro轻应用中,通过调用流式报文接口实现智能对话的流程,如图1所示。

图1 调用流式报文接口实现智能对话操作流程

步骤一:在华为云Astro轻应用中对接大模型接口

在华为云Astro轻应用中,提供了脚本自定义连接器两种方式来对接大模型接口,请根据具体需求和实际情况进行选择。

步骤二:调用流式报文接口实现智能对话

创建一个标准页面,并拖入一个智能助手组件,通过脚本调用流式报文接口实现智能对话。

  1. 在应用设计器的左侧导航栏中,选择“界面”
  2. 单击页面后的“+”,创建一个空白页面的标准页面。

    图21 设置标准页面基本信息
    表10 标准页面参数说明

    参数

    说明

    示例

    标签

    输入标准页面的标签名,用于在页面显示,创建后可修改。

    取值范围:1~64个字符。

    流式页面

    名称

    输入标准页面的名称,名称是标准页面在系统中的唯一标识,创建后不可修改。命名要求如下:

    • 长度不能超过64个字符,包括前缀命名空间的长度。

      名称前的内容为命名空间,在华为云Astro轻应用中为了避免不同租户间数据的重名,租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间,创建后不支持修改。

    • 必须以英文字母开头,只能由英文字母、数字或单下划线组成,且不能以下划线结尾。

    streampage

  3. 基本组件 > 智能化中,拖拽“智能助手”组件到右侧画布中。

    图22 添加智能助手组件

  4. 为组件绑定模型,用于存储智能助手响应的数据。

    1. 选中智能助手组件,在属性 > 数据绑定 > 值绑定中,单击,进入模型选择页面。
      图23 单击设置按钮图标
    2. 单击“新增模型”,输入模型名称(如message)、“来源”选择“自定义”,单击“下一步”
      图24 新增模型message
    3. 自定义模型字段保持不变,单击“下一步”。
    4. 方法保持不变,单击“确定”,返回选择模型页面。
    5. 选中已创建的模型,单击“确定”,返回标准页面设计页面,可查看到组件已绑定模型。
      图25 选中已创建的message模型
      图26 组件绑定模型效果

  5. 为智能助手组件添加事件。

    1. 选中智能助手组件,在“事件”页签,单击“发送事件”后的“+”
    2. 在自定义动作中,输入如下示例,单击“创建”
      const _component = context.$component.current;
      // 获取界面聊天框输入的信息
      const messages = _component.getMessages();
      // 判断接口返回值是否为JSON,流式接口的返回值不是可解析的JSON格式,需要特殊处理,所以这里填false
      const isJson = false;
      // 通过脚本名,传入脚本入参,执行脚本。这里的messages是所有界面聊天框已输入信息的集合,最后一位为最新发送的消息
      var _script = context.script('命名空间__streamScript').run({ inputParam: messages[messages.length -1].content }, isJson).then(async resp => {
          // 创建一个可读流
          const reader = resp.body.getReader();
          const decoder = new TextDecoder();
          // 循环调用流式接口的返回值
          while (true) {
              const { done, value } = await reader.read();
              // 流式接口的返回值,每次返回都会有done字段判断流是否发送结束
              if (done) {            
                  // 当前组件
                  var _component = context.$component.current;    
                  _component.closeLoading();    
                  return;
              }
              const chunk = decoder.decode(value);
              const data = chunk.split('\n').filter(n => n).map(item => {
                  try {
                      // 流式接口的返回值,会以data:xxx的格式返回,输出到页面时,需要将data:去除
                      return JSON.parse(item.replaceAll('data:', '')).content;
                  } 
              })
              data.forEach(item => {
                  $model.ref('message').setData(item)
              })
          }
      })

      其中,“命名空间__streamScript”通过脚本对接大模型接口中创建脚本的名称,“message”4.b中创建模型的名称。

      如果6中使用的是通过服务编排调用自定义连接器的方式,此处请输入如下事件代码。其中,“streamFlow”6.b中创建服务编排的名称,“message”6.e中新建的变量。

      const _component = context.$component.current;
      // 获取界面聊天框输入的信息
      const messages = _component.getMessages();
      // 判断接口返回值是否为JSON,流式接口的返回值不是可解析的JSON格式,需要特殊处理,所以这里填false
      
      // 初始化Flow
      var _flow = context.flow(" {{ flowName }}");
      // 适用于一次调用,Flow即完成的场景
      // 运行Flow
      _flow.run({ inputParam: messages[messages.length - 1].content }).then(function (resp) {
           // 创建一个可读流
          const reader = resp.body.getReader();
          const decoder = new TextDecoder();
          // 循环调用流式接口的返回值
          while (true) {
              const { done, value } = await reader.read();
              // 流式接口的返回值,每次返回都会有done字段判断流是否发送结束
              if (done) {            
                  // 当前组件
                  var _component = context.$component.current;    
                  _component.closeLoading();    
                  return;
              }
              const chunk = decoder.decode(value);
              const data = chunk.split('\n').filter(n => n).map(item => {
                  try {
                      // 流式接口的返回值,会以data:xxx的格式返回,输出到页面时,需要将data:去除
                      return JSON.parse(item.replaceAll('data:', '')).content;
                  } 
              })
              data.forEach(item => {
                  $model.ref('message').setData(item)
              })
          }
      })

  6. 设计完成后,单击页面上方的,保存标准页面。

步骤三:验证智能助手是否流式输出

  1. 在已创建的标准页面中,单击,进入预览页面。

    图27 标准页面预览页面

  2. 在智能助手的聊天框中,输入文字,例如“我想创建一个差旅管理应用”,单击“发送”

    智能助手返回如下流式结果,表明智能助手组件对接外部大模型接口成功。
    图28 智能助手响应效果

相关文档