Labeeb2339/cyber-rag

GitHub: Labeeb2339/cyber-rag

该项目是一个完全本地的网络安全 RAG 原型,旨在通过混合检索和 MITRE ATT&CK 图谱锚定,在保护查询隐私的同时提升本地小模型在威胁情报任务中的表现。

Stars: 0 | Forks: 0

# CyberRAG **一个完全本地的网络安全 RAG 原型,具备混合检索、MITRE ATT&CK 图谱锚定、带引用的回答以及可重复的评估框架。** ![展示了 15 个问题中每一个问题的纯本地模型和检索增强模型的关键词覆盖率的 CyberRAG 配对试点图表](https://static.pigsec.cn/wp-content/uploads/repos/cas/36/36a26587d0423de073b5121d17af97c92758470bafc530136274a8b56373b2a9.svg) *根据已提交的 15 个问题试点快照生成。平均确定性 关键词覆盖率从 0.627 增加到 0.843,预期文档在 14/15 的问题中出现在前五名,并且平均延迟增加了 2.694 秒。 这是一个小规模的本地试点,并非生产环境验证或云模型平价基准。* 我构建 CyberRAG 是为了探索一个实际问题:在将查询时的数据 保留在用户机器上的前提下,检索能在多大程度上提升小型本地模型在 威胁情报任务上的表现? 我开展这个项目是为了响应 CyberSecurity Malaysia 的一份挑战赛简报。它是 一个独立的原型,并非 CyberSecurity Malaysia 的官方委托、 部署或认可的产品。 ## 它展示了什么 - **私密的查询路径:** embeddings、检索、reranking、图查找和生成通过本地 Ollama 模型运行。 - **混合检索:** 密集向量 + BM25 + reciprocal-rank fusion,并对 CVE、ATT&CK、CAPEC 和 CWE 标识符提供精确加权。 - **图谱锚定:** MITRE ATT&CK 关系支持有关组织、恶意软件、技术和缓解措施的多跳问题。 - **证据优先的回答:** 检索到的段落和图事实被传递给 prompt,该 prompt 要求内联引用并拒绝不受支持的标识符。 - **将评估作为工程:** 固定的问题集用于衡量关键词覆盖率、检索命中率、模型评委得分和延迟。 ## 试点基准测试 已提交的 [15 个问题结果快照](eval/results_2026-06-22_1901.json) 比较了相同本地模型在使用和不使用 CyberRAG 情况下的表现: | 指标 | 仅本地模型 | 本地模型 + CyberRAG | |---|---:|---:| | Keyword coverage | 0.627 | **0.843** | | Context hit rate | — | **0.933** | | Model-judge score | 0.427 | **0.647** | | Mean latency | 11.95 s | 14.65 s | 确定性指标显示出更强的事实覆盖率和检索能力。模型评委的结果是方向性的:原始快照没有记录每个得分是来自外部评委还是本地回退。当前的运行器会记录所选的评委后端,以便未来的结果是可审计的。 这是一个小型的试点基准测试,并非云模型平价或具备生产环境就绪状态的证明。 ## 架构 ``` flowchart LR Q[Question] --> R{Route} R -->|Entity or relationship| KG[MITRE ATT&CK graph] R --> V[Vector retrieval] R --> B[BM25 retrieval] V --> F[RRF + exact-ID boost] B --> F F --> RR[Local reranker] KG --> P[Grounded prompt] RR --> P P --> L[Local Ollama model] L --> A[Answer + citations] ``` | 层级 | 默认实现 | |---|---| | Embeddings | 通过 Ollama 的 `nomic-embed-text` | | Vector store | ChromaDB,本地存储 | | Lexical retrieval | BM25 | | Rank fusion | Reciprocal Rank Fusion + exact-ID boost | | Knowledge graph | 基于 MITRE ATT&CK STIX 的 NetworkX | | Generator / reranker | 通过 Ollama 的 `qwen2.5-coder:7b` | 设计详情请参见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。 ## 快速开始 ### 环境要求 - Python 3.11+ - 本地运行 [Ollama](https://ollama.com/) - 足够的本地存储空间和内存,用于所选模型和生成的索引 ``` git clone https://github.com/Labeeb2339/cyber-rag.git cd cyber-rag python -m venv .venv # Windows: .venv\Scripts\activate # Linux/macOS: source .venv/bin/activate python -m pip install -r requirements.txt ollama pull nomic-embed-text ollama pull qwen2.5-coder:7b ``` 通过设置 `CYBERRAG_GEN_MODEL` 或 `CYBERRAG_EMBED_MODEL` 来覆盖默认配置,而无需修改代码。 ### 构建公开数据索引 此设置阶段会下载权威的公开数据源,因此会使用网络: ``` python ingest/fetch_authoritative.py python ingest/build_index.py python rag/hybrid.py build python rag/kg.py build ``` 在数据源和索引存在之后,常规的查询路径均在本地执行: ``` python demo.py "Which techniques does APT29 use and how can they be detected?" ``` ### 添加您自己的文档 ``` python ingest/ingest_docs.py ./my_reports --source internal-cti --recursive python rag/hybrid.py build ``` 支持的文档格式包括 PDF、DOCX、Markdown、文本和 HTML。请勿提交私有文档、生成的索引或 embedding 缓存。 要在不修改代码的情况下将自定义数据源添加到完整重建中: ``` python ingest/build_index.py --extra-source "my-notes=./notes/*.md" ``` ## 评估 ``` # 仅本地模型 vs 本地模型 + CyberRAG python eval/run_eval.py # 添加本地模型 judge;后端记录在输出中 python eval/run_eval.py --judge --judge-backend local # 使用从 stdin 读取 prompt 的外部命令 set CYBERRAG_EVAL_COMMAND=your-evaluator-command python eval/run_eval.py --judge --judge-backend command --cloud ``` 云评估是可选的,它从不属于常规的 CyberRAG 查询路径。使用 `--cloud` 或 `--judge-backend command` 可能会将 benchmark prompts 发送到已配置的外部服务。 ## 测试 ``` python -m pytest -q ``` 单元测试涵盖了分词、停用词处理、精确安全标识符提取、reciprocal-rank fusion 以及确定性评估指标。完整的端到端评估还需要 Ollama 以及生成的语料库/索引文件。 验证 README 的基准图表是否仍然与已提交的快照相匹配: ``` python scripts/generate_readme_assets.py --check ``` ## 仓库边界 包含内容: - 摄取和查询的源代码; - 评估问题和带有日期的结果快照; - 架构和执行文档。 不包含: - 生成的 Chroma/BM25/图索引; - 下载的语料库; - 私有的事件报告或运营 SOC 数据; - 生产环境部署或正式安全认证的证据。 ## 许可证 MIT — 请参见 [LICENSE](LICENSE)。
标签:AI风险缓解, DLL 劫持, RAG, 大语言模型, 威胁情报, 开发者工具, 本地部署, 特权检测, 网络安全, 逆向工具, 隐私保护