阅读时间 : 10 minutes

foundry/— 托管我工作区代码的功能区域 — 包含18个项目。其中八个是以Apache 2.0许可证的开源项目。仅有一个是 闭源 — Edster SaaS。在这几个月里,这九个项目一直共存。 在同一文件夹中,仅由…​…​什么都没有分隔。 它们的公共/私有状态 它曾是我脑中的信息,而不是文件系统中的信息。

然后我想要连接一个 RAG。然后,一切都崩溃了。

等待发生的事故

2026年4月,我开始为 slider-gradle 实现了 pgvector 的 RAG。 原则:索引所有存储库的`foundry/, 生产一些 嵌入,并将其注入到LLM的上下文中,以便它有一个 感知"的档案`foundry/。

管道很简单:

val repos = fileTree(rootDir) {
    include("**/*.adoc", "**/*.kts", "**/*.kt", "**/*.json", "**/*.yml")
}
val chunks = repos.map { chunk(it) }
val embeddings = chunks.map { embed(it) }
pgvector.insert(embeddings)

简单。 有效。 和危险的。

因为这个`fileTree`不区分`plantuml-gradle/` (Apache 2.0, 公共) 和`edster/`(closed source, private). 它吞噬一切。 如果有一天我发布这些嵌入向量 — 在仪表盘上,在一个回答中 LLM,在一个训练数据集中 — Edster 的专有代码正在泄漏。

问题不在于LLM会读取闭源代码。问题, 这是因为这个代码应该最终进入一个向量嵌入 公开— 不可逆的、不可删除的、不可审计的。

真正的问题

这不是“如何防止LLM泄漏代码?”。这是“如何”。 使逃脱在结构上不可能?

答案不是一个提示。答案是把文件夹分成两半。

解决方案:OSS/ 和 CSS/

之前:

foundry/
├── plantuml-gradle/       ← public
├── bakery-gradle/         ← public
├── magic-stick/           ← public
├── edster/                ← PRIVÉ
├── slider-gradle/         ← public
└── ...                    ← mélange invisible

之后:

foundry/
├── OSS/                   ← tout est Apache 2.0
│   ├── plantuml-gradle/
│   ├── bakery-gradle/
│   ├── magic-stick/
│   ├── slider-gradle/
│   └── ...
└── CSS/                   ← tout est closed source / private
    └── edster/

Le `fileTree`成为 :

val ossRepos = fileTree(File(rootDir, "OSS")) {
    include("**/*.adoc", "**/*.kts", "**/*.kt", "**/*.json", "**/*.yml")
}
val cssRepos = fileTree(File(rootDir, "CSS")) {
    include("**/*.adoc", "**/*.kts", "**/*.kt", "**/*.json", "**/*.yml")
}

// Embeddings publics — OSS seulement
pgvectorPublic.insert(ossRepos.map { chunk(it) }.map { embed(it) })

// Dataset fine-tuning privé — CSS seulement
fineTuningDataset.insert(cssRepos.map { chunk(it) })  // jamais publié

公共 RAG 永远看不见`CSS/`. 闭源代码驱动一个数据集 未经过微调的 — 一个永不会离开我这里的内部模型。 拉 分离是机械的,不是声明的。

为什么"OSS"和"CSS"而不是"Public"和"Private

选择 OSS(开源软件)和 CSS(闭源软件)的缩写 已审议:

  • Public"/"Private" 描述可见性(GitHub 看到的内容)

  • OSS"/"CSS" 描述了自然代码(LLM必须知道的)

GitHub可见性是远程仓库的元数据。代码的性质是 内容的一个属性。LLM 没有访问 GitHub API 的权限 — 但它有访问 到文件系统。CSS/`他告诉他说:“注意,这段代码未获得许可。” 免费" 无需阅读一个`LICENSE`或是解析一个`package.json。

文件夹名称是您可以给予的最强大的元数据 一个LLM。它不能被错误地解析、忽略或误解。该LLM 看到`CSS/edster/`在文件路径中 — 他知道。

完整的树 — 四个区域,不是三个

OSS/CSS 细粒化完善了三区域本体。 区域 `foundry/`从 1 到 2 个功能子区 :

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam wrapWidth 260

title foundry/ 的组织 — 细粒度化 OSS/CSS
package "foundry/" {

  package "圈 0 — 根目录" #FFCCCC {
    rectangle "PICTURE_ME_ROLLIN_*.adoc" as STIM
    rectangle "WORKSPACE_*.adoc" as VISION_DOC
    note right of STIM
自由脑力倾倒
从未版本化
[LLM : interdit d'indexer]
    end note
  }

  package "圈 1 — configuration/" #FFD9CC {
    rectangle "密钥,令牌" as SECRETS
    rectangle "Spring Cloud Config" as SCC
    note right of SECRETS
私密-CVS,单独访问
[LLM : INTERDIT]
    end note
  }

  package "圈 2 — office/" #FFFFCC {
    rectangle "文章,框架" as DATA
    rectangle "培训,SPG/SPD" as FORM
    note right of DATA
私有-CVS
[LLM : filtré Vision/Opinion]
    end note
  }

  package "圈 3 — foundry/" #CCE5FF {
    package "OSS/ — Apache 2.0" #CCFFCC {
      rectangle "插件 Gradle" as PLUGINS
      rectangle "引擎" as ENGINE
    }
    package "CSS/ — 闭源" #CCDDFF {
      rectangle "edster/" as EDSTER
    }
  }
}

@enduml

| 区域 | GDPR | 公共 RAG 索引 | 微调数据集 | | 根源 | 级别 0 — 私密 | ✗ | ✗ | |configuration/| 第 1 级 — 受限 | ✗ | ✗ | |office/| 第 2 级 — 协作 | ✓ 已过滤 | ✓ 已过滤 | |foundry/private/| 级别 3 — 条件开放 | ✗ | ✓ 私有 | |foundry/public/| 第 4 级 — 母语人士 | ✓ 免费 | ✓ 公开 |

特殊情况:cheroliv.com

当时,我纠正了另一个不一致。 我的网站 cheroliv.com`居住在`foundry/`就像一个软件项目 独立的——有自己的 Gradle 构建,自己的 CI,自己的 治理.agents/`。

但博客文章不是代码。它们是 数据 Cercle 2 的社论 — 与其框架相当`office/pilotage/` 或者形成的`office/formations/`.

AVANT                            APRÈS
foundry/                office/
  cheroliv.com/                    sites/
    site/jbake/content/blog/         cheroliv.com/
      2026/0117_....adoc               2026/0117_....adoc

变化的是:

  • 文章在`office/`→ Cercle 2 的保密性

  • 任务`publishSite`成为一种 capability 的`engine`

通过`bakery-gradle`— 插件收到一个`FileTree`,他不知道 这些文章来自`office/`

  • 一套 CI,一套治理 — 零重复

  • Vision/Opinion 分类器(规则 2bis)自动适用:

文章中的`office/`在出版前被过滤

bakery-gradle S’En Fiche

那就是美好的所在。插件`bakery-gradle`未被修改。 它接收一个 AsciiDoc 内容目录,它生成 HTML,它推送 在 GitHub Pages 上。这个目录被称为`site/jbake/content/` ou office/sites/cheroliv/— 插件根本不在乎。

// engine/build.gradle.kts
task("publishBlog") {
    doLast {
        val articles = fileTree("../../office/sites/cheroliv/2026/")
        bakery.generate(articles)  // ← bakery ne sait pas d'où ça vient
    }
}

接口契约是一个 Gradle 任务。不是 REST API。不是一个 webhook。 一个任务 — 类型化、可测试、可在本地和 CI 中执行。

对治理智能体的影响

OSS/CSS 的细粒度修改了代理治理的三个方面:

  1. RAG public : 索引范围从`foundry/**`

à foundry/public/+office/Vision/. 闭源代码 通过任务配置被排除在索引之外,而非通过提示。

  1. 知识图谱 : graphify-gradle 生成两个图 :

*office/graph.json(public) — OSS工件与office/Vision之间的关系 *configuration/graph_private.json(gitignored, 私有) — 关系在 CSS 工件,从未发布

  1. 数据集微调 :`codebase-gradle`现在有两个来源:

*OSS/→ 公共数据集 (社区模型, 基准) *CSS/→ 私有数据集(内部模型,专有微调)

我们得到的 (以及我们失去的)

之前 (平面文件夹) 之后 (OSS/CSS + office/sites)

ls foundry/→ 公共/私人混合

ls foundry/public/→ 一切皆可发布

RAG 对所有内容进行无差别索引

RAG 索引`OSS/`+`office/Vision`仅

无法知道一个项目是否为开源

路`OSS/` ou `CSS/`所说的

cheroliv.com 拥有自己的 CI,以及自己的治理

CI 和 治理 在 engine 中共享

博客文章位于 'code' 仓库中

博客文章在`office/sites/`— 数据,不是代码

公开嵌入中泄露闭源代码的风险

结构上不可能 —`CSS/`超出范围 RAG

唯一的成本:一`git mv`在 17 个 OSS 仓库上的全局 + 一个重构的 build.gradle.kts de engine. 这是一次冷迁移 — 没有传输中的数据,没有受影响的用户。

结论:物理信号击败软件信号

我今天下午所做的就是替换了一条不可见的约定。 通过该区域内可见的分离`foundry/. 以前,你必须 知道`edster/`它是闭源的。 现在,你*看见*它 — 文件夹叫`CSS/.

这是与Unix权限、网络VLAN或 数据库中的防火分区。安全不应 应该记住的信息。它必须是一个属性。 身体的系统的。

OSS/CSS 的细粒化是该原则在该领域的体现 关于LLM治理。LLM不需要知道Edster是 保密的。他需要无法对其进行索引。

而这就是`CSS/`保证

相关文章