专项练习 · 10 分钟阅读

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 然后直接相信吗?

不能。要求 JSON 之后还要解析和校验。模型可能返回合法 JSON 却字段错误,也可能在对象外包一层说明文字。

应该无限自动重试吗?

不应该。使用有上限、带退避的重试和明确回退。无限重试增加成本,还会掩盖持续存在的结构问题。

提示词注入只是聊天机器人的问题吗?

不是。任何读取不可信文本、又能触发工具或数据访问的模型,都需要在内容和权限之间建立边界。

练习提示词校验

12 道题,覆盖模板、JSON 解析、结构校验、回退和隐私。

打开练习

继续阅读: