第二部分 · 对「选题」这一步的优化
我的工作流里,选题这一步被它优化了:别人的视频批量变成本地语料,新选题先查库——竞品讲过的直接检索对齐、避免自撞车;单条视频给个 BV 号就能总结成结构化笔记。后面照旧讲技术管线,但记住它服务的是选题与竞品调研。
红色为第 05 章「BM25 检索」,全系统的能力底座;前三站为它供料,后三节是它长出来的玩法。
bgent 是 Bilibili 批量「下载 → 转写 → 润色」工作流,把合集、系列、UP 主视频批量转成可读口播稿,再落成可检索语料。已在两批生产数据上验证:睡前消息 852 条(约 280 小时音频)与峰哥亡命天涯直播回放。
四段管线:列表抓取 → 下载+转写驱动 → 润色子代理 → RAG 语料问答。值得注意的设计:润色稿即语料——转写流水线的最终产物,直接就是检索系统的输入,中间没有任何格式转换成本。
素材源文件/agentdraw/board.agentdraw.json)点击放大┌────────────┐ ┌──────────────────────────────┐ ┌─────────────────┐
│ fetch_list │ → │ run_driver(下载+转写流水线) │ → │ 润色子代理 │
│ 列表抓取 │ │ 官方API下载∥faster-whisper │ │ ASR稿润色技能 │
└────────────┘ └──────────────────────────────┘ └─────────────────┘
│ │
▼ ▼
┌───────────────────────────┐ ┌──────────────────────┐
│ rag 语料库 │ ←───── │ 润色稿即语料 │
│ 分块 → jieba → BM25Plus │ └──────────────────────┘
└───────────────────────────┘
│ query 返回 top-k 片段(带来源文件)
▼
合订本问答 / 赛博克隆扮演 / 选题 · 竞品调研
踩坑起点:住宅 IP 下 yt-dlp 的 Bilibili extractor 请求指纹被风控,下载 formats 一律 HTTP 412,Chrome UA、Referer、指纹 cookie 全无效。解法:绕开 yt-dlp,直接调官方 API——view → wbi 签名 playurl → DASH 音频流。只下音频不下视频,流量和速度都划算。
签名细节:playurl 的 WBI 签名参数名是 wbi_sign;但 arc/search 必须用 w_rid——同名不同接口,用错直接 -403。合集列表端点被网关路径级拦截(返回 404 反爬页,与参数无关),改用 arc/search 全量投稿 + 标题过滤。
多 P 与风控:直播回放常分 P 上传,逐 P 下载后 ffmpeg concat 拼接——concat 列表必须写绝对路径,否则「找不到文件」;流拷贝失败自动回退重编码。登录 cookie 每小时重读,两次下载间隔 --pace 节流,温和防风控。
素材源文件/agentdraw/board-fetch.agentdraw.json)点击放大合集页 / 系列页 / UP 空间
→ arc/search(w_rid 签名)或 seasons_series_list 预览(前 ~6 条)
→ view 接口取视频信息(标题 / 分 P / 时长)
→ playurl(wbi_sign 签名)拿 DASH 音频流
→ 逐 P 下载 m4a → ffmpeg concat(绝对路径)
→ .b2t/downloads/{bvid}.m4a
模型与速度:faster-whisper small(float16, beam=2),比 openai-whisper 快约 2 倍。权重从 ModelScope 拉本地副本——HF 直连被墙,hf-mirror 对新 xethub CAS 存储返回 401,ModelScope snapshot_download 是实测可用的路径。
性能调优反直觉:GPU 上保持 1 个 worker。3 个 whisper worker 在单进程里争 torch 线程池 + 显存,GPU 利用率只有 ~36%;实测 1 worker × 8 线程最快,多 worker 吞吐反而下降。
工程细节:驱动断点续跑——重复执行同一命令即可继续(driver_state.json)。收尾必须在队列排空后再发 stop 哨兵、worker 只在哨兵处退出;若在循环条件里检查 stop,最后一条 2—4 小时的长视频转一半就被杀。
素材源文件/agentdraw/board-transcribe.agentdraw.json)点击放大faster-whisper small(float16, beam=2),1 worker × 8 线程
→ .b2t/transcripts/original/{标题}-{时间戳}.txt 转写原文稿
→ 同名 .srt 带时间戳字幕
→ .b2t/metadata/{标题}.json 元数据
→ runs/<run名>/driver_state.json 断点(可续跑)
润色:ASR 原文稿没标点、同音错字多,交给润色子代理(prompt 模板 + ASR 润色技能):分段、补中文标点、修明显同音错字;直播口语保留口语风格,不确定的专有名词和数字保留原文、不联网考证——转写稿能读,才有资格当语料。
分块:chunk_text(size=1000, overlap=100),块界优先落在段落边界(\n\n),其次句子边界(。!?;)——保证召回的是完整语义单元,overlap 让跨块内容不丢。
分词与指纹:jieba 分词 + 可加载用户词典(人名、栏目黑话),分词质量直接决定 BM25 命中率。文件指纹(名称|大小|mtime 的 sha1)判定索引过期,query 时自动重建——语料目录加个新文件就能搜,不需要手动 rebuild。
# 分块:1000 字/块,块间重叠 100,优先段落边界、其次句子边界
for offset, seg in chunk_text(text, size=1000, overlap=100):
...
# 分词:jieba Tokenizer(每库独立实例,可加载用户词典)
tok = jieba.Tokenizer()
if user_dict:
tok.load_userdict(user_dict) # 如 dicts/睡前消息.txt
tokens = [w for w in tok.lcut(seg) if w.strip()]
# 指纹:文件列表的 sha1,变了就自动重建索引
fp = sha1(f"{name}|{size}|{mtime_ns}\n" for f in files)
原理:rank_bm25 库的 BM25Plus。每个语料块分词进 corpus,查询词分词后 get_scores,取 score>0 的 top-k。经典 TF-IDF 词面匹配;中文场景下,分词质量比检索模型选择更影响效果。
为什么不用 embedding:语料是目标博主的全部文字稿,查询是 2—4 个核心名词——词面命中就够用,语义检索没有边际收益,还省掉向量模型与 GPU。索引 pickle 持久化,查询毫秒级。
用法:rag list 看库,rag query <库名> "关键词1 关键词2" -k 5 检索;结果不佳就换同义/近义词(房地产 → 房价 楼市 法拍房)多组各检索一次再合并。
from rank_bm25 import BM25Plus
bm25 = BM25Plus(corpus) # corpus: 每个语料块的分词列表
scores = bm25.get_scores(tokenize(query))
ranked = sorted((i for i, s in enumerate(scores) if s > 0),
key=lambda i: scores[i], reverse=True)[:k]
# 返回 top-k 块:{doc: 来源文件名, score, offset, text}
单条视频 · 内容总结:给一个 BV 号(或合集链接),bgent 自动走完「解析视频信息 → 检查本地语料库是否已覆盖 → 未覆盖则下载转写 → 通读全文做结构化总结」,输出核心主题、研究脉络、分节要点和结论——选题前花一分钟知道「这条视频到底讲了什么」。示例:BV1viun6rExU《【酷温】跌了22年的日本房价 凭什么回来了?!》,点开看完整总结。
全量竞品 · 观点检索:把目标博主的语料全部抓取索引后,选题雷达就位——新选题先查库:博主是否讲过、讲过几遍、当时的观点是什么,避免自撞车;重复出现的观点簇 = 高置信度的「该博主核心立场」,竞品同质化的选题一眼看穿。
边界:检索能帮「找」、帮「对齐」,不能替「想」;车轱辘话 = 同一观点高频复现,召回时天然高分,反而好找;搬运与版权边界自己把握,工具只负责让内容可检索。
bgent 单视频总结输出 · 下载转写后通读全文的结构化摘要,下方还有用「彩蛋」提示词生成的真实产物页(9 章拆解 + SVG 图解 + 真实截帧)
视频:《【酷温】跌了22年的日本房价 凭什么回来了?!》
核心主题:用日本房价 22 年下跌史作为「先行参照系」,回答当下中国楼市「是否见底」的问题。
1 · 引子:楼市唱多信号:近期市场出现成交量降幅收窄、日光盘重现、部分城市连续同比上涨、开发商抢地等现象,博主被问「楼市调整是否结束了」,决定用日本经验做参照。
2 · 研究方法:用 AI 研究助手(深度调研模式)做三步研究——梳理日本房价史与国民经济状况、与当下中国对标、构建楼市情绪监控「温度计」。
3 · 日本房价的完整轨迹:
4 · 中国对标结论:
5 · 楼市温度计(个人决策工具):8 个维度打分(基本面:销售、拍地、房价,取 15 年数据;宏观:房企估值、基金持仓、ETF、研报、政策);历史分位法打分(1–5 分)换算温度,并做通胀调整。当前结果:11 度(初春微凉)——全国仍在冬天,一线城市和政策面已吹起春风,买方议价权仍占优但窗口期在收窄。
6 · 最终结论(三件事):
给个体的建议:与其等「大底」确认,不如关注议价权变化——当前温度 11 度,买房窗口还在,可自行用类似工具持续跟踪。
完整总结页(真实产物 · 9 章拆解 + SVG 图解 + 截帧,可滚动查看):
不带 bgent、不带语料库也能用:复制后粘贴给任意 agent,喂一个视频链接或本地视频文件,即可得到一份「抓取 → 转写 → 拆章 → SVG 图解 → 真实截帧 → 离线单页」的完整视频总结。
流程:用 yt-dlp 结合 cookies 抓完整元数据,B 站尽量保留标题、UP、分 P、简介、标签、封面、时长等信息;下载最佳音频转 mp3,用 ffprobe 校验时长,和元数据差异超过 5% 就重下或标记异常。用 Whisper 转写,中文用 turbo zh,英文用 small.en 并翻成中文;校验最后一个 segment 的结束时间和音频时长是否接近。 内容上,按视频自然结构拆章。每章要提炼问题、陷阱、步骤、结论,写成白话短句;带可回跳视频的时间戳、要点、关键引用、视觉锚点。不要机械套固定模板,按内容组织页面。 SVG 必须随章节内容动态生成:流程就画步骤/路径,概念就画关系/分层,时间变化就画时间线,对比就画矩阵,风险误区就画检查表/决策树,数据就画简图,因果就画链路。每张图都要来自本章真实内容,包含关键词、关系、箭头或标签,不能做装饰图或重复套壳。 界面或操作演示类视频(画布、控制台、剪辑器、文档),每章在 SVG 之外再配一张视频里抽的真实帧:从该章时间段挑信息量最大、界面最清晰的一帧,用 ffmpeg 精确抽帧(-ss 定位、-q:v 1 最高质量),文件名带阶段名和秒数;长视频先分片并行抽帧拿候选再定时间戳导出。页面里每章按「正文 → SVG 图解 → 真实截图」排,图解讲关系、截图给实证;图片走相对路径和 HTML 放一起,离线也能看,SVG 说明标「图解」、截图说明标「视频时间戳」一眼分开。 最后生成可离线打开的单页 HTML,内联 CSS 和 SVG、真实截图走相对路径引用;用 Chrome headless 截整页 PNG,读取图片检查渲染、重叠和空白,确认每段 SVG 和截图都正常显示,再用 ffmpeg crop 切图,切片保留约 100px 重叠,避免切断标题。
把睡前消息合集全部抓取、转写、润色,落成合订本语料库——【睡前消息1000】身后是一千,小目标是一万.txt 式命名,期号即来源锚点。语料库可随时注册新库(rag add),新 run 的润色稿合并进既有库即可被检索。
问答协议是简报式:结论先行 1—2 句 → 按观点/主题分点 → 每点标注来源期号;只引用检索到的内容,不得编造,覆盖不足就明说、建议换关键词。合订本的意义:从「记得哪期讲过但找不到」变成「检索一句话」。
结论:马督工对中国房地产政策的立场是一贯的——现行以「卖地财政」为核心的体系不可持续,放松限购、托底救市都是治标不治本的后视镜操作;唯一的根本解药是全面开征房产税,用「按房收税、按人补助」替代土地财政。他对房价本身不抱幻想,认为人口才是决定房价的终极指标。
核心观点分述:
五步流程:检索(人物名 + 话题词,必要时多组同义词各检索一次)→ 区分「本人的话」与「他人的话」(弹幕、观众提问、嘉宾、引用的新闻都不得算作本人观点)→ 提炼立场倾向 + 语气特征(口头禅、句式、说话节奏、常用比喻、金句风格)→ 用本人口气直接作答——口语化、松散、有反问、有自我调侃,不编号分点、不总结陈词、不中途标来源 → 作答后与原始语料并排比对自检,不像就重写。
红线:立场必须来自语料,语气可自然延展——严禁让克隆说出语料支撑不了的观点;借用语料里的原句、金句、比喻往往最像本人。
示例:「峰哥,你怎么看25岁结婚」→ 召回峰哥直播片段(「离婚,不用争论了,直接离婚吧」「年轻人,你一定要有主见」)→ 用他的反问连击、口语金句、损人式关心作答。酷温(财经类)等 run 也已跑过,同一套流程可以对任意目标博主做克隆。
扮演模式输出 · 检索峰哥语料后以本人口气直接作答:不编号分点、不总结陈词、不中途标来源|悬停段落可试听 TTS 语音
考了三年▶ 播放?那我先问你,你考研是为了啥?为了找个好工作呗?我跟你说实话,现在考研更不好找工作,研究生出来该失业还是失业。你随便看看,本科的白领,四五千的工作都不好找,全被 AI 替代了,你研究生能强到哪儿去?强不了多少,能不能找个工作都两说。
你说你三年没考上▶ 播放,我反倒觉得这是老天爷在帮你——你在这棵树上吊了三年,它愣是没让你吊死,说明啥?说明这路跟你没缘分,它在撵你去干点别的。
你听我的▶ 播放,别考了,去找班上,去学门手艺。现在啥最值钱?技能。焊个接、修个电路板、开个叉车,出来八千九千的工作,比你念完研究生坐办公室强多了。现在蓝领比白领好混,这是大势所趋,国外都这样,国内也躲不过。你与其再考一年赌一个「万一」,不如先挣着钱,边干边想。
再说了,你想想▶ 播放你为啥想考上——是你自己想上,还是你爹妈想让你上?你爹妈砸锅卖铁供你三年,那是他们的谈资,是他们下半辈子跟人吹的资本,不是你的日子。你今年25了,你还打算考到30?你考上了又咋样?研究生出来也是打工,打工哪有容易的?上班本来就是打工,大家都一样,谁也别笑话谁。
实在不行,你还年轻▶ 播放,做做自媒体,学点东西,搞点副业。我十年前就预言了,以后人人都是自媒体,你看现在是不是?路多了去了,别拿考研当人生唯一的门。
三年了,该换条路了▶ 播放。去挣点钱,把钱挣到手里,你腰杆子就硬了——到那时候你再看,考不考研,屁大点事儿。
滚轮缩放 · 按住拖动平移 · 单击切换 100% · 点击空白或按 Esc 关闭