内容
# ✍︎ 人工智能写作的迹象
[](https://peopleworks.github.io/SignsofAI/)
[](LICENSE)
[](https://dotnet.microsoft.com/)
[](https://learn.microsoft.com/aspnet/core/blazor/)
[](https://github.com/peopleworks/SignsofAI/stargazers)
**[尝试在线演示 →](https://peopleworks.github.io/SignsofAI/)** — 支持英语和西班牙语,在浏览器中运行,无需注册,数据不会离开您的设备。
一个免费、注重隐私的学术和写作完整性工具包。它可以执行两个功能:
1. **去 AI 化检查器** — 标记 AI 生成写作的迹象(过度使用的词汇、修辞拐杖、机器人般的句子节奏),并为每个发现提供修复建议。
2. **原创性检查器** — 判断文本是否由 AI 生成或抄袭。通过比较文档并突出显示共享的段落 — 原样复制、改写段落(甚至跨语言)以及整个群体的概览,作为人类判断的证据。不是黑盒判决。
> 🔒 **几乎所有操作都在浏览器中进行。您的文档永远不会离开您的设备。**
> 唯一的例外是可选的改写检查,严格选择加入并在 UI 中清楚披露。
由 **Pedro Hernández (PeopleWorks)** 使用 **.NET 10** 和 **Blazor WebAssembly** 构建,获得 .NET 和微软开发者社区的认可。
仓库:https://github.com/peopleworks/SignsofAI
支持英语和西班牙语(自动检测或可选)。西班牙语规则包是针对西班牙语的 AI 写作标记的原创衍生。
---
## 1. AI 写作检查器(“分析”)
与仅输出分数的黑盒检测器不同,这是一个可解释、可操作、具有教育意义的检查器。粘贴、上传(`.docx` / `.txt` / `.md`)或直接输入 — 0-100 分数、突出显示、统计数据和每个发现的修复建议在您输入时更新。
| 类别 | 示例 |
|------------|----------|
| **词汇** | *探索、锦绣、多面性、细致入微、关键、强调、展示、见证…* (按 ChatGPT 后过度频率加权) |
| **修辞** | 否定并行结构(“不仅是 X,还有 Y”)、陈词滥调的开头(“在当今的数字时代”)、 hedging(“值得注意的是”)、虚假范围、三项规则 |
| **句法** | 动词避免(“作为…”、“是…的见证”)、膨胀结构(“发挥着至关重要的作用”) |
| **统计** | **突发性** — 句子长度均匀度。机器文本停留在 0.0-0.2;人类散文在 0.6-0.8 |
- **句子节奏可视化** — 按句子的条形图,使突发性可视化。
- **每个发现的建议** — 每个标记的迹象都带有具体的修复建议和研究依据。
- **人性化(可选,BYOK)** — 连接 AI 提供商并一键重写标记的文本。Anthropic(`claude-opus-4-8`,从浏览器工作)、OpenAI / DeepSeek、Azure OpenAI 或 **Ollama**(本地,无需密钥)。凭证仅存在于您的浏览器中,并直接发送给提供商。
- **前后对比** 和 **可分享的结果卡**(PNG 摘要,永远不包括您的文本)。
- **自定义目录(BYO 规则)** — 粘贴禁止的单词或导入规则包 JSON;实时合并。
- **目录页面** — 一个可搜索的 AI 写作迹象库,支持两种语言,通过浏览器 BM25 索引排名。
## 2. 原创性检查器(“原创性”)
*“这段文字是 AI 生成的、抄袭的还是改写的?”* 放入两个或多个文档 — 论文及其来源、学生提交的作业 — 并查看它们共享的内容。该指南的原则是诚实的:**我们提供证据并突出显示;由人类判断。我们从不指责。** 这不是像 Turnitin 那样的全网索引。
| 阶段 | 捕获内容 | 方式 | 运行位置 |
|-------|-----------------|-----|---------------|
| **A — 原样复制** | 原样共享的段落,抵抗大小写/口音变化 | 重音/大小写折叠单词 *k* -shingles + 贪婪最长匹配拼接,逐令牌验证 | 🔒 **在浏览器中** |
| **B — 改写** | *改写的* 复制 — 相同想法,不同的词语 — **甚至跨语言** | 句子嵌入(谷歌 **EmbeddingGemma-300M**,ONNX)+ 余弦相似度 | 🌐 可选服务器(**选择加入**) |
| **C — 群体** | 整个班级中谁复制了谁,一目了然 | 批量上传 + N×N **重叠热图**;点击单元格检查配对 | 🔒 **在浏览器中** |
| **D — 网络现成检查** | 段落是否已经在线存在 | 提取文档中最 **独特的段落**,并为您提供一键精确短语搜索(Google/Bing/DuckDuckGo) | 🔒 **在浏览器中** |
- **共享段落证据** — 匹配结果在两个文档中并排显示;标题重叠编号与您看到的突出显示内容完全匹配(证据 *即* 分数)。
- **阶段 B 是唯一离开设备的功能。** 它是选择加入的,在 UI 中公开,并仅发送您选择检查的句子到 PeopleWorks 服务器。其他一切都保留在您的机器上。
- **阶段 D** 故意诚实:我们无法索引整个网络,因此我们提供值得检查的段落并准备搜索 — 在您点击其中一个之前,什么都不会发送到任何地方。 **可选的自动网络搜索** 可以由服务器操作员启用(参见下面的 *可选服务器*)。
## 3. 可预测性仪表(可选服务器)
对困惑度的诚实重构。一个小型语言模型(Qwen2.5-0.5B 或 Microsoft Phi-4-mini,int8 ONNX)衡量文本的措辞有多 **可预测/通用**。**这不是 AI 与人类的判决** — 在标记的语料库中,两个重叠得不好(记忆中的人类文本也得分 **可预测**)。我们诚实地提供可预测性,作为众多信号之一,按语言校准。选择加入;在 PeopleWorks 服务器上运行。模型惰性加载和空闲卸载,以保持服务器轻量。
## 4. 从其他应用程序使用 — MCP 服务器
上述所有内容也可通过 `SignsOfAI.Mcp` 提供给 **Claude Desktop 和任何 [MCP](https://modelcontextprotocol.io) 客户端**,这是一个 Model Context Protocol 服务器(基于官方 [`ModelContextProtocol`](https://www.nuget.org/packages/ModelContextProtocol) SDK,stdio 传输)。由于引擎位于 `SignsOfAI.Core` — 纯 .NET,无浏览器依赖 — 服务器只需将它公开为工具:
| 工具 | 功能 | 运行位置 |
|------|--------------|---------------|
| `analyze_ai_writing` | 分数 + 判决 + 发现(带有修复)+ 统计数据 | 🔒 设备上 |
| `check_originality` | 2+ 文档之间的重叠百分比和共享段落 | 🔒 设备上 |
| `search_catalog` | 搜索 AI 写作迹象目录(EN/ES) | 🔒 设备上 |
| `extract_distinctive_phrases` | 独特短语 + 现成的网络搜索链接 | 🔒 设备上 |
| `measure_predictability` | 通过可选服务器进行可预测性 | 🌐 服务器(**选择加入**) |
| `check_paraphrase` | 通过 EmbeddingGemma 进行改写/翻译匹配 | 🌐 服务器(**选择加入**) |
前四个工具完全在机器上运行;后两个工具公开了它们将文本发送到服务器(通过 `SIGNSOFAI_API_ENDPOINT` 环境变量的端点)。将 Claude Desktop 指向它:
```jsonc
// %APPDATA%\Claude\claude_desktop_config.json
{ "mcpServers": { "signs-of-ai": {
"command": "dotnet",
"args": ["…/src/SignsOfAI.Mcp/bin/Release/net10.0/SignsOfAI.Mcp.dll"]
}}}
```
它还打包为全局工具(`signsofai-mcp`)。参见 `src/SignsOfAI.Mcp/README.md` 获取详细信息。
## 5. 作为代理技能使用 — `/signs-of-ai`
更喜欢在编辑器中工作?`skill/signs-of-ai` 是一个可以直接插入的 **Claude Code / Codex / 代理技能**,它可以精简草稿 — 或判断文本是否像 AI 写作一样 — 支持英语和西班牙语。它是对相同的 `rules.en.json` / `rules.es.json` 分类法的可读提炼,因此它按照引擎评分的相同规则进行编辑。 通过将存储库链接粘贴到 AI 容器中或将文件夹复制到 `~/.claude/skills/`,然后:
```
/signs-of-ai <您的草稿> # 编辑模式:重写 + 更改摘要
/signs-of-ai 是 AI 垃圾吗? <文本> # 检测模式:引用判决,无重写
```
该技能 **从不伪造数字分数** — 对于校准的 0-100 判决、突发性、原创性或可预测性,它会交给这个引擎(网页应用、CLI 或上面的 MCP 工具)。参见 `skill/README.md`。
---
## 架构
```
SignsOfAI.slnx
├─ src/
│ ├─ SignsOfAI.Core # 纯 C# 引擎(无 UI/服务器依赖)
│ │ ├─ Analyzers/ # 词汇、模式、突发性(IAnalyzer)
│ │ ├─ Originality/ # OriginalityChecker(shingles+tiling)、ParaphraseFinder、
│ │ │ # DistinctivePhraseExtractor
│ │ ├─ Rules/Packs/ # rules.en.json, rules.es.json(嵌入式,社区可扩展)
│ │ ├─ Text/ # Tokenizer, 句子分割器,语言检测器,统计数据
│ │ └─ AiWritingAnalyzer # 公共 facade:Analyze(text, language)
│ ├─ SignsOfAI.Web # Blazor WebAssembly 前端(Analyze, Originality, Catalog)
│ ├─ SignsOfAI.Cli # `dotnet tool` 用于 CI 管道
│ ├─ SignsOfAI.Mcp # MCP 服务器(stdio):引擎作为 Claude Desktop / 任意客户端的工具
│ └─ SignsOfAI.Perplexity.Api # 可选 ASP.NET Core 服务器:可预测性 + 嵌入
│ ├─ Engine/ # OnnxPerplexityEngine, OnnxEmbeddingEngine(惰性加载 + 空闲卸载)
│ └─ Config/ # 模型配置文件,校准,嵌入 + 网络搜索选项
└─ tests/
└─ SignsOfAI.Core.Tests # xUnit(40+)
```
核心引擎与 UI 和服务器分离 — CLI、Blazor 应用程序和 API 都重用了它们。
## 运行
```bash
dotnet run --project src/SignsOfAI.Web
# 然后打开 http://localhost:5019
```
## 测试
```bash
dotnet test
```
## 命令行和 CI(`dotnet tool`)
检查工具作为全局工具提供,因此您可以在 CI 中检查文本:
```bash
dotnet tool install --global SignsOfAI.Cli
signsofai check README.md # 漂亮的报告
signsofai check article.docx --lang en # Word 文档也支持
signsofai check post.md --json # 机器可读
signsofai check post.md --max-score 40 # 如果它读起来太像 AI → 失败 CI
signsofai check post.md --rules my-style.json # 自定义目录
```
分析引擎也是一个库 — `dotnet add package SignsOfAI.Core`:
```csharp
var result = new SignsOfAI.Core.AiWritingAnalyzer().Analyze(text, "auto");
Console.WriteLine($"{result.OverallScore}/100 — {result.Verdict}");
```
## 可选服务器(`SignsOfAI.Perplexity.Api`)
客户端独立工作;此服务器仅支持 **选择加入** 功能(可预测性仪表和阶段 B 改写检查)。它是 ASP.NET Core (.NET 10) 主持的 ONNX 模型,具有惰性加载和空闲卸载,因此保持轻量。模型文件 **未** 在 git 中 — 它们在首次使用时下载。
客户端默认指向托管实例;要运行自己的实例,请在应用程序服务器设置中设置端点并为您的源配置 CORS。
### 启用可选的自动网络搜索(阶段 D)
默认情况下,阶段 D 是设备上的单击搜索体验(无需密钥,直到您单击才会发送任何内容)。操作员还可以通过在 **服务器** 上配置搜索引擎来启用 **自动** 网络搜索 — 有用的演示 — 通过配置搜索引擎:
```jsonc
// appsettings.json(或环境变量)
"WebSearch": {
"Enabled": true,
"Provider": "brave", // Brave Search API(免费层);提供者抽象
"ApiKey": "", // 优先使用 BRAVE_API_KEY 环境变量
"MaxPhrasesPerDoc": 8,
"MaxResultsPerPhrase": 5
}
```
启用后,服务器会宣传该功能,客户端会提供一个自动的“搜索网络”操作,该操作会报告 **逐字** 包含段落的页面。如果关闭、配额耗尽或出错,UI 会回落到手动单击搜索 — 它永远不会中断。
## 扩展规则
将条目添加到 `src/SignsOfAI.Core/Rules/Packs/rules.<lang>.json` — **词汇** 规则匹配单个单词标记,**模式** 规则是多单词迹象的正则表达式。每个规则都设置 `weight`、`severity` 和 `suggestion`。
## 部署
Blazor 客户端是一个静态捆绑包(可在任何地方免费托管)。包含的 GitHub Actions:
- **GitHub Pages**(`deploy-pages.yml`)— 设置 → Pages → 源:”GitHub Actions”。工作流会重写基本 href 并写入 SPA `404.html` 回退页。
- **Azure Static Web Apps**(`azure-static-web-apps.yml`)— 将部署令牌添加为存储库机密。
可选服务器是一个普通的 ASP.NET Core 应用程序(使用 `dotnet publish` 发布 `SignsOfAI.Perplexity.Api` 项目)。
## 致谢
由 **Pedro Hernández — PeopleWorks** 创建,.NET 微软 MVP。检测标记基于 AI 风格语言学研究 — 参见 `Docs/GoogleResearch.md`。