Python 提示词校验练习:JSON、结构与安全
模型只是 AI 功能的一部分。周围的 Python 决定输入什么、输出是什么形状,以及响应错误时怎么办。这些练习构建校验层,避免坏响应变成坏操作。
把输出契约写清楚
把任务和要求的 JSON 结构放在一个模板里。写清字段名、类型,以及无法回答时怎么做。契约要短到人类可以审查、测试可以执行。
template = "Return JSON with title and minutes for a lesson about {topic}."
prompt = template.format(topic="loops")
print(prompt)这是契约,不是愿望
用 json.loads 解析
被说明文字或 Markdown 包裹的响应不是合法 JSON。严格解析,捕获 JSONDecodeError,并保留原始文本用于调试。绝不要使用 eval:模型输出是不可信输入。
import json
raw = '{"title": "Loops", "minutes": 12}'
try:
data = json.loads(raw)
except json.JSONDecodeError:
data = None
print(data)严格解析
校验键、类型和范围
解析成功也可能内容错误。检查必需键、期望类型和合理范围。返回错误列表,而不是在页面渲染深处抛异常,让调用方决定重试还是回退。
required = {"title": str, "minutes": int}
data = {"title": "Loops", "minutes": "12"}
errors = []
for key, kind in required.items():
if key not in data:
errors.append(f"missing {key}")
elif not isinstance(data[key], kind):
errors.append(f"wrong type {key}")
print(errors)把错误当成数据
在失败前设计回退
提前决定解析或校验失败后怎么办:用更短的提示词重试一次、显示安全默认值,还是交给人工。不要静默编造缺失字段。记录失败类别,但不要记录密钥。
def validate(data):
if not isinstance(data, dict):
return ["not an object"]
if "title" not in data:
return ["missing title"]
return []
print(validate({"minutes": 12}))
print(validate({"title": "Loops"}))可预测的失败路径
不要把密钥和个人数据放进去
提示词里不要放 API 密钥、密码、隐私记录或不必要的个人数据。检索文本中的指令是不可信内容,不是调用工具的授权。影响重大的决定要保留人工复核和审计记录。
record = {"name": "Ada", "email": "ada@example.com", "topic": "loops"}
safe = {key: value for key, value in record.items() if key != "email"}
print(safe)提示前先最小化
你的练习清单
- 在提示词模板中写清必需字段和类型。
- 用 json.loads 解析并捕获 JSONDecodeError。
- 使用前校验缺失键、类型和范围。
- 为每种失败选择重试、回退或人工复核。
- 不要把密钥和不必要的个人数据放进提示词。
常见问题
可以让模型返回 JSON 然后直接相信吗?
不能。要求 JSON 之后还要解析和校验。模型可能返回合法 JSON 却字段错误,也可能在对象外包一层说明文字。
应该无限自动重试吗?
不应该。使用有上限、带退避的重试和明确回退。无限重试增加成本,还会掩盖持续存在的结构问题。
提示词注入只是聊天机器人的问题吗?
不是。任何读取不可信文本、又能触发工具或数据访问的模型,都需要在内容和权限之间建立边界。
练习提示词校验
12 道题,覆盖模板、JSON 解析、结构校验、回退和隐私。
继续阅读: