一个开发者问:怎么在 REST API 里防止对象级授权失效?这个问题如果丢给通用聊天机器人,大概率会得到一段听起来对、但没法追溯来源的回答。CyberMira 的做法不一样——它先去查一份结构化的网络安全知识库,再把查到的证据交给 Gemini 生成答案。

这份知识库目前有 36 条结构化条目,覆盖 OWASP Top 10:2025 分类、漏洞、攻击模式、检测技术、缓解措施、技术和安全参考。目标很直接:先检索结构化的安全知识,再生成解释。

打开网易新闻 查看精彩图片

Gemini 不是知识来源

整个架构里最关键的一点是:Gemini 不负责提供网络安全知识。应用先从 Sanity 知识库检索证据,再把证据交给语言模型。

请求的流转路径是这样的:开发者提问,进入 React / Vite 前端,再到 FastAPI 后端,后端识别出与问题相关的知识领域,通过 Sanity Context MCP 检索结构化证据,最后交给 Gemini 生成有依据的安全答案。

这套设计把网络安全知识单独隔了出来。后端先判断开发者的问题涉及哪些知识领域,再检索结构化证据,然后才把证据传给语言模型。

知识被拆成了独立的内容类型

Sanity 在这里是 CyberMira 背后的结构化知识层。作者没有把内容存成一大块文本,而是为网络安全概念分别建了 schema。漏洞、技术、攻击模式、检测技术、缓解措施、OWASP 分类,都是各自独立的内容类型。

这些内容被索引进一个 Sanity 知识库,CyberMira 再通过 Sanity Context MCP 访问它。后端用 MCP 工具检索相关知识:

  • Sanity → 结构化网络安全知识
  • Sanity Context MCP → 检索接口
  • FastAPI → 应用与检索逻辑
  • Gemini → 解释与答案生成
  • React → 面向开发者的界面

应用会先根据开发者的问题选出相关知识路径,读取证据,再生成答案。比如一个关于 API 授权的问题,可能检索到 access_control、attack_patterns、mitigation 这几个领域。检索到的内容随后作为证据提供给 Gemini。

Sanity 在这里不只是当 CMS 用。它的结构化内容和知识库是推理管线的一部分。

项目信息与可访问性

项目 ID 为 zf6ckuvp,数据集是 production,知识库名为 CyberMira Knowledge Base,知识库 ID 为 kbDqGgqkpnBN,条目数 36。应用公开可访问,不需要账号。

作者提到,这个项目最有意思的部分不是把 LLM 接到数据库上,而是设计结构化知识与生成答案之间的边界。Sanity Context MCP 提供了一种干净的方式,把经过整理的知识库暴露给应用,而后端仍然负责决定检索什么、以及这些证据该怎么用。

最终得到的,是一个知识层结构化、可检查、并与语言模型分离的网络安全助手。