综合小项目:用 Python 构建可校验的 AI 配置迁移计划器
配置升级经常不是简单地替换一个值:旧配置可能缺少新字段,也可能需要删除过时字段,还可能涉及人工确认。让模型直接改写配置文件,会把“理解差异”和“执行变更”混在一起。本篇把结构化输出、输入边界、结果校验和人工复核组合成一个小项目:模型只生成迁移计划,Python 检查计划是否覆盖了全部变更,程序不自动写回任何配置。
先把建议与执行分开
为了让示例足够小,输入只包含一层 JSON 对象。程序比较旧配置和新配置,模型为每个发生变化的键返回 path、action、risk、reason 和 manual_steps。action 只能是 add、update 或 remove,不能凭空增加未出现在输入中的字段。
这里有三个边界。第一,配置内容只是待分析的数据,不能把其中的字符串当成指令执行。第二,计划必须逐项覆盖所有变化,不能遗漏、重复或改写键名。第三,计划通过校验也不等于可以上线;它仍然要交给负责人确认,真正修改配置应由单独的确定性程序完成。
准备环境和示例配置
在独立虚拟环境中安装官方 Python SDK 和 Pydantic:
1 | python -m venv .venv |
密钥和模型名只从环境变量读取。示例中的配置也不能包含真实密码、令牌或连接串;生产环境应先脱敏,只把生成迁移计划所需的字段发送给模型。
编写最小计划器
把下面代码保存为 config_migration.py。responses.parse 使用 Pydantic 模型解析结构化结果;解析成功后,validate 仍会根据新旧配置重新计算期望变更,避免把“格式正确”误当成“计划正确”。
1 | import json |
changed_paths 是确定性规则:它只比较输入中已有的顶层键,不让模型决定“哪些字段算变更”。ConfigDict(extra="forbid") 防止模型添加未声明字段,Literal 限制动作和风险枚举,validate 再检查覆盖范围、动作一致性、理由和人工步骤。任何失败都只输出待复核状态,不会写文件,也不会执行迁移。
如何验证而不消耗 API 额度
先运行本地检查:
1 | python -m py_compile config_migration.py |
--self-test 会构造一份合法计划,覆盖新增、更新两类变化,并验证规则可以通过。还可以把测试计划中的 path 改成不存在的键,或把 action 改错,确认程序会拒绝结果。真实调用时再设置环境变量运行 python config_migration.py;终端中的计划内容以你的模型实际返回为准,不应在代码或文章中预先假设。
如果配置存在嵌套对象,最小示例不能直接把 database.pool.size 当作普通顶层键处理。生产版本应先定义稳定的路径规则,例如 JSON Pointer,再为路径展开、数组变化和类型变化补充固定测试。不要为了让模型“看起来完成”而放宽集合校验。
常见问题
为什么不让模型直接输出新配置? 新配置可能覆盖人工修改、泄露敏感值或改变未讨论的字段。先生成计划,能把自然语言判断和实际写入隔离开;执行阶段使用已经审批的计划,由普通 Python 代码完成。
为什么要保存 reason 和 manual_steps? reason 便于审核者理解模型依据,manual_steps 把高风险操作显式列出来。它们不是事实证明,不能代替配置负责人检查依赖、回滚方式和发布窗口。
风险等级是模型说了算吗? 不是。模型只能提出候选等级。生产系统可以增加确定性规则,例如涉及认证、权限或网络入口的路径至少标记为 high,并强制人工审批;模型给出的 low 不能覆盖这类规则。
失败后要不要自动重试? 超时或限流可以有限重试,但字段覆盖不完整、动作冲突等校验失败通常说明输入或提示词需要处理。应保留失败原因,不要用下一次随机结果静默覆盖原计划。
小结
这个项目把“配置差异理解”收敛成一个可检查的中间产物:模型生成结构化迁移计划,Python 重新计算变更集合并校验动作,人工确认风险后才允许进入执行环节。它没有自动修改任何配置,却已经形成了输入脱敏、结构解析、确定性规则、离线自测和人工审批的基本闭环。后续扩展嵌套路径、回滚计划或审批记录时,也应保持建议与执行分离。