ishumilin/epstein-chat

GitHub: ishumilin/epstein-chat

面向法律调查文档的三阶段混合检索问答系统,专为高噪声OCR数据集的精准检索与可审计性设计。

Stars: 7 | Forks: 5

# Epstein 文档分析系统 ## 概述 本仓库提供了一个用于查询 Epstein 文档数据集的高精度接口。我们的方案旨在解决大规模、嘈杂 OCR 数据集中信息检索的特定挑战,在这些数据集中,准确性和可审计性至关重要。 ## 发布计划 - [x] **第一阶段:独家早期访问** 限制向经核实的记者、NGO 和独立调查人员提供访问权限,用于针对性研究。 - [x] **第二阶段:首次公开发布** 公开发布有限的、经过整理的数据集,允许更广泛的社区探索和测试。 - [ ] **第三阶段:无限制公开访问** 向所有用户完整、全面地公开数据集。 ## 技术架构与问题解决 该数据集的主要挑战在于,从扫描文档提取的非结构化文本中,特定实体(如电话号码、航班尾号和时间戳)的密度很高。仅使用标准 Vector 搜索往往无法满足这种“大海捞针”式调查查询所需的精细度。 我们通过实施实体感知摄取管道和复杂的 3 阶段检索架构解决了这个问题: ### 0. 智能元数据提取 在索引之前,系统会进行自动元数据提取,以结构化非结构化 OCR 文本: - **实体识别**:结合使用专门的 Regex 模式和基于 BERT 的命名实体识别 (NER) 模型 (`dslim/bert-base-NER`) 来识别电话号码、电子邮件地址、航班尾号、日期以及大写的姓名/地点。 - **丰富索引**:将提取的元数据注入到文档块中,确保在 Semantic 和 Lexical 搜索阶段优先处理特定的、高价值的调查 token。 ### 1. 混合检索策略 (Vector + Keyword) 为了最大化召回率,系统采用双流搜索机制: - **Semantic Search**:利用 `BAAI/bge-m3` Embedding 捕获用户查询的概念上下文和意图。 - **Lexical Matching**:利用 `BM25` 检索器处理特定的数字和基于实体的查询(例如,飞行日志或电话记录),在这些情况下,精确字符串匹配效果更好。 - **Reciprocal Rank Fusion (RRF)**:来自两个流的结果使用 RRF 进行融合,优先考虑在 Semantic 和 Lexical 领域都表现出色的文档。 ### 2. 神经重排序 (Cross-Encoder) 由于 OCR 伪影,初始检索候选项通常包含噪音。我们利用 `BAAI/bge-reranker-base` Cross-Encoder 对前 50 个候选项进行基于深度学习的二次相关性检查。该过程有效地识别出最相关的上下文,并将其推至上下文窗口的顶部,从而显著提高系统的精度以及随后的 LLM 生成质量。 ### 3. 页面级审计与引用 在法律和调查文档分析中,透明度至关重要。我们的实现使用专门的 `CitationQueryEngine`,为每个助手响应提供可验证的页面级证据,允许用户将发现结果直接与原始材料进行交叉引用。 ## 性能基准 该架构使用合成评估套件进行了严格测试: - **命中率 (Top-5)**:**81.99%** - **平均倒数排名 (MRR)**:**0.7110** 这些指标表明,在绝大多数查询中,正确响应出现在第一或第二个结果位置,展示了进一步分析和调查的坚实基础。 ## 使用 Docker 快速开始 本仓库包含一个**可工作的 Docker Compose 设置**(FastAPI 应用 + Ollama),这是在本地运行系统的最简单方法。 **前置条件** - Docker Desktop / Docker Engine **启动堆栈** ``` # 从 repo 根目录 cd epstein-chat # 启动 Ollama + API docker compose up -d --build # 查看启动日志(首次运行会下载 HF embedding + reranker models) docker compose logs -f app ``` **健康检查 + 示例查询** ``` curl -s http://localhost:8000/health | jq . curl -s -X POST http://localhost:8000/chat \ -H 'Content-Type: application/json' \ -d '{"query":"Who Censored Roger Rabbit?"}' \ | jq . ``` ## 手动运行 ### 1. 下载数据集 我们使用 [**Epstein Files OCR Dataset**](https://huggingface.co/datasets/ishumilin/epstein-files-ocr-datasets-1-8-early-release)。 OCR 是使用 [Wild Ma-Gässli](https://wildma.ch) 提供的专有模型执行的。 ``` huggingface-cli download ishumilin/epstein-files-ocr-datasets-1-8-early-release --repo-type dataset --local-dir data --local-dir-use-symlinks False ``` ### 2. 评估管道(可选) 要在运行完整聊天系统之前验证检索准确性,您可以摄取并评估文档的一个子集。 **步骤 2a:摄取评估数据** 这仅索引评估数据集所需的文档。 ``` # 确保你在 epstein-chat 目录中 cd epstein-chat # Ingest eval 子集(指向你下载的数据) python eval/ingest_eval_dataset.py --data-dir ../data --recursive ``` **步骤 2b:运行评估** 运行评估脚本以测量命中率和 MRR。 ``` python eval/eval_run.py --data-dir ../data --recursive ``` *结果将保存到 `eval_results.csv`。* ### 3. 完整系统摄取 要将交互式聊天与整个数据集一起使用,您必须摄取所有文档。 *注意:根据您的硬件,此过程可能需要大量时间。* ``` # Ingest 所有数据(指向你下载的数据) python ingest.py --data-dir ../data --recursive ``` ### 4. 交互式聊天 摄取完成后,您可以启动聊天界面。 **CLI 模式:** ``` python chat.py ``` *或者进行单个查询:* ``` python chat.py "Who Censored Roger Rabbit?" ``` ## 配置 系统使用环境变量进行配置。您可以在 shell 或 `.env` 文件中设置这些变量。 | 变量 | 描述 | 默认值 | | :--- | :--- | :--- | | `OCR_DATA_DIR` | 包含 markdown 文件的文件夹路径 | `data` | | `CHROMA_PERSIST_DIR` | 存储 Vector Database 的路径 | `./chroma_db` | | `VLLM_API_BASE` | LLM API 的 URL (兼容 OpenAI) | `http://ollama:11434/v1` | | `VLLM_MODEL_NAME` | 要使用的 LLM 模型名称 | `llama3` |
标签:AI风险缓解, BERT, NER, NLP, OCR处理, RAG, 人工智能, 信息检索, 元数据提取, 公共数据, 向量数据库, 命名实体识别, 数据新闻, 数据清洗, 文档分析, 检索增强生成, 法律文档检索, 法律科技, 混合检索, 爱泼斯坦, 用户模式Hook绕过, 用户界面, 结构化数据, 请求拦截, 调查新闻, 进程保护, 逆向工具, 金融犯罪, 问答系统, 隐私