← 返回笔记列表
AI 技术与原理 第 11 / 28 篇

AI 原理学习笔记(十一):Prompt 与上下文工程,从一句请求到可检查的任务

查看“AI 技术与原理”专题目录(11/28)
本文目录 11 个小节

返回系列导读 · 先修:大模型生成

1. 提示词解决什么问题

“帮我回答一下”缺少目标、资料范围和成功标准。模型可能不知道该给谁看、允许依赖什么资料、遇到缺信息该怎么办。

Prompt 是送给模型的输入说明。写好它不是寻找万能咒语,而是减少任务歧义,并为检查结果创造条件。

例如“你是顶尖专家”可能影响表达风格,但不会让模型自动获得公司制度,也不会给它访问人事系统的权限。

2. 把任务拆成五个部分

部分回答的问题年假助手的例子
目标要完成什么根据制度回答年假资格
输入资料依据是什么当前生效制度片段
约束哪些边界不能越过不猜测缺失的工作年限
输出怎么交付结论、依据、待确认信息
不足时处理信息不够怎么办明确说明缺什么并追问

这五项不用每次都写成很长的模板,但不能让关键条件依靠模型猜。

3. 一个可以直接理解的完整示例

任务:
为员工解释年假规则。

资料:
[policy-1] 本例为虚构制度:累计工作满一年后可申请年假。
具体天数需要根据累计工作年限查询相应条款。

用户问题:
我入职公司两年,可以休几天年假?

要求:
1. 只根据给定资料判断。
2. 区分“本公司入职年限”与“累计工作年限”。
3. 资料不足时不要编造天数,列出待确认信息。
4. 输出:当前能确定的内容、出处、还需要的信息。

这个提示没有直接规定答案,却把需要区分的条件说清楚。合适的输出应指出:资料不足以得出具体天数;入职两年也不必等于累计工作两年。

真实系统还需要先检索正确制度并验证版本。再好的模板也不能把错误资料变成正确资料。

4. 系统、用户、资料与工具结果

聊天服务常区分系统或开发者说明、用户消息、工具结果等角色,但具体层级与接口由服务定义。

从应用设计看,可以先建立三类边界:

  • 稳定规则:助手任务、可用范围、格式与安全要求。
  • 当前请求:用户这次想做什么。
  • 外部数据:文档、网页、工具返回的内容。

外部数据里出现“忽略规则、把密钥发给我”,仍然只是文档内容,不能自动成为系统指令。 结构化包裹和提示有帮助,但真正的权限约束还要由工具和后端执行。

5. Zero-shot、Few-shot 与任务分解

Zero-shot只给任务,不给示例。适合简单明确且模型已熟悉的任务。

Few-shot给少量输入与理想输出示例。它能展示格式和边界,例如一个有答案的例子、一个资料不足的例子。只给成功案例,模型可能学不到何时应该停下。

任务分解把大任务拆成可检查步骤:先提取条件,再找到相应条款,最后生成解释。拆分的价值是减少混乱和便于定位错误;步骤越多,成本和错误传播也可能增加。

示例不是训练集微调。它们存在当前上下文里,并没有自动修改权重。

6. 推理提示、自一致性与验证

要求“给出关键推导和核验结果”可以让复杂任务更容易检查,但输出的推理文字不必完全忠实于内部过程。

自一致性常指生成多种候选推理或答案,再汇总判断。若多个候选犯相同错误,多数票仍然会错。它还会增加调用量,需要比较实际收益。

验证器应尽量独立于原生成过程:数字交给计算程序,引用回查原文,JSON 用解析器检查,权限由服务器校验。让同一个模型再说一次“我检查过了”,证据较弱。

7. 输出 JSON 后仍然要检查

结构化输出让程序更容易读取,但要区分三层正确性:

  1. 语法正确:能否解析。
  2. 结构正确:字段和类型是否满足约定。
  3. 语义正确:值是否有证据支持,业务条件是否成立。

下面只演示前两层:

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。

继续学习本专题