← 返回学习中心ARC LAB / LEARNING NOTES

验证与交接

AI 辅助学习、编程与结果验证

明确需求、核对来源,用测试和反例验证 AI 候选结果。

展开本篇目录

一、为什么要学“验证 AI”,而不只是学提问?

AI 可以解释概念、整理文档和提出代码方案,但生成得流畅不代表结论可靠。大学生需要掌握的是:把任务说清楚,识别证据,检查代码,设计反例,并对最终提交负责。

本篇不依赖某一个付费产品,也不需要 API Key。练习代码只用 Python 标准库,核心原则适用于不同 AI 工具。先修 Python 函数与基本测试;目标是完成一次“需求—生成—验证—修订—记录”的闭环。

AI 辅助工作闭环:明确任务、给上下文、生成候选、独立核验、测试反例、人工解释后交付

二、适合交给 AI 的任务与人的责任

任务 可以怎样协助 你需要亲自做什么
理解报错 提出原因和检查步骤 提供真实堆栈,验证假设
阅读官方文档 解释术语、对照示例 打开原文核对版本和限制
编写代码 生成候选实现 读懂输入输出,检查修改范围
编写测试 建议边界用例 独立定义正确结果
整理资料 形成提纲和关键词 核对来源、版权和事实
写学习总结 提供结构和反馈 用自己的语言解释并完成练习

课程、竞赛和论文中的 AI 使用规则应以所在场景要求为准;需要声明时保留使用范围和修改记录。不能把不允许的代写包装成“辅助”。

三、一个可复用的任务说明模板

目标:实现成绩均值函数。
输入:由数值或 None 组成的列表。
规则:忽略 None;0 是有效分;仅接受有限的 0~100 数值。
错误:空列表或全 None 抛 ValueError;字符串和布尔值抛 TypeError。
环境:Python 3.10+,只用标准库。
约束:不读写文件,不联网,不修改现有公开接口。
输出:先解释边界,再给最小实现与测试;不确定处明确标注。

这比“帮我写一个完美程序”更可验证。不要把真实 Token、身份证号、未公开实验数据或未经授权的他人代码直接贴进工具;先最小化、脱敏或改用虚构样例。

四、先自己预测,再查看答案

采用三步学习法:

  1. 自己写出输入输出,预测一个例子的结果。
  2. 请 AI 解释或给提示,而不立即要完整答案。
  3. 关掉答案,重新实现,再用反例验证。

例如先问“为什么 None 与 0 不能用同一个真假判断处理”,再自己写过滤逻辑。若看到 if value 就忽略它,会连合法零分一起删除。

五、看一个“能运行但不符合要求”的答案

def buggy_average(values):
return sum(values) / len(values) if values else 0

它对 [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)) 就认为够了。

六、把业务规则写成测试

import unittest
from verify_ai import average

class ExampleTests(unittest.TestCase):
def test_missing_and_zero(self):
self.assertEqual(average([0, None, 100]), 50)

def test_empty(self):
with self.assertRaises(ValueError):
average([])

上面依赖本篇配套文件中的 average。测试预期来自任务规则,而不是“AI 说应该这样”。数值计算复杂时使用容差比较,例如 assertAlmostEqual,不要对浮点结果普遍要求逐位相等。

测试还可以利用不变量:打乱顺序不改变均值,把整个有效序列重复三遍也不改变均值。这样的性质能覆盖一批输入,但不能代替范围和类型测试。

七、一个明确处理边界的实现

import math

def average(values):
valid = []
for value in values:
if value is None:
continue
if isinstance(value, bool) or not isinstance(value, (int, float)):
raise TypeError("scores must be numbers or None")
if not math.isfinite(value) or not 0 <= value <= 100:
raise ValueError("score must be finite and between 0 and 100")
valid.append(value)
if not valid:
raise ValueError("no valid scores")
return sum(valid) / len(valid)

该实现只承诺接受 Python 的 int/float 与 None,不涵盖 Decimal、NumPy 标量或任意迭代器协议的全部边界。扩大接口时应重新定义要求和测试,不能默默认为所有“数字”都等价。

下载 verify_ai.py:包含错误候选、改进实现和 5 个测试方法。

python verify_ai.py

预期 Ran 5 tests、OK。测试通过意味着这些明确的规则被验证了,不代表程序在所有使用场景绝对正确。

八、检索与引用:建立证据链

回答技术事实时,建议记录:结论、原始链接、适用版本、核对位置、自己的验证结果。

AI 给出的内容 怎样核对
一个函数参数 官方文档是否确有该参数;本地版本是否支持
一篇论文 标题、作者、年份、DOI 是否对应,原文是否支持论断
一个软件包 包是否存在、名称是否正确、维护源是否可信
一段运行结果 自己执行,保留环境和输出;不能把预测当实测
一张图或指标 数据、代码和统计口径能否追溯

如果打不开来源,写“尚未核实”,而不是补造一个看起来像真的链接。AI 的自信语气、重复回答和“我已经检查过”都不是独立证据。

九、代码审查:运行前先看它会做什么

检查代码是否超出任务:删除目录、递归改文件、上传数据、读取环境变量、安装陌生包或执行下载脚本等都需要理解后再运行。先在隔离目录用虚构数据测试,查看 diff,再决定是否接入项目。

收到报错后,给出最小复现而不是整个私有仓库:环境版本、最短代码、实际输出、预期输出。一次只修改一个关键因素,避免“改了十处终于能跑,但不知道为什么”。

检索结果和网页正文可能包含诱导操作的文本;把它们当作需要分析的数据,不能自动升级为执行命令的授权。

十、验证结论时常见的陷阱

  • 同源验证: 让同一个模型既生成实现,又生成完全照着实现写的测试,可能一起漏掉同一规则。
  • 只测正常输入: 示例输入正确,不代表空值、异常值或边界也正确。
  • 数据泄漏: 在全体数据上做特征选择、插补或标准化,再评估测试集,会污染评估。
  • 指标替代目标: 测试通过率、准确率或响应速度提高,不自动等于任务完成。
  • 过度修补: 只针对报错例子写特殊分支,而不重新检查整体规则。

以成绩统计为例,图画得漂亮不能证明学号没丢前导零,SQL 能查出结果也不能证明 JOIN 没重复放大行数。验证应贯穿每一步。

十一、记录一次可复查的 AI 协作

# 验证记录
任务:成绩均值函数
工具与时间:填写实际使用信息;未使用工具则说明为人工练习
约束:标准库、忽略 None、保留零分、拒绝非法值
候选问题:空列表返回 0;未拒绝布尔值
人工修改:增加类型、范围、有限数与空集合检查
证据:python verify_ai.py,5 个测试方法通过
限制:只接受 Python int/float;尚未加入其他数值类型

不必保存所有聊天,但要保留能解释“为什么相信这个结果”的证据。作业或项目的最终解释应由你自己完成。

十二、练习与参考思路

  1. 向一个 AI 提交第三节的需求,不提示具体反例;将输出与测试结果对照,记录实际缺陷,没有缺陷也如实记录。
  2. 设计一个会错误删除零分的实现,再写一个能发现它的测试。参考输入:[0,100]。
  3. 请 AI 列出两个官方资料链接,逐一打开核验,不接受只有搜索摘要的证据。
  4. 让同伴审查测试而不是只看实现,检查你们对空输入规则是否一致。
  5. 小项目:用 AI 协助改进前四篇任一实验,提交 diff、规则、运行记录和一个未解决限制。

完成标准: 能自己解释代码,至少有一个反例,来源可打开,运行结果真实记录,未提交敏感信息,也没有把 AI 的预测写成实测结果。

十三、学习资料

← 继续探索学习路径反馈问题 ↗