我用 AI 写了 100 个自动化脚本,效率提升 10 倍的真实体验
先说结论:AI 写脚本是真的强,但前提是你得知道怎么"指挥"它。
我是做运维的,日常有大量重复性工作——日志分析、数据迁移、监控报警、自动部署。以前这些活儿占了我 60% 的工作时间。后来我开始系统性地用 AI 写自动化脚本,现在这部分时间压缩到了 6%。
下面是我积累的一些实战经验。
为什么 AI 写脚本特别靠谱
脚本有个特点:输入输出明确、逻辑线性、不需要复杂的架构设计。这恰好是 AI 最擅长的领域。
BASH
# 举个例子:分析 Nginx 日志,统计各接口的 P99 延迟
# 以前手写要 30 分钟,AI 10 秒出结果
cat /var/log/nginx/access.log | \
awk '{print $7, $NF}' | \
sort | \
awk '{
times[$1] = times[$1] " " $2
} END {
for (path in times) {
split(times[path], arr, " ")
n = asort(arr)
p99 = arr[int(n * 0.99)]
printf "%s: P99=%.3fs\n", path, p99
}
}'我的 AI 脚本开发流程
经过 100 个脚本的打磨,我总结出了这个流程:
第一步:定义输入输出
先明确告诉 AI 输入是什么、输出要什么格式:
CODE
我需要一个 Python 脚本,功能如下:
- 输入:一个 CSV 文件路径,包含字段 name,email,department
- 输出:按 department 分组,生成多个 CSV 文件到 ./output/ 目录
- 额外要求:跳过空行,去重 email,记录跳过的行到 skip.log第二步:要求错误处理
AI 默认写的脚本缺少错误处理,一定要明确要求:
PYTHON
# 不够好 - AI 默认产出
def process_csv(filepath):
with open(filepath) as f:
reader = csv.DictReader(f)
# 没有任何错误处理...
# 好得多 - 加上明确要求后
def process_csv(filepath: str) -> dict:
"""处理 CSV 文件,按部门分组输出"""
if not os.path.exists(filepath):
return {"error": f"文件不存在: {filepath}"}
if not filepath.endswith('.csv'):
return {"error": "仅支持 CSV 格式"}
os.makedirs('./output', exist_ok=True)
departments = defaultdict(list)
skip_count = 0
try:
with open(filepath, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
if not all(row.values()):
skip_count += 1
continue
departments[row['department']].append(row)
except csv.Error as e:
return {"error": f"CSV 解析错误: {e}"}
# 输出去重后的文件
for dept, rows in departments.items():
output_path = f'./output/{dept}.csv'
unique_rows = {r['email']: r for r in rows}.values()
with open(output_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'email', 'department'])
writer.writeheader()
writer.writerows(unique_rows)
return {
"success": True,
"departments": list(departments.keys()),
"total_records": sum(len(v) for v in departments.values()),
"skipped": skip_count
}第三步:让 AI 写测试
脚本写完后,让 AI 自己写测试用例:
PYTHON
import unittest
import tempfile
import os
class TestProcessCsv(unittest.TestCase):
def setUp(self):
self.test_csv = tempfile.NamedTemporaryFile(
mode='w', suffix='.csv', delete=False
)
self.test_csv.write(
"name,email,department\n"
"张三,zhangsan@corp.com,Engineering\n"
"李四,lisi@corp.com,Engineering\n"
"王五,wangwu@corp.com,Marketing\n"
"张三,zhangsan@corp.com,Engineering\n" # 重复
)
self.test_csv.close()
def tearDown(self):
os.unlink(self.test_csv.name)
def test_basic(self):
result = process_csv(self.test_csv.name)
self.assertTrue(result['success'])
self.assertEqual(result['total_records'], 3) # 去重后
def test_missing_file(self):
result = process_csv('/nonexistent.csv')
self.assertIn('error', result)
def test_invalid_extension(self):
result = process_csv('/tmp/test.txt')
self.assertIn('error', result)常见翻车场景及解法
场景 1:路径处理
PYTHON
# AI 经常写的
with open('data/config.json') as f:
...
# 应该这样 - 使用绝对路径
import os
from pathlib import Path
BASE_DIR = Path(__file__).parent
config_path = BASE_DIR / 'data' / 'config.json'
with open(config_path) as f:
...场景 2:并发安全
PYTHON
# AI 默认写的 - 不安全
def process_file(filepath):
with open(filepath, 'w') as f:
f.write(result)
# 应该这样 - 原子写入
import tempfile
def safe_write(filepath, content):
dir_path = os.path.dirname(filepath)
with tempfile.NamedTemporaryFile(
mode='w', dir=dir_path, delete=False
) as tmp:
tmp.write(content)
tmp_path = tmp.name
os.replace(tmp_path, filepath) # 原子操作我的 Prompt 模板
经过大量迭代,我沉淀了一个万能 Prompt:
CODE
写一个 Python 脚本,要求:
1. 功能:[详细描述]
2. 输入:[格式、来源]
3. 输出:[格式、目标]
4. 错误处理:对以下异常要有处理(文件不存在、格式错误、网络超时)
5. 日志:使用 logging 模块,INFO 级别以上
6. 类型:使用 type hints
7. 配置:通过环境变量或配置文件读取敏感信息
8. 测试:提供 pytest 测试用例
9. 文档:每个函数有 docstring总结
AI 写脚本的核心不是"让它写",而是"教它写"。你要做好三件事:
1. 把需求翻译成精确的输入输出描述
2. 补充 AI 容易忽略的边界条件和错误处理
3. 让 AI 自测,形成闭环
做到这三点,AI 写脚本的成功率能从 60% 提升到 95%。
读者评论 2