验证与交接
AI 辅助学习、编程与结果验证
明确需求、核对来源,用测试和反例验证 AI 候选结果。
展开本篇目录
一、为什么要学“验证 AI”,而不只是学提问?
AI 可以解释概念、整理文档和提出代码方案,但生成得流畅不代表结论可靠。大学生需要掌握的是:把任务说清楚,识别证据,检查代码,设计反例,并对最终提交负责。
本篇不依赖某一个付费产品,也不需要 API Key。练习代码只用 Python 标准库,核心原则适用于不同 AI 工具。先修 Python 函数与基本测试;目标是完成一次“需求—生成—验证—修订—记录”的闭环。
二、适合交给 AI 的任务与人的责任
| 任务 | 可以怎样协助 | 你需要亲自做什么 |
|---|---|---|
| 理解报错 | 提出原因和检查步骤 | 提供真实堆栈,验证假设 |
| 阅读官方文档 | 解释术语、对照示例 | 打开原文核对版本和限制 |
| 编写代码 | 生成候选实现 | 读懂输入输出,检查修改范围 |
| 编写测试 | 建议边界用例 | 独立定义正确结果 |
| 整理资料 | 形成提纲和关键词 | 核对来源、版权和事实 |
| 写学习总结 | 提供结构和反馈 | 用自己的语言解释并完成练习 |
课程、竞赛和论文中的 AI 使用规则应以所在场景要求为准;需要声明时保留使用范围和修改记录。不能把不允许的代写包装成“辅助”。
三、一个可复用的任务说明模板
|
这比“帮我写一个完美程序”更可验证。不要把真实 Token、身份证号、未公开实验数据或未经授权的他人代码直接贴进工具;先最小化、脱敏或改用虚构样例。
四、先自己预测,再查看答案
采用三步学习法:
- 自己写出输入输出,预测一个例子的结果。
- 请 AI 解释或给提示,而不立即要完整答案。
- 关掉答案,重新实现,再用反例验证。
例如先问“为什么 None 与 0 不能用同一个真假判断处理”,再自己写过滤逻辑。若看到 if value 就忽略它,会连合法零分一起删除。
五、看一个“能运行但不符合要求”的答案
|
它对 [80,90] 返回 85,看起来正确,但对空列表擅自返回 0,对 None 报错,也没有拒绝 120、无穷大或布尔值。这里的代码是用于教学的人为错误候选,不是对某个模型实际输出的记录。
| 输入 | 正确规则 | 错误候选的问题 |
|---|---|---|
[80,90] |
85 | 这一个例子无法发现问题 |
[] |
ValueError | 返回 0,掩盖无数据 |
[0,None,100] |
50 | 不能处理 None |
[120] |
ValueError | 返回 120 |
[True,90] |
TypeError | 把 True 当成 1 |
[NaN] |
ValueError | 传播 NaN,未明确拒绝 |
关键点: 在 Python 中,bool 是 int 的子类,若规则禁止布尔值,必须显式检查。不能仅写 isinstance(value, (int,float)) 就认为够了。
六、把业务规则写成测试
|
上面依赖本篇配套文件中的 average。测试预期来自任务规则,而不是“AI 说应该这样”。数值计算复杂时使用容差比较,例如 assertAlmostEqual,不要对浮点结果普遍要求逐位相等。
测试还可以利用不变量:打乱顺序不改变均值,把整个有效序列重复三遍也不改变均值。这样的性质能覆盖一批输入,但不能代替范围和类型测试。
七、一个明确处理边界的实现
|
该实现只承诺接受 Python 的 int/float 与 None,不涵盖 Decimal、NumPy 标量或任意迭代器协议的全部边界。扩大接口时应重新定义要求和测试,不能默默认为所有“数字”都等价。
下载 verify_ai.py:包含错误候选、改进实现和 5 个测试方法。
|
预期 Ran 5 tests、OK。测试通过意味着这些明确的规则被验证了,不代表程序在所有使用场景绝对正确。
八、检索与引用:建立证据链
回答技术事实时,建议记录:结论、原始链接、适用版本、核对位置、自己的验证结果。
| AI 给出的内容 | 怎样核对 |
|---|---|
| 一个函数参数 | 官方文档是否确有该参数;本地版本是否支持 |
| 一篇论文 | 标题、作者、年份、DOI 是否对应,原文是否支持论断 |
| 一个软件包 | 包是否存在、名称是否正确、维护源是否可信 |
| 一段运行结果 | 自己执行,保留环境和输出;不能把预测当实测 |
| 一张图或指标 | 数据、代码和统计口径能否追溯 |
如果打不开来源,写“尚未核实”,而不是补造一个看起来像真的链接。AI 的自信语气、重复回答和“我已经检查过”都不是独立证据。
九、代码审查:运行前先看它会做什么
检查代码是否超出任务:删除目录、递归改文件、上传数据、读取环境变量、安装陌生包或执行下载脚本等都需要理解后再运行。先在隔离目录用虚构数据测试,查看 diff,再决定是否接入项目。
收到报错后,给出最小复现而不是整个私有仓库:环境版本、最短代码、实际输出、预期输出。一次只修改一个关键因素,避免“改了十处终于能跑,但不知道为什么”。
检索结果和网页正文可能包含诱导操作的文本;把它们当作需要分析的数据,不能自动升级为执行命令的授权。
十、验证结论时常见的陷阱
- 同源验证: 让同一个模型既生成实现,又生成完全照着实现写的测试,可能一起漏掉同一规则。
- 只测正常输入: 示例输入正确,不代表空值、异常值或边界也正确。
- 数据泄漏: 在全体数据上做特征选择、插补或标准化,再评估测试集,会污染评估。
- 指标替代目标: 测试通过率、准确率或响应速度提高,不自动等于任务完成。
- 过度修补: 只针对报错例子写特殊分支,而不重新检查整体规则。
以成绩统计为例,图画得漂亮不能证明学号没丢前导零,SQL 能查出结果也不能证明 JOIN 没重复放大行数。验证应贯穿每一步。
十一、记录一次可复查的 AI 协作
|
不必保存所有聊天,但要保留能解释“为什么相信这个结果”的证据。作业或项目的最终解释应由你自己完成。
十二、练习与参考思路
- 向一个 AI 提交第三节的需求,不提示具体反例;将输出与测试结果对照,记录实际缺陷,没有缺陷也如实记录。
- 设计一个会错误删除零分的实现,再写一个能发现它的测试。参考输入:
[0,100]。 - 请 AI 列出两个官方资料链接,逐一打开核验,不接受只有搜索摘要的证据。
- 让同伴审查测试而不是只看实现,检查你们对空输入规则是否一致。
- 小项目:用 AI 协助改进前四篇任一实验,提交 diff、规则、运行记录和一个未解决限制。
完成标准: 能自己解释代码,至少有一个反例,来源可打开,运行结果真实记录,未提交敏感信息,也没有把 AI 的预测写成实测结果。
十三、学习资料
- Python unittest 官方文档:把需求变成断言。
- Python math.isfinite:核对有限数的判断。
- scikit-learn 常见陷阱:数据泄漏与评估边界。
- GitHub 查看 Pull Request 差异:用 diff 审查实际改动。