Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Fact Check AI

视频/图片/文本事实核查工具。支持多平台视频 URL、图片上传、文本输入,通过 Gemini/OpenAI + Google Search Grounding 自动核查事实。集成飞书机器人和 Notion 同步,支持知识管理和持久化备份。

架构

┌──────────────────────────────────────────────────┐
│            Docker Container (:8000)              │
│                                                  │
│  Gateway Service (FastAPI)                       │
│  ├── /api/check          文本/图片事实核查        │
│  ├── /api/check/stream   流式事实核查             │
│  ├── /api/pipeline       视频核查流程             │
│  ├── /api/history        历史记录管理             │
│  ├── /api/llm-config     大模型配置               │
│  ├── /api/notion-config  Notion 同步配置          │
│  ├── /api/notion/sync    手动同步到 Notion         │
│  ├── /api/prompt         提示词管理               │
│  ├── /api/cookies        平台 Cookie 管理         │
│  ├── /api/health         健康检查                 │
│  │                                               │
│  ├── downloaders/        视频下载器               │
│  │   ├── 优先: 第三方解析 API (所有平台)           │
│  │   └── 回退: yt-dlp + cookies                  │
│  │                                               │
│  ├── feishu/             飞书机器人 (WebSocket)    │
│  │   ├── 文本消息 → 事实核查                       │
│  │   ├── 图片消息 → 多模态核查                     │
│  │   └── 视频链接 → 视频核查流程                   │
│  │                                               │
│  ├── notion/             Notion 同步              │
│  │   ├── 自动同步: 核查完成后自动写入               │
│  │   └── 手动同步: 历史记录一键同步                 │
│  │                                               │
│  └── frontend/           单页面 Web UI            │
└──────────────┬───────────────────────────────────┘
               │ HTTP POST /transcribe
┌──────────────▼───────────────────────────────────┐
│  Whisper Service (宿主机 launchd :8001)           │
│  Apple Silicon GPU · mlx-whisper                  │
└──────────────────────────────────────────────────┘

核心流程:

  • 文本 → Gemini/OpenAI + Google Search Grounding 事实核查
  • 图片 + 文本 → 多模态 Gemini 事实核查
  • 视频 URL → 下载音频 → 获取字幕/Whisper 转写 → 观点总结 + 事实核查
  • 核查结果 → 自动/手动同步到 Notion 子页面

目录结构

fact_check/
├── backend/
│   ├── main.py                    # FastAPI 入口,生命周期管理
│   ├── config.py                  # 环境变量配置 (Pydantic Settings)
│   ├── routers/
│   │   ├── check.py               # 文本/图片事实核查 (GET/POST, 流式)
│   │   ├── pipeline.py            # 视频核查流程 (POST 提交, GET 轮询)
│   │   ├── history.py             # 历史记录 CRUD
│   │   ├── prompt.py              # 提示词模板管理
│   │   ├── cookies.py             # 平台 Cookie 管理
│   │   ├── llm_config.py          # 大模型配置管理
│   │   ├── notion.py              # Notion 同步 API
│   │   ├── feishu.py              # 飞书 WebSocket 集成
│   │   └── health.py              # 健康检查
│   ├── services/
│   │   ├── llm.py                 # GeminiService / OpenAIService (多模型)
│   │   ├── pipeline.py            # 视频核查 Pipeline 编排
│   │   ├── whisper_client.py      # Whisper HTTP 客户端
│   │   ├── prompt_manager.py      # 提示词模板管理
│   │   ├── llm_config.py          # LLM 配置持久化
│   │   ├── notion_config.py       # Notion 配置持久化
│   │   ├── notion_client.py       # Notion 写入服务 (Markdown → Blocks)
│   │   ├── cookie_manager.py      # 平台 Cookie 管理
│   │   ├── history_manager.py     # 历史记录管理 (线程安全, 自动同步)
│   │   ├── feishu_client.py       # 飞书 SDK 封装 (消息卡片)
│   │   ├── feishu_handler.py      # 飞书消息处理逻辑
│   │   └── feishu_card.py         # 飞书卡片模板构建
│   ├── downloaders/
│   │   ├── base.py                # Downloader 基类 (API 优先 + yt-dlp 回退)
│   │   ├── bilibili.py            # B站下载器 + 字幕提取
│   │   ├── youtube.py             # YouTube 下载器 + 字幕提取
│   │   ├── douyin.py              # 抖音下载器
│   │   └── kuaishou.py            # 快手下载器
│   ├── models/
│   │   ├── task.py                # TaskStatus 枚举
│   │   ├── download.py            # AudioDownloadResult
│   │   ├── transcript.py          # TranscriptResult / Segment
│   │   └── pipeline.py            # PipelineRequest / Result
│   └── utils/
│       └── url_parser.py          # URL 平台识别 + video_id 提取
├── whisper_service/               # Whisper 独立服务 (宿主机运行)
│   ├── main.py                    # FastAPI 入口
│   ├── transcriber.py             # mlx-whisper 封装
│   └── pyproject.toml             # 独立依赖
├── frontend/
│   └── index.html                 # 单页面 Web UI (暗色/亮色主题)
├── homebrew/
│   └── com.fact-check.whisper.plist  # launchd 配置
├── Makefile
├── Dockerfile
├── docker-compose.yml
├── pyproject.toml
├── prompt_config.json             # 提示词模板
├── cookies_config.json            # 平台 Cookie 存储
├── llm_config.json                # LLM 配置存储
└── notion_config.json             # Notion 配置存储

快速开始

前置要求

  • Python 3.12+
  • uv 包管理器
  • Docker(生产部署)
  • ffmpeg(音频提取)
  • Apple Silicon Mac(Whisper 转写服务,可选)

1. 克隆项目

git clone <repo-url> && cd fact_check

2. 配置

所有核心配置均可在前端页面的 Settings 面板中管理,无需手动编辑配置文件:

  • LLM Configuration — API Key、模型名称、代理地址、Whisper 服务地址
  • Notion Configuration — Notion Integration Token、目标页面 ID

环境变量(.env)仅用于飞书机器人和视频解析 API 等可选功能:

变量 说明 必填
VIDEO_API_URL 视频解析 API 地址 否
VIDEO_API_CLIENT_ID 解析 API Client ID 否
VIDEO_API_SECRET_KEY 解析 API Secret Key 否
FEISHU_APP_ID 飞书应用 ID 否
FEISHU_APP_SECRET 飞书应用 Secret 否

3. 开发模式运行

# 安装依赖并启动
uv sync
make dev

访问 http://localhost:8000

4. Docker 部署

make up

访问 http://localhost:8000

5. Whisper 转写服务(可选)

Whisper 使用 mlx-whisper 运行在 Apple Silicon GPU 上,不能放在 Docker 内,需要在宿主机单独部署:

# 安装依赖 + 注册 launchd 服务
make whisper-install

# 启动服务
make whisper-start

# 验证服务状态
make whisper-status
# → {"status": "ok", "model": "mlx-community/whisper-large-v3-turbo", "runtime": "mlx-whisper"}

使用方式

文本事实核查

在 Text Check 标签页输入文本,点击 Verify Content。支持流式/非流式响应。

图片事实核查

在 Text Check 标签页上传图片(拖拽、粘贴或点击上传),配合文本输入进行多模态事实核查。

视频事实核查

在 Video Check 标签页粘贴视频 URL,点击 Analyze Video。

支持的平台:

平台 URL 示例
Bilibili https://www.bilibili.com/video/BVxxxxxx
YouTube https://www.youtube.com/watch?v=xxxxx
抖音 https://www.douyin.com/video/xxxxx
快手 https://www.kuaishou.com/short-video/xxxxx

视频下载策略:优先使用第三方解析 API(需配置 VIDEO_API_*),失败则回退到 yt-dlp。

转写策略:优先获取平台字幕(Bilibili/YouTube),无字幕则使用 Whisper 转写。

飞书机器人

配置 FEISHU_APP_ID 和 FEISHU_APP_SECRET 后,启动时自动连接飞书 WebSocket。在飞书群聊中:

  • 发送文本 → 自动事实核查,结果以卡片形式回复
  • 发送图片 → 多模态事实核查
  • 发送视频链接 → 触发视频核查流程,实时进度卡片更新

Notion 同步

将核查和总结结果同步到 Notion,作为知识管理和持久化备份。

配置步骤:

  1. 访问 notion.com/my-integrations 创建 Integration
  2. 复制 Internal Integration Token
  3. 在 Notion 中打开目标页面 → ⋯ → Add connections → 选择你的 Integration
  4. 复制页面链接中的 Page ID(URL 中 32 位字符串)
  5. 在前端 Settings → Notion Configuration 中填入 Token 和 Page ID,勾选启用

功能特性:

  • 自动同步:核查/总结完成后自动创建 Notion 子页面(仅同步成功的记录)
  • 手动同步:历史记录中点击 📤 按钮或详情页中点击 "Sync to Notion"
  • 去重机制:已同步的记录不会重复创建,点击同步直接打开已有页面
  • 格式保留:Markdown 内联格式(粗体、斜体、代码、删除线、链接)完整转换为 Notion 原生格式
  • 纯页面方案:每次创建子页面,规避 Notion 免费版 100 行数据库限制
  • 全渠道:Web 端和飞书的核查结果统一同步

前端配置

所有配置均可通过前端页面右上角设置按钮管理,无需重启服务:

  • Prompt Configuration — 编辑事实核查提示词模板,{query} 作为输入占位符
  • Summary Prompt Configuration — 编辑视频观点总结提示词模板
  • Cookie Configuration — 为各平台设置 Cookie,用于访问需要登录的内容
  • LLM Configuration — 配置 API Key、模型名称、代理地址、Whisper 服务地址(支持 Gemini/OpenAI)
  • Notion Configuration — 配置 Notion 同步(Token、Page ID、启用开关)

历史记录

左侧边栏显示查询历史(最多 200 条),支持按类型(文本/视频)筛选、查看详情、删除和同步到 Notion。

API

端点 方法 说明
/api/check?query=... GET 文本事实核查
/api/check/stream?query=... GET 文本事实核查(流式)
/api/check POST 多模态事实核查(文本 + 图片)
/api/check/stream POST 多模态事实核查(流式)
/api/pipeline POST 提交视频核查任务
/api/pipeline/{task_id} GET 查询任务状态和结果
/api/history GET 获取历史记录列表
/api/history/{id} GET 获取单条历史详情
/api/history/{id} DELETE 删除单条历史
/api/history DELETE 清空所有历史
/api/prompt GET/POST 查看/修改提示词模板
/api/cookies GET/POST 查看/修改平台 Cookie
/api/llm-config GET/POST 查看/修改大模型配置
/api/notion-config GET/POST 查看/修改 Notion 配置
/api/notion/test POST 测试 Notion 连接
/api/notion/sync/{id} POST 手动同步单条记录到 Notion
/api/health GET 健康检查

视频核查示例

# 提交任务
curl -X POST http://localhost:8000/api/pipeline \
  -H "Content-Type: application/json" \
  -d '{"video_url": "https://www.bilibili.com/video/BVxxxxxx"}'
# → {"task_id": "uuid", "status": "PENDING"}

# 轮询状态
curl http://localhost:8000/api/pipeline/{task_id}
# → {"status": "DOWNLOADING"}
# → {"status": "TRANSCRIBING"}
# → {"status": "FACT_CHECKING"}
# → {"status": "SUCCESS", "result": {...}}

多模态核查示例

curl -X POST http://localhost:8000/api/check \
  -F "query=这张图片中的说法是否属实?" \
  -F "images=@screenshot.jpg"

Makefile 命令

make dev              # 开发模式(本机直接运行,热重载)
make up               # Docker 构建并启动
make down             # 停止 Docker
make logs             # 查看 Docker 日志
make whisper-install  # 安装 Whisper 服务
make whisper-start    # 启动 Whisper 服务
make whisper-stop     # 停止 Whisper 服务
make whisper-log      # 查看 Whisper 日志
make whisper-status   # 检查 Whisper 服务状态
make start-all        # 启动 Whisper + Docker

技术栈

  • 后端:FastAPI, Pydantic, uvicorn
  • 大模型:Google Gemini / OpenAI + Google Search Grounding
  • 音频转写:mlx-whisper(Apple Silicon GPU 加速)
  • 视频下载:yt-dlp + ffmpeg + 第三方解析 API
  • 飞书集成:lark-oapi(WebSocket 长连接)
  • Notion 集成:notion-client(异步 API,Markdown → Blocks 转换)
  • 前端:原生 HTML/CSS/JS, marked.js, DOMPurify
  • 部署:Docker, launchd
  • 包管理:uv

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages