还在为调用大模型API接口返回数据的处理问题烦恼???来看看这篇文章,解决你的烦恼!!!

news2024/12/23 20:46:04

大家好!我是学徒小z,今天给大家分享一下我做项目过程中遇到的一个问题。

文章目录

  • 问题
  • 大模型接口
  • 解决方案
    • 流式返回和回调函数
    • 另一个问题
      • 1. 使用web组件
      • 2. 使用第三方库

问题

不知道大家有没有遇到这样一个问题。在调用大模型接口的时,返回的数据总是一大坨,然后再将数据展示再UI界面上,就会显得数据加载很迟钝,用户体验会很不好。那么该如何实现返回的数据可以迅速进行加载并且如同打字一样再UI界面上显示呢?答案就是使用流式返回回调函数来解决这个问题。

在这里插入图片描述

大模型接口

  • 模型:使用的是星火认知大模型
    在这里插入图片描述

  • 使用HTTP协议来进行API接口的访问

  • 大模型接口请求参数举例

    3.2. 请求参数
    {
        "model": "generalv3.5",
        "user": "用户唯一id",
        "messages": [
            {
                "role": "system",
                "content": "你是知识渊博的助理"
            },
            {
                "role": "user",
                "content": "你好,讯飞星火"
            }
        ],
        // 下面是可选参数
        "temperature": 0.5,
        "top_k": 4,
        "stream": false,
        "max_tokens": 1024,
        "presence_penalty": 1,
        "frequency_penalty": 1,
        "tools": [
            {
                "type": "function",
                "function": {
                    "name": "str2int",
                    "description": "将字符串类型转为 int 类型",
                    "parameters": {...} // 需要符合 json schema 格式
                }
            },
            {
                "type": "web_search",
                "web_search": {
                    "enable": true
                }
            }
        ],
        "response_format": {
            "type": "json_object"
        },
        "suppress_plugin": [
            "knowledge"
        ]
    }
    
    参数名称类型是否必传取值范围描述
    modelstringlite generalv3 pro-128k generalv3.5 max-32k 4.0Ultra指定访问的模型版本: lite指向Lite版本; generalv3指向Pro版本; pro-128k指向Pro-128K版本; generalv3.5指向Max版本; max-32k指向Max-32K版本; 4.0Ultra指向4.0 Ultra版本;
    userstring自定义用户的唯一id,表示一个用户,user_123456
    messagesarray输入数组
    messages.rolestringuser assistant system tool角色,user表示用户,assistant表示大模型,system表示命令,tool代表function call执行结果
    messages.contentstring角色对应的文本内容
    temperaturefloat取值范围[0, 2] 默认值1.0核采样阈值
    top_pint取值范围(0, 1] 默认值1生成过程中核采样方法概率阈值,例如,取值为0.8时,仅保留概率加起来大于等于0.8的最可能token的最小集合作为候选集。取值越大,生成的随机性越高;取值越低,生成的确定性越高。
    top_kint取值范围[1, 6] 默认值4从k个中随机选择一个(非等概率)
    presence_penaltyfloat取值范围[-2.0,2.0] 默认0重复词的惩罚值
    frequency_penaltyfloat取值范围[-2.0,2.0] 默认0频率惩罚值
    streambooltrue false是否流式返回结果。默认是false 表示非流式。 如果使用流式,服务端使用SSE的方式推送结果,客户端自己适配处理结果。
    max_tokensintPro、Max、Max-32K、4.0 Ultra 取值为[1,8192],默认为4096; Lite、Pro-128K 取值为[1,4096],默认为4096。模型回答的tokens的最大长度
    response_formatobject指定模型的输出格式
    response_format.typestringtext json_object{ “type”: “json_object” } 指定模型输出json格式 使用 JSON 模式时,请始终指示模型通过对话中的某些消息(例如通过系统或用户消息)生成 JSON
    toolsarray Optionalopenai 新版本参数
    tools.functionobject{“type”:“function”, “function”:{“name”: “my_function”, “description”: “xxx”, “parameters”: {…}}} parameters要符合json schema 描述
    tools.web_searchobject否,默认表示开启{“type”: “web_search”, “web_search”: {“enable”: true}} enable 开关表示是否开启搜索功能,禁用时不会联网搜索, tokens 使用量低
    tool_choicestring or object Optionalauto none required {“type”: “function”, “function”: {“name”: “my_function”}}设置模型自动选择调用的函数: auto:传了tool时默认为auto,模型自动选择调用的函数 none:模型禁用函数调用 required:模型始终选择一个或多个函数进行调用 {“type”: “function”, “function”: {“name”: “my_function”}} :模型强制调用指定函数

解决方案

流式返回和回调函数

  • 调用鸿蒙开发中HTTP中的一个流式返回数据的函数

    on(“dataReceive”)10+

    on(type: “dataReceive”, callback: Callback): void

    订阅HTTP流式响应数据接收事件。

    系统能力:SystemCapability.Communication.NetStack

    参数:

    参数名类型必填说明
    typestring订阅的事件类型,‘dataReceive’。
    callbackAsyncCallback回调函数。
  • 在我的项目中的调用示范代码

  • 基本步骤

    • 初始化了一个空字符串fullContent,用于存储接收到的内容,以及一个httpRequest对象,用于发送HTTP请求。
    • httpRequest对象接收到数据时,会触发dataReceive事件,这里定义了一个事件处理函数,用于处理接收到的数据。
    • 这里创建了一个TextDecoder对象,用于将接收到的ArrayBuffer数据解码为字符串。decodeToStringOptions中的stream: true表示数据是流式传输的。(这里使用的是util工具类中的函数,需要进行导入 import util from ‘@ohos.util’; )
    • 这里将接收到的字符串数据按行分割,然后处理以data:开头的行,这些行包含了服务器发送的JSON数据。解析JSON数据后,如果包含choices字段且不为空,则将其中的内容添加到fullContent中,并调用onUpdate回调函数更新UI(这样就可以实现UI界面数据展示的实时更新)。
    • 这里使用httpRequest对象发送一个POST请求到HttpGet.travelUrl,请求头包含Content-TypeAuthorization,请求体包含一些额外的数据,如modelmax_tokenstop_ktemperaturemessagesmessages是一个包含系统角色和用户内容的数组,用于向服务器请求旅行细节信息。
    • 在请求完成后,无论成功还是失败,都会移除dataReceive事件监听器,并销毁httpRequest对象,释放资源。
    //使用流式请求传输方式
      static async travelDetailGet(context:string, onUpdate: (chunk: string) => void): Promise<string>{
        let fullContent = '';
        let httpRequest = http.createHttp();
        httpRequest.on("dataReceive", (data:ArrayBuffer) => {
          let textDecoderOptions: util.TextDecoderOptions = {
            fatal: false,
            ignoreBOM : true
          }
          let decodeToStringOptions: util.DecodeToStringOptions = {
            stream: true
          }
          let textDecoder = util.TextDecoder.create('utf-8', textDecoderOptions);
          let retStr = textDecoder.decodeToString(new Uint8Array(data), decodeToStringOptions);
    
          const lines = retStr.split('\n');
    
          for (const line of lines)
          {
            if (line.trim().startsWith('data: '))
            {
              const jsonData = line.trim().substring(5);
    
              try {
                const parsedData: StreamResponse2 = JSON.parse(jsonData);
                if (parsedData.choices && parsedData.choices.length > 0)
                {
                  const content = parsedData.choices[0].delta.content;
                  if (content)
                  {
                    fullContent += content;
                    console.log('Received content:', content);
                    onUpdate(content);//调用回调函数,更新UI
                  }
                }
              }catch (e)
              {
                console.log("HttpGet error " + e)
              }
    
            }
          }
        });
    
        try {
          let response = await httpRequest.requestInStream(
            HttpGet.travelUrl,
    
            {
              method: http.RequestMethod.POST,
              header: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${HttpGet.travelPassword}`
              },
              extraData:{
                "model": HttpGet.useTravelModel,
    
                "max_tokens": 1024,
                "top_k": 4,
                "temperature": 0.5,
                "messages": [
                  {
                    "role": "system",
                    "content": "你是一个专业的旅游家。"
                  },
                  {
                    "role": "user",
                    "content": `${context};${this.travelTemplate}`
                  }
                ],
                "stream": true
              }
            }
          );
          console.log("TagTest ", response.toString())
          if (response.toString() === '200') {
            return fullContent;
          } else {
            throw new Error(`HTTP request failed with status ${response.toString()}`);
          }
        }catch (error){
          console.log(error)
        } finally {
          httpRequest.off("dataReceive");
          httpRequest.destroy();
        }
        return "error"
      }
    

另一个问题

  • 在这里不知道大家有没有遇到另一个问题,那就是调用api返回的数据是markdown格式的。那么应该如何处理markdown格式的数据呢

1. 使用web组件

  • 鸿蒙开发支持使用Web组件来展示和处理Markdown格式的数据。Web组件可以嵌入到鸿蒙应用中,通过加载h5页面来解析和渲染Markdown内容。

2. 使用第三方库

  • 鸿蒙开发也可以利用第三方库来处理Markdown格式的数据。
    比如,我是用的就是处理markdown的第三方库lv-markdown-in。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lnmp(mysql分离)(nginx 1.13.6+mysql5.5+php5.3)环境一键搭建

Lnmp&#xff08;mysql分离&#xff09;&#xff08;nginx 1.13.6mysql5.5php5.3&#xff09;环境一键搭建 如果对运维课程感兴趣&#xff0c;可以在b站上、csdn或微信视频号 上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实…

深度学习之残差网络ResNet

文章目录 1. 残差网络定义2. 数学基础函数类3. 残差块4.ResNet模型5.训练模型6.小结 1. 残差网络定义 随着我们设计的网络越来越深&#xff0c;深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力。在这种网络中&#xff0c;添加层会使得网…

单例模式:为何继承无法保证子类的单例特性

这里写目录标题 一、引言二、背景描述三、单例模式的规范边界全局访问点与静态工厂方法代码示例与注意事项 四、单例实现继承遇到的问题五、结论与替代方案结论替代方案特殊的想法&#x1f338;&#x1f338;源码阶段验证编译阶段验证运行阶段验证总结 一、引言 在软件设计中&a…

实时语音转文字(基于NAudio+Whisper+VOSP+Websocket)

今天花了大半天时间研究一个实时语音转文字的程序&#xff0c;目的还包括能够唤醒服务&#xff0c;并把命令提供给第三方。 由于这方面的材料已经很多&#xff0c;我就只把过程中遇到的和解决方案简单说下。源代码开源在AudioWhisper: 实时语音转文字(基于NAudioWhisperVOSPWe…

基于SSM的个性化商铺系统【附源码】

基于SSM的个性化商铺系统 效果如下&#xff1a; 用户登录界面 app首页界面 商品信息界面 店铺信息界面 用户功能界面 我的订单界面 后台登录界面 管理员功能界面 用户管理界面 商家管理界面 店铺信息管理界面 商家功能界面 个人中心界面 研究背景 研究背景 科学技术日新月异…

Leetcode 每日温度

class Solution {public int[] dailyTemperatures(int[] temperatures) {int n temperatures.length;Stack<Integer> stack new Stack<>();//默认将数组中的所有元素初始化为 0int[] results new int[n];for(int i 0; i < n; i) {while(!stack.isEmpty() &a…

leaflet前端JS实现高德地图POI兴趣点批量分类下载(附源码下载)

前言 leaflet 入门开发系列环境知识点了解&#xff1a; leaflet api文档介绍&#xff0c;详细介绍 leaflet 每个类的函数以及属性等等leaflet 在线例子leaflet 插件&#xff0c;leaflet 的插件库&#xff0c;非常有用 内容概览 leaflet前端JS实现高德地图POI兴趣点批量分类下载…

小猿口算炸鱼脚本

目录 写在前面&#xff1a; 一、关于小猿口算&#xff1a; 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享&#xff1a; 补充&#xff1a;软件包下载 写在前面&#xff1a; 最近小猿口算已经被不少大学生攻占&#xff0c;小学生直呼有挂。原本是以为大学生都打着本…

【Python爬虫】看电影还在用VIP?一个python代码让你实现电影自由!附源码

今日主题 如何用Python解析vip电影。 什么是vip电影&#xff1f; 这些vip电影啊&#xff0c;想要观看的话&#xff0c;必须充值会员&#xff0c;否则没法看。 比如这个&#xff1a; 这些vip电影解析后呢&#xff1f; 不需要会员&#xff0c;不需要登录&#xff0c;可以直接…

Java-类与对象

一、面向对象 在了解类与对象前&#xff0c;我们需要先知道"面向对象"这个词的概念&#xff1a; 在Java语言中&#xff0c;我们的主要思想就是"面向对象"&#xff0c;而在之前我们所学习的C语言中大部分时候的思想是"面向过程"。 那么什么是&…

MySQL-10.DML-添加数据insert

一.DML(INSERT) -- DDL&#xff1a;数据操作语言 -- DML&#xff1a;插入数据 - insert -- 1.为tb_emp表的username&#xff0c;name&#xff0c;gender字段插入值 insert into tb_emp (username,name,gender) values (wuji,无忌,1); -- 这样会报错&#xff0c;因为create_ti…

DS堆的实际应用(10)

文章目录 前言一、堆排序建堆排序 二、TopK问题原理实战创建一个有一万个数的文件读取文件并将前k个数据创建小堆用剩余的N-K个元素依次与堆顶元素来比较将前k个数据打印出来并关闭文件 测试 三、堆的相关习题总结 前言 学完了堆这个数据结构的概念和特性后&#xff0c;我们来看…

限时设计ui

ctrl-------放大缩小 空格-----画面移动 alt------复制 页面<画板<图层 添加交互事件 原型 点击蓝色的圆&#xff0c;从1跳转到2 点击绿色的圆&#xff0c;从2跳转到1

基于SSM+Vue+MySQL的健身房管理系统

系统展示 系统背景 随着人们生活水平的提高和健康意识的增强&#xff0c;越来越多的人选择去健身房锻炼。传统的健身房管理方式往往依赖于纸质记录和人工操作&#xff0c;这种方式不仅效率低下&#xff0c;而且容易出错。为了提高健身房的管理效率和服务质量&#xff0c;开发一…

python项目实战——下载美女图片

python项目实战——下载美女图片 文章目录 python项目实战——下载美女图片完整代码思路整理实现过程使用xpath语法找图片的链接检查链接是否正确下载图片创建文件夹获取一组图片的链接获取页数 获取目录页的链接 完善代码注意事项 完整代码 import requests import re import…

图文检索综述(2):Deep Multimodal Data Fusion

Deep Multimodal Data Fusion 摘要1 引言2 基于编码器-解码器融合2.1 数据级别融合2.2 分层特征融合2.3 决策级别融合 3 基于注意力融合3.1 模态内的自注意力3.2 模态间的交叉注意力3.3 基于transformer的方法 4 基于图神经网络融合4.1 单个模态的表示学习4.2 融合数据的表示学…

【数据结构】宜宾大学-计院-实验三

线性表的应用——实现两多项式的相加 课前准备&#xff1a;实验学时&#xff1a;2实验目的&#xff1a;实验内容&#xff1a;实验结果&#xff1a;实验报告:&#xff08;及时撰写实验报告&#xff09;实验测试结果&#xff1a;代码实现&#xff1a;&#xff08;C/C&#xff09;…

Java 小游戏《超级马里奥》

文章目录 一、效果展示二、代码编写1. 素材准备2. 创建窗口类3. 创建常量类4. 创建动作类5. 创建关卡类6. 创建障碍物类7. 创建马里奥类8. 编写程序入口 一、效果展示 二、代码编写 1. 素材准备 首先创建一个基本的 java 项目&#xff0c;并将本游戏需要用到的图片素材 image…

华为 HCIP-Datacom H12-821 题库 (38)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.请对 2001:0DB8:0000:C030:0000:0000:09A0:CDEF 地址进行压缩。&#xff08; &#xff09;&…

阻塞I/O与非阻塞I/O

目录 一、基本概念 二、阻塞I/O的实现机制 —— 等待队列 一、基本概念 阻塞&#xff1a;在执行单元进行操作时&#xff0c;如果不能获得申请的资源&#xff0c;则执行单元挂起直至资源可用后再进行操作。 非阻塞&#xff1a;在执行单元进行操作时&#xff0c;如果不能获得申…