当前位置: 首页 > news >正文

国产ToolLLM的课代表---OpenBMB机构(清华NLP)旗下ToolBench的安装部署与运行(附各种填坑说明)

ToolBench项目可以理解为一个能直接提供训练ToolLLM的平台,该平台同时构建了ToolLLM的一个开源训练指令集。,该项目是OpenBMB机构(面壁智能与清华NLP联合成立)旗下的一款产品,OpenBMB机构名下还同时拥有另外一款明星产品–XAgent。

ToolBench的简介

该项目旨在构建开源、大规模、高质量的指令调整 SFT 数据,以促进构建具有通用工具使用能力的强大LLMs。其目标是赋予开源 LLMs 掌握成千上万多样的真实世界API能力。项目通过收集高质量的指令调整数据集来实现这一目标。该数据集使用最新的ChatGPT(gpt-3.5-turbo-16k)自动构建,该版本升级了增强的函数调用功能。
与此同时,通过项目提供的数据集、相应的训练和评估脚本,可以得到ToolBench上经过微调的一个强大的工具调用模型ToolLLaMA。

项目数据集的构建

以下是数据集构建方法、模型训练、推理模式的整体概览
在这里插入图片描述

产品自身特点

API收集: 项目从 RapidAPI 收集了 16464 个API。RapidAPI 是一个托管开发者提供的大规模真实世界API的平台。

指令生成: 项目生成了涉及单工具和多工具场景的指令。

回答标注: 项目设计了一种新颖的深度优先搜索决策树方法(DFSDT),以增强LLMs的规划和推理能力。这显著提高了标注效率,并成功地对那些不能用CoT或ReACT回答的复杂指令进行了标注。项目提供的回答不仅包括最终答案,还包括模型的推理过程、工具执行和工具执行结果。

API Retriever: 项目整合了API检索模块,为ToolLLaMA提供了开放域的工具使用能力。

数据生成:所有数据均由OpenAI API自动生成并由项目组筛选,整个数据创建过程易于扩展。

各类ToolLLM训练数据集的对比
ToolLLaMA已经达到了和ChatGPT(turbo-16k)接近的工具使用能力,未来我们将不断进行数据的后处理与清洗,以提高数据质量并增加真实世界工具的覆盖范围。
ToolLLaMA的可用性与其他主流LLM对比

产品的FT(FineTuning)

该项目提供了ToolLLaMA的FT方法,本篇不做更多介绍,又兴趣的同学可以到这里查看其具体流程

ToolBench的安装

Clone项目

克隆这个仓库并进入ToolBench文件夹。

git clone git@github.com:OpenBMB/ToolBench.git
cd ToolBench

申请项目方的ToolbenchKey

因为项目方自建了RapidAPI的服务,可以向项目方申请使用该RapidAPI服务进行推理。
请点击这里填写问卷,大概2个工作日内,工作人员会给你ToolBench项目方给您发送toolbench key。然后初始化您的toolbench key:

export TOOLBENCH_KEY="your_toolbench_key"

当然,您也可以使用自己私有的RapidAPI Account进行推理,具体操作可以看这里

ToolBench 的设置与启动

ToolBench运行环境是要求Python>=3.9,此处我们用了Python3.10,为防止环境间的干扰,使用了Conda,Conda的安装配置可以自行百度解决,要注意下载2023年的版本,能够支持到3.10才可以

# 新创建toolbench_env环境,使用python3.10
conda create -n toolbench_env python=3.10 -y# 查看已建立的所有的虚拟环境
conda env list
# conda environments:
#
# base                  *  /root/anaconda3
# py310                    /root/anaconda3/envs/py310
# toolbench_env            /root/anaconda3/envs/toolbench_env# 切换到toolbench_env
conda active toolbench_env# 在Toolbench的根目录下执行以下命令安装依赖包
pip install -r requirements.txt

DataSet的下载

推理时会需要一些预设的数据(其实,大部分数据时训练ToolLLaMA模型所使用的),可以到 Tsinghua Cloud.这个地方去下载
下载的数据解压后,就在项目目录的data文件夹下,400M大小,其数据的目录格式如下

├── /data/
│  ├── /instruction/
│  ├── /answer/
│  ├── /toolenv/
│  ├── /retrieval/
│  ├── /test_instruction/
│  ├── /test_query_ids/
│  ├── /retrieval_test_query_ids/
│  ├── toolllama_G123_dfs_train.json
│  └── toolllama_G123_dfs_eval.json
├── /reproduction_data/
│  ├── /chatgpt_cot/
│  ├── /chatgpt_dfs/
│  ├── ...
│  └── /toolllama_dfs/

ToolBench的python应用推理

运行推理时,可以使用项目方已经训练完毕的ToolLLaMA版本,也可以使用OpenAI的key来调用GPT3.5或GPT4.0服务。

使用项目方的ToolLLaMA

项目方已经训练的ToolLLaMA版本已升级到ToolLLaMA-2-7b-v2,其模型利用了Toolbench项目的数据集,经由LLaMA-2-7b微调而来, 可免费下载使用。

抱抱脸那边时常连接不太稳定,而且,当前的ToolLLaMA-2-7b-v2模型文件的总和已经到达20G+,连接外网不方便或机器资源不那么充裕的,大概率会被劝退,这时可以使用OpenAI的Key来试试效果~~

使用OpenAI的key

  1. 用rapidAPI作答

将您的OPENAI_KEY设定后,使用以下代码运行(官方的指引直接跑不起来,请使用我的这个命令)

export TOOLBENCH_KEY=""
export OPENAI_KEY=""
export PYTHONPATH=./
python toolbench/inference/qa_pipeline.py \--tool_root_dir data/toolenv/tools/ \--backbone_model chatgpt_function \--openai_key $OPENAI_KEY \--max_observation_length 1024 \--method DFS_woFilter_w2 \--input_query_file data/test_instruction/G1_instruction.json \--output_answer_file chatgpt_dfs_inference_result/qa_answer \--toolbench_key $TOOLBENCH_KEY

注意的坑:如果代码提示有说OpenAI版本过高的问题,可以直接运行以下命令,将openai包还原到1.00以下

pip install openai==0.28.0

执行以上的命令时,会解析ata/test_instruction/G1_instruction.json文件的请求,然后进行响应,这个文件如果不做任何编辑,猜想应该会把里面的所有Task都跑一遍,我还是很心疼自己的美刀,于是只留出一个看看效果就行了,G1_instruction.json文件裁剪后的内容如下:

[{"api_list": [{"category_name": "Food","tool_name": "Nutrition by API-Ninjas","api_name": "/v1/nutrition","api_description": "API Ninjas Nutrition API endpoint.","required_parameters": [{"name": "query","type": "STRING","description": "Query text to extract nutrition information (e.g. **bacon and 3 eggs**).","default": "1lb brisket with fries"}],"optional_parameters": [],"method": "GET","template_response": {"name": "str","calories": "float","serving_size_g": "float","fat_total_g": "float","fat_saturated_g": "float","protein_g": "float","sodium_mg": "int","potassium_mg": "int","cholesterol_mg": "int","carbohydrates_total_g": "float","fiber_g": "float","sugar_g": "float"}}],"query": "I'm planning a family dinner and I need to know the nutrition information for a recipe. Can you extract the nutrition data for a dish that includes 2 pounds of chicken, 1 cup of rice, and 3 tablespoons of olive oil?","relevant APIs": [["Nutrition by API-Ninjas","/v1/nutrition"]],"query_id": 88193}
]

上面那个文件的示例,其实也就是要问这句话:

I’m planning a family dinner and I need to know the nutrition information for a recipe.
Can you extract the nutrition data for a dish that includes 2 pounds of chicken, 1 cup of rice, and 3 tablespoons of olive oil?

如果运行成功,可以看到输出的内容如下:

[process(0)]now playing I'm planning a family dinner and I need to know the nutrition information for a recipe. Can you extract the nutrition data for a dish that includes 2 pounds of chicken, 1 cup of rice, and 3 tablespoons of olive oil?, with 2 APIs
[process(0)]total tokens: 698
Action: v1_nutrition_for_nutrition_by_api_ninjas
query to Food-->nutrition_by_api_ninjas-->v1_nutrition_for_nutrition_by_api_ninjas
Action Input: {"query": "2 pounds of chicken, 1 cup of rice, and 3 tablespoons of olive oil"
}
Observation: {"error": "", "response": "[{'name': 'chicken', 'calories': 2019.8, 'serving_size_g': 907.184, 'fat_total_g': 117.0, 'fat_saturated_g': 33.2, 'protein_g': 215.3, 'sodium_mg': 655, 'potassium_mg': 1625, 'cholesterol_mg': 835, 'carbohydrates_total_g': 0.4, 'fiber_g': 0.0, 'sugar_g': 0.0}, {'name': 'rice', 'calories': 201.3, 'serving_size_g': 158.0, 'fat_total_g': 0.4, 'fat_saturated_g': 0.1, 'protein_g': 4.2, 'sodium_mg': 1, 'potassium_mg': 67, 'cholesterol_mg': 0, 'carbohydrates_total_g': 44.9, 'fiber_g': 0.6, 'sugar_g': 0.1}, {'name': 'olive oil', 'calories': 352.0, 'serving_size_g': 40.5, 'fat_total_g': 41.0, 'fat_saturated_g': 5.6, 'protein_g': 0.0, 'sodium_mg': 0, 'potassium_mg': 0, 'cholesterol_mg': 0, 'carbohydrates_total_g': 0.0, 'fiber_g': 0.0, 'sugar_g': 0.0}]"}
[process(0)]total tokens: 1405
Action: Finish
Action Input: {"return_type": "give_answer","final_answer": "The nutrition information for the dish is as follows:\n- Chicken:\n  - Calories: 2019.8\n  - Fat: 117g\n  - Saturated Fat: 33.2g\n  - Protein: 215.3g\n  - Sodium: 655mg\n  - Potassium: 1625mg\n  - Cholesterol: 835mg\n  - Carbohydrates: 0.4g\n  - Fiber: 0g\n  - Sugar: 0g\n- Rice:\n  - Calories: 201.3\n  - Fat: 0.4g\n  - Saturated Fat: 0.1g\n  - Protein: 4.2g\n  - Sodium: 1mg\n  - Potassium: 67mg\n  - Cholesterol: 0mg\n  - Carbohydrates: 44.9g\n  - Fiber: 0.6g\n  - Sugar: 0.1g\n- Olive Oil:\n  - Calories: 352\n  - Fat: 41g\n  - Saturated Fat: 5.6g\n  - Protein: 0g\n  - Sodium: 0mg\n  - Potassium: 0mg\n  - Cholesterol: 0mg\n  - Carbohydrates: 0g\n  - Fiber: 0g\n  - Sugar: 0g"
}
Observation: {"response":"successfully giving the final answer."}
[process(0)]valid=True

另外,以上命令成功运行后,就会在chatgpt_dfs_inference_result/qa_answer文件夹中生成回复文件,再次运行同样的命令不会再重新生成gpt请求,除非将应答文件手动删除。

  1. 用customAPI作答
    这种方式,其开源项目地址已有描述,可以参照这里
    需要注意的坑:
    第一, API描述的json文件中,tool_name字段名要和文件名保持一致,是不是一定英文没有验证过
    第二,json描述文件的位置要在data/toolenv/tools/目录下面,且要新建文件夹,文件夹的名字不一定非要是’Customized’,但位置不能变,因为所有tools的白名单都是从data/toolenv/tools/目录获取的

后端:server启动

正常提供服务时,我们还是需要把各个可执行命令转化为server服务,方便进行连续测试,以下则是server启动的操作方法(此处用的还是openai key,如果你想使用ToolLLaMA来启动,请参照github上的说明):

export TOOLBENCH_KEY="your toolbench key is applied from ToolBench platform"
export OPENAI_KEY="your OpenAI key"
export PYTHONPATH=./# 该条命令能够启动Toolbenchserver,不过目前官方的server启动模式还尚未能完全兼容gpt的指令,
# 在前端发出指令后,其响应的代码逻辑仍存在问题.
# 查看了一下源码,应该是toolbench_server.py代码中定义data_dict = { "query": user_input},这个对象的包装缺少api_tools的相关定义,
# 其缺失的代码逻辑需要补足后才能正常工作(本来是打算server启动后再来hack代码尝试的,发现可能需要不少变动甚至重构,还没有成型的解决方案)
python toolbench/inference/toolbench_server.py \--corpus_tsv_path data/retrieval/G1/corpus.tsv \--retrieved_api_nums 5 \--tool_root_dir data/toolenv/tools/ \--backbone_model chatgpt_function \--openai_key $OPENAI_KEY \--max_observation_length 1024 \--method DFS_woFilter_w2 \--input_query_file data/test_instruction/G1_instruction.json \--output_answer_file chatgpt_dfs_inference_result/server_answer \--toolbench_key $TOOLBENCH_KEY

注意的坑:以上使用openai key的方式启动,如果有关于model path的错误爆出时,可以将toolbench\inference\toolbench_server.py的部分代码进行变动以绕过。

# 在class Model初始化的那部分代码中变动以下内容:
print("Loading retriever...")# 注释下面这句,然后将retriever赋None值,因为使用chatgpt_function时,不会使用retriever相关代码
# self.retriever = self.pipeline.get_retriever()        self.retriever = None

正常启动后,可以看到以下提示:

Server ready* Serving Flask app 'toolbench_server'* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:5000* Running on http://10.0.0.11:5000
Press CTRL+C to quit

前端:chatbot-ui-toolllama

ToolBench 项目和一个基于ChatBotUi的Web UI项目可以搭配使用, 以用于后端的Tools调用。

# 本地运行chatbot-ui-toolllama的步骤
git clone https://github.com/lilbillybiscuit/chatbot-ui-toolllama
cd chatbot-ui-toolllama
# 此处运行前请先通过nvm来快速安装node v18版本
npm install
npm run dev

运行之后,你能看到以下提示:

> ai-chatbot-starter@0.1.0 dev
> next devready - started server on 0.0.0.0:3000, url: http://localhost:3000
Attention: Next.js now collects completely anonymous telemetry regarding usage.
This information is used to shape Next.js' roadmap and prioritize features.
You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
https://nextjs.org/telemetryevent - compiled client and server successfully in 4.3s (273 modules)
wait  - compiling...
event - compiled successfully in 302 ms (233 modules)

*注意的坑:*如果碰到以下错误信息:

showAll: args["--show-all"] ?? false,
syntaxError: Unexpected token '?'

上面的错误提示,意味着你的node环境是不是 v18版本,可以用nvm install v18来安装该环境

nvm install v18
# 根据nvm所安装的版本,把node版本切换到v18
nvm use v18.19.0
# 将v18更改为默认node版本
nvm alias default v18.19.0

启动后,访问http://localhost:3000就能打开一个类似chatgpt的聊天页面,和下面这个应该相似(借官网的一用)。这是部署了ToolbenchLLaMA的应答效果,但那个model实在是大,暂时手上没有闲置的GPU机器,自己改造了后台GPT直连,只是将python单应用跑通,了解下这个项目的应用潜力和设计思路,本人尚未将server的gpt模式和前台的联动代码调通,有兴趣的同学可以继续尝试哈。
在这里插入图片描述

相关文章:

国产ToolLLM的课代表---OpenBMB机构(清华NLP)旗下ToolBench的安装部署与运行(附各种填坑说明)

ToolBench项目可以理解为一个能直接提供训练ToolLLM的平台,该平台同时构建了ToolLLM的一个开源训练指令集。,该项目是OpenBMB机构(面壁智能与清华NLP联合成立)旗下的一款产品,OpenBMB机构名下还同时拥有另外一款明星产…...

串口通信(5)-C#串口通信数据接收不完整解决方案

本文讲解C#串口通信数据接收不完整解决方案。 目录 一、概述 二、Modbus RTU介绍 三、解决思路 四、实例 一、概述 串口处理接收数据是串口程序编写的关键...

大数据分析岗是干什么的?

大数据分析岗主要负责从大规模数据集中提取、整理、分析和解释有关业务、市场或其他相关领域的信息的职位。 主要的职责和工作内容如下: 1. 数据收集和整理 收集各种数据源(包括结构化、非结构化和半结构化数据),并将其整理成可…...

hadoop运行jar遇到的一个报错

报错信息: 2023-12-19 14:28:25,893 INFO mapreduce.Job: Job job_1702967272525_0001 failed with state FAILED due to: Application application_1702967272525_0001 failed 2 times due to AM Container for appattempt_1702967272525_0001_000002 exited with…...

长短期记忆(LSTM)神经网络-多输入分类

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分程序: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…...

开启创意之旅:免费、开源的噪波贴图(noise texture)生成网站——noisecreater.com详细介绍

在当今数字创意领域,噪波贴图(Noise Texture)是游戏渲染、游戏开发、美术设计以及影视制作等行业不可或缺的艺术素材之一。为了满足广大创作者的需求,noisecreater.com应运而生,成为一款免费、开源的噪波贴图生成工具。…...

Android Studio问题解决:Gradle Download 下载超时 Connect reset

文章目录 一、遇到问题二、解决办法 一、遇到问题 Gradle Download下载超时Sync了很多次,一直失败 二、解决办法 手动通过gradle网站下载 https://gradle.org/releases/可能也会出现超时,最好开个VPN软件会比较快。 下载好的软件,放到本机的…...

【Python百宝箱】云上翱翔:Python编程者的AWS奇妙之旅

雲端箴言:用Python主持AWS管理交響樂 前言 随着云计算的普及,AWS(Amazon Web Services)成为了许多组织和开发者首选的云服务提供商。作为Python工程师,深入了解AWS管理工具和库对于高效利用云资源至关重要。本文将引…...

抖音直播间websocket礼物和弹幕消息推送可能出现重复的情况,解决办法

在抖音直播间里,通过websocket收到的礼物消息数据格式如下: {common: {method: WebcastGiftMessage,msgId: 7283420150152942632,roomId: 7283413007005207308,createTime: 1695803662805,isShowMsg: True,describe: 莎***:送给主播 1个入团卡,priority…...

【设计模式--行为型--访问者模式】

设计模式--行为型--访问者模式 访问者模式定义结构案例优缺点使用场景扩展分派动态分派静态分派双分派 访问者模式 定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。 结构 抽象访问者角色&…...

[最后一个月征稿、ACM独立出版】第三届密码学、网络安全和通信技术国际会议(CNSCT 2024)

第三届密码学、网络安全和通信技术国际会议(CNSCT 2024) 2024 3rd International Conference on Cryptography, Network Security and Communication Technology 一、大会简介 随着互联网和网络应用的不断发展,网络安全在计算机科学中的地…...

android —— PopupWindow

一、常用方法: 1、设置显示的位置 // 一个参数 popupWindow.showAsDropDown(v); //参数1: popupWindow关联的view // 参数2和3:相对于关联控件的偏移量popupWindow.showAsDropDown(View anchor, int xoff, int yoff)2、是否会获取焦点 popupWindow.se…...

mysql部署 --(docker)

先查找MySQL 镜像 Docker search mysql ; 拉取mysql镜像,默认拉取最新的; 创建mysql容器,-p 代表端口映射,格式为 宿主机端口:容器运行端口 -e 代表添加环境变量,MYSQL_ROOT_PASSWORD是root用户…...

基于多智能体系统一致性算法的电力系统分布式经济调度策略MATLAB程序

微❤关注“电气仔推送”获得资料(专享优惠) 参考文献: 主要内容: 应用多智能体系统中的一致性算法,以发电机组的增量成本和柔性负荷的增量效益作为一致性变量,设计一种用于电力系统经济调度的算法&#x…...

Android : SensorManager 传感器入门 简单应用

功能介绍&#xff1a;转动手机 图片跟着旋转 界面&#xff1a; activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/andr…...

《点云处理》 点云去噪

前言 通常从传感器&#xff08;3D相机、雷达&#xff09;中获取到的点云存在噪点&#xff08;杂点、离群点、孤岛点等各种叫法&#xff09;。噪点产生的原因有不同&#xff0c;可能是扫描到了不想要扫描的物体&#xff0c;可能是待测工件表面反光形成的&#xff0c;也可能是相…...

npm login报错:Public registration is not allowed

npm login报错:Public registration is not allowed 1.出现场景2.解决 1.出现场景 npm login登录时,出现 2.解决 将自己的npm镜像源改为npm的https://registry.npmjs.org/这个&#xff0c;解决&#xff01;...

OpenHarmony 启动流程优化

目前rk3568的开机时间有21s&#xff0c;统计的是关机后从按下 power 按键到显示锁屏的时间&#xff0c;当对openharmony的系统进行了裁剪子系统&#xff0c;系统app&#xff0c;禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…...

解决腾讯云CentOS 6硬盘空间不足问题:从快照到数据迁移

引言&#xff1a; 随着数据的不断增加&#xff0c;服务器硬盘空间不足变成了许多运维人员必须面对的问题。此主机运行了httpd&#xff08;apache服务&#xff09;&#xff0c;提供对外web访问服务,web资源挂载在**/data/wwwroot目录下,http日志存放在/data/wwwlogs目录下&…...

org.slf4j日志组件实现日志功能

slf4j 全称是Simple Logging Facade for Java。facade是一种设计模式。 slf4j 是一个抽象程度更高的日志组件&#xff0c;本身并不提供实际的日志功能。实际的日志功能是通过log4j等日志组件实现&#xff0c;而使用者只需要关心 slf4j 给出的API。 slf4j 仅仅是一个为Java程序提…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...