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() 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81881.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【軟件設計師】知識點簡單整理

文章目錄 數據結構與算法排序算法圖關鍵路徑 軟件工程決策表耦合類型 編程思想設計模式 計算機網絡域名請求過程 數據結構與算法 排序算法 哪些排序算法是穩定的算法?哪些不是穩定的算法,請舉出例子。 穩定排序算法:冒泡排序、插入排序、歸并排序、基數排序、計數…

FastAPI 支持文件下載和上傳

文章目錄 1. 文件下載處理1.1. 服務端處理1.1.1. 下載小文件1.1.2. 下載大文件(yield 支持預覽的)1.1.3. 下載大文件(bytes)1.1.4. 提供靜態文件服務1.1.5. 中文文件名錯誤 1.2. 客戶端處理1.2.1. 普通下載1.2.2. 分塊下載1.2.3. …

naive-ui切換主題

1、在App.vue文件中使用 <script setup lang"ts"> import Dashboard from ./views/dashboard/index.vue import { NConfigProvider, NGlobalStyle, darkTheme } from naive-ui import { useThemeStore } from "./store/theme"; // 獲取存儲的主題類…

Kotlin 協程 (三)

協程通信是協程之間進行數據交換和同步的關鍵機制。Kotlin 協程提供了多種通信方式&#xff0c;使得協程能夠高效、安全地進行交互。以下是對協程通信的詳細講解&#xff0c;包括常見的通信原語、使用場景和示例代碼。 1.1 Channel 定義&#xff1a;Channel 是一個消息隊列&a…

使用SQLite Studio導出/導入SQL修復損壞的數據庫

使用SQLite Studio導出/導入SQL修復損壞的數據庫 使用Zotero時遇到了數據庫損壞&#xff0c;在軟件中寸步難行&#xff0c;遂嘗試修復數據庫。 一、SQLite Studio簡介 SQLite Studio是一款專為SQLite數據庫設計的免費開源工具&#xff0c;支持Windows/macOS/Linux。相較于其…

【git config --global alias | Git分支操作效率提升實踐指南】

git config --global alias | Git分支操作效率提升實踐指南 背景與痛點分析 在現代軟件開發團隊中&#xff0c;Git分支管理是日常工作的重要組成部分。特別是在規范的開發流程中&#xff0c;我們經常會遇到類似 feature/user-management、bugfix/login-issue 或 per/cny/dev …

(八)深度學習---計算機視覺基礎

分類問題回歸問題聚類問題各種復雜問題決策樹√線性回歸√K-means√神經網絡√邏輯回歸√嶺回歸密度聚類深度學習√集成學習√Lasso回歸譜聚類條件隨機場貝葉斯層次聚類隱馬爾可夫模型支持向量機高斯混合聚類LDA主題模型 一.圖像數字化表示及建模基礎 二.卷積神經網絡CNN基本原…

在tensorflow源碼環境里,編譯出獨立的jni.so,避免依賴libtensorflowlite.so,從而實現apk體積最小化

需要在APP里使用tensorflow lite來運行PC端訓練的model.tlite&#xff0c;又想apk的體積最小&#xff0c;嘗試了如下方法&#xff1a; 1. 在gradle里配置 implementation("org.tensorflow:tensorflow-lite:2.16.1") 這樣會引入tensorflow.jar&#xff0c;最終apk的…

neo4j框架:java安裝教程

安裝使用neo4j需要事先安裝好java&#xff0c;java版本的選擇是一個犯難的問題。本文總結了在安裝java和使用Java過程中遇到的問題以及相應的解決方法。 Java的安裝包可以在java官方網站Java Downloads | Oracle 中國進行下載 以java 8為例&#xff0c;選擇最后一行的x64 compr…

[服務器備份教程] Rclone實戰:自動備份數據到阿里云OSS/騰訊云COS等對象存儲

更多服務器知識&#xff0c;盡在hostol.com 各位服務器的守護者們&#xff0c;咱們都知道&#xff0c;數據是數字時代的“黃金”&#xff0c;而服務器上的數據更是我們業務的命脈。可天有不測風云&#xff0c;硬盤可能會突然“壽終正寢”&#xff0c;手滑執行了“毀滅性”命令…

Nextjs App Router 開發指南

Next.js是一個用于構建全棧web應用的React框架。App Router 是 nextjs 的基于文件系統的路由器&#xff0c;它使用了React的最新特性&#xff0c;比如 Server Components, Suspense, 和 Server Functions。 術語 樹(Tree): 一種用于可視化的層次結構。例如&#xff0c;包含父…

山東大學計算機圖形學期末復習15——CG15

CG15 OpenGL緩沖區、讀寫操作以及混合&#xff08;Blending&#xff09; 一、OpenGL緩沖區概述 OpenGL中的緩沖區是用于存儲像素數據的內存區域&#xff0c;主要包括以下類型&#xff1a; 顏色緩沖區&#xff08;Color Buffer&#xff09;&#xff1a;存儲每個像素的顏色值…

html+css+js趣味小游戲~記憶卡片配對(附源碼)

下面是一個簡單的記憶卡片配對游戲的完整代碼&#xff0c;使用HTML、CSS和JavaScript實現&#xff1a; html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

?個并發訪問量?較?的key在某個時間過期,在redis中這個時間過期什么意思

在 Redis 中&#xff0c;當提到一個鍵&#xff08;key&#xff09;“在這個時間過期”&#xff0c;指的是為該鍵設置了生存時間&#xff08;TTL, Time To Live&#xff09;或過期時間&#xff08;expiration time&#xff09;。一旦到達設定的過期時間&#xff0c;Redis 會自動…

【設計模式】- 行為型模式1

模板方法模式 定義了一個操作中的算法骨架&#xff0c;將算法的一些步驟推遲到子類&#xff0c;使得子類可以不改變該算法結構的情況下重定義該算法的某些步驟 【主要角色】&#xff1a; 抽象類&#xff1a;給出一個算法的輪廓和骨架&#xff08;包括一個模板方法 和 若干基…

ubuntu22.04 卸載ESP-IDF

要在Ubuntu 22.04上完全卸載ESP-IDF&#xff0c;請按照以下步驟操作&#xff1a; 卸載ESP-IDF的步驟 刪除ESP-IDF目錄&#xff1a; # 假設ESP-IDF安裝在~/esp/esp-idf目錄 rm -rf ~/esp/esp-idf刪除ESP-IDF工具鏈和下載的工具&#xff1a; rm -rf ~/.espressif從PATH中移除ESP…

SQLMesh 內置宏詳解:@PIVOT等常用宏的核心用法與示例

本文系統解析 SQLMesh 的四個核心內置宏&#xff0c;涵蓋行列轉換的 PIVOT、精準去重的 DEDUPLICATE、靈活生成日期范圍的 DATE_SPINE&#xff0c;以及動態表路徑解析的 RESOLVE_TEMPLATE。通過真實案例演示參數配置與 SQL 渲染邏輯&#xff0c;并對比宏調用與傳統 SQL 的差異&…

基于Springboot + vue3實現的工商局商家管理系統

項目描述 本系統包含管理員、商家兩個角色。 管理員角色&#xff1a; 用戶管理&#xff1a;管理系統中所有用戶的信息&#xff0c;包括添加、刪除和修改用戶。 許可證申請管理&#xff1a;管理商家的許可證申請&#xff0c;包括搜索、修改或刪除許可證申請。 許可證審批管理…

第五部分:第五節 - Express 路由與中間件進階:廚房的分工與異常處理

隨著你的 Express 應用變得越來越大&#xff0c;所有的路由和中間件都寫在一個文件里會變得難以管理。這時候就需要將代碼進行拆分和組織。此外&#xff0c;一個健壯的后端應用必須能夠優雅地處理錯誤和一些常見的 Web 開發問題&#xff0c;比如跨域。 路由模塊化 (express.Ro…

萌新聯賽第(三)場

C題 這道題用暴力去寫想都不要想&#xff0c;一定超時&#xff0c;于是我們需要優化&#xff0c;下面是思路過程&#xff1a; 如圖&#xff0c;本題只需找到x的因數個數和(n-x)的因數個數&#xff0c;這兩個相乘&#xff0c;得到的就是對于這個x來說組合的個數&#xff0c;且x…