# 在线人物筛选 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 `: 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` 到日志文件。 ### 产物 - 抓取缓存:`/.mp4`、`.info.json`、`comments.json`、`metadata.json` (默认 `inference/online_runs/_/`,可用 `WORK_DIR` 复用避免重下)。 - 推理结果(默认 `demo/lead_filter_runs/online__/`): `results.jsonl`、`results.html`、`summary.json`、`decision_table.csv`、 `images/`、`frame_cache/`。 - 日志:`.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 ``` `--` 之后透传给推理脚本,例如调温度: ```bash ./run_people_online_tavily.sh --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://:8000 export TAVILY_API_KEY=tvly-xxxxxxxx export HTTP_PROXY_URL="" # 直连,不走代理 ./run_people_online_tavily.sh ``` ### 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')" ```