| # 在线人物筛选 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')" |
| ``` |
| |