这一讲要回答的不是「AI 能干什么」,而是「它到底在干什么」。先补上术语底座——命令行、Python、库与框架、API——再拆开模型的机制、边界和沟通方式。讲完这一讲,后面两讲提到的每一个词,在座的人都应该知道它指什么。
JSON.parse、文本切块、概率归一化。你改输入,结果就跟着变,没有预先写好的答案。所有演示都能用键盘操作。整页可直接打印,打印时按钮会自动隐藏。
这门课不教「怎么让 AI 写周报」。三讲的目标是让一间会议室里的人用同一套词说话:当有人说「这个上下文塞不进去」「这一步要不要人在环」「这个 Agent 会不会绕圈」,所有人指的是同一件事。第一讲负责铺词。
先记下你自己的答案,第三讲结束时回来对一遍
这个板块不是为了让谁学会编程,是为了拆掉五个会一直挡路的词:命令行、Python、库与框架、API、Git。后面两讲每一次提到「终端型 Agent」「装个库」「调 API」「它自己开了个 PR」,都要用到这五个词。不讲这一块,第三讲会有一半人在猜。
不是黑客的东西,是没有图形界面时的正常操作方式
图形界面和命令行不是「简单版」和「高级版」,是同一台电脑的两个门。双击文件夹图标和敲 cd study-DM001 干的是同一件事:把「我现在在哪个目录」这个状态改掉。差别只有一个——图形界面用指,命令行用说。
为什么非要有个用「说」的门?因为说出来的话可以被记下来、重放、串起来、让别人检查。指的动作不行。你没法把「鼠标移到这儿、双击、再拖到那儿」存成文件明年再跑一遍,但你能把三十行命令存成一个脚本。这就是自动化的全部秘密,也是为什么所有能自己干活的工具最后都长出一个命令行。
下面是一个假的、跑在这个网页里的终端,装了一个假的项目目录。点按钮或者直接在里面打字,回车执行。删不坏任何东西——这里没有真的文件。先照顺序点一遍上面那排按钮。
支持 pwd ls ls -l cd cat head wc -l python pip install help clear。↑ ↓ 可以翻历史命令。
~ 是你的主目录。所有相对路径都从这里算。$ 是普通用户,# 是 root——看到 # 就该谨慎。命令 选项 参数——wc 是命令,-l 是选项(改行为),raw/ae.csv 是参数(作用对象)。看不懂一条命令时,先按这三段切开。ls 在不同目录给不同结果。所有「怎么在我这儿跑不出来」的问题,一半是这个状态不一样。lss——command not found 的意思很具体:这个词我不认识。它已经把问题精确指到了哪一个字上。命令行的报错几乎都是这种风格,读懂它比记住命令重要。
第三讲会讲「终端型 Coding Agent」。它的能力边界就是这个黑框的能力边界:你在命令行能做的,它能做;你做不了的,它也做不了;而你能在这里删掉的东西,它同样能删掉。这句话是后面讨论「人在环」和「设卡」时的物理基础。
不学语法,只建立「一个脚本是怎么跑起来的」这个直觉
先把关系摆正:Python 不是「更好的 SAS」,它是一门通用语言。SAS 是为「表格数据 + 统计过程」这一件事造的,所以它在这件事上顺手得不像话——proc freq 一行就出频数表。Python 什么都能干,代价是什么都得自己拼,或者装个库来拼。
三个必须记住的机制差别:
data / set / run 这三行背后有一个「逐行读、逐行处理」的引擎,你只写规则。Python 里那个 for 得自己敲——这是初看 Python 代码觉得啰嗦的主要原因。pandas、numpy 全是外面的人写的、要自己装。这是两个世界最大的心智落差,0.3 专门讲。if」。缩进错了就是逻辑错,而且经常不报错。还有个更基础的问题:一个脚本到底怎么「跑起来」?check_ae.py 只是个文本文件,本身什么都不会发生。是你在命令行敲 python check_ae.py,启动了叫 Python 解释器的那个程序,让它从上到下,一行一行读这个文件并照做。SAS 里对应的是提交代码给 SAS 引擎、然后看 log——一样的道理。
这是一个真能用的脚本:从 raw/ae.csv 里挑出 3 级及以上的不良事件,按受试者计数。点「下一步」,左边看它现在停在哪行,右边看变量的值怎么变。这是理解「程序」这个词最快的路径——它就是一个不断改写变量的过程。
int(row["AESEV"])。CSV 文件里没有类型,读进来的 "3" 是文字不是数字,不转换就比不出大小。SAS 的 proc import 会替你猜类型(有时猜错),Python 里这一步要你自己表态。
任务完全一样:读 ae.csv,筛 AESEV >= 3,按受试者出频数。切换标签,对着看。重点不是哪个好,是各自把哪部分工作交给了谁。
proc import datafile="raw/ae.csv" out=ae dbms=csv replace; run; data ae3; set ae; if AESEV >= 3; run; proc freq data=ae3; tables USUBJID / nocum nopercent; run;
set 背后就是逐行读。proc import 替你猜。方便,也是最常见的隐患来源。proc freq 内置,带完整的输出表和 ODS。import csv
counts = {}
with open("raw/ae.csv") as f:
for row in csv.DictReader(f):
if int(row["AESEV"]) >= 3:
sid = row["USUBJID"]
counts[sid] = counts.get(sid, 0) + 1
for sid in sorted(counts):
print(sid, counts[sid])
for 明明白白摆在那儿。int() 是你的责任。import pandas as pd
ae = pd.read_csv("raw/ae.csv")
ae3 = ae[ae["AESEV"] >= 3]
print(ae3["USUBJID"]
.value_counts()
.sort_index())
ae["AESEV"] >= 3 是整列一起比——和数据步的心智几乎一样。read_csv 替你猜,和 proc import 一个套路,也一样会猜错。value_counts() 一行出频数。pandas 不是 Python 自带的,得先装。它存在的意义就是把 SAS 数据步那套心智模型搬到 Python 里来。时间紧时可以自学;但第三讲讲 Coding Agent 之前必须补上
一句话分清库和框架:库是你调它,框架是它调你。
pandas 读表、requests 发网络请求。约等于 SAS 里一套别人写好的宏。接下来是最实际的一件事:库要装。装库的工具叫 pip,敲 pip install pandas,它去一个叫 PyPI 的公共仓库把包下载下来。这里埋着两个我们躲不开的问题。
两个项目:DM001 号研究的老脚本需要 pandas 1.5,DM002 号研究的新脚本需要 pandas 2.2。先在「全局环境」模式下,按顺序装两个版本、再分别跑一下,看会发生什么。然后切到「虚拟环境」模式重来一遍。
python3
└─ site-packages/
└─ (空)
装第二个版本时,第一个被覆盖掉了,而且没有任何警告。老脚本从此坏掉,坏的时间点和你改动的地方毫无关系——这是最难查的一类故障。
study-DM001/.venv/ → (空) study-DM002/.venv/ → (空)
每个项目自带一份独立的库目录,互不影响。python -m venv .venv 一行创建。这是行业默认做法,不是高级技巧。
requirements.txt,每行写死一个版本,比如 pandas==1.5.3)。这一节是板块 0 里最该讲的——后面两讲全靠它
API 是一台机器留给另一台机器用的表单。它规定了三件事:往哪个地址发、表单上有哪些格子、填对了会回你什么。人用网页,机器用 API,背后往往是同一套系统。
那张表单用 JSON 这种格式写。JSON 只有两种结构,看一眼就够:{} 是「键值对」(像一行观测,字段名 → 值),[] 是「列表」(像一叠行)。整个 AI 应用领域的数据都长这个样子,包括第二讲的工具调用、第三讲的 Agent 消息记录。板块 3.3 还会讲怎么让模型直接吐 JSON。
一份 define.xml 描述了数据集里有哪些变量、什么类型、取值范围——API 文档干的是同一件事,只是描述对象从数据集变成了接口。而 JSON 相当于 XML 的一个更省事的表亲。
下面是调用 Claude 时真正在网络上传输的东西——左边是发出去的,右边是回来的。点任何一个带下划线的字段,下面会解释它是什么、为什么在这儿。这一屏是第二讲和第三讲的地基:所谓「接了大模型」,指的就是有程序在替你反复发这个请求。
: sk-ant-••••••••••••
: 2023-06-01
content-type: application/json
{
"": "claude-opus-5",
"": 2048,
"": "你是临床数据审阅助手。只依据提供的数据回答,无法确定时明确说无法确定。",
"": [
{
"": "user",
"": "以下是 3 条 AE 记录……01-001-0042 有几条 3 级事件?"
}
],
"": { "effort": "medium" },
"": { "type": "adaptive" }
}
{
"id": "msg_01Ab2Cd3Ef4Gh5",
"type": "message",
"role": "assistant",
"model": "claude-opus-5",
"": [
{
"type": "text",
"text": "01-001-0042 有 2 条 3 级事件:\n中性粒细胞减少(2026-03-14)、\n发热(2026-03-21)。"
}
],
"": "end_turn",
"": {
"input_tokens": 1284,
"output_tokens": 96,
"cache_read_input_tokens": 0
}
}
先看整体形状:一次调用是无状态的。这个请求里没有「上一句话」,模型也不记得你刚问过什么。所谓「多轮对话」,是客户端每次都把之前所有轮次重新装进 messages 数组再发一遍。这一条解释了后面很多现象——为什么对话越长越贵、越长越慢,也为什么它会「忘」。
usage 就是账单。input_tokens + output_tokens 决定这一次花多少钱。第三讲算成本时,算的就是这两个数字。x-api-key 是钥匙,数据是从我们这边流出去的。请求体里那段 content 会离开公司网络。这是整个系列里最需要记住的一条边界——它是第三讲「数据边界」整节的起点,也是为什么受试者可识别信息不能进这个格子。
时间紧时可以自学;只需要建立一个概念
Git 是版本控制工具。对这门课来说,只需要理解它提供的一样东西:一个可以随时回到的已知良好状态。
这四个词解释了第三讲的一个观察:所有严肃的 Coding Agent 都要求项目在 Git 里。原因很直白——它要改一堆文件,而你需要在它改坏的时候一键回退,还需要逐行看它到底改了什么。Git 是把「让 AI 改代码」从赌博变成可控操作的那件东西。
@@ -4,7 +4,9 @@ counts = {} with open("raw/ae.csv") as f: for row in csv.DictReader(f): - if int(row["AESEV"]) >= 3: + sev = row["AESEV"].strip() + if not sev.isdigit(): + continue + if int(sev) >= 3: sid = row["USUBJID"]
上面是一个 Agent 真实会产出的那种改动:它发现 AESEV 有空值时原来的 int() 会崩,于是加了防护。这就是你要审的东西——四行,一眼能看完,判断得出对不对。
上面这个改动技术上对,业务上未必对。空的 AESEV 被 continue 悄悄跳过了——脚本不崩了,但那条记录从统计里消失了,而且没有任何提示。在我们这行,「静默丢数据」比「程序报错」严重得多。
这就是为什么「它跑通了」永远不等于「它做对了」。四行改动尚且如此,四百行改动会怎样,值得在这里停下来想三秒钟。
这个板块要同时拆掉两样东西:神秘感,和不切实际的期待。讲完之后,「它为什么会一本正经地编」「为什么对话长了就变笨」「为什么算数会错」这几个问题,应该都变成能推导出来的结论,而不是需要背的现象。
全课程最重要的一节。后面所有结论都从这一句推出来
大模型的全部工作是:读入一段文字,输出「下一个 token 该是什么」的一张概率表。就这样。没有理解、没有意图、没有查询数据库。它反复做这一件事,一次一个 token,把自己刚吐出来的接回输入,再猜下一个。
先解决那个词:token 不是「字」也不是「词」,是模型的最小切分单位。它是拿海量文本统计出来的——常见的片段占一个位置,不常见的被拆开。模型眼里的世界就是一串 token 编号,它从来没见过「字母」这个东西。这一条比听起来重要,先摸一下。
在框里打任何字,下面实时切成 token。先按顺序点前两个预设——同一句话的中文和英文版,比一下 token 数。
这是一个近似分词器:它复刻了真实分词器的三个规律(中文约一字一 token、英文约四字符一 token、数字和标识符被切碎),但具体边界和真实的 tokenizer 不完全一致。要精确数,用官方的 count_tokens 接口。
USUBJID 在模型眼里不是一个整体,是两三个碎片。所以它偶尔会把变量名拼错成一个「看起来很像」的东西——因为在它的世界里,这些碎片本来就是可以重新组合的。1234567890 被切成了几段。模型看不到「这是一个整数」,它看到的是几个碎片的排列。让它算数,等于让人只凭「这几个字块常一起出现」来做加法。算数要交给工具——这是第二讲工具调用的第一个理由。
知道了输入是什么,再看那个循环。这是全课程最该记住的一张图:
开头已经给定。每点一次「生成下一个」,就走一遍上面那张图的一整圈。先用默认温度点到句子结束,然后把温度拉到 0 重来一遍,再拉到 1.6 重来一遍——注意句子怎么变。也可以直接点概率条自己选一个 token。
1/T 次幂再归一化——这个演示里算的就是这个式子,你拉滑块时那些百分比是真的在重算。temperature 参数了——传了会直接报错。控制深浅的旋钮换成了 output_config.effort(low 到 max)。温度作为原理依然要理解(所有采样式生成都是这么工作的),但作为参数已经不是你该去调的东西了。这类「原理长期有效、参数半年就变」的落差,在这个领域里是常态——记原理,别记参数。
「它是不是在数据库里查了一下?」没有。整个过程里没有任何查询——只有一次矩阵计算和一次抽样。它「知道」的东西全部压在参数里,是训练时把统计规律固化下来的结果,没有一条可以指着说「这条知识存在这里」。
这也就是为什么你没法让它「改掉」某一条错误知识,只能在提问时把正确信息给它(板块 2、3 的全部内容),或者让它去外部查(第二讲的 RAG 和工具调用)。
这一节解释为什么它会「听话」——以及听话是被训出来的,不是天生的
上一节那个循环只会补全文本。一个只会补全的模型,你问它问题,它不会回答,它会接着往下编更多问题。它变成一个「助手」,靠的是训练完之后的两道加工。
拿海量文本反复做「猜下一个 token」。语言、常识、代码、逻辑的雏形都在这一步长出来,绝大部分能力来自这里。
数据:几万亿 token 的公开文本喂进大量「人问 → 好答案」的示范对,让它学会「被问了就该回答」这个格式。学的是行为模式,不是新知识。
数据:几万到几十万条人写的示范让人(或另一个模型)对多个候选答案排序,再用这些偏好去调它。有用、诚实、无害这些性质是在这一步塑造的。
数据:大量「A 比 B 好」的偏好比较问题固定:「临床试验里的盲态是什么意思?」切换标签,看同一个模型在三个训练阶段会输出什么。第一个标签是重点——多数人从没见过纯预训练模型的反应,而那才是「猜下一个 token」的裸机行为。
这三条不是缺点,是物理边界。绕不过去,只能规划
下面所有数字都是真算的。先选一个模型,然后拖「附件文档」和「对话轮数」,看那条预算条什么时候撑爆。重点看右下角两个数字:这一轮花多少,和聊到现在累计花多少。
stop_reason 变成 max_tokens)。「窗口有 100 万 token,那我把整个研究的文档全塞进去不就行了?」——技术上塞得进,但会同时踩两个坑:一是每一轮都按这个量重新计费,成本会失控;二是塞得越满,找得越不准(板块 3.4 会用一张图说明这件事)。塞满不等于用好。该带的是相关的那几页,不是全部。
回到开场第 3 题——答案是「都不是」
开场问过:它错的时候是「不会」还是「胡说」?正确答案是:这个区分在机制上不存在。它每一步都在做同一件事——从概率表里抽一个 token。表很尖的时候抽出来是对的,表很平的时候抽出来是编的,而这两种情况生成的句子在语气上完全一样。
关键在于:那张概率表里没有「我不知道」这个选项占据高位。模型必须输出某个 token,它不能输出「空」。所以在它没有相关知识时,概率会摊薄到一堆格式正确、看起来合理的候选上——然后其中一个被抽中,被当作既定事实接着往下写。
同一个模型,两个问题。切换看两张概率表的形状差别,然后看最下面那行「它实际会输出什么」。这个演示的全部意义在于:形状差别巨大,输出的语气毫无差别。
凡是「它应该知道」的问题,都改成「这里是材料,请只依据材料回答,材料里没有就说没有」。这一句改写,能消掉我们日常用法里的大部分幻觉风险,而且不需要任何工具、任何开发、任何预算。
全课程投入产出比最高的一个板块:不需要开发、不需要预算、今天下午就能用上。核心只有一句话——提示词的工作不是「说得客气」,是把模型必须替你猜的东西一个个关掉。
先讲原理,五要素只是原理的一个清单
回到 1.1:模型在算「下一个 token 的概率分布」。你的提示词是这张分布的唯一条件。提示词模糊,意味着有一大片彼此矛盾但都合理的续写共享概率——它抽中哪个都是偶然。提示词精确,意味着概率集中到你想要的那一片上。
所以「写好提示词」不是修辞问题,是信息问题:你每补一句话,就从模型的猜测清单上划掉一项。下面这个演示把这件事直接摊开。
原始请求就一句话:「帮我看一下这批 AE 数据有没有问题」。右边列着模型此刻必须替你猜的九件事。逐个打开左边的开关,看被划掉几条、提示词长成什么样。
| 要素 | 它关掉的是 | 写不写都行? |
|---|---|---|
| 角色 | 「这话说给谁听、用什么专业深度」 | 短任务可省。但跨专业沟通时必写——写给统计师看和写给项目经理看是两份东西。 |
| 任务 | 「到底要我干什么、干到什么程度」 | 必写。而且要写成动词:「列出」「比对」「改写成」,不要写「看一下」「处理一下」。 |
| 上下文 | 「相关事实是什么」 | 必写,而且是决定上限的那一项。板块 3 整节讲它。 |
| 输出格式 | 「长什么样、多长、什么语言」 | 结果要进下游程序时必写,而且要写成可机读的(板块 3.3)。 |
| 约束 | 「不许做什么、遇到边界怎么办」 | 最容易漏、也最值钱的一项。「材料里没有就说没有」属于这一项。 |
最省力的一招,原因也在 1.1 那张概率表里
为什么例子比说明有效?因为说明要模型先理解再翻译成行为,例子直接就是行为。你给它两条「输入 → 输出」的实例,它要做的只是把这个模式延续下去——而延续模式恰好是它唯一擅长的事。
更准确的说法是:例子在收窄可能性,不是在增加信息。下面这个演示把这个过程画出来。
任务:「把研究者手写的不良事件描述整理成标准条目」。下面六种输出全都符合这句指令——这就是问题所在。拖动示例数量,看哪些形态被掐掉。
这一节的参数细节半年就会变,判断标准不会变
所谓推理模型(或者「思考模式」),做的事很朴素:在给出答案之前,先生成一段推导过程。那段推导也是 token,一样计费、一样占窗口,只是通常不展示给你看。
为什么这会有效?回到 1.1 的第 ③ 条——模型没有回头修正的机制,已经写出来的就是前提。所以如果它一上来就要报答案,那个答案是「一步蒙出来的」。让它先把中间步骤写出来,每一步都成为下一步的上下文,等于给了它一张草稿纸。
这道题你自己做,需不需要打草稿?
需要打草稿的(多步推导、要回溯、有明确对错)→ 开深一点,值。
不需要打草稿的(查找、抽取、改写、翻译、格式转换、分类)→ 开了纯浪费钱和时间,而且有时更差:它会给一个简单任务硬编出一套推理,然后被自己那套推理带偏。
| 我们的日常任务 | 要不要让它多想 | 为什么 |
|---|---|---|
| 从 CRF 里抽字段填映射表 | 不要 | 是查找和搬运,没有推理链。多想只会增加编造的机会。 |
| 把一段 SAS 改写成等价 Python | 要 | 要逐句对照语义、处理缺失值差异,是多步推导。 |
| 润色一段病历叙述 | 不要 | 改写任务。想多了会自己加内容——在我们这行这叫编造。 |
| 核对派生变量的逻辑是否自相矛盾 | 要 | 典型的约束满足问题,需要来回验算。 |
| 按规范判断一批记录合不合规 | 要 | 规则多、有例外、要逐条比对。 |
| 把一份清单翻译成英文 | 不要 | 逐项映射,没有需要权衡的地方。 |
过去几年这件事的做法一直在变,现在(2026 年 9 月)在 Claude 这一代上是这样:思考默认是开着的、自适应的(thinking: {type: "adaptive"}),你不再指定「思考多少 token」,而是用一个叫 effort 的档位控制深浅——low / medium / high / xhigh / max。同时,1.1 提过的 temperature 在这一代上已经被移除了。
这些参数名不必记,只需要记住一件事:「深浅」现在是一个可调的旋钮,调它要花钱,所以该按任务性质选,不是一律开到最大。具体参数叫什么、有几档,要动手时去看当时的官方文档。
四组前后对照,可以直接照着改自己的提示词
帮我处理一下这个 AE 数据集。
逐条检查下面的 AE 记录,找出 「结束日期早于开始日期」和 「严重程度为 3 级以上但结局为 已恢复且未采取任何措施」这两类 矛盾,列出涉及的 USUBJID 和 AESEQ。不要给处理建议。
我们这个研究的主要终点该怎么 定义比较合适?
以下是方案第 4 节的原文: 【粘贴原文】 依据以上原文,说明主要终点的 定义和评估时点。原文未写明的 部分,回答「方案中未写明」, 不要推测。
把这份数据检查一遍,总结主要 发现,写成给申办方的邮件, 再列出后续要做的事,顺便看看 有没有需要报告的 SAE。
第一步(只做这一步):逐条检查 下面记录,输出问题清单,每条 注明 USUBJID 和问题类型。 ——确认清单无误后,再发第二条 提示词让它写邮件。
把这些日期统一一下格式。
把下列日期改写成 ISO 8601 (YYYY-MM-DD)。规则: · 只有年月的写成 YYYY-MM, 不要补日 · 完全缺失的留空,不要写 NA · 任何无法确定的,原样保留并 在末尾加 (?) 标记
拿出你这周真的问过 AI 的一句话,套用五问改写一遍,念给旁边的人听。不要求写得好,只要求指出原来那句里哪几件事是让模型猜的。改自己的活,比看别人的例子有用得多。
板块 2 讲的是怎么问,这个板块讲的是给它看什么。一句话概括全部内容:上下文是产出质量的上限,不是配料。提示词再好,也补不上没给它的事实。
这一节只有一个观念,但它决定后面所有做法
「上下文」指的是这一次调用时,模型能看到的全部文字:系统提示词、工具定义、之前每一轮对话、你粘进去的文档、工具返回的结果——0.4 那个请求体里的全部内容。
它是上限,因为回到 1.1:模型的输出是以上下文为条件的概率分布。不在上下文里的事实,不会以任何方式影响这个分布(除了它训练时碰巧记住的那部分,而那部分你既不能查也不能改)。所以:
问「怎么让 AI 答得更准」之前,先问「我给它看的东西够不够它答对」。十次里有七次,问题在后半句。
对我们最实际的一节——我们的材料几乎全是表格和长文档
模型的输入只有一种形状:一串 token。所以任何东西进去之前都要先拉平成文本。这个拉平过程是我们大部分「它读错了表」问题的真正来源。
0 认成 O、把 1 认成 l。下面是一张 AE 表,要被切成小块送进模型(或存进检索库)。拖动块大小,看切口落在哪。然后看最下面那条判定——同一个问题,在不同切法下能不能答对。切块和判定都是这个页面真算的,不是写死的。
要让它读一份材料,优先级是:① 纯文本 / CSV > ② Markdown 表格 > ③ 原生 PDF > ④ Excel > ⑤ 扫描版 PDF / 截图。能自己控制格式的时候,导成 CSV 或纯文本再给它,准确率的提升往往比换模型大得多,而且不花钱。
这一节决定了「能不能接进现有流程」
只要结果的下一站是程序而不是人,就必须要求结构化输出。理由不是好看,是散文的形状不稳定:同一个意思它能有十种写法,而每一种都要下游写一套解析——这活干不完。下面这个演示直接跑给你看。
下面四段散文说的是同一件事,只是措辞不同。右边那个提取程序(真的正则,就在这个页面里跑)逐个去读。点着看每一段坏在哪——特别是第四段。
JSON.parse() 的结果output_config.format,或者把它做成一个工具的参数)。能在 API 层约束的东西,就不要在提示词里恳求。
不写程序的人也用得上:「输出一个表格,四列:USUBJID、问题类型、涉及记录、依据。不要任何表格以外的文字。」——最后那半句是关键。它能把「好的,我帮您看了一下……」那段寒暄掐掉,让结果可以直接粘进 Excel。
这一节收掉第一讲,也直接接上第二讲
直觉会说:给的信息越多,它答得越好。实际不是。塞到一定程度之后,质量会掉。原因有五个,前两个是模型本身的,后三个是我们自己造成的。
顺着这一节往下想一步:如果「不能全塞进去」,又「必须让它用上那些材料」,那就得有个东西在每次提问时替你挑出该带的那几页——那个东西叫 RAG,是第二讲第一节。
再往下:如果它需要的不是文档而是算一下、查一下、改一下,那就得让它能调用外部程序——那是工具调用与 MCP,第二讲第二节。第一讲讲完的是边界,第二讲讲的全是怎么绕过这些边界。
把你开场时记下的答案对一遍。第 2 题(有没有打开过命令行)现在应该是「有」了。第 3 题的正确答案是「这个区分不存在」——它没有「不会」和「胡说」两种模式,只有一种模式。
pwd、ls(Windows 上是 dir)、cd 各一次。目标只是让那个黑框从「陌生」变成「见过」——第三讲讲终端型 Agent 时会用到这个熟悉感。第一讲讲的全是边界:它只会猜下一个 token、窗口有限、不知道截止日期之后的事、算不好数。第二讲讲的全是怎么绕过这些边界——用检索绕过知识边界(RAG),用工具绕过能力边界(Function Calling 与 MCP),用自主循环绕过单次调用的边界(Agent)。本讲的每一个约束,在第二讲都有一个对应的破解办法。
术语表按本讲出现顺序排列,可以单独打印。预设问答是这类培训里最常被问到的九个问题,答案一并写在这里,便于会后查阅。
~ 是主目录,. 是当前目录,.. 是上一层。「当前目录」是个会变的状态。python)是那个从上到下读它并照做的程序。pip install X 从公共仓库 PyPI 下载安装库。这条依赖链是需要被冻结和归档的供应链。{}(键值对)和 [](列表)两种结构。temperature 参数,改用 effort 档位。它是不是会偷偷学我们的数据,然后告诉别人?
要分两件事说。一、你发出去的内容确实离开了公司网络,这一点没有含糊空间,所以受试者可识别信息和未盲态数据不能进去。二、「会不会被用于训练」取决于你用的是哪种账户和合同——企业/API 通道通常默认不用于训练,个人版免费产品经常会。这不是技术问题,是合同问题,要看我们和供应商签的是什么,不能靠猜。第三讲会专门处理这一节。
那我把姓名删掉再发,是不是就安全了?
不够。去标识不等于不可识别——罕见适应症 + 出生年月 + 中心编号 + 访视日期,组合起来往往就能定位到人。判断依据应当是我们现有的数据分级规范,不是「我觉得看不出来是谁」。这一条建议直接沿用公司现行的数据处理 SOP,不要在这门课里另立标准。
既然它会编,那还能用来干什么?
用在「产出容易被验证」的地方。写检查脚本——跑一下就知道对不对;读懂一份没人熟悉的旧程序——它给的解释你可以对着代码核;把材料给它做抽取和改写——原文在手边,一比就知道。反过来,「产出难以验证」的地方就是它最危险的地方,比如让它凭记忆说某条法规怎么规定。判断标准不是任务难不难,是错了你能不能发现。
为什么同一个问题问两次答案不一样?这不是不可靠吗?
这是 Demo 2 里的采样——它每步是从概率表里抽签,不是查表。「不确定性」是这类模型的固有属性,不是缺陷或 bug。所以任何需要可重复的场景,都不能依赖「再问一次应该也一样」,必须把输出固化下来(存成文件、纳入版本控制),并且对结果做验证。第三讲讲验证和留痕时会回到这里。
我们要不要自己训练一个模型?
几乎肯定不要。板块 1.2 那张三段式图就是答案——能力主要来自预训练,而那一步的成本以千万美元计。真正的需求「让它懂我们的规范和数据」,属于后两段甚至更外层的问题,应该用上下文、检索、工具来解决(板块 2、3 和第二讲的全部内容),成本差好几个数量级,而且改起来是当天生效的。
我不写代码,板块 0 那些东西对我有什么用?
用处在于你要参与判断。第三讲会讨论「这个工具能不能进我们的流程」「哪一步必须有人确认」「数据边界划在哪」——这些讨论里会不断出现命令行、依赖、API、Git 这些词。不需要会用,需要知道它们指什么、边界在哪。不然那场讨论里你只能听,没法投票。
Python 会取代 SAS 吗?我们要不要都去学 Python?
这门课不回答这个问题,而且要小心别让它变成本课的隐含结论。板块 0.2 讲 Python 只有一个目的:这个领域的工具和示例几乎都是 Python 写的,看得懂才能参与判断。至于我们的交付流程用什么语言,是另一场需要考虑监管、验证、团队能力和历史资产的讨论,和这门课无关。
上下文窗口有 100 万 token,是不是就没有限制了?
窗口大只解决「装得进」,不解决「找得准」——板块 3.4 那张 U 形图讲的就是这件事。而且每一轮都按实际装进去的量重新计费,塞满 100 万 token 聊二十轮,账单会很有说服力。正确做法是带相关的那几页,不是全带。
这份讲义里的数字和参数,多久会过时?
分三层。原理层(下一个词预测、上下文是上限、幻觉机制、切块规则)——很稳定,可以按年算。实践层(提示词五要素、示例驱动、结构化输出)——也很稳定。参数与价格层(模型名、窗口大小、单价、temperature 还在不在)——三到六个月就会变一轮。所以本页凡是具体数字都注明了「2026 年 9 月」——请把它们当快照,不要当结论。
| 编号 | 演示 | 在哪一节 | 标签 |
|---|---|---|---|
| Demo A | 摸一次命令行 | 0.1 | 模拟沙盘 |
| Demo B | Python 执行追踪 | 0.2 | 模拟沙盘 |
| Demo C | SAS / Python 对照 | 0.2 | 模拟沙盘 |
| Demo D | 依赖与虚拟环境 | 0.3 | 模拟沙盘 |
| Demo E | 解剖一次模型调用 | 0.4 | 模拟沙盘 |
| Demo 1 | 分词器 | 1.1 | 真实运行 |
| Demo 2 | 亲手采样 + 温度 | 1.1 | 示意数值 |
| Demo 3 | 三个训练阶段 | 1.2 | 示意数值 |
| Demo 4 | 上下文预算 | 1.3 | 真实运行 |
| Demo 5 | 两张概率表 | 1.4 | 示意数值 |
| Demo 6 | 五个开关九个歧义 | 2.1 | 真实运行 |
| Demo 7 | 示例收窄可能性 | 2.2 | 示意数值 |
| Demo 8 | 表格被切在错的位置 | 3.2 | 真实运行 |
| Demo 9 | 让程序去读回答 | 3.3 | 真实运行 |