ElijahFang777/Phishing-Incident-Response-RAG-System

GitHub: ElijahFang777/Phishing-Incident-Response-RAG-System

一个面向钓鱼事件响应的RAG系统,系统性对比BM25、Dense FAISS和Hybrid三种检索策略在网络安全垂直知识库上的检索与生成效果。

Stars: 0 | Forks: 0

# 钓鱼事件响应 RAG 系统 本代码库包含一个用于课程作业的检索增强生成(RAG)系统,旨在从一个小型、本地化的澳大利亚网络安全知识库中生成钓鱼事件响应指南。 本项目对比了三种检索策略: - **BM25** 词法检索 - **Dense FAISS** 检索,使用 sentence-transformer embeddings - **Hybrid** 检索,结合了归一化的 BM25 和 dense 评分 对于每个评估查询,系统会检索排名前 3 的文本块,使用 Qwen2.5-1.5B-Instruct 生成带有引用的答案,并通过检索相关性、答案相关性、引用覆盖率、忠实度代理指标以及人工可操作性标签来评估结果。 ## 当前状态 实验已经运行完毕。本代码库包含: - 处理后的知识库文本块和检索索引; - 生成的检索、答案和评估 CSV 输出; - 人工相关性和人工可操作性标签; - 可直接用于报告的分析 Notebook 输出和图表。 清理后的代码库移除了临时缓存文件、旧日志以及过期的探索性 Notebook。运行时日志和 Python 字节码可以通过重新运行流水线来生成。 ## 项目结构 ``` . ├── config.py # Central paths and experiment settings ├── run_experiment.py # Main coursework entry point ├── requirements.txt # Python package requirements ├── environment.yml # Conda environment definition ├── data/ │ ├── eval_queries.csv # 20 evaluation queries and references │ ├── manual_relevance_labels.csv # Manual top-3 chunk relevance labels │ ├── manual_actionability_scores.csv │ ├── raw_docs/ # Source PDFs, Markdown files, manifest │ └── processed/ # Chunks, embeddings, BM25 and FAISS indexes ├── src/ # Pipeline modules ├── prompts/ # Generation prompt template ├── outputs/ # Completed experiment outputs │ └── figures/ # Report-ready figures └── notebooks/ └── report_experiment_results.ipynb ``` ## 知识库 知识库存储在 `data/raw_docs/` 目录中,并由 `data/raw_docs/source_manifest.csv` 描述。它包含来自 ACSC/Cyber.gov.au 的钓鱼、诈骗、社会工程学和事件响应指南,以及三个关于事件响应或演习规划的 PDF 文件。 经过预处理后,语料库包含 **152 个文本块**: | 来源 | 文本块数 | |---|---:| | ACSC Cyber Incident Response Plan Guidance | 75 | | Cyber Incident Response Plan for ACCHO Use | 27 | | SA Government Cyber Security Exercise Guide | 24 | | ACSC Cyber Security Incident Response Planning | 9 | | ACSC Detecting Socially Engineered Messages | 7 | | ACSC Phishing Guidance | 6 | | ACSC Recognise and Report Scams | 4 | 每个文本块保留了来源标题、文件名、章节标题、URL(如果有的话)、访问日期、文本块 ID 以及分块策略。 ## 设置 使用 Conda: ``` conda env create -f environment.yml conda activate RAG3090 ``` 使用 `venv`: ``` python -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` 生成器在 `config.py` 中进行配置: ``` GENERATOR_MODEL_NAME = "/mnt/Data2/zfang/rlhf_assignment/data/raw/models/Qwen2.5-1.5B" EMBEDDING_MODEL_NAME = "sentence-transformers/all-MiniLM-L6-v2" EMBEDDING_DEVICE = "cuda" ``` 如果 CUDA 不可用,请将 `EMBEDDING_DEVICE` 更改为 `"cpu"`。 ## 运行流水线 运行完整实验: ``` python run_experiment.py ``` 复用已有的处理后文本块和索引: ``` python run_experiment.py --skip-ingest ``` 仅运行数据摄取和检索: ``` python run_experiment.py --skip-generation ``` 流水线在运行时会自动创建 `logs/rag_pipeline.log`。 ## 输出 主要输出文件: | 文件 | 用途 | |---|---| | `data/processed/chunks.csv` | 处理后的文本块及元数据 | | `data/processed/bm25.pkl` | 保存的 BM25 索引 | | `data/processed/faiss.index` | 保存的 FAISS dense 索引 | | `data/processed/embeddings.npy` | 文本块 embeddings | | `outputs/retrieved_chunks.csv` | 每个查询和检索器对应的 Top-3 检索文本块 | | `outputs/generated_answers.csv` | 包含 `[chunk_id]` 引用的生成答案 | | `outputs/evaluation_scores.csv` | 自动及备用评估得分 | | `outputs/retriever_metric_summary.csv` | 按检索器统计的平均指标 | | `outputs/query_difficulty_summary.csv` | 查询级别的难度摘要 | | `outputs/retrieval_failure_diagnosis.csv` | 检索失败记录和来源诊断 | | `outputs/report_metric_summary.csv` | 可用于报告的按查询/按检索器统计的指标 | 可直接用于报告的图表位于 `outputs/figures/` 目录中。 ## 实验摘要 已完成的实验使用了: - **20** 个从业者风格的钓鱼事件响应查询; - **3** 个检索器:BM25、dense FAISS 和 hybrid; - 每个查询/检索器 **Top-3** 的检索文本块; - **180** 个检索文本块实例; - **60** 个生成的答案; - **180** 个手动相关性标签; - **60** 个手动可操作性标签。 各检索器的平均结果: | 检索器 | 上下文相关性 | 答案相关性 | 引用覆盖率 | 忠实度代理 | 可操作性 | |---|---:|---:|---:|---:|---:| | BM25 | 0.983 | 0.544 | 0.912 | 0.912 | 2.20 | | Dense | 1.117 | 0.592 | 0.919 | 0.919 | 2.35 | | Hybrid | 1.233 | 0.556 | 0.945 | 0.945 | 2.40 | Hybrid 检索在整体上下文相关性、引用覆盖率和人工可操作性方面表现最好。Dense 检索产生了最高的答案相关性代理指标。对这些结果的解释应持谨慎态度,因为引用覆盖率仅仅是一个可追溯性代理,并不能证明声明级别的忠实度。 ## 评估 评估遵循 RAGAS 风格的维度: - **上下文相关性:** 检索到的文本块是否与查询相关。 - **答案相关性:** 生成的答案是否切中查询。 - **忠实度:** 生成的声明是否基于检索到的上下文。 当无法进行完整的 RAGAS 评估时,项目会使用备用指标: - 来自 `data/manual_relevance_labels.csv` 的人工上下文相关性; - 用于评估答案相关性的 embedding 相似度; - 用于评估忠实度代理的引用覆盖率; - 来自 `data/manual_actionability_scores.csv` 的人工可操作性。 人工可操作性使用 1-5 的评分标准: ``` 1 = vague or not useful for incident response 2 = partially relevant but missing concrete analyst actions 3 = usable but incomplete or weakly prioritised 4 = clear, actionable, and mostly complete 5 = highly actionable, specific, prioritised, and well grounded ``` ## 评分说明 需要检查的重要文件包括: - `src/run_pipeline.py`:端到端工作流; - `src/retrievers.py`:BM25、dense 和 hybrid 检索; - `src/generator.py`:基于事实依据的答案生成; - `src/evaluation.py`:备用评估逻辑; - `notebooks/report_experiment_results.ipynb`:可直接用于报告的分析; - `outputs/retriever_metric_summary.csv` 和 `outputs/report_metric_summary.csv`:最终结果。 代码库有意保留了处理后的数据和实验输出,以便在无需重新运行完整生成流水线的情况下也能检查最终结果。
标签:AI安全, AI智能体, Apex, BM25, Chat Copilot, DLL 劫持, FAISS, Qwen2.5, RAG, RAG系统, 信息检索, 凭据扫描, 句子嵌入, 向量数据库, 大语言模型, 威胁情报, 安全报告, 安全运营, 小型语言模型, 开发者工具, 引用生成, 扫描框架, 文本向量化, 本地知识库, 机器学习, 检索增强生成, 检索策略对比, 检索评估, 深度学习, 混合检索, 澳大利亚网络安全, 网络安全, 词法检索, 语义检索, 逆向工具, 钓鱼攻击响应, 隐私保护