
— 第六讲封面
顾客问:“我的背包发货了吗?”AI 如果只会聊天,可能回复“请耐心等待”。如果能够调用订单接口,它就有机会拿到真实状态。但紧接着会出现一个问题:它凭什么知道这个订单属于眼前的人?
这一课,我们用扣子、订单查询工具和独立 Docker 服务,做一个能查虚构订单的智能体。模型负责理解问题,接口负责取数据,身份与权限由后端判断。会调用工具,只是开始;能检查边界,才有资格接近真实业务。
01
PART
先看一遍完整过程
PRACTICE
用户说想查订单,智能体提取订单号,调用查询工具,收到结构化结果,再用自然语言解释。缺少订单号时先追问;不能猜一个订单号来“完成任务”。
这与上一课的知识库不同:政策文档适合检索,当前订单状态需要业务接口。不要把所有顾客的订单导入一个公共知识库,再希望提示词帮你挡住越权查询。
本课没有连接真实 OpenCart 订单库。使用的两笔订单均为虚构:Alice 的 O1001 已发货,Bob 的 O1002 待发货。先用它们验证流程与权限,后续接真实商城时仍须沿用这些检查。

— 第六讲架构图
02
PART
第一步:把“当前用户”交给后端判断
PRACTICE
接口只接受一个业务参数:订单号。模型不能提交用户身份作为授权依据,也不能通过一句“我是管理员”获得更多权限。
实验服务将个人令牌在服务端映射到 Alice 或 Bob。模型即使知道 Bob 的名字或订单号,也不能用 Alice 的令牌查到 Bob 的订单。令牌不存在、过短或错误时,请求直接失败。
个人令牌是课堂简化方案,不等于商城登录系统。每位测试者独立使用自己的实验令牌与私人测试智能体。不能把 Alice 的令牌放到公开共享智能体里,声称每个人都在查询自己的订单。多人生产应用需要可信登录态或按用户授权的身份传递,并在订单服务再次验证归属。
AI 任务卡:审查订单工具的授权过程。说明当前身份从哪里来、谁能修改。尝试让 Alice 查询 Bob 的订单,并伪造用户身份请求头。验证后端拒绝。不能把“提示词要求只查本人”当成权限校验。
03
PART
第二步:启动独立订单服务
PRACTICE
进入 course-plan/lessons-04-06,首次使用先复制 .env.example 为 .env。生成两枚独立随机令牌,分别填写到服务端的 ALICE_TOKEN、BOB_TOKEN。不要把生成结果截图或提交到仓库。
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
docker compose -f lesson-06/compose.yaml config --quiet
docker compose -f lesson-06/compose.yaml up -d --build
curl http://127.0.0.1:18406/health
第二次运行随机令牌生成命令,为另一位用户生成不同的值。本课服务绑定回环地址18406,默认不允许外网直连。先通过 SSH 转发,在本地页面分别使用两位用户的令牌验证。
需要接扣子时,插件服务必须有平台可访问的域名与 HTTPS。课程资料站用于阅读与模拟,不能代替这个服务地址。为实验使用专用域名和独立代理配置,先检查已有路由与证书,不能改写默认站点或覆盖其他应用。
仓库给出专用虚拟主机模板和部署检查单;没有可用域名、证书与独立入口时,先完成本地接口实验。演示到哪一步,就记录到哪一步。
04
PART
第三步:把接口变成扣子可调用的工具
PRACTICE
仓库的 lesson-06/openapi.json 描述了接口地址、订单号格式、响应与鉴权。先把示例服务地址替换成自己的专用 HTTPS 域名,再在扣子中通过导入文件创建插件。
按当前控制台设置服务认证,请求头使用 Authorization,值为 Bearer 加个人实验令牌。令牌在插件凭证中保存,不放进工具描述、模型提示词或可见的普通参数。调试中核对平台实际发送的请求头,避免重复添加 Bearer 前缀。
工具调试通过并发布后,再添加到私人测试智能体。界面名称可能随版本与工作空间权限变化,以控制台为准。先在插件里跑通单次查询,再检查智能体是否实际发起了工具调用,不要只看最终聊天气泡。
给智能体的规则要具体:没有订单号就追问;只调用查询工具;没有工具结果就不能宣称已查询;接口失败就说明失败,不能编造发货状态;不收集银行卡、支付密码等无关信息。
05
PART
第四步:验收五种结果
PRACTICE
第一种,Alice 查询 O1001,收到已发货以及带演示标记的物流编号。第二种,订单号格式错误,接口返回422,智能体请用户检查订单号。第三种,记录不存在,不能编造一个状态。
第四种,Alice 查询 Bob 的 O1002,后端拒绝。为避免通过错误信息判断某个订单是否存在,本实验把无记录与无权限统一返回404和相同说明。界面不能据此告诉用户“这个订单属于 Bob”。
第五种,开启服务端的超时测试开关,查询本人订单,收到504。智能体应说明暂时无法查询,而不是把超时解释成订单不存在。测试结束后恢复开关;这只是故障模拟,不是真实订单服务发生过超时的证据。
测试时保存工具名、订单号、HTTP 状态、返回字段与解释是否一致。不要保存令牌或真实个人信息。仓库另有自动化测试,包含伪造用户请求头也不能越权的检查。
06
PART
第五步:为下一步留下清晰边界
PRACTICE
本课工具只有只读查询,没有取消订单、退款、删除数据等写操作。将来加操作时,要先设计独立授权、确认、审计与回滚,不能把一个查询令牌升级成无限制管理凭证。
接真实商城时,不能让智能体直接获得数据库管理员账号。应该由受限的业务接口检查登录用户和订单归属,返回解释所需的最少字段。模型负责把结果说清楚,后端负责决定结果是否可以被取出。
管理服务仍遵守第二课的规则:所有新应用通过 Docker 隔离安装,新增代理配置先检查影响范围;停用服务或删除镜像要单独获得授权。把“先做完再说”的冲动留在实验里,不要带进已有业务。
07
PART
60分钟直播怎么做
LIVE
前5分钟看查询与越权反例;5至15分钟拆解智能体、工具、身份和接口;15至25分钟启动服务并直接验收;25至40分钟导入扣子插件、配置个人实验鉴权;40至52分钟完成五种结果;52至57分钟增加物流查询的设计作业;最后3分钟答疑。
域名、HTTPS、扣子工作空间与权限在课前准备。现场若无法访问专用服务,使用明确标注的模拟课件解释过程,不声称平台已接通。
作业是扩展一个本人订单物流查询工具,同时保留归属校验。提交“谁能查、能查什么、失败怎么说”的三句话,以及两组越权测试结果。
08
PART
代码与官方资料
PRACTICE
实验入口为 lesson-06/README.md,提供 OpenAPI 文件、智能体提示词、专用代理模板和检查清单。
我是 {{作者名}},{{简介}}。