用 AI 做那些烦人的事:几个真正能省时间的提效套路

2026-05-28 18 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:10 分钟

让 AI 写测试、通宵 Debug、帮回老板消息——这些事不少开发者已经在干了,只是不好意思公开说。开源中国最近发起了「AI 提效小机灵鬼」征集活动,说白了就是:把你用 AI 偷懒的骚操作拿出来晒,让全网程序员看看什么叫"聪明的懒惰"。

但抛开活动本身,真正值得聊的是:哪些 AI 提效套路是可复制的?哪些只是看起来酷但实际鸡肋?下面分享几个我实测能省时间的场景,附带可以直接跑的代码。

自动生成单元测试:最稳的提效起点

写测试是公认最枯燥的环节之一。用 LLM 从函数签名和 docstring 批量生成测试用例,是目前性价比最高的 AI 提效方式——因为测试代码容错率高,即使生成结果有瑕疵,跑一遍就能筛掉错误用例,不像业务逻辑那样容不得半点偏差。

下面是一个最小可跑的脚本,读取 Python 源文件中的函数定义,调用 OpenAI 兼容接口生成对应的 pytest 测试:

#!/usr/bin/env python3
"""从 Python 源码自动生成 pytest 测试用例"""

import ast
import os
import sys
from openai import OpenAI

# ---- 配置区:按你的环境修改 ----
API_KEY = os.getenv("OPENAI_API_KEY", "sk-xxx")
BASE_URL = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
MODEL = os.getenv("AI_MODEL", "gpt-4o-mini")
# ---- 配置区结束 ----

client = OpenAI(api_key=API_KEY, base_url=BASE_URL)


def extract_functions(source_path: str) -> list[dict]:
    """解析源文件,提取函数名、参数、docstring"""
    with open(source_path) as f:
        tree = ast.parse(f.read())
    funcs = []
    for node in ast.walk(tree):
        if isinstance(node, ast.FunctionDef):
            args = [a.arg for a in node.args.args]
            doc = ast.get_docstring(node) or ""
            funcs.append({"name": node.name, "args": args, "docstring": doc})
    return funcs


def generate_tests(source_path: str, funcs: list[dict]) -> str:
    """调用 LLM 为提取到的函数生成 pytest 测试"""
    source_code = open(source_path).read()
    func_descriptions = "\n".join(
        f"- `{f['name']}({', '.join(f['args'])})`: {f['docstring']}" for f in funcs
    )
    prompt = (
        f"你是测试工程师。根据以下 Python 源码和函数列表,生成完整的 pytest 测试文件。\n"
        f"要求:覆盖正常路径和边界情况;每个函数至少 2 个测试;"
        f"只输出代码,不要解释。\n\n"
        f"源码:\n```python\n{source_code}\n```\n\n"
        f"函数列表:\n{func_descriptions}"
    )
    resp = client.chat.completions.create(
        model=MODEL,
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3,
    )
    text = resp.choices[0].message.content
    # 剥掉 markdown 代码块包裹
    if text.startswith("```"):
        text = text.split("\n", 1)[1].rsplit("```", 1)[0]
    return text


def main():
    if len(sys.argv) < 2:
        print("用法: python gen_tests.py <源文件路径>")
        sys.exit(1)
    src = sys.argv[1]
    funcs = extract_functions(src)
    if not funcs:
        print("未找到函数定义,跳过")
        return
    test_code = generate_tests(src, funcs)
    out_path = os.path.splitext(src)[0] + "_test.py"
    with open(out_path, "w") as f:
        f.write(test_code)
    print(f"测试已写入 {out_path},共 {len(funcs)} 个函数")
    print("下一步: pytest " + out_path + "  # 跑一遍,删掉失败的用例")


if __name__ == "__main__":
    main()

运行方式:

# 安装依赖
pip install openai

# 设置 API(支持任何 OpenAI 兼容接口,比如 DeepSeek、本地 Ollama)
export OPENAI_API_KEY="你的key"
export OPENAI_BASE_URL="https://api.deepseek.com/v1"  # 换成你用的服务
export AI_MODEL="deepseek-chat"

# 对任意 Python 文件生成测试
python gen_tests.py my_module.py

关键思路:生成后必须跑一遍 pytest,删掉失败用例、补全遗漏边界。AI 生成测试的价值不在"一次完美",而在"省掉 80% 的打字量",剩下的 20% 你手动修比从头写快得多。

Git Commit Message 自动撰写

另一个低风险、高收益的场景:让 AI 根据 diff 写 commit message。没人喜欢写 commit message,但好的 commit message 又确实有用。这个场景容错率也高——写不好顶多不优雅,不会搞坏代码。

#!/usr/bin/env bash
# ai_commit.sh — 用 AI 生成 git commit message
# 依赖: git, curl, jq

# ---- 配置区 ----
API_KEY="${OPENAI_API_KEY:-sk-xxx}"
BASE_URL="${OPENAI_BASE_URL:-https://api.openai.com/v1}"
MODEL="${AI_MODEL:-gpt-4o-mini}"
# ---- 配置区结束 ----

DIFF=$(git diff --cached --stat && echo "---详细diff---" && git diff --cached)

PROMPT="根据以下 git diff 生成一条简洁的中文 commit message,格式: <类型>: <描述>。类型用 feat/fix/refactor/docs/chore。只输出一行,不要解释。

${DIFF}"

RESPONSE=$(curl -s "${BASE_URL}/chat/completions" \
  -H "Authorization: Bearer ${API_KEY}" \
  -H "Content-Type: application/json" \
  -d "$(jq -n \
    --arg model "$MODEL" \
    --arg prompt "$PROMPT" \
    '{model: $model, messages: [{role: "user", content: $prompt}], temperature: 0.2}' \
  )" \
)

MSG=$(echo "$RESPONSE" | jq -r '.choices[0].message.content' | sed 's/^"//;s/"$//')

echo "建议 commit message:"
echo "  $MSG"
echo ""
read -p "采用此 message? [Y/n/e(手动编辑)] " ACTION

case "$ACTION" in
  n) echo "跳过"; exit 1 ;;
  e) read -p "输入你的 message: " CUSTOM; git commit -m "$CUSTOM" ;;
  *) git commit -m "$MSG" ;;
esac

用法:

git add your_files
bash ai_commit.sh

这个小脚本把 staged diff 喂给 LLM,拿到一条格式化的 commit message,再让你确认或修改。比每次手写 feat: 添加用户登录页面 省心不少。

哪些场景别碰 AI

说完了能用的,也得说边界:

  • 业务逻辑核心代码:AI 生成的业务代码跑起来可能没问题,但隐藏的逻辑漏洞(比如权限判断漏了边界)很难通过简单测试发现。这类代码写错了代价太高,AI 只适合给灵感,不适合直接上。
  • 数据库 schema 变更:一条 ALTER TABLE 写错可能导致数据丢失,AI 生成后必须逐字人工审查,反而比自己写更慢。
  • 安全相关配置:CORS 规则、鉴权中间件、TLS 配置——AI 可能给你一个"能跑但不安全"的方案,这种坑最危险。

简单判断原则:出错后果越严重的代码,AI 参与比例越低。测试和文档出错代价小,放心用;核心逻辑出错代价大,谨慎用。

把你的骚操作晒出来

回到开头说的活动——开源中国这个「AI 提效小机灵鬼」征集,本质上就是让开发者把各自私藏的 AI 偷懒技巧公开化。你如果有类似的套路(比如用 AI 批量翻译文档、自动写 CRUD 接口、生成 Kubernetes Helm chart),提交上去既能让别人少走弯路,还有京东卡奖励。

几个提交建议:

  1. 写清楚工具链:用了哪个模型、什么 prompt 策略、哪个 API 参数调了——这些才是别人能复制的部分。
  2. 附上可跑的代码:一个 20 行的脚本比 2000 字描述有用得多。
  3. 标注风险:你的套路在什么场景下会翻车,提前说清楚,比事后被人骂靠谱。

"聪明的懒惰"不是什么都不做,而是把重复劳动丢给机器,把精力留给真正需要人判断的部分。上面两个脚本你可以直接拿去改造——换模型、换 prompt、加到 CI 流程里,都行。跑通了之后,不妨去活动页面提交一下,让更多人少写几行无聊的代码。


相关推荐