在数据洪流中保持清醒,确保每一份AI生成的内容都可追溯、可验证。
Important
核心提示: Brocade 是一个即插即用的反向代理服务器,它在您与大型语言模型(如 OpenAI API)交互时,以静默方式为所有生成的文本嵌入不可见的数字水印,旨在解决 AI 生态系统中的数据溯源和模型近亲繁殖(Inbreeding)问题。
随着大型语言模型(LLM)的普及,一个严峻的问题浮出水面:模型坍塌(Model Collapse)。当模型开始使用由其他AI(甚至其自身)生成的数据进行训练时,其能力会逐渐退化,多样性减少,最终陷入平庸的泥潭。这种“数据近亲繁殖”污染了我们的信息生态,威胁着下一代AI的健康发展。
本项目介绍了 Brocade(织锦),一个旨在应对这一挑战的工具。它通过在 LLM 的输出中嵌入不可见的数字水印,为每一份AI生成的内容打上一个无法轻易移除的“出生证明”。
Brocade 重新定义了我们与 LLM API 的交互方式,将其视为一个可信管道,而非一个简单的请求-响应黑盒。它协同了高性能网络代理的透明性与零宽字符编码的隐蔽性,创造出一个轻量、强大且对用户无感的溯源系统,能够在不影响正常使用的情况下,保护数据生态的纯净。
Brocade 不仅仅是另一个API工具,它代表了我们保障AI生成内容(AIGC)可追溯性的根本性转变。我们相信,AI生态的长远发展需要一个机制,能够清晰地区分人类原创内容与AI生成内容。
"当AI开始吞噬自己的尾巴时,进步便戛然而止。我们的使命是为数据流打上标记,让未来有源可溯。"
本设计旨在无缝集成到现有的工作流中,以最小的侵入性提供最大的保障,确保开发者和用户在享受AI便利的同时,不会无意中成为“数据污染”的传播者。
透明代理与实时注入 是 Brocade 架构的基石,也是整个水印流程的“单一事实来源”。该机制将系统从复杂的客户端改造或SDK依赖中解放出来。
核心功能: 系统通过一个协调的代理服务来工作,该服务扮演着几个关键角色:
- 请求监听者: 忠实地接收所有符合 OpenAI API 格式的请求。
- 安全转发者: 将用户的请求安全、可靠地转发至上游真实的 LLM 服务。
- 实时织锦师: 在收到上游服务的响应(无论是流式还是非流式)后,实时地、逐块地将包含来源信息的水印“编织”进返回的文本中。
因此,用户最终收到的每一个字,都可能携带了关于其来源、生成时间和用户标识的隐形元数据,这一切都在毫秒之间完成,对终端用户完全透明。
Brocade 中的不同组件各司其职,通过明确的劳动分工,共同实现一个整体性的智能流程。
- 目标: 成为用户和上游 LLM 服务之间的可靠中间人,处理所有网络流量。
- 实现: 基于高性能的 FastAPI 和 HTTPX 库构建。它异步处理所有传入的
/v1/chat/completions
请求,完美支持流式(stream=True
)和非流式响应,确保高并发和低延迟。
- 目标: 将结构化的溯源信息(如时间戳、用户ID、签名)转换为不可见的零宽字符,并以特定规律插入到文本中。
- 实现:
WatermarkInjector
类负责此任务。它首先将元数据编码为二进制字符串,再映射为零宽字符。然后,它以可配置的间隔(例如,每5个可见字符)将一个水印字符注入文本流,既保证了水印的鲁棒性,又最大限度地减少了对原文的干扰。
- 目标: 提供一个简单可靠的方式来检测和解码文本中隐藏的水印。
- 实现:
verify_watermark
函数是注入器的逆向操作。它扫描文本,提取所有零宽字符,将其重新组合成二进制数据,解码为原始元数据,并通过校验签名来验证其真实性。这提供了一个独立的端点(/v1/verify-watermark
)用于验证。
Brocade 的运作遵循一个清晰、透明的代理流程:
- 接收 (Receive): 用户的应用程序将原本发往 OpenAI API 的请求,转而发送到 Brocade 代理服务器。
- 生成水印 (Generate): Brocade 收到请求后,立即根据请求信息(如自定义的用户ID)和当前时间戳,生成一个独一无二的签名水印。
- 转发 (Forward): Brocade 将原始请求(不含水印)安全地转发给配置好的上游 LLM API 服务。
- 注入 (Inject): 当上游服务返回响应时,Brocade 会拦截响应数据。
- 对于流式响应,它会逐块(chunk-by-chunk)解析 Server-Sent Events (SSE),找到文本内容并实时插入水印字符。
- 对于非流式响应,它会在完整的 JSON 响应中找到最终文本内容,并一次性注入水印。
- 返回 (Return): Brocade 将带有隐形水印的响应数据返回给用户的应用程序。整个过程对用户应用层完全透明,无需修改任何代码逻辑。
尽管一些平台尝试在元数据层面或通过修改模型输出来实现溯源,但这些方法往往要么容易被剥离,要么会影响生成质量。
这正是 Brocade 旨在深入探索和解决的方向。
Brocade 通过其独特的 透明代理与零宽字符注入架构,提供了以下优势:
- 极高的兼容性: 无需修改客户端代码。只需将请求的域名指向 Brocade 服务器,即可立即启用。
- 鲁棒且隐蔽: 零宽字符在大多数文本编辑器和网页中都是不可见的,并且在复制粘贴过程中通常会被保留,使得水印难以被无意中移除。
- 可验证的来源: 内置的签名机制确保了水印的完整性,防止伪造或篡改。任何人都可以使用验证端点来确认文本是否由您的系统生成。
- 流式原生支持: 专为现代流式对话应用设计,即使在打字机效果的场景下,水印也能平滑、实时地注入。
- Python 3.8+
- Pip
- 一个可用的 OpenAI 兼容 API 密钥及服务地址
# 克隆仓库
git clone https://github.com/cotix-ai/Brocade.git
cd Brocade
# 安装依赖
pip install -r requirements.txt
- 复制
.env.example
文件为.env
。 - 在
.env
文件中填入你的上游 LLM 服务配置:# 你想要代理的目标 OpenAI 兼容服务器地址 UPSTREAM_URL=https://api.openai.com/v1 # 访问上游服务器所需的 API Key UPSTREAM_API_KEY="sk-..."
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
您的 Brocade 水印代理现在已在 http://localhost:8000
上运行。
将您应用中请求 OpenAI 的地址从 https://api.openai.com
改为 http://localhost:8000
。现在所有通过该代理的响应都将自动带有水印。
发送请求示例:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer dummy-key" \
-H "x-user-id: my-test-user" \
-d '{
"model": "gpt-5",
"messages": [{"role": "user", "content": "你好!"}],
"stream": false
}'
验证水印: 复制上述请求返回的文本内容,并通过以下方式验证:
curl http://localhost:8000/v1/verify-watermark \
-H "Content-Type: application/json" \
-d '{
"text": "【这里粘贴带有水印的文本】"
}'
我们欢迎并鼓励对 Brocade 项目的贡献!如果您有任何想法、建议或发现错误,请随时提交 Pull Request 或创建 Issue。