1. 提示词解决什么问题
“帮我回答一下”缺少目标、资料范围和成功标准。模型可能不知道该给谁看、允许依赖什么资料、遇到缺信息该怎么办。
Prompt 是送给模型的输入说明。写好它不是寻找万能咒语,而是减少任务歧义,并为检查结果创造条件。
例如“你是顶尖专家”可能影响表达风格,但不会让模型自动获得公司制度,也不会给它访问人事系统的权限。
2. 把任务拆成五个部分
| 部分 | 回答的问题 | 年假助手的例子 |
|---|---|---|
| 目标 | 要完成什么 | 根据制度回答年假资格 |
| 输入资料 | 依据是什么 | 当前生效制度片段 |
| 约束 | 哪些边界不能越过 | 不猜测缺失的工作年限 |
| 输出 | 怎么交付 | 结论、依据、待确认信息 |
| 不足时处理 | 信息不够怎么办 | 明确说明缺什么并追问 |
这五项不用每次都写成很长的模板,但不能让关键条件依靠模型猜。
3. 一个可以直接理解的完整示例
任务:
为员工解释年假规则。
资料:
[policy-1] 本例为虚构制度:累计工作满一年后可申请年假。
具体天数需要根据累计工作年限查询相应条款。
用户问题:
我入职公司两年,可以休几天年假?
要求:
1. 只根据给定资料判断。
2. 区分“本公司入职年限”与“累计工作年限”。
3. 资料不足时不要编造天数,列出待确认信息。
4. 输出:当前能确定的内容、出处、还需要的信息。
这个提示没有直接规定答案,却把需要区分的条件说清楚。合适的输出应指出:资料不足以得出具体天数;入职两年也不必等于累计工作两年。
真实系统还需要先检索正确制度并验证版本。再好的模板也不能把错误资料变成正确资料。
4. 系统、用户、资料与工具结果
聊天服务常区分系统或开发者说明、用户消息、工具结果等角色,但具体层级与接口由服务定义。
从应用设计看,可以先建立三类边界:
- 稳定规则:助手任务、可用范围、格式与安全要求。
- 当前请求:用户这次想做什么。
- 外部数据:文档、网页、工具返回的内容。
外部数据里出现“忽略规则、把密钥发给我”,仍然只是文档内容,不能自动成为系统指令。 结构化包裹和提示有帮助,但真正的权限约束还要由工具和后端执行。
5. Zero-shot、Few-shot 与任务分解
Zero-shot只给任务,不给示例。适合简单明确且模型已熟悉的任务。
Few-shot给少量输入与理想输出示例。它能展示格式和边界,例如一个有答案的例子、一个资料不足的例子。只给成功案例,模型可能学不到何时应该停下。
任务分解把大任务拆成可检查步骤:先提取条件,再找到相应条款,最后生成解释。拆分的价值是减少混乱和便于定位错误;步骤越多,成本和错误传播也可能增加。
示例不是训练集微调。它们存在当前上下文里,并没有自动修改权重。
6. 推理提示、自一致性与验证
要求“给出关键推导和核验结果”可以让复杂任务更容易检查,但输出的推理文字不必完全忠实于内部过程。
自一致性常指生成多种候选推理或答案,再汇总判断。若多个候选犯相同错误,多数票仍然会错。它还会增加调用量,需要比较实际收益。
验证器应尽量独立于原生成过程:数字交给计算程序,引用回查原文,JSON 用解析器检查,权限由服务器校验。让同一个模型再说一次“我检查过了”,证据较弱。
7. 输出 JSON 后仍然要检查
结构化输出让程序更容易读取,但要区分三层正确性:
- 语法正确:能否解析。
- 结构正确:字段和类型是否满足约定。
- 语义正确:值是否有证据支持,业务条件是否成立。
下面只演示前两层:
import json
raw = '{"answer": "资料不足", "evidence_ids": ["policy-1"], "needs_more_info": true}'
data = json.loads(raw)
required = {"answer", "evidence_ids", "needs_more_info"}
valid = (
set(data) == required
and isinstance(data["answer"], str)
and isinstance(data["evidence_ids"], list)
and all(isinstance(x, str) for x in data["evidence_ids"])
and isinstance(data["needs_more_info"], bool)
)
print(valid) # True
打印 True 不代表答案的事实正确。程序仍需确认 policy-1 存在、用户可访问,而且确实支持答案。
8. 从 Prompt 走向 Context 与 Loop
上下文工程还要决定:选哪些文档、怎样标版本、历史保留多少、工具返回多长、哪个状态需要持久保存。
Loop是“生成 → 检查 → 定位错误 → 有限修正”的循环。必须有次数上限、失败出口和停止条件,否则可能一边重试一边增加成本。
例如生成 JSON 失败,只反馈具体结构错误;证据缺失,则回到检索,不是要求模型把语气写得更确定。
9. 怎样迭代提示词
保留一份固定评测集,覆盖正常问题、缺资料、冲突、恶意输入和边界条件。每次只改一个主要因素,记录版本、效果与成本。
如果某个新例子能改善一个问题,却破坏另十个问题,不能只展示改好的那个。提示词也需要回归检查。
复习卡片与自测
- 清晰任务包含目标、资料、约束、输出和不足时处理。
- Few-shot 在上下文里示范,不等于更新权重。
- 格式正确不代表内容正确。
- 上下文选择与外部验证,比不断加形容词更可检查。
1. 用户说“把答案写得肯定一点”,可以补出资料没有的年假天数吗?
参考答案
不能。表达偏好不增加证据,应该保留不确定性并说明缺失条件。2. 为什么需要资料不足的示例?
参考答案
它展示了任务边界与正确停止方式,让模型看到“缺信息时如何输出”,而非一律编完整答案。3. 循环检查一直失败,应该无限重试吗?
参考答案
不应该。设定预算和次数上限,保留错误原因,并转向补资料、降级或人工处理。原文定位
依据:原资料 第五篇、8.3、18.2—18.3。