沈毅全栈与 AI

巴黎 • 新加坡 • 上海

RAG Formation · 第 15 课 · 可靠性与产品就绪

安全、权限与部署边界

让客户数据、秘密、租户边界和生产服务不被不安全的演示假设所混淆。

$ lesson --status
▸ course RAG Formation
▸ lesson 15 / 16
▸ phase 可靠性与产品就绪
▸ status 已完成
● build → measure → learn

独立课程

在这里学习完整课程并检验你的理解。

RAG Formation 的 16 节课程内容已完成。本页包含完整课程内容、本地参考资料和可直接在浏览器中完成的即时练习。

本课的具体收获

你会有一张轻量的 MVP 威胁与权限清单,并为每条边界设计一个证明它确实有效的负向测试。

观看讲解视频

1 · 核心技能

检查演示环境边界、环境变量的加载方式、CORS 和日志假设,然后运行一次负向访问测试——整个过程不打开任何密钥文件。

  • 最小权限:用户、服务和工具各自只获得实际需要的访问权限。
  • 数据边界:在演示、预发布和生产之间建立真实的技术隔离,同时隔离数据和解锁数据所需的凭证。
  • 提示词/数据注入:不受信任的文档或用户内容试图劫持系统行为,或泄露本不该泄露的信息。
  • CORS,摆在明面上:api/app.py 里设的是 allow_origins=["*"]——这不是需要你去验证的假设,而是一个可以直接读到的事实。自己判断一下,这对这套演示环境的威胁模型来说是否可以接受,真要做成多租户的生产部署,又该怎么改。

主要阅读:OWASP《大语言模型应用十大风险》

2 · 运行证据闭环

先看数据导入这条边界——这是一次空跑,不会改动任何东西:

cd demo
python3 setup_demo.py ingest --dry-run

读一下打印出来的命令,确认密钥路径:.env.demo.local(仅供演示使用,已加入 .gitignore)跟 demo/.env(生产环境变量的副本)是两个完全独立的文件——演示环境的技术栈永远不会去读后者。

接下来实测查询阶段的边界。把技术栈启动起来(python3 setup_demo.py up)之后,用同一个问题、除了 workspace 字段以外完全相同的请求,调用两次 /api/v1/qa

curl -s -X POST http://localhost:8000/api/v1/qa \
  -H "Content-Type: application/json" \
  -d '{"question": "PR-QA-MRD-009 从 V3 到 V4 之间改了什么?", "workspace": "meridian_demo"}'

curl -s -X POST http://localhost:8000/api/v1/qa \
  -H "Content-Type: application/json" \
  -d '{"question": "PR-QA-MRD-009 从 V3 到 V4 之间改了什么?", "workspace": "not-a-real-workspace"}'

对比两次返回结果里的 stats.graph_context_charssources 里的引用列表——如果图谱相关的证据在两次调用之间发生了变化,甚至直接消失了,而向量/摘要/全文这几路的引用完全没变,你就亲眼看到了这条边界真实的样子:图谱这一路信号是真管用的,另外三路完全没设防。

对每条边界写下目前保护它的机制、一条能够证明它的安全命令,以及强制执行方面还缺在哪里。

答案有多准确并不重要——只要暴露了受限文档或密钥,就是一次失败。

3 · 决策工作表

基线证据一个假设/改动指标回归检查有边界的结论
_________________________

4 · 检索练习

问题:一个密钥没有进入 Git,却被打印到了调试日志中。这样的边界安全吗?

企业场景连接

企业聊天机器人一旦暴露客户文档、生产密钥或受限程序,就已经失败,即使答案中的每一个字在事实上都正确。

5 · 交付物与下一步

  1. 保存命令输出或报告。
  2. 填写决策工作表。
  3. 写下一个失败案例,以及下一项要运行的验证。

交付物是一张轻量的 MVP 威胁与权限清单,并为每条边界配一个证明其有效的负向测试。

下一步:第 16 课将讲试点评审和 30 天实施计划。

如果对证据、指标、失败案例或下一步尝试有疑问,尽管继续问我。 这门课我就是你的老师。