smolagents学习笔记系列(七)Examples-Self-correcting Text-to-SQL
这篇文章锁定官网教程中 Examples
章节中的 Self-correcting Text-to-SQL
文章,主要介绍了如何使用 Agent 对数据库进行查找。
- 官网链接:https://huggingface.co/docs/smolagents/v1.9.2/en/examples/text_to_sql;
【注意事项】:
- 这个教程涉及到一些SQL的部分,如果你对这里不熟悉也不必担心,你更应该关注的是如何定义 tool 以及给 agent 怎样提供合适的 prompt;
- 官网在这部分做的有一点不好,他们将数据准备、tool、agent定义都拆开到不同的代码段里,导致你直接运行单独部分会没有任何输出,我这里将数据准备和tool agent定义拆分成两个文件,然后利用python特性分次执行这两个文件,这样能够更好地模拟真实生产环境,即先有数据然后才会让你写agent,你不必关心SQL部分怎么实现因为在这个系列文章中你要学习的是如何实现tool和agent;
Text-to-SQL
官网在一开头就给出了一个核心问题:为什么不直接使用LLM生成的SQL语句而需要通过Agent执行,他们为此给出了以下几个理由:
- LLM生成的SQL语句很容易出错;
- SQL语句可能执行成功但由于存在逻辑错误,导致答案不是我们想要的,这个过程并不会触发异常;
- Agent可以帮我们检查输出结果,并决定是否需要修改向LLM的查询prompt;
准备工作
安装依赖:
$ pip install smolagents python-dotenv sqlalchemy --upgrade -q
如果你已经在环境变量中配置好 HF_TOKEN
则可以跳过下面这行命令:
$ export HF_TOKEN="你的huggingface token"
准备一个SQL环境并添加一些数据,这里我将官方提供的两段代码合成了一段,因为这两段都是数据库的前期准备工作,实现的是创建表、插入数据、显示数据的功能,将这个文件保存为 prepare_sql.py
,尽管可以直接将后面的 tool 和 agent 写在这个文件后面,但真实情况下都是已经有一个完整的 SQL ,然后才去写 tool 和 agent,所以我这里将两部分内容拆开成两个文件。
prepare_sql.py
文件:
# 代码段一:
from dotenv import load_dotenv
load_dotenv()from sqlalchemy import (create_engine,MetaData,Table,Column,String,Integer,Float,insert,inspect,text,
)engine = create_engine("sqlite:///:memory:")
metadata_obj = MetaData()def insert_rows_into_table(rows, table, engine=engine):for row in rows:stmt = insert(table).values(**row)with engine.begin() as connection:connection.execute(stmt)table_name = "receipts"
receipts = Table(table_name,metadata_obj,Column("receipt_id", Integer, primary_key=True),Column("customer_name", String(16), primary_key=True),Column("price", Float),Column("tip", Float),
)
metadata_obj.create_all(engine)rows = [{"receipt_id": 1, "customer_name": "Alan Payne", "price": 12.06, "tip": 1.20},{"receipt_id": 2, "customer_name": "Alex Mason", "price": 23.86, "tip": 0.24},{"receipt_id": 3, "customer_name": "Woodrow Wilson", "price": 53.43, "tip": 5.43},{"receipt_id": 4, "customer_name": "Margaret James", "price": 21.11, "tip": 1.00},
]
insert_rows_into_table(rows, receipts)# 代码段二:
inspector = inspect(engine)
columns_info = [(col["name"], col["type"]) for col in inspector.get_columns("receipts")]table_description = "Columns:\n" + "\n".join([f" - {name}: {col_type}" for name, col_type in columns_info])
print(table_description)
Build our agent
接下来就是定义一个 somlagents 的 tool ,这个实现的就是对 “receipts” 表进行SQL查询,然后以字符串的形式返回。我这里同样将官网上的两段代码合并成一段,因为这两段代码分别是定义 tool 和 Agent。Agent没有使用官网上的 meta-llama/Meta-Llama-3.1-8B-Instruct
,而是不指定由 HuggingFace 自动分配:
agent.py
文件:
from smolagents import tool
from smolagents import CodeAgent, HfApiModel# 定义tool
@tool
def sql_engine(query: str) -> str:"""Allows you to perform SQL queries on the table. Returns a string representation of the result.The table is named 'receipts'. Its description is as follows:Columns:- receipt_id: INTEGER- customer_name: VARCHAR(16)- price: FLOAT- tip: FLOATArgs:query: The query to perform. This should be correct SQL."""output = ""with engine.connect() as con:rows = con.execute(text(query))for row in rows:output += "\n" + str(row)return output# 定义agent
agent = CodeAgent(tools=[sql_engine],model=HfApiModel(),
)# 让agent执行你与LLM交互的内容
agent.run("Can you give me the name of the client who got the most expensive receipt?")
为了将两个文件依次执行以模拟真实情况,我们需要额外创建一个文件 merge.py
:
merge.py
文件:
# 先执行 prepare_sql.py 将数据准备好
with open("prepare_sql.py", encoding="utf-8") as f:exec(f.read())# 再执行 agent.py 实现agent调用tool功能
with open("agent.py", encoding="utf-8") as f:exec(f.read())
此时你的文件结构应该如下:
(base) ~/Desktop/LLM $ tree
.
├── agent
├── merge.py
└── prepare_sql.py
运行 merge.py
文件:
$ python merge.py
Level 2: Table joins
官网除了提供上面那个SQL查询的示例以外,还提供了另一个 SQL 任务:处理多个表之间的连接。这里同样将其拆成三个文件:
prepare_sql.py
文件:
from dotenv import load_dotenv
load_dotenv()from sqlalchemy import (create_engine,MetaData,Table,Column,String,Integer,Float,insert,inspect,text,
)engine = create_engine("sqlite:///:memory:")
metadata_obj = MetaData()def insert_rows_into_table(rows, table, engine=engine):for row in rows:stmt = insert(table).values(**row)with engine.begin() as connection:connection.execute(stmt)# 第一张 Table
table_name = "receipts"
receipts = Table(table_name,metadata_obj,Column("receipt_id", Integer, primary_key=True),Column("customer_name", String(16), primary_key=True),Column("price", Float),Column("tip", Float),
)
metadata_obj.create_all(engine)rows = [{"receipt_id": 1, "customer_name": "Alan Payne", "price": 12.06, "tip": 1.20},{"receipt_id": 2, "customer_name": "Alex Mason", "price": 23.86, "tip": 0.24},{"receipt_id": 3, "customer_name": "Woodrow Wilson", "price": 53.43, "tip": 5.43},{"receipt_id": 4, "customer_name": "Margaret James", "price": 21.11, "tip": 1.00},
]
insert_rows_into_table(rows, receipts)# 第二张 Table
table_name = "waiters"
waiters = Table(table_name,metadata_obj,Column("receipt_id", Integer, primary_key=True),Column("waiter_name", String(16), primary_key=True),
)
metadata_obj.create_all(engine)rows = [{"receipt_id": 1, "waiter_name": "Corey Johnson"},{"receipt_id": 2, "waiter_name": "Michael Watts"},{"receipt_id": 3, "waiter_name": "Michael Watts"},{"receipt_id": 4, "waiter_name": "Margaret James"},
]
insert_rows_into_table(rows, waiters)updated_description = """Allows you to perform SQL queries on the table. Beware that this tool's output is a string representation of the execution output.
It can use the following tables:"""inspector = inspect(engine)
for table in ["receipts", "waiters"]:columns_info = [(col["name"], col["type"]) for col in inspector.get_columns(table)]table_description = f"Table '{table}':\n"table_description += "Columns:\n" + "\n".join([f" - {name}: {col_type}" for name, col_type in columns_info])updated_description += "\n\n" + table_descriptionprint(updated_description)
agent.py
文件:
from smolagents import tool
from smolagents import CodeAgent, HfApiModel@tool
def sql_engine(query: str) -> str:"""Allows you to perform SQL queries on the table. Returns a string representation of the result.The table is named 'receipts'. Its description is as follows:Columns:- receipt_id: INTEGER- customer_name: VARCHAR(16)- price: FLOAT- tip: FLOATArgs:query: The query to perform. This should be correct SQL."""output = ""with engine.connect() as con:rows = con.execute(text(query))for row in rows:output += "\n" + str(row)return outputsql_engine.description = updated_descriptionagent = CodeAgent(tools=[sql_engine],model=HfApiModel(),
)agent.run("Which waiter got more total money from tips?")
merge.py
文件:
# 先执行 prepare_sql.py 将数据准备好
with open("prepare_sql.py", encoding="utf-8") as f:exec(f.read())# 再执行 agent.py 实现agent调用tool功能
with open("agent.py", encoding="utf-8") as f:exec(f.read())
然后执行 merge.py
文件:
$ python merge.py
相关文章:
smolagents学习笔记系列(七)Examples-Self-correcting Text-to-SQL
这篇文章锁定官网教程中 Examples 章节中的 Self-correcting Text-to-SQL 文章,主要介绍了如何使用 Agent 对数据库进行查找。 官网链接:https://huggingface.co/docs/smolagents/v1.9.2/en/examples/text_to_sql; 【注意事项】:…...
ffmpeg常用方法(一)
FFmpeg是一个非常强大的开源项目,提供了一套可以用来录制、转换数字音频、视频,并能将其转换成不同格式的工具和库。它是命令行工具,意味着它没有图形用户界面,但它能够被嵌入到其他应用程序中。它支持多种操作系统,包…...
c++:多态
1.多态 多态就是多种形态的意思。 分为编译时多态,也叫静态多态,通过传递不同参数的方式使同一个函数好像实现了不同的状态。eg:函数模板,函数重载 还有运行时多态,也叫动态多态。通过使用不同的对象调用“同一个函数”…...
Nuxt.js 3【详解】服务器 Server
Nuxt.js 是一个全栈框架,可以在一个项目中,同时完成前端和后端的开发。 服务器架构 Nuxt.js 的服务端由 Nitro 实现,Nitro 由基于 H3 实现。 Nitro 官网 https://nitro.build/guideH3 官网 https://h3.unjs.io/guide 接口路由 基于文件目录自…...
DeepSeek回答:AI时代Go语言学习路线
最近有小伙伴经常会问:**该如何学习入门Go语言?怎样提升Go语言Coding水平?**这篇文章我们就使用DeepSeek来梳理下Go语言在AI时代的学习路线。 向DeepSeek提问的问题原文: 你现在是一名资深的Go语言工程师,精通Go语言并…...
OpenGL 04--GLSL、数据类型、Uniform、着色器类
一、着色器 在 OpenGL 中,着色器(Shader)是运行在 GPU 上的程序,用于处理图形渲染管线中的不同阶段。 这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器…...
仅需三分钟,使用Vue3.x版本组件式风格实现一个消息提示组件!
一、前言 在日常的前端项目开发中,我们时常需要使用到“消息提示”(以下简称“消息”)这个组件来帮助我们更好的给予用户提示,例如常见的“登录成功”、“操作成功”、“服务器异常”等等提示。 尽管市面上已经有一些组件库提供了…...
天猫代运营公司推荐:品融电商
天猫代运营公司推荐:品融电商 在电商行业竞争日益激烈的今天,选择一家专业的天猫代运营公司成为众多品牌商家提升市场竞争力、实现销售增长的关键。在众多代运营公司中,品融电商凭借其专业的团队、丰富的经验和显著的成功案例,脱…...
2025.2.26#Java开发中的鉴权机制详解
1、Java开发中的鉴权机制详解 用户问的是在Java开发中什么是鉴权。首先,我需要明确鉴权的定义。鉴权,也就是认证授权,是确认用户身份和权限的过程。可能用户刚接触安全相关的内容,需要简单明了的解释。 接下来,我应该分…...
AF3 DataPipeline类解读
AlphaFold3 的DataPipeline类处理单链蛋白数据,主要负责从不同数据源(FASTA、PDB、mmCIF、ProteinNet .core 文件等)解析输入序列、MSA、模板匹配、序列嵌入(如 ESM-2)、并将其转换为 AlphaFold3 可用的特征格式。 源代码: class DataPipeline:"""Assem…...
Windows系统PyTorch环境配置
0、前言 深度学习为什么要配置GPU? GPU(图形处理单元)最初是为图形渲染而设计的,它们擅长处理大量并行计算任务。深度学习模型,特别是卷积神经网络(CNN)和循环神经网络(RNN…...
策略模式环境类的实现方式对比
文章目录 1、策略模式2、聚合策略类实现方式一3、聚合策略类实现方式二4、对比5、补充:ApplicationContextAware接口 1、策略模式 近期工作中,需要处理4.x和5.x两个版本的数据,所以自然想到的是策略模式,写一个抽象类,…...
深入理解JVM的运行时数据区
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
mapbox基础,加载background背景图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象…...
14.二叉搜索树
二叉搜索树 1.概念 ⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树: *若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值 *若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点…...
javascript-es6 (五)
内置构造函数 在 JavaScript 中 最主要 的数据类型有 6 种: 基本数据类型: 字符串、数值、布尔、undefined、null 引用类型: 对象 但是,我们会发现有些特殊情况: //普通字符串 const str peiqi console.log(str.length) //…...
飞鱼科技游戏策划岗内推
协助策划完成相关工作,包括但不仅限于策划配置,资料搜集,游戏体验; 游戏策划相关作品;游戏大赛经历;游戏demo制作经历;游戏公司策划岗位实习经历优先 内推码 DSZP7YFU...
探索浮点数在内存中的存储(附带快速计算补码转十进制)
目录 一、浮点数在内存中的存储 1、常见的浮点数: 2、浮点数存储规则: 3、内存中无法精确存储: 4、移码与指数位E: 5、指数E的三种情况: 二、快速计算补码转十进制 1、第一种方法讨论: 2、第二种方…...
elfk+zookeeper+kafka数据流
申请7台部署elfkzookeeperkafka 数据流: filebeat(每台app) ------>【logstash(2) kafka(3)】 -------> logstash(1) -------> 【elasticsearch(3) kibana(1)】...
汽车悬架系统技术演进:从被动到全主动的革新之路(主动悬架类型对比)
在汽车工业的百年发展史中,悬架系统始终是平衡车辆性能与舒适性的关键战场。随着消费者对驾乘体验要求的不断提升,传统被动悬架已难以满足中高端车型的需求,而半主动与全主动悬架技术的崛起,正在重塑行业格局。本文将深入解析三大…...
什么限制了LLM:空间复杂度限制
什么限制了LLM: 空间复杂度限制 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,它描述了算法所需的额外存储空间与输入数据规模之间的增长关系。这里的存储空间主要包括算法执行过程中所使用的变量、数据结构、栈空间等。和时间复杂度类似,空间复杂度通常也…...
Docker02 - 深入理解Docker
深入理解Docker 文章目录 深入理解Docker一:Docker镜像原理1:镜像加载原理1.1:unionFS1.2:加载原理 2:分层理解 二:容器数据卷详解1:什么是容器数据卷2:使用数据卷3:具名…...
深度学习中卷积层(Conv)、BN层(Batch Normalization)和 ReLU层(Rectified Linear Unit)的详细介绍
一、卷积层(Conv) 定义 卷积层是深度学习中卷积神经网络(CNN)的核心组成部分。它通过对输入数据(如图像)进行卷积操作来提取特征。卷积操作是用一个卷积核(也称为滤波器)在输入数据上…...
二分查找算法的全面解析C++
一、核心原理与特性 二分查找是一种**对数时间复杂度(O(log n))**的高效搜索算法46,需满足两个前提条件: 数据存储在连续内存空间(如数组)数据按升序/降序有序排列35 算法通过折半比较缩小搜索范围: 初始化左右边界…...
【论文笔记】Splatter Image: Ultra-Fast Single-View 3D Reconstruction
原文链接:https://openaccess.thecvf.com/content/CVPR2024/papers/Szymanowicz_Splatter_Image_Ultra-Fast_Single-View_3D_Reconstruction_CVPR_2024_paper.pdf 简介:本文介绍了Splatter Image这一非常高效的单目3D物体重建方法。基于高斯溅射…...
【论文解读】《C-Pack: Packed Resources For General Chinese Embeddings》
论文链接:https://arxiv.org/pdf/2309.07597 本论文旨在构建一套通用中文文本嵌入的完整资源包——C-Pack,解决当前中文文本嵌入研究中数据、模型、训练策略与评测基准缺失的问题。论文主要贡献体现在以下几个方面: 大规模训练数据…...
Python 3 实用工具库
Python 作为一门强大且灵活的编程语言,提供了许多内建库和模块,可以大大简化开发工作,提升开发效率。在日常开发中,使用一些实用的工具库能够帮助你更轻松地完成任务。本文将介绍几款常用且实用的 Python 3 工具库,它们…...
vue+element-dialog:修改关闭icon / 遮罩层不能挡住弹窗 / 遮罩层不能遮挡元素
一、是否显示操作按钮 二、修改dialog默认关闭icon .el-dialog__headerbtn {top: 15px !important;width: 18px;height: 18px;background: url(~assets/img/formworkManagement/close-button.png) left no-repeat;background-size: cover; } .el-dialog__headerbtn i {content…...
深入解析React性能优化三剑客:React.memo、useMemo与useCallback
目录 渲染机制基础 React的渲染流程解析组件重渲染的根本原因性能优化的核心目标 React.memo深度解析 组件级缓存原理浅比较机制详解自定义比较函数实现 useMemo核心技术 值缓存机制剖析引用稳定性控制复杂计算场景实战 useCallback终极指南 函数缓存本质闭包陷阱解决方案事…...
Java高频面试之SE-23
hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝🐶 Java 中的 Stream 是 Java 8 引入的一种全新的数据处理方式,它基于函数式编程思想,提供了一种高效、简洁且灵活的方式来…...
SOC-ATF 安全启动BL31流程分析(3)
一、BL31启动流程 与bl1和bl2不同,bl31包含两部分功能,在启动时作为启动流程的一部分,执行软硬件初始化以及启动bl32和bl33镜像。在系统启动完成后,将继续驻留于系统中,并处理来自其它异常等级的smc异常,以…...
计算机三级网络技术备考
#subtotal 1Mbps1024kb128KB12.8M/s #1024B1KB 1024KB1MB 1024MB1GB #路由器的5G信号和平常的波长不同(5G的穿墙性能差) #局域网LAN(一公里内——构成集线机、交换机、同轴电缆) #城域网MAN(几公里到几十公里——光…...
Linux红帽:RHCSA认证知识讲解(四)修改远程配置文件,取消root禁用,便于使用root身份远程
Linux红帽:RHCSA认证知识讲解(四)修改远程配置文件,取消root禁用,便于使用root身份远程 前言一、远程连接的用途和原因二、通过 ssh 远程登陆系统三、默认限制及解决方案(一)非常规方法一&#…...
【笔记ing】每天50个英语词汇
ex- e-out exclude 排外,排除 expect 期待,期望 单词构成: 前缀(prefix):情感(emotion)方向(orientation) 词根(root)…...
Linux 基本开发工具的使用(yum、vim、gcc、g++、gdb、make/makefile)
文章目录 Linux 软件包管理器 - yum理解什么是软件包和yum如何查看/查找软件包如何安装软件如何实现本地机器和云服务器之间的文件互传如何卸载软件 Linux 编辑器 - vim 的使用vim 的基本概念vim 的基本操作vim 命令模式各命令汇总vim 底行模式各命令汇总vim 的简单配置 Linux …...
idea创建第一个springboot程序
说明: 我计划用idea,创建第一个springboot程序,但是作为新手完全不会弄,今天我就亲自尝试一边,并且出一期详细,完美的教程,亲测可以运行 step1. 点击file , 选new, 选…...
python 使用 venv 创建虚拟环境 (VSCode)
Python 自带了一个名为 venv 的模块,可以用来创建虚拟环境。这是 Python 官方推荐的方式,不需要额外安装 Anaconda 或其他工具。 假设项目名为myproject,进入到项目目录 cd myproject 创建虚拟环境 python3 -m venv 虚拟环境名(…...
组态软件在物联网中的应用
随着物联网的快速发展,组态软件在物联网中的应用也越来越广泛。组态软件是一种用于创建和管理物联网系统的可视化工具,它能够将传感器、设备和网络连接起来,实现数据的采集、分析和可视化。本文将探讨组态软件在物联网中的应用,并…...
字节火山引擎-大模型声音复刻,流式语音合成接口
字节火山引擎-大模型声音复刻,流式语音合成接口 参考文档:火山引擎-大模型声音复刻文档 官网给出的示例代码有bug,这里已经修改了 创建应用 声音复刻大模型页面查看应用,获取接口调用需要的参数 注意调用tts接口时候需要三个参数…...
QT:Graphics View的坐标系介绍
在 Qt 的 Graphics View 框架中,存在三种不同的坐标系,分别是 物品坐标系(Item Coordinates)、场景坐标系(Scene Coordinates) 和 视图坐标系(View Coordinates)。这三种坐标系在图形…...
轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置
一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时,合理的环境管理是必不可少的,特别是当你在多个项目中…...
Unity TMPro显示中文字体
TMP默认的字体只能显示英语,那么怎么显示中文呢 1、找到支持中文的字体文件 在c盘搜索Fonts文件夹有很多支持中文的字体文件 我这里选择雅黑 PS.双击打开发现里面有粗体细体普通三个版本,也可以只导入一个版本进去 2、将其拖入到unity Assets里面 3…...
【嵌入式原理设计】实验五:远程控制翻盖设计
目录 一、实验目的 二、实验环境 三、实验内容 四、实验记录及处理 五、实验小结 六、成果文件提取链接 一、实验目的 熟悉和掌握舵机及串口控制方式 二、实验环境 Win10ESP32实验开发板 三、实验内容 1、熟悉舵机的控制方式; 2、用串口发…...
矩阵乘积态简介
定义 矩阵乘积态(Matrix Product State, MPS)是一种用于表示量子多体系统的强大工具,特别是在一维系统中。MPS 是一种张量网络状态,它通过将全局量子态分解为一系列局部张量的乘积来有效地表示量子态。 注释: 量子态表…...
国自然面上项目|基于肺癌精准靶向治疗的基因影像组学研究|基金申请·25-02-26
小罗碎碎念 今天和大家分享一个国自然面上项目,执行年限为2019.01~2022.12,直接费用为57万元。 项目旨在解决肺癌靶向治疗耐药问题,通过整合多组学和影像组学技术构建预测模型。 研究期间,对非小细胞肺癌 CT 影像组学…...
OA办公系统自动渗透测试过程
目录 一、下载环境源码 二、部署环境 三、测试 XSS漏洞 SQL注入 文件上传漏洞 一、下载环境源码 OA源码打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署环境...
Fisher信息矩阵(Fisher Information Matrix,简称FIM)
Fisher信息矩阵简介 Fisher信息矩阵(Fisher Information Matrix,简称FIM)是统计学和信息理论中的一个重要概念,广泛应用于参数估计、统计推断和机器学习领域。它以统计学家罗纳德费希尔(Ronald Fisher)的名…...
nginx反向代理以及负载均衡(常见案例)
一、nginx反向代理 1、什么是代理服务器? 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据…...
LabVIEW形状误差测量系统
在机械制造领域,形状与位置公差(GD&T)直接影响装配精度与产品寿命。国内中小型机加工企业因形状误差导致的返工率高达12%-18%。传统测量方式存在以下三大痛点: 设备局限:机械式千分表需人工读数,精度…...
将VsCode变得顺手好用(1
目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹,用于放置调试文件以及你未来写的代码,随便命名但…...