adrienclaire/threat-intel-rag
GitHub: adrienclaire/threat-intel-rag
基于 BM25 词法检索的本地威胁情报问答助手,针对 MITRE ATT&CK、CVE 和安全公告语料提供带引用的可解释检索回答。
Stars: 0 | Forks: 0
# threat-intel-rag
面向安全分析师的本地优先威胁情报检索助手。
这个 MVP 从一个紧凑的本地安全语料库中回答分析师的问题,并返回其引用的段落。它被刻意设计得简单且透明:优先使用词法检索,并为后续升级到 embedding 或完整的 RAG pipeline 保留清晰的路径。
## 为什么创建这个仓库
安全问题通常可以从已知参考资料中找到答案,但这些上下文散布在 ATT&CK 技术、安全公告、分析师笔记和响应指南中。本项目展示了一个小型检索工作流,在生成每个回答时都会附带引用的源材料。
它被设计为一个可用于作品集展示的示例,展示了:
- 网络安全知识检索
- 可解释的本地优先 AI 架构
- FastAPI 服务设计
- 可测试的 Python 代码
- 从 MVP 到生产级 RAG 的现实路径
## 功能
- 加载紧凑的 JSON 安全参考语料库
- 从 `data/notes/` 摄取可选的 markdown 分析师笔记
- 在本地对每份文档进行 token 化处理
- 使用紧凑的 BM25 风格词法 ranker 对文档进行评分
- 返回由最匹配段落合成的答案
- 保留引用信息,包含 `doc_id`、`title`、`source`、`source_url`、score 和段落片段
- 提供小型的 FastAPI API 和浏览器 UI
## 当前语料库
演示语料库包含了受常见安全参考类型启发的示例:
- MITRE ATT&CK 风格的技术
- 供应商安全公告风格的漏洞说明
- CISA 风格的勒索软件防范指南
该语料库被刻意设置得很小,以便于轻松检查和解释检索行为。
## 架构
```
Analyst question
|
v
FastAPI /query endpoint
|
v
retriever.py -> lexical scoring over loaded documents
|
v
answer + citations
```
关键文件:
- `app/main.py` — FastAPI 应用和请求验证
- `app/indexer.py` — 语料库加载和 token 化
- `app/retriever.py` — 排序和答案构建
- `data/corpus.json` — 紧凑的演示安全语料库
- `tests/` — retriever、API 和语料库质量测试
## 技术栈
- Python 3.12+
- FastAPI
- Uvicorn
- Pytest
## API endpoint
| 方法 | 路径 | 用途 |
|---|---|---|
| `GET` | `/` | 用于分析师查询的小型浏览器 UI |
| `GET` | `/health` | 服务健康检查 |
| `POST` | `/query` | 提出威胁情报问题 |
## 设置
手动设置:
```
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-dev.txt
```
或使用 Makefile:
```
make install
```
## 运行测试
```
source .venv/bin/activate
python -m pytest -q
```
或:
```
make test
```
预期结果:
```
12 passed
```
## 本地运行
```
source .venv/bin/activate
uvicorn app.main:app --reload
```
或:
```
make run
```
打开 API 文档:
```
http://localhost:8000/docs
```
## 使用 Docker 运行
构建镜像:
```
make docker-build
```
运行容器:
```
make docker-run
```
或使用 Docker Compose:
```
make docker-up
```
API 监听地址:
```
http://localhost:8000
```
停止 Compose 栈:
```
make docker-down
```
## 示例请求
```
curl -X POST http://localhost:8000/query \
-H "Content-Type: application/json" \
-d '{"question":"How should we triage phishing that may have captured credentials?"}'
```
## 示例响应结构
```
{
"question": "How should we triage phishing that may have captured credentials?",
"answer": "Phishing: MITRE ATT&CK T1566 covers phishing techniques used to obtain credentials...",
"citations": [
{
"doc_id": "mitre-t1566",
"title": "Phishing",
"source": "MITRE ATT&CK",
"source_url": "https://attack.mitre.org/techniques/T1566/",
"score": 1.23,
"passage": "MITRE ATT&CK T1566 covers phishing techniques used to obtain credentials or deliver malicious content"
}
]
}
```
## 分析师示例问题
- `我们应该如何处理可能已窃取凭据的网络钓鱼?`
- `在收到远程代码执行安全公告后,我们应该验证什么?`
- `哪些迹象表明存在合法账号滥用?`
- `我们应该为勒索软件防范做些什么?`
- `如何检测可疑的 PowerShell 执行?`
## 公开发布检查清单
在将此仓库公开之前,请验证:
- [x] 不存在真实的客户数据、密钥、token 或内部笔记
- [x] 语料库仅使用演示/安全公告风格的内容
- [x] 测试在本地通过
- [x] README 包含设置、测试和演示用法
- [x] 请求验证避免了明显的 API 错误
- [x] Docker 镜像和 Compose 演示可用
- [x] GitHub topics 已配置
- [x] 仓库可见性已按计划更改为公开
## 路线图
接下来值得做的改进:
1. [x] 添加 TF-IDF 或 BM25 评分,同时保持引用行为不变。
2. [x] 添加用于分析师笔记的 markdown 文档摄取。
3. [ ] 在相同的 `rank_documents` 接口背后添加基于 embedding 的检索。
4. [x] 添加源 URL 和段落级别的引用范围。
5. [x] 添加一个用于分析师查询的小型 Web UI。
## 许可证
MIT
标签:AV绕过, FastAPI, RAG, 信息检索, 威胁情报, 开发者工具, 网络安全, 网络测绘, 请求拦截, 逆向工具, 隐私保护