11 实践课-开发成果验收与优化
关联:索引
- 场景提问:同样是“能跑的智能体”,为什么交付时有人被打回?常见原因是代码不可读、错误处理不全、证据字段缺失、用例无法复现。
- 作业 PDF 草稿第 3–8 节的核心内容(环境/API/输出契约/E2E+Smoke/审计清单+问题清单/修复闭环)
- 1 份代码审计 checklist(四维)+ 问题清单(≥8 条,带证据与风险等级,写入作业模板第 7 节)
- 至少 2 个修复闭环(每个都要有修复前/后对比 + 回归证明,写入作业模板第 8 节)
目标:用统一口径审代码,避免“凭感觉改”。
- 规范性(风格与契约)
- 命名:模块/函数/变量能表达职责,避免含糊缩写
- 契约:工具输入输出结构稳定(成功/失败字段一致),证据字段不缺失
- 配置:环境变量读取与校验明确,缺配置要指明变量名
- 可读性(结构与复杂度)
- 单一职责:config/api_client/tools/router/prompts/tests 分层清晰
- 边界清晰:空输入、缺槽位、无权限、超时、限流有明确分支
- 重复消除:同类错误处理统一封装,避免散落复制
- 功能性(需求覆盖)
- 路由正确:意图识别与槽位抽取能触发正确工具
- 工具正确:API 调用参数对齐接口契约,解析字段稳定
- 输出正确:最终输出满足约定前缀与证据字段(
trace_id/parse_trace_id)
- 鲁棒性(异常与降级)
- HTTP 异常:401/403/404/409/422/429/503/504 能区分并输出
error_code + trace_id - 超时/重试:合理 timeout,必要时退避重试或提示降级策略
- 外部依赖:LLM 不可用时能降级为固定模板与直接查询
对照 greensort_teaching_demo 的“逐文件审计法”(照着走一遍,就能写出第 7 节审计报告):
审计目标不是“挑语法毛病”,而是把“交付风险”找出来:别人能不能复现、失败能不能定位、修复能不能回归。
1)先用 Smoke Test 把“可复现入口”固定住(后续所有修复都以它为回归证明):
cd ".\greensort_teaching_demo"
python -m student_agent.tests_smoke
2)按模块职责逐个过(建议每组分工:每人负责 2 个文件,最后合并问题清单):
-
student_agent/config.py(配置与校验) -
检查点:缺必填项是否明确报错(变量名/建议值/示例),默认值是否合理(如 timeout)
-
证据:故意注释
.env的某一行,再运行 Smoke Test 或 config 校验命令,截取错误输出(不要截图真实密钥) -
student_agent/api_client.py(HTTP 调用与错误映射) -
检查点:请求是否统一带超时;异常是否区分(超时/连接失败/4xx/5xx);失败时是否能拿到
http_status/error_code/trace_id -
证据:用“故障注入点”触发 403/422/504,截取响应体(含
error_code/trace_id) -
student_agent/tools_sorting.py(工具封装与返回契约) -
证据:同一工具用成功用例与失败用例各跑 1 次,对比输出字段是否一致
-
student_agent/prompts.py(输出契约) -
检查点:4 类输出前缀是否稳定;是否总能输出
trace_id/parse_trace_id;字段格式是否会漂移(百分比/小数位/缺字段) -
证据:手动输入 4 条典型问句(数据查询/设备控制/知识问答/澄清),把输出贴进 PDF
-
student_agent/app.py(路由与端到端入口) -
检查点:空输入是否进入澄清;意图识别结果是否能被追溯(
parse_trace_id);路由选择是否可解释(至少能从输出或日志判断走了哪条分支) -
证据:输入空字符串与含槽位信息的问句各 1 条,保留输出
-
student_agent/tests_smoke.py(回归入口与断言) -
检查点:断言是否覆盖最关键证据字段;失败输出是否可定位(能看出卡在登录/统计/记录/设备/解析哪一步)
-
证据:跑 1 次 Smoke Test,把通过/失败列表截图或复制输出(失败也可以作为“问题复现证据”)
-
mock_server/app.py(服务端契约与统一错误响应) -
检查点:统一错误响应是否包含
error_code/message/detail/path/timestamp/trace_id;RBAC/校验/超时注入是否可复现 -
证据:在 Swagger 执行 3 类“故障注入点”,把错误响应贴到 PDF(含
trace_id) -
现象描述必须包含:触发方式(命令/问句/接口入参)+
http_status+error_code(如有)+trace_id/parse_trace_id -
根因判断必须指向:文件 + 函数/模块职责 + 为什么会导致该现象
-
建议修改必须能落地:改哪一处、改完怎么复验(复验优先 Smoke Test)
最小审计清单模板(可直接复制到小组记录):
本节产出写法(用于作业模板第 7 节):
- checklist:把“你们项目版”的勾选项填完整(未通过要写原因与修复计划)
- 问题清单(≥8 条):建议用表格记录并编号,后续修复闭环直接引用编号
| 编号 | 分类 | 风险等级 | 现象/证据(含 trace_id/http_status/error_code) | 根因判断 | 建议修改 | 是否已修复 |
|---|---|---|---|---|---|---|
| Q-01 | 规范性 | 中 | ... | ... | ... | 否 |
- 功能完整性:需求覆盖,关键路径可跑通
- 准确率:关键字段与计算结果符合预期(至少能解释口径并可复验)
- 稳定性:重复运行结果一致,异常分支能给出明确可执行提示
-
功能完整性(基线复用上一讲)
-
沿用上一讲的 E2E 与 Smoke Test 用例覆盖口径(不再重复讲“怎么搭环境/怎么调接口/怎么写 Prompt”)。
-
准确率(可解释可复验)
-
关键指标与字段口径写清(例如合格率定义、统计范围、默认时间窗口),并能用同一请求复跑得到一致结果。
-
稳定性(可回归)
-
Smoke Test 至少运行 1 次并保留输出证据;如需证明稳定性,可选连续运行 3 次对比(重点盯
trace_id/parse_trace_id)。 -
异常至少覆盖 2 类(鉴权失败/限流/超时/参数校验任选其二),输出必须包含
error_code + trace_id,并给出复验步骤。 -
可交付性(本节课新增)
-
代码:关键模块可读、契约稳定、错误处理可定位(能把失败收敛到具体环节)。
-
输入:原始问句或请求参数
-
期望:必须出现的字段(至少 1 个证据字段)
-
实际:输出片段或响应体(含
trace_id/parse_trace_id) -
复现:一条可执行命令或明确操作步骤
1)API 成功用例(至少 2 次独立调用):
- 推荐方式 A(Swagger):在
http://127.0.0.1:8000/docs里执行 POST /api/v1/auth/login→ 截图access_token(可打码 token 字符串中间部分)GET /api/v1/sorting/realtime-stats?line_id=LINE-01→ 截图响应体(含trace_id)GET /api/v1/sorting/records?line_id=LINE-01&grade=A&limit=20→ 截图响应体(含trace_id)- 推荐方式 B(PowerShell,便于在 PDF 里贴“可复制命令”):
$base="http://127.0.0.1:8000"
$loginBody='{"username":"admin","password":"admin123"}'
$token=(Invoke-RestMethod -Method Post -Uri "$base/api/v1/auth/login" -ContentType "application/json" -Body $loginBody).access_token
$auth="Bearer $token"
Invoke-RestMethod -Method Get -Uri "$base/api/v1/sorting/realtime-stats?line_id=LINE-01" -Headers @{authorization=$auth}
Invoke-RestMethod -Method Get -Uri "$base/api/v1/sorting/records?line_id=LINE-01&grade=A&limit=20" -Headers @{authorization=$auth}
2)异常覆盖用例(至少 2 类,推荐直接用“故障注入点”保证可复现):
- 403(权限):
robot/command的emergency_stop不带X-Role: admin - 422(参数校验):
robot/command传不支持的动作 - 504(超时):
robot/command传action=simulate_timeout
3)端到端输出(4 类输出各 1 条,推荐从 python -m student_agent.app 取证):
- 数据查询(必须出现
trace_id=) - 设备控制回执(必须出现
trace_id=) - 知识问答(必须出现
parse_trace_id=) - 需要澄清(必须出现
parse_trace_id=)
4)回归证明(Smoke Test):
- 修复前:保留 1 次 Smoke Test 输出(通过或失败列表)
- 修复后:同样命令再跑 1 次,保留输出用于对比(这就是你第 8 节“回归证明”的核心证据)
本节补齐并归档到作业 PDF(对应模板第 3–6 节):
- 第 3 节 环境与运行:补 1 次环境配置校验证据(变量齐全、依赖 OK;不写真实密钥)
- 第 4 节 API 验证证据:补至少 2 次独立 API 调用证据(请求入参/响应片段/http_status/trace_id)+ 至少 2 类异常覆盖证据(含 error_code + trace_id)
- 第 5 节 Prompt 与输出契约:补“4 类输出前缀 + 必含字段”的契约摘要 + 字段一致性检查结论
目标:把审计发现落到“最小修改 + 回归证据”。
- 再补错误分支:把 401/403/429/504 等常见错误区分开(输出
error_code + trace_id) - 再控输出稳定:统一输出格式,避免字段名漂移
- 最后做回归:每修一处立刻跑 Smoke Test
回归口径(复用上一讲):
- 仍以 Smoke Test 为唯一回归入口(命令与用例复用上一讲,不在本讲重复抄写)。
- 本讲新增要求:每次修复必须给出“修复前/后对比证据”(输出片段或测试结果)并标注对应问题编号。
修复闭环写法(用于作业模板第 8 节,至少 2 个):
- 复现:写清复现命令/输入与“修复前输出证据”(必须含证据字段)
- 定位依据:说明为什么判断是这个环节(配置/API/工具/路由/Prompt/测试)
- 修改点描述:只描述改动点与影响范围(避免贴大段代码)
- 修复后对比:同一用例再次执行的关键输出片段(含证据字段)
- 回归证明:Smoke Test 输出(通过或失败列表;失败要能定位环节)
把“修复闭环”写成可抽测复现的格式(建议直接复制下面小模板):
-
复现方式:
-
方式 A(命令):
python -m student_agent.tests_smoke -
方式 B(接口):Swagger / PowerShell 命令(写清 URL、方法、入参、header)
-
方式 C(问句):
python -m student_agent.app输入的原始问句 -
修复前证据:
-
关键输出片段(必须含:
http_status或文本输出前缀 +trace_id/parse_trace_id) -
若是接口错误:贴出
error_code/message/detail/path/trace_id -
定位依据:
-
你如何判断问题出在:配置 / API / 工具封装 / 路由 / 输出契约 / 测试
-
指向具体文件(例如
student_agent/api_client.py)与理由 -
修改点描述(不要贴大段代码):
-
改动点 1:改了什么(例如“将超时异常与 5xx 区分并保留 trace_id”)
-
改动点 2:改动影响范围(哪些工具/哪些输出会变)
-
修复后证据:
-
用同一复现方式再次执行,贴关键输出片段(必须含证据字段)
-
回归证明:
-
Smoke Test 输出(通过/失败列表)
-
若仍失败:写清失败用例编号与下一步定位计划(不要只写“没时间修”)
-
逻辑清晰性:按“背景→目标→步骤→证据→问题→修复→回归→结论”组织,避免流水账
-
截图/记录齐全:每个关键节点至少 1 份证据(命令输出/接口响应/测试结果/关键截图)
-
可复现:只按文档能跑通(命令完整、参数明确、输入输出可对照)
-
可核验:每个结论都能对应到证据(截图/日志/接口响应/测试结果,含关键证据字段)
-
可定位:失败时能快速判断环节(环境/API/工具/路由/输出回填),并给出复验步骤
-
可追踪:写清改动点与回归结果(修复前/后对比,至少 1 个闭环案例)
开发文档推荐结构(可直接照搬):
最终以“作业(布置)”给出的模板为准。本节课只做两件事:
- 把模板第 3–6 节写到可抽测复现:命令可执行、参数明确、证据字段可对照
- 把模板第 9 节补齐:文档结构调整前/后对比 + 缺口补齐清单(命令/截图/字段/复验步骤)
截图与记录清单(建议对照补齐):
- 上一讲已有证据:可直接引用(如
python --version、依赖安装、基础 API 成功响应、基础 E2E 输出、基础 Smoke Test 通过) - 本讲新增必须证据:
- 代码审计问题清单(≥8 条,含风险等级与归类)
- 至少 2 个修复闭环(修复前/后对比 + 回归证明)
- 文档结构调整前/后对比(目录或章节截图即可)
- AI 协同审计记录(至少 2 次,含人工审计结论与落地修改点)
把证据“按模板填进去”的最快做法(对应作业模板第 3–6 节,建议按顺序完成):
你们最终只交 1 个 PDF,所以要把证据直接写进 Markdown 正文中。建议每节都按“命令/操作 → 输出/截图 → 关键字段标注”的三行结构来写。
1)第 3 节 环境与运行(必须可复现):
- 命令/操作:
cd ".\greensort_teaching_demo"
python --version
python -m pip install -r .\requirements.txt
- 输出/截图:版本与安装日志(可截取关键几行)
- 关键字段标注:列出
.env变量名清单(只写变量名与含义/是否必填,不写真实密钥)
2)第 4 节 API 验证证据(至少 2 成功 + 至少 2 异常):
- 命令/操作:优先用 Swagger(更稳定),或用 PowerShell(更易复制)
- 输出/截图:成功响应必须能看到
trace_id;异常响应必须能看到http_status + error_code + trace_id - 关键字段标注:把
trace_id单独用加粗标出来,便于教师抽查
3)第 5 节 Prompt 与输出契约(4 类输出样例):
- 命令/操作:
python -m student_agent.app
-
输出/截图:对每类输出只截取“前缀 + 关键字段”的那一行或那一段
-
关键字段标注:
-
数据查询/设备控制:必须标注
trace_id=... -
知识问答/需要澄清:必须标注
parse_trace_id=... -
命令/操作:
python -m student_agent.tests_smoke
-
输出/截图:通过/失败列表
-
关键字段标注:若失败,写清“失败用例编号 + 失败环节判断 + 复现命令”
-
方式 A:Typora 打开 Markdown → 导出 PDF(页面设置用默认即可)
-
方式 B:VS Code 安装 “Markdown PDF” 类扩展 → 右键导出 PDF
导出前检查:截图可读、命令可复制、不要出现真实密钥/Token 全量字符串。
目标:用 AI 加速,但不把质量责任外包给 AI。
环节 1(推荐):AI 辅助代码审计
输入给 AI(必须提供证据):
- 你们的审计 checklist(四维 + 最小模板)
- 关键代码片段:只贴相关 10–60 行(例如 config/api_client/tools/router/prompts/tests)
- 失败/风险样例:1 条异常输出或 1 条接口错误响应(含
error_code/trace_id/http_status)
要求 AI 输出(结构化):
1)问题清单(按规范/可读/功能/鲁棒分类)
2)风险等级(高/中/低)与原因
3)最小修改建议(尽量只改 1 个点)
4)复验步骤(至少 3 条)与预期证据字段
人工审计点:
- AI 是否引用了你提供的证据(接口路径、错误码、响应片段)
- AI 是否编造不存在的接口/字段/文件
- 建议是否能被 Smoke Test 覆盖并验证
本节产出落地(用于作业模板第 10 节):
- 每次 AI 协同必须绑定证据输入:给出你自己的接口响应/错误输出/用例输出片段(含关键证据字段)
- 每次都要写清人工审计结论与最终落地改动,并附复验结果(Smoke Test/用例输出)
把 AI 协同记录写成“可核验”的格式(建议直接复制下面小模板,填真实内容):
记录 #(代码审计 / 文档完善):
- 证据输入(你给 AI 的内容):
- 证据 1:接口响应/错误响应(含
http_status/error_code/trace_id) - 证据 2:相关代码片段(限定 10–60 行,包含文件名与行号范围)
- 证据 3:Smoke Test 输出片段(通过/失败列表)
- AI 输出建议(结构化粘贴):
- 问题点/风险等级/建议修改/复验步骤
- 人工审计结论(必须写理由):
- 保留:哪些建议能落地、为什么
- 拒绝:哪些建议不成立、依据是什么(例如“项目不存在该接口/字段”)
- 最终落地改动(简述,不贴大段代码):
- 改动点:文件 + 变更描述
- 复验结果(必须能对照证据字段):
- Smoke Test:通过/失败列表
- 关键用例:修复前/后对比片段(含
trace_id/parse_trace_id)
环节 2(推荐):AI 辅助文档结构优化与内容补全
输入给 AI:
- 你们当前文档目录(或全文)
- 缺失点清单(你自己先写 5 条:缺命令/缺截图/缺字段/缺复现步骤等)
要求 AI 输出(结构化):
1)缺口清单(按章节归类)
2)重排后的目录与每章必填项
3)需要补的截图/记录列表(逐条写“截图内容 + 命令/操作 + 预期证据字段”)
4)可直接粘贴的补充段落草稿(但必须标注需要你补的真实数据)
人工审计点:
-
是否混入未经证实的结论与数据
-
是否把“应当有的证据”写成了“已经有的证据”
-
让 AI 每条建议都必须对应到一条可执行用例与一个证据字段。
-
让 AI 不得输出真实密钥,不得要求粘贴敏感配置到作业。
- 命令一致:文档中的命令能在干净环境执行,不依赖“我本地才有”的路径
- 字段一致:输出字段名与文档/测试断言一致(trace_id、parse_trace_id 等)
- 证据一致:每个结论都有可复验证据,不靠口头解释
- 回归一致:修复后 Smoke Test 通过(或失败列表清楚且能定位环节)
导出前快速自检(避免被打回):
- 截图清晰:接口响应、Smoke Test、端到端输出可读,关键字段能看清
- 敏感信息:不得出现真实密钥/Token/内网地址/个人隐私
- 编号可追溯:问题清单编号(Q-xx)能在修复闭环中被引用
- 代码审计:出示问题清单与修复闭环(以“作业(布置)”模板要求为准)。
- AI 协同:出示 AI 协同审计记录与人工审计结论(以“作业(布置)”模板要求为准)。
现场出示要求:只需打开你最终提交的 PDF;证据组织结构与抽查范围以“作业(布置)”的模板第 3–10 节为准(环境/API/输出契约/端到端与 Smoke Test/审计与修复闭环/文档完善/AI 记录)。
作业(布置)
本次为第 10 + 11 讲合并作业:只提交 1 个“Markdown 转 PDF”的交付文件,不收源码、不收额外附件。
提交要求(统一规范):
- 文件命名(必须一致):
学号_姓名_分拣场景全流程交付作业.pdf
- 文件格式:
- 作业正文用 Markdown 编写,并导出为 PDF 后提交(只收 1 个 PDF)
- 证据呈现方式:
- 所有证据(截图/日志片段/输出全文)必须直接出现在这 1 个 PDF 内
- 注意:
- 不收源码或可执行二进制;所有结论必须能在 PDF 证据中被核验
作业模板(Markdown 正文结构,复制后替换占位内容):
- 封面信息
- 课程:人工智能综合实践
- 作业:分拣场景全流程交付(第 10 + 11 讲合并)
- 学号/姓名/班级/小组(如有)/日期
- 项目概述(对齐第 10 讲)
- 业务对象与目标链路(检测→分级→分拣→搬运→入库/统计)
- 关键实体字段(至少 5 个):line_id/batch_id/fruit_id/grade/trace_id/target_zone(可增补)
- 你们的输出证据字段口径:trace_id/parse_trace_id/http_status/error_code
- 环境与运行(对齐第 10 讲,必须可复现)
- Python 版本与依赖安装证据(截图或复制输出)
- 环境变量清单(不写真实密钥;写变量名与是否必填、默认值)
- 启动方式与运行命令(逐条列出)
- 环境配置校验证据:1 次(变量齐全、依赖 OK)
- API 验证证据(对齐第 10 讲)
- 至少 2 次 API 独立调用证据(每次都要包含:请求入参/响应片段/http_status/trace_id)
- 异常覆盖证据(至少 2 类,任选):403/429/504/422 等(需包含 error_code + trace_id)
- Prompt 与输出契约(对齐第 10 讲)
- 输出契约摘要:4 类输出前缀 + 必含字段(trace_id/parse_trace_id/no_tools 等)
- 字段一致性检查结论:是否存在缺字段/字段名漂移/随机格式变化
- 4 条端到端输出证据(覆盖 4 类输出;每条都要能看到证据字段)
- Smoke Test 输出:1 次(通过或失败列表)
- 若失败:必须写“失败用例编号 + 失败环节判断 + 复现命令”
- 代码审计报告(对齐第 11 讲)
- 审计 checklist(四维:规范性/可读性/功能性/鲁棒性)
- 问题清单(≥8 条):编号/分类/风险等级/证据/建议/是否已修复
- 修复闭环(对齐第 11 讲,≥2 个)
- 闭环 #1:复现 → 定位依据 → 修改点描述 → 修复后对比 → 回归证明(Smoke Test/用例证据)
- 闭环 #2:复现 → 定位依据 → 修改点描述 → 修复后对比 → 回归证明(Smoke Test/用例证据)
- 开发文档完善记录(对齐第 11 讲)
- 文档结构调整前/后对比(目录或关键段落)
- 缺口补齐清单:命令/截图/字段/复验步骤(逐条列出)
- AI 协同审计记录(对齐第 10 + 11 讲,至少 2 次)
- 记录 #1(代码审计):输入证据 → AI 输出建议 → 人工审计结论(保留/拒绝/修改原因)→ 最终落地改动 → 复验结果
- 记录 #2(文档结构/内容):输入证据 → AI 输出建议 → 人工审计结论(保留/拒绝/修改原因)→ 最终落地改动 → 复验结果
- 附录(可选,但推荐)
- 完整日志片段、更多截图、更多用例输出(按编号整理,便于抽测核验)