作者通过一年日志总结出核心规律:验证输出比生成输出便宜的地方AI就值得用,并用CSV清洗和统计建模两个场景做了具体验证。
我在日常研究工作中记录了一份粗略的日志,持续约一年,记录了 AI 工具在哪些地方节省了我的时间,在哪些地方悄无声息地浪费了我的时间。结果出乎我的意料——几乎所有收获都来自枯燥繁琐的地方;而所有损失都出现在那些在演示中看起来最惊艳的部分。
有一条规则可以预测这种分化:
任何验证输出比生成输出更便宜的地方,AI 都值得使用。
仅此而已。以下所有内容都从这条规则推导出来。写一个 pandas 变换是慢的;检查这个变换是否正确是快的,因为你可以直接看输出。推理一个混合效应模型是否正确指定是慢的,检查别人的推理同样慢。所以前者是 AI 的好用例,后者是一个陷阱。
每个实验室都有一台机器,导出的是 2011 年某个人写的 CSV。表头行里塞着单位。一列里有三种日期格式,因为中途更新了固件。本应是浮点数的地方出现了 n.d.。列名末尾带着空格,不花四十分钟处理 KeyError 就看不到。
这件事做得好的关键在于,我改变了对 AI 的请求方式。我不会把数据丢给模型,让它还我一份干净数据。我会给它一个样本,然后请它写出转换代码。
我粘贴进去的大致是:
print(df.head(20).to_markdown())
print(df.dtypes)
print(df.isna().sum())
加上对问题所在和目标 schema 的朴素描述。模型返回的是一个函数:
def normalize_run(df: pd.DataFrame) -> pd.DataFrame:
df = df.rename(columns=lambda c: c.strip().lower().replace(" ", "_"))
# instrument switched date format at firmware 2.4
df["collected_at"] = pd.to_datetime(
df["collected_at"], format="mixed", dayfirst=True, errors="coerce"
)
# "n.d." and "<LOD" both mean below detection, but they are not the same
# as missing — keep the distinction in a separate flag column
below_lod = df["conc"].astype(str).str.strip().isin({"n.d.", "<LOD"})
df["below_lod"] = below_lod
df["conc"] = pd.to_numeric(df["conc"].where(~below_lod), errors="coerce")
return df
模型从不碰任何单个数据点。它写转换函数,我读转换函数,然后对照源文件检查。如果转换错了,它会大声地、同样地错在每一行——这恰恰是你想要的失败模式。你不想要的失败模式是静默的逐行编辑。
一个回报丰厚的习惯:在函数末尾加上断言,然后保留它们。
assert df["collected_at"].notna().all(), "unparsed dates remain"
assert df["conc"].between(0, 1e4).all() or df["conc"].isna().any()
这些断言毫无成本,却帮我捕捉到两个真实的数据问题,与 AI 完全无关。
不是摘要,是筛选。
如果你正在开始一篇综述,从 Semantic Scholar 或 PubMed 查询中拿到了 800 条摘要,昂贵的部分不是阅读那 40 篇相关的——而是找出是哪 40 篇。这是一种带评分标准的分类任务,而且验证很便宜:抽查即可。
我使用的设置刻意做得很无聊。把纳入标准明确写出来,就像写给人类研究助理的说明:
INCLUDE 如果论文报告了对 X 在哺乳动物系统中的原始测量。
EXCLUDE 综述、不含实验验证的模拟、非哺乳动物系统。
如果摘要对系统描述模糊,标记为 UNSURE——不要猜测。
然后让每条摘要过一遍,存储决定、理由和摘要 ID。有三件事很关键:
保留 UNSURE 那个桶。被迫做二元判断的筛选器会做一个判断,而且很有信心。真正需要你读的,是你实际放入 UNSURE 堆里的那些。
记录被拒绝的条目及其理由。你需要之后能够审查,而且如果你在写系统综述,方法部分本来也需要这些。
自己手工筛选 50 条随机样本并比较。这花一个小时,但能告诉你评分标准是否有效。如果一致性很差,那是评分标准本身模糊,不是模型的问题。
最后一点是整个环节的关键。大多数时候筛选出问题,是因为那些标准本来就从来没有对人类研究助理做到足够精确——而你只是刚刚发现了这一点。
Argparse 代码块。matplotlib 子图网格,你要记着是 axes[i, j] 还是 axes[j, i]。statsmodels 公式语法。Snakemake 规则。正则表达式,用来解析你仪器文件名惯例。
这是回报最高的类别,也是最无聊的。共同特征是:我看输出能立即知道对不对,通常是跑一下。没人需要在这里小心翼翼。
相关的一种情况是:那些本来根本不会写的临时脚本。 一个五分钟的脚本,给 400 个文件按样本表重命名——以前这活儿我手工做,因为写脚本感觉比手工还费劲。这笔账现在变了,而且从长远看,这意味着更少的手工步骤从未被记录下来。
这是我预期收获最大、却得到最复杂答案的地方。
绘图不是瓶颈。问任何一个发过论文的人:瓶颈是第三次修订——审稿人让你重命名面板 B 里的一种蛋白质,而那个分层的源文件在一台已经被重装的笔记本上,唯一幸存的是一张压平的 300 dpi PNG。现在你因为一个词要在凌晨一点重建整个面板。
所以对于任何图表工具(AI 或否),有用的问题不是"它能生成一张好看的图吗"。而是"六个月后这个文件是什么样的"。一张无法编辑的生成 PNG 只是转移了问题,不是解决了问题。我要的是分层的 SVG,能在 Illustrator 或 Inkscape 里正常打开;或者是可编辑的 PPTX——如果你们组的幻灯片本来就存在那里的话。
大致这就是为什么我用 Scientific Figure 做示意图和图形摘要,而不是通用的图像模型:它能从描述、一个笔记本草图或参考图生成草稿,但输出保持为可编辑的图层,你可以导出为 SVG 或 PPTX。关键不是生成这一步。而是六个月后的修订只需两分钟,而不是花一个下午。
有两件事值得直说。第一,每次都要自己检查每个标签。图像中生成的文字是整个工作流里最不可靠的东西,图表里一个转错的下标就是一份勘误通知。第二,投稿前检查目标期刊的 AI 披露政策,因为各期刊要求不同,而且每隔几个月就在变。
我不使用 AI 起草文章。我发现有用的是相反方向:粘贴进你已经写好的一节,请它给出它所隐含的大纲。每段一句话,不带评论。
当返回的大纲与你脑中预设的不符时,这是关于你写作的真正发现。通常意味着第四段在做两件事,或者你以为是讨论部分的论点其实只在图注里。
对抗性版本也有效:"你是审稿人 2。列出对这一节最可能出现的三个方法论异议。"会有一些噪音,但让你感到尴尬的异议,才是真实审稿人也会提出的,而且现在听到它们要便宜得多。
统计推理。问模型规格设定、多重比较校正,或者某个特定 p 值允许你得出什么结论,你会得到一个具有专业外形的答案。其中一些是错的,而且需要领域专家才能看出来。在这里验证和亲自动手一样昂贵,所以根据开头的规则,它不值得。我会问统计学家。
引文。这应该是个已经解决的问题,但实际不是。任何不检索原文就生成参考文献的工具,都会生成不存在的参考文献——作者看似合理,期刊看似合理,年份看似合理。每条引文都要通过 DOI 核实,否则不放入。没有任何例外,没有任何"大概没问题"。
两者的模式相同:输出自信满满、结构正确,但检查成本极高。这恰恰是不该自动化的东西的特征。
根据检查答案的成本来排序你的任务,而不是根据任务本身的难度。
数据清洗、样板代码、文件处理、第一轮筛选:检查便宜,放心自动化。统计、引文、任何 subtle 错了和做对了在审稿人发现之前无法区分的事:自己做,或者问懂的真人。
工具会越来越好,但这条规则不会变,因为它无关能力。它关乎谁为论文负责。