File size: 6,822 Bytes
120e73b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | # 在线人物筛选 Demo(YouTube + Tavily 文搜)
给定一个 YouTube 视频链接,自动:
1. 用 `yt-dlp` 抓取视频 + 顶层评论 + 元数据;
2. 跑“高颜值男女可抽取素材”筛选推理(多轮工具调用,`web_search` 走 Tavily 公网搜索);
3. 产出结构化判定(approve / reject / undecided)、HTML 轨迹、决策表 CSV 等。
本目录已**自包含全部源码**,可整目录拷贝到其他服务器部署。
---
## 一、目录结构
```
demo/
├── run_people_online_tavily.sh # 入口脚本(可迁移版,REPO_ROOT 自动取本目录)
├── requirements.txt # Python 依赖(已清理为本地可安装格式)
├── README.md # 本文件
├── inference/
│ ├── fetch_youtube_online.py # 第 1 步:yt-dlp 抓视频/评论 -> work_dir
│ ├── run_people_quality_inference.py # 第 2 步:单条筛选推理入口
│ ├── attractive_leads_prompt.py # system / user prompt 构造
│ ├── eval.py # 核心:五工具多轮推理 + Tavily/图搜 + HTML
│ └── video_dr_bridge.py # 桥接层:复用 video_dr_gen 的帧处理/工具逻辑
└── video_dr_gen/ # VideoDR SFT 构造代码(帧抽取、bbox、图搜/web搜实现)
├── assemble_sft_dataset.py # NEW_SYSTEM_PROMPT 等
├── config.py # MARS / gateway / 默认帧参数等常量
├── prompts.py # PHASE1/PHASE2/BASE system prompts
└── utils.py # normalize_bbox / crop_frame / image_search / mars_web_search ...
```
> **重要**:`inference/` 与 `video_dr_gen/` 必须保持现在的相对位置(同在 `demo/` 下)。
> `video_dr_bridge.py` 按 `本文件父目录的父目录 / video_dr_gen` 定位依赖;也可用环境变量
> `VIDEO_DR_SOURCE_ROOT` 显式指定其它路径。
>
> 本 demo 已把用到的 4 个 `video_dr_gen` 文件打包进来并改成相对/可配置定位,
> 迁移后无需依赖旧机器共享盘路径。
---
## 二、运行流程(脚本做了什么)
`run_people_online_tavily.sh <youtube_url>`:
1. 设置出网代理 + `no_proxy`(内网模型直连、公网走代理),激活 conda 环境。
2. **抓取**:调用 `inference/fetch_youtube_online.py`
- `yt-dlp` 下载 mp4 + `info.json`(含评论),规范化后写出
`comments.json` / `metadata.json`;
- 以 `---FETCH--- KEY=VALUE ---END---` 块把 `VIDEO_ID/VIDEO_PATH/COMMENTS_FILE/
TITLE/CHANNEL/DURATION/VIEW_COUNT/VIDEO_URL` 回传给 shell。
3. **推理**:shell 解析上述 KEY=VALUE,拼成单条参数喂给
`inference/run_people_quality_inference.py`(`--web-search-backend tavily` + 一组
`--tavily-*`),复用 `eval.py::evaluate_video_tool()` 的五工具多轮推理逻辑。
4. 标准输出/错误 `tee` 到日志文件。
### 产物
- 抓取缓存:`<work_dir>/<id>.mp4`、`<id>.info.json`、`comments.json`、`metadata.json`
(默认 `inference/online_runs/<id>_<ts>/`,可用 `WORK_DIR` 复用避免重下)。
- 推理结果(默认 `demo/lead_filter_runs/online_<id>_<ts>/`):
`results.jsonl`、`results.html`、`summary.json`、`decision_table.csv`、
`images/`、`frame_cache/`。
- 日志:`<output_dir>.log`。
---
## 三、用法
```bash
cd demo
./run_people_online_tavily.sh https://www.youtube.com/shorts/ZHI5IkRfXAM
# 或
VIDEO_URL=https://www.youtube.com/watch?v=XXXX ./run_people_online_tavily.sh
# 限制评论数
MAX_COMMENTS=50 ./run_people_online_tavily.sh <url>
```
`--` 之后透传给推理脚本,例如调温度:
```bash
./run_people_online_tavily.sh <url> --temperature 0.6
```
---
## 四、部署到新服务器
### 1. 系统依赖
- `ffmpeg`(yt-dlp 合并 mp4 必需,需在 PATH)。
- `yt-dlp`(pip 安装或系统包均可)。
### 2. Python 依赖
```bash
/home/tione/notebook/gaozhenkun/envs/sglang/bin/python -m pip install -r requirements.txt
# eval.py 顶层 import playwright,需要装浏览器内核:
PLAYWRIGHT_BROWSERS_PATH=$PWD/.playwright-browsers \
/home/tione/notebook/gaozhenkun/envs/sglang/bin/playwright install chromium
```
> 说明:当前默认使用本机 `/home/tione/notebook/gaozhenkun/envs/sglang` 环境。
> `google-*`(Vertex/Gemini)仅在 `--model-client vertex` 时才需要,默认不装也能跑。
### 3. 必填环境变量 / 配置
| 变量 | 作用 | 默认值 | 迁移时是否要改 |
|------|------|--------|----------------|
| `CONDA_ENV` | 要激活的 conda 环境路径/名 | `/home/tione/notebook/gaozhenkun/envs/sglang` | 视情况 |
| `CONDA_BASE` | conda 安装根(取 `conda shell.bash hook`) | `/root/miniconda3` | 视情况 |
| `MODEL_BASE_URL` | VLM 推理服务(OpenAI 兼容 `/v1`) | `http://100.102.37.219:8008` | **是** |
| `MODEL_NAME` | 模型名 | `qwen3-vl-video-dr` | 视情况 |
| `TAVILY_API_KEY_FILE` | Tavily key 列表文件(每行一个) | `demo/secrets/tavily_api_keys.txt` | 视情况 |
| `HTTP_PROXY_URL` | 公网代理(yt-dlp/Tavily 出网);直连可设为空 `""` | `http://127.0.0.1:17890` | **是** |
| `YT_DLP` | yt-dlp 可执行路径 | 自动探测 | 视情况 |
| `VIDEO_DR_SOURCE_ROOT` | VideoDR 依赖目录 | 默认用打包的 `demo/video_dr_gen` | 一般不用改 |
| `VIDEO_DEEP_RESEARCH_DATA_ROOT` | 本地批量数据/评测数据根目录 | `demo/local_data` | 可选 |
| `VIDEO_DEEP_RESEARCH_SECRETS_DIR` | 本地 secret 文件目录 | `demo/secrets` | 可选 |
| `PLAYWRIGHT_BROWSERS_PATH` | Playwright 浏览器内核目录 | `demo/.playwright-browsers` | 可选 |
Tavily key 也可不用文件,直接 `export TAVILY_API_KEY=...` 或 `TAVILY_API_KEYS=k1,k2`。
示例(新机直连公网):
```bash
export CONDA_ENV=/home/tione/notebook/gaozhenkun/envs/sglang
export CONDA_BASE=/root/miniconda3
export MODEL_BASE_URL=http://<your-vlm-host>:8000
export TAVILY_API_KEY=tvly-xxxxxxxx
export HTTP_PROXY_URL="" # 直连,不走代理
./run_people_online_tavily.sh <youtube_url>
```
### 4. 可选服务(默认不写死旧机器路径)
`web_search` 在本 demo 中走 Tavily。`MARS_RETRIEVAL_ADDRESS` / `MARS_SUMMARIZER_ADDRESS`
默认空字符串,只有显式 `export` 后才会探测内网 MARS/summarizer。
`image_search` 默认读取 `GATEWAY_URL` / `GATEWAY_TOKEN` / `SERPER_API_KEY` /
`OSS_ACCESS_KEY_ID` 等环境变量;未配置时工具会返回配置缺失错误,但不会依赖旧机器明文路径。
---
## 五、运行前自检
```bash
# 模型服务可达?
curl "$MODEL_BASE_URL/v1/models"
# 源码闭包可导入?(应输出 IMPORT_OK)
cd demo/inference && python -c "import fetch_youtube_online, run_people_quality_inference; print('IMPORT_OK')"
```
|