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

AI工程师系列——面向copilot编程

前言

笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考

当然,其实也不局限于copilot本身,类似的VsCode插件有很多,本文也只是拿chat的AI大模型做例子,只要是deepseek-v3就好

需求文档

为了聚焦,具体需求做了些抽象,简单的说,需要对系统一个IP解析功能进行更新:

1.以前使用了A库和B库进行解析,现在需要增加C库进行解析,

2.需要对三个库解析的结果进行优先级判断,确保把最优结果进行输出

前期准备

这一步很重要,因为很多时候当我们拿到需求文档的时候,希望直接给到IDE的AI助手,结果一般事与愿违,因为AI助手适合在一个限定范围内学习和给出高质量意见

所以要做一些简单前期工作——目的是让copilot学习尽量少的代码资料,从而减少幻觉的输出

1.写代码把C库加载进来

最好把三个库加载的代码先尽量写到一个文件中,比如:

func init() {slog.Info("loading A.dat file")if info, err := os.Stat("A.dat"); err == nil && !info.IsDir() {slog.Info("A.dat file loading from /data/A.dat")tobdb, err = ipcity.LoadV2("/data/A.dat")if err != nil {slog.Error("load /data/A.dat file fail")panic("cannot initialize A data")}} slog.Info("loading B.dat file")if info, err := os.Stat("B.dat"); err == nil && !info.IsDir() {slog.Info("B.dat file loading from /data/B.dat")tobdb, err = ipcity.LoadV2("/data/B.dat")if err != nil {slog.Error("load /data/B.dat file fail")panic("cannot initialize B data")}} slog.Info("loading C.dat file")if info, err := os.Stat("C.dat"); err == nil && !info.IsDir() {slog.Info("C.dat file loading from /data/C.dat")tobdb, err = ipcity.LoadV2("/data/C.dat")if err != nil {slog.Error("load /data/C.dat file fail")panic("cannot initialize C data")}} 
}

这里有两个注意的点:

(1) 以终为始:

我们是希望copilot能够准确的学习到这是三个库的加载方法,所以这里要写的教条一点:即三个函数相似度要高,而且要通过注释、日志反复增强对函数作用的说明,这样copilot会更准确的学习这里的业务逻辑

(2)日积月累:

如果前期代码就是这样“教条”的撰写风格,那么这段代码本身就可以用copilot生成

2.找到解析函数代码

IP解析函数中,要包含对A、B库的调用及综合算法

因为涉及综合算法,最好把综合算法放到一个文件中,这样copilot就可以读更少的文件

然后把确定输入代码的地方,写个注释,表示要在这里写

比如:

// ParseIP parse passed in ip string and return country, region, city, isp.
func ParseIP(clientIP string) (ip, country, region, city, isp string) {ip = clientIPswitch IPLibraryVersion {case "v1":、、、case "v2":// patch result from C// patch result from AresultA := A.Search(net.ParseIP(clientIP))if meta != nil {country = meta.Country()region = meta.Province()city = meta.City()isp = meta.ISP()}// patch result from B, espicially for ISPresultB := B.Search(net.ParseIP(clientIP))if resultB != nil {if country == "" || country == "未知" { // if cannot found country from A, then turn to Bcountry = resultB.Country()region = resultB.Province()city = resultB.City()isp = resultB.ISP()} else if (strings.HasPrefix(isp, "Error") && (B.ISP() != "未知" && B.ISP() != "")) || isp == "未知" || isp == "" { // if B's  ISP is prefix with 'Error', so replace it with tobdb's ISPisp = B.ISP()}}

这里也有两个注意的点:

(1)写好注释:

一般来说,写注释是研发同学最难以为继的事情,但随着copilot的到来,大家可以写完一个函数后,让copilot帮忙写注释,对于研发同学来说,甚至只需要输入“//”,然后等待copilot生成就好

(2)变量简单命名:

除了注释,变量名的清晰明了也是可以让copilot来更好的学习,同时,这里最好写的比较有规律,比如resultA、resultB,这样剩下的变量名也可以自助生成

3.把相关的文件放到copilot中,选择deepseek- v3模型

请在此添加图片描述

这里Copilot类似工具有很多,笔者用的是VSCode的IDE,大家可以随意选择,本质上是DeepSeek-v3模型就好

开始提效

这一步就需要把需求文档的内容,进行输入,当然,很多时候,需求充满着未添加的背景信息和口语的表述,作为一名研发,有时需要做一些逻辑转换用语

一、输入清晰的业务逻辑

这里可以看一个业务逻辑输入示例:

我想写一段逻辑,现在有三种数据源获取了country,region,city,isp四个数据,我希望A库的数据优先级最高,只有当A库的country识别不出来,或者country识别出来,但region的识别不出来的时候,才使用B库的数据;然后只有B库识别isp为“Error”打头时或者为空或者为“未知”,且C库识别isp不为空或者“未知”,才使用C库数据,如果三者都识别不出来,ISP如果有英文则用英文的版本,否则用A;其中一个重要逻辑是,最后使用的country,region,city,isp必须整体使用某一个数据源,且如果region识别为国内的广东等省必须加省后缀…

这是一个失败的表述,虽然可能完全来自与需求文档/会议结论/邮件输出,但对于copilot来说,逻辑十分的混乱

我们来分析下为什么混乱:

  1. 没有按照1、2、3标题,这让copilot难以分段
  2. 逻辑这里最终输出是if、while的类型,所以需要写清晰优先级
  3. “其中一个重要逻辑”,这种十分的口语,其实对于程序员也会难以理解
  4. 最后的特殊逻辑,太过于细节,可以在生成基础代码的基础上再进行“优化”

!17 “看到这里,很多读者可能也觉得这个逻辑十分混乱,但笔者想说的是,这是一个真实的业务内容,之所以大家觉得逻辑混乱是因为,撰写的人具备大量的背景知识,所以撰写者觉得清晰明了,但其他人和copilot完全不知所云!”!

那怎么才能写出清晰的业务逻辑输入呢?

笔者认为:清晰的逻辑输入需要清晰的输入格式

我重新梳理一下规则,1,代码实现在ParseIP的v2逻辑路径中;2.三个数据源分别来自resultA、resultB、resultC,最终要选择某一个的数据源来获取country,region,city,四个数据,3.第一优先级是获取resultA的数据,当resultA分析的country为空/未知或者region为空/未知时,才用resultB数据;4.第二优先级是获取resultB数据,当resultB分析的country为空/未知或者region为空/未知时,才使用resultC数据;5.如果三者都识别不出来,ISP如果有英文则用英文的版本,否则用A,帮我写下这个代码

这里对上述的问题进行了修正,同时增加几点优化:

  1. 而且明确了代码撰写在什么地方,更加限定了copilot的使用场景
  2. 描述逻辑时用了大量相似的语句,减少的copilot分析难度,即输入“教条”一些

我们看下结果:

case "v2":// 从三个数据源获取信息resultA := A.Search(net.ParseIP(clientIP))resultB := B.Search(net.ParseIP(clientIP))resultC := C.Search(net.ParseIP(clientIP))// 定义最终使用的数据源var finalSource *IPInfo// 第一优先级:resultAif resultA != nil && resultA.Country() != "" && resultA.Country() != "未知" &&resultA.Province() != "" && resultA.Province() != "未知" {finalSource = resultA} else {// 第二优先级:resultBif resultB != nil && resultB.Country() != "" && resultB.Country() 

相关文章:

AI工程师系列——面向copilot编程

前言 ​ 笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考 当然,其实也不局限于copilot本身,类似…...

【竖排繁体识别】如何将竖排繁体图片文字识别转横排繁体,转横排简体导出文本文档,基于WPF和腾讯OCR的实现方案

一、应用场景 在古籍数字化、繁体文档处理、两岸三地文化交流等场景中,经常需要将竖排繁体文字转换为横排文字。例如: 古籍研究人员需要将竖排繁体文献转换为现代横排简体格式以便编辑和研究出版行业需要将繁体竖排排版转换为简体横排格式两岸三地交流中需要将繁体竖排文档转…...

梳理Spring Boot中三种异常处理

在 Spring Boot 中处理异常确实有多个方式,比如使用 ControllerAdvice、 BasicErrorController、HandlerExceptionResolver等。不同方式适合不同的场景,下面是对这些方式的分析以及如何选择的建议: 🧩 1. ControllerAdvice Exce…...

NFS服务器实验

实验要求 架设一台NFS服务器,并按照以下要求配置 1、开放/nfs/shared目录,供所有用户查询资料 2、开放/nfs/upload目录,为192.168.xxx.0/24网段主机可以上传目录,并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3…...

ffmpeg 转换视频格式

使用FFmpeg将视频转换为MP4格式的常用命令: ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4 -i input.avi:指定输入文件 -c:v libx264:使用H.264视频编码器 -crf 23:控制视频质量(范围18-28&#…...

Java进阶之新特性

Java新特性 参考 官网:https://docs.oracle.com/en/ JDK5新特性 1.自动装箱与拆箱 自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装类中。 自动拆箱的过程:每当需要一个值时&#xf…...

Python基础学习-Day32

面对一个全新的官方库,是否可以借助官方文档的写法了解其如何使用。 我们以pdpbox这个机器学习解释性库来介绍如何使用官方文档。 大多数 Python 库都会有官方文档,里面包含了函数的详细说明、用法示例以及版本兼容性信息。 通常查询方式包含以下2种&…...

离线服务器算法部署环境配置

本文将详细记录我如何为一台全新的离线服务器配置必要的运行环境,包括基础编译工具、NVIDIA显卡驱动以及NVIDIA-Docker,以便顺利部署深度学习算法。 前提条件: 目标离线服务器已安装操作系统(本文以Ubuntu 18.04为例&#xff09…...

AIGC工具平台-卡通图片2D转绘3D

本模块是一款智能化的2D转3D图像处理工具,能够将卡通风格的2D图片自动转换为高质量3D渲染模型,让平面图像焕发立体生机。借助先进的AI深度学习算法,该工具可以精准识别角色轮廓、光影关系、材质纹理等关键元素,自动生成逼真的3D形…...

docker 启动一个python环境的项目dockerfile版本

文件格式 /home/py/docker/ # 项目根目录 ├── Dockerfile # Docker 构建文件 ├── requirements.txt # Python 依赖清单 └── src/ # 项目代码目录└── api_mock.py # Flask 应用入口文件Dockerfile # 使用…...

Java虚拟机 -方法调用

方法调用 方法调用静态链接动态链接案例虚方法与非虚方法虚方法(Virtual Method)非虚方法(Non-Virtual Method) 方法返回地址 方法调用 我们编写Java程序的时候,我们自己写的类通常不仅仅是调用自己本类的方法。调用别…...

基于matlabcd7.x的无网格近似方法

无网格近似方法(Meshless Methods)是一类数值计算方法,用于解决偏微分方程(PDEs)问题,特别是在几何形状复杂或需要动态网格更新的场景中。与传统的有限元方法(FEM)相比,无…...

JMeter JDBC请求Query Type实测(金仓数据库版)

文章目的 在实际性能测试中,JMeter的JDBC Request组件常用于模拟数据库操作。但许多用户对Query Type参数的具体行为存在疑惑。 本文将以金仓数据库KingbaseES为例,通过实测验证每种Query Type的行为,帮助用户明确其使用场景和限制&#xff…...

【内部教程】ISOLAR-AB配置以太网栈|超详细实战版

目录 往期推荐 缩写与定义 关于系统描述(System Description) 1.1 EthCommunicationController 1.2 EthCommunicationConnector 1.2.1 Ports(端口) 1.3 EthPhysicalChannel(以太网物理通道) 1.3.1…...

哈希表和容器中添加元素的方法

push_back v.s. emplace_back: 两者都是在容器末尾添加元素的方法&#xff0c;但是push_back会创建临时对象并进行拷贝构造&#xff0c;而emplace_back是直接构造 //push_back std::vector<MyClass> vec1; MyClass obj1("Object1", 1);//创建一个obj1对象 ve…...

Nginx 核心功能

目录 一&#xff1a;正向代理 1&#xff1a;编译安装 Nginx &#xff08;1&#xff09;安装支持软件 &#xff08;2&#xff09;创建运行用户、组和日志目录 &#xff08;3&#xff09;编译安装 Nginx &#xff08;4&#xff09;添加 Nginx 系统服务 2&#xff1a;配置正…...

String.join()-高效字符串拼接

String.join-高效字符串拼接 前言一、基础用法&#xff1a;拼接数组或集合元素&#xff08;仅分隔符&#xff09;语法示例 1&#xff1a;拼接字符串数组示例 2&#xff1a;拼接集合元素注意事项 二、进阶用法&#xff1a;结合 Stream API 处理复杂场景示例 1&#xff1a;添加前…...

【Canvas与图标】圆角方块蓝星CSS图标

【成图】 120*120的png图标 大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…...

系统性能分析基本概念(5) : 何时开始性能分析

决定何时开始系统性能优化&#xff08;Performance Optimization&#xff09;需要根据系统状态、业务需求和资源可用性来判断。以下是触发性能优化的关键场景和时机&#xff0c;结合系统性能分析&#xff08;如DRAM读取吞吐量等&#xff09;的背景&#xff0c;保持简洁且实用&a…...

Python实现Web请求与响应

目录 一、Web 请求与响应基础 &#xff08;一&#xff09;Web 请求与响应的定义与组成 &#xff08;二&#xff09;HTTP 协议概述 &#xff08;三&#xff09;常见的 HTTP 状态码 二、Python 的 requests 库 &#xff08;一&#xff09;安装 requests 库 &#xff08;二…...

机器学习 day05

文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习&#xff0c;我掌握了机器学习中模型的选择与调优&#xff0c;包括交叉验证&#xff0c;超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法&#xff0c;这里主要介绍较…...

CentOS Stream安装MinIO教程

1. 下载 MinIO 二进制文件 # 进入 MinIO 安装目录 sudo cd /usr/local/bin/# 下载 MinIO 二进制文件&#xff08;替换为最新版本链接&#xff09; wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x minio2. 创建专用用户和存储目录 # 创建 minio 用户…...

C#新建打开文件对话框

这是Winform直接封装好的打开文件对话框 using System.Windows.Forms; public static string OpenFile(string path) {OpenFileDialog openFileDialog new OpenFileDialog();// 设置对话框属性openFileDialog.Title "选择文件";openFileDialog.InitialDirectory …...

汇川PLC通过开疆智能Profinet转ModbusTCP网关读取西门子PLC数据案例

本案例是客户通过开疆智能Profient转ModbusTCP网关连接汇川PLC的配置案例 Modbus TCP主站即Modbus TCP客户端&#xff0c;Modbus TCP主站最多支持同时与31个Modbus TCP从站 。&#xff08;Modbus TCP服务器&#xff09;进行通信。 第一步设置PLC IP地址&#xff1b; 默认PLC…...

零基础入门:MinerU 和 PyTorch、CUDA的关系

&#x1f4a1;一句话总结&#xff1a;MinerU 是一个用 PyTorch 跑模型的程序&#xff0c;PyTorch 支持多种加速方式&#xff08;如 CUDA、MPS&#xff09;&#xff0c;让它跑得快就需要依赖这些加速工具。 PyTorch官网安装教程&#xff08;可根据系统情况选择不同版本&#xf…...

借助IEDA ,Git版本管理工具快速入门

01 引言 一直使用SVN作为版本管理工具&#xff0c;直到公司新来的一批同事&#xff0c;看到我们使用的SVN都纷纷吐槽&#xff0c;什么年代了&#xff0c;还使用SVN。聊下来&#xff0c;才知道人家公司早早就将SVN切成了Git工具&#xff0c;并吐槽SVN的各种弊端。 既然新的技术…...

三维空间,毫秒即达:RTMP|RTSP播放器在Unity中的落地实现

有人问我&#xff1a;在 Unity 里做超低延迟的直播播放&#xff0c;是什么感觉&#xff1f; 我说&#xff0c;是把一帧帧流动的时间&#xff0c;嵌进一个三维的空间里。 它不属于现在&#xff0c;也不属于过去。 它属于“实时”——属于那一秒内刚刚发生&#xff0c;却已被你看…...

【计算机网络】HTTP/1.0,HTTP/1.1,HTTP/2,HTTP/3汇总讲解,清晰表格整理面试重点对比

表格汇总 对比维度HTTP/1.0HTTP/1.1HTTP/2HTTP/3传输协议TCPTCPTCP/TLS&#xff08;默认加密&#xff09;UDP&#xff08;基于 QUIC 协议&#xff09;连接方式短连接&#xff08;每次请求/响应后断开&#xff09;引入持久连接&#xff08;Persistent Connection&#xff09;&a…...

ubuntu 搭建FTP服务,接收部标机历史音视频上报服务器

1.安装vsftpd 1.1.安装命令 sudo apt update sudo apt install vsftpd 1.2.备份原始配置文件 sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak 1.3.配置 vsftpd 编辑配置文件 /etc/vsftpd.conf&#xff1a; sudo vim /etc/vsftpd.conf 将以下参数修改为对应值&#xff…...

一、内存调优

一、内存调优 什么是内存泄漏 监控Java内存的常用工具 内存泄露的常见场景 内存泄露的解决方案 内存泄露与内存溢出的区别 内存泄露&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&…...