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绕过, 用户界面, 结构化数据, 请求拦截, 调查新闻, 进程保护, 逆向工具, 金融犯罪, 问答系统, 隐私