📌 本主題系列工作流所生成的文章,請參考另一個主題系列:[轉生到鬼島的反派,為了生存必須在30天內學會30種 AI 工具!]
📌 本主題內容以個人經驗為主探索 AIGC 協作工作流,建議讀者搭配個人情境參考適用程度
📌 文中使用『引用格式』代表輸入的 Prompt
💡
這是輸入的 Prompt
⚠️ 天才與瘋子只有一線之隔,使用 AIGC 請注意幻覺的副作用,建議搭配應用領域的相關 domain 服用。
⚠️ 由於 AIGC 突飛猛進,本系列介紹的工具版本可能快速的變更而有所差異
在 [Level 2] 時我們已經透過 Cursor 幫我們寫了一個 bash shell script,來自動化將一批的 Youtube 影片網址清單進行標籤與評分。
不過在進行多次的測試後,有兩個主要的錯誤。一個是在處理 Fabric 回傳的 json 內容時,偶而會有特殊字元的處理 error。第二個則是雖然提供了多筆影片網址,但都只產生第一筆的標籤與評分內容。
在多次的嘗試讓 Cursor 修了 A 又錯了 B 的鬼打牆之後,我意識到轉換高階語言可能會比較簡單。因為很多底層可能遇到的問題,在主要程式庫中都會有完整的異常處理。
因此我們希望可以有一個列表,讓個人電腦自動讀取列表中的 Youtube 影片網址。並依序呼叫 Fabric 的 Pattern,最後將標籤與評分結果更新到列表中。
那既然已經安裝了 Cursor,那我們就將這個需求丟給 AI 來幫我們想想辦法:
💡
我想開發一個 python script 讀取 csv 檔案
檔案中有幾個欄位,一個欄位是 video_url,其他欄位是 command line 指令輸出的 json 內容。
首先讀取 csv 檔案後,會將 video_url 當作參數呼叫一個 command line 指令。
最後將指令的 json 輸出結果中的欄位內容,依序填入 csv 檔案的對應欄位。
最後 Cursor 便幫我們生成了下面的 python 腳本,這樣我們只要新增一批 csv 中的影片網址,便可以每天自動讓 Fabric 幫我們批次評估影片是否值得花時間投資囉!
import csv
import json
import subprocess
import sys
def execute_command(video_url):
# 這裡替換成實際的命令行指令
command = f"fabric -y {video_url} | fabric -sp label_and_rate"
try:
result = subprocess.run(command, shell=True, capture_output=True, text=True, check=True)
return json.loads(result.stdout)
except subprocess.CalledProcessError as e:
print(f"執行命令時出錯:{e}")
return {}
except json.JSONDecodeError as e:
print(f"解析 JSON 時出錯:{e}")
return {}
def process_csv(input_file, output_file):
with open(input_file, 'r', newline='', encoding='utf-8') as infile, open(output_file, 'w', newline='', encoding='utf-8') as outfile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()
for row in reader:
video_url = row['video_url']
json_result = execute_command(video_url)
# 更新行中的其他欄位
for key in fieldnames:
if key != 'video_url' and key in json_result:
row[key] = json_result[key]
writer.writerow(row)
def main():
if len(sys.argv) != 3:
print("使用方法: python script.py <input_csv> <output_csv>")
sys.exit(1)
input_csv = sys.argv[1]
output_csv = sys.argv[2]
process_csv(input_csv, output_csv)
if __name__ == "__main__":
main()
由於 Fabric 新版本是用 Golang 開發,那我們也試試用 Cursor 開發 Golang 程式,之後可以考慮學習 Fabric 的原始碼並開發擴充功能。
因此我們希望可以有一個列表,讓個人電腦自動讀取列表中的 Youtube 影片網址。並依序呼叫 Fabric 的 Pattern,最後將標籤與評分結果更新到列表中。
那既然已經安裝了 Cursor,那我們就將這個需求丟給 AI 來幫我們想想辦法:
💡
我想開發一個 Golang 程式讀取 csv 檔案
檔案中有幾個欄位,一個欄位是 video_url,其他欄位是 command line 指令輸出的 json 內容。
首先讀取 csv 檔案後,會將 video_url 當作參數呼叫一個 command line 指令。
最後將指令的 json 輸出結果中的欄位內容,依序填入 csv 檔案的對應欄位。
最後 Cursor 便幫我們生成了下面的 Golang 程式,這樣我們只要新增一批 csv 中的影片網址,便可以每天自動讓 Fabric 幫我們批次評估影片是否值得花時間投資囉!
package main
import (
"encoding/csv"
"encoding/json"
"fmt"
"os"
"os/exec"
)
func executeCommand(videoURL string) map[string]interface{} {
// 這裡替換成實際的命令行指令
command := fmt.Sprintf("fabric -y %s | fabric -sp label_and_rate", videoURL)
cmd := exec.Command("bash", "-c", command)
output, err := cmd.Output()
if err != nil {
fmt.Printf("執行命令時出錯:%v\n", err)
return nil
}
var result map[string]interface{}
err = json.Unmarshal(output, &result)
if err != nil {
fmt.Printf("解析 JSON 時出錯:%v\n", err)
return nil
}
return result
}
func processCSV(inputFile, outputFile string) error {
// 讀取輸入文件
inFile, err := os.Open(inputFile)
if err != nil {
return fmt.Errorf("無法打開輸入文件:%v", err)
}
defer inFile.Close()
reader := csv.NewReader(inFile)
records, err := reader.ReadAll()
if err != nil {
return fmt.Errorf("讀取 CSV 時出錯:%v", err)
}
// 創建輸出文件
outFile, err := os.Create(outputFile)
if err != nil {
return fmt.Errorf("無法創建輸出文件:%v", err)
}
defer outFile.Close()
writer := csv.NewWriter(outFile)
defer writer.Flush()
// 寫入標題行
if err := writer.Write(records[0]); err != nil {
return fmt.Errorf("寫入標題行時出錯:%v", err)
}
// 處理每一行
for _, record := range records[1:] {
videoURL := record[0]
jsonResult := executeCommand(videoURL)
if jsonResult != nil {
for i, field := range records[0] {
if i != 0 && jsonResult[field] != nil {
record[i] = fmt.Sprintf("%v", jsonResult[field])
}
}
}
if err := writer.Write(record); err != nil {
return fmt.Errorf("寫入行時出錯:%v", err)
}
}
return nil
}
func main() {
if len(os.Args) != 3 {
fmt.Println("使用方法: go run script.go <input_csv> <output_csv>")
os.Exit(1)
}
inputCSV := os.Args[1]
outputCSV := os.Args[2]
err := processCSV(inputCSV, outputCSV)
if err != nil {
fmt.Printf("處理 CSV 時出錯:%v\n", err)
os.Exit(1)
}
fmt.Println("CSV 處理完成")
}