<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>批处理 on iwmei的博客</title><link>https://iwmei.top/tags/%E6%89%B9%E5%A4%84%E7%90%86/</link><description>Recent content in 批处理 on iwmei的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>iwmei</copyright><lastBuildDate>Wed, 06 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://iwmei.top/tags/%E6%89%B9%E5%A4%84%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>BilibiliContentFetcher 项目复盘：从单条演示到批处理闭环</title><link>https://iwmei.top/p/bilibilicontentfetcher-from-single-demo-to-batch-workflow/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://iwmei.top/p/bilibilicontentfetcher-from-single-demo-to-batch-workflow/</guid><description>&lt;img src="https://iwmei.top/p/bilibilicontentfetcher-from-single-demo-to-batch-workflow/cover.png" alt="Featured image of post BilibiliContentFetcher 项目复盘：从单条演示到批处理闭环" />&lt;p>这次复盘记录的是 &lt;code>BilibiliContentFetcher&lt;/code> 一次完整落地过程。&lt;/p>
&lt;p>我这次的目标不是做一条能看的演示链路，而是把批量生产链路做稳定，把输出质量做可控，把项目结构做可维护，把最终产物直接落到 Obsidian。&lt;/p>
&lt;p>我按真实时间线展开，尽量保留全过程细节。&lt;/p>
&lt;h2 id="1-起点目标">1. 起点目标
&lt;/h2>&lt;p>我在会话开始阶段先把目标重新收敛，避免中途跑偏。&lt;/p>
&lt;p>当时我给自己定了六个硬条件。&lt;/p>
&lt;ol>
&lt;li>主目标是批量稳定执行，不是单条效果展示。&lt;/li>
&lt;li>输出格式必须严格贴合根目录 &lt;code>Tempate.md&lt;/code>。&lt;/li>
&lt;li>必须使用 DeepSeek 思考模式，不接受本地替代。&lt;/li>
&lt;li>模块结构与链路逻辑要对齐 &lt;code>XHSContentFetcher&lt;/code>。&lt;/li>
&lt;li>最终笔记必须可直接出现在 Obsidian。&lt;/li>
&lt;li>最终代码要推送远程，并补全 CLI 命令文档。&lt;/li>
&lt;/ol>
&lt;p>这一组条件决定了后续所有取舍。&lt;/p>
&lt;h2 id="2-阶段-a">2. 阶段 A
&lt;/h2>&lt;p>这个阶段是质量回归和模板约束加固，时间段是 18 点 20 到 18 点 33。&lt;/p>
&lt;p>我先执行回归测试，确认基线可跑。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">pytest&lt;/span> &lt;span class="n">-q&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>结果是 &lt;code>5 passed&lt;/code>。&lt;/p>
&lt;p>这一步给了我一个清晰信号，当前代码有可用基础，但输出质量不够。&lt;/p>
&lt;p>我随后集中处理了四类问题。&lt;/p>
&lt;ol>
&lt;li>文本里有泛化表达，观点和结论过于笼统。&lt;/li>
&lt;li>有占位风格残留，章节质感不稳定。&lt;/li>
&lt;li>评论区覆盖不足，子评论利用率偏低。&lt;/li>
&lt;li>视频类笔记有明显模板痕迹。&lt;/li>
&lt;/ol>
&lt;h3 id="21-质量约束改造">2.1 质量约束改造
&lt;/h3>&lt;p>我在 &lt;code>src/bili_content_fetcher/ai_writer.py&lt;/code> 里加了完整质量栅栏。&lt;/p>
&lt;p>关键函数是：&lt;/p>
&lt;ul>
&lt;li>&lt;code>_validate_markdown_output&lt;/code>&lt;/li>
&lt;li>&lt;code>_repair_markdown_once&lt;/code>&lt;/li>
&lt;li>&lt;code>_ensure_quality&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>这三步形成了质量闭环。&lt;/p>
&lt;ol>
&lt;li>先检查结构完整性。&lt;/li>
&lt;li>再执行自动修订。&lt;/li>
&lt;li>最后做二轮兜底，不通过就回退。&lt;/li>
&lt;/ol>
&lt;p>我把检查项写得很细，包含章节顺序、占位词、概念数量、问题数量、评论数量、图片内联要求。&lt;/p>
&lt;h3 id="22-评论区典型性改造">2.2 评论区典型性改造
&lt;/h3>&lt;p>我同时补了评论评分和代表性筛选。&lt;/p>
&lt;p>对应新增逻辑：&lt;/p>
&lt;ul>
&lt;li>&lt;code>_comment_score&lt;/code>&lt;/li>
&lt;li>&lt;code>_select_representative_comments&lt;/code>&lt;/li>
&lt;li>&lt;code>_comment_insight&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>这组改动让评论区从堆数据变成可读观点层。&lt;/p>
&lt;p>我要求每条代表评论都要有我的提炼句，不再只贴原文。&lt;/p>
&lt;h3 id="23-阶段-a-实跑">2.3 阶段 A 实跑
&lt;/h3>&lt;p>我用单条链接做了一次实跑。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">bili-note&lt;/span> &lt;span class="n">run&lt;/span> &lt;span class="n">https&lt;/span>&lt;span class="err">:&lt;/span>&lt;span class="p">//&lt;/span>&lt;span class="n">www&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">bilibili&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">com&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="n">opus&lt;/span>&lt;span class="p">/&lt;/span>&lt;span class="mf">1195483269038080034&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>结果是新笔记目录生成成功，结构可用，基础质量明显提升。&lt;/p>
&lt;h2 id="3-阶段-b">3. 阶段 B
&lt;/h2>&lt;p>这个阶段是切到 DeepSeek 真链路，时间段是 18 点 33 到 18 点 36。&lt;/p>
&lt;p>问题不是代码逻辑，而是配置状态。&lt;/p>
&lt;h3 id="31-deepseek-key-缺失">3.1 DeepSeek Key 缺失
&lt;/h3>&lt;p>我检查后确认当前项目没有可用 Key。&lt;/p>
&lt;ol>
&lt;li>项目 &lt;code>.env&lt;/code> 缺失。&lt;/li>
&lt;li>环境变量 &lt;code>DEEPSEEK_API_KEY&lt;/code> 为空。&lt;/li>
&lt;/ol>
&lt;p>我的处理方式是从 &lt;code>XHSContentFetcher&lt;/code> 读取可用配置，再写入当前项目 &lt;code>.env&lt;/code>。&lt;/p>
&lt;h3 id="32-vault-路径空值误解析">3.2 Vault 路径空值误解析
&lt;/h3>&lt;p>我还遇到了一个配置细节问题。&lt;/p>
&lt;p>&lt;code>OBSIDIAN_VAULT_PATH=&lt;/code> 空值被解析为当前目录，&lt;code>bili-note check&lt;/code> 显示默认 Vault 指向点目录。&lt;/p>
&lt;p>我删除了空值行，恢复为未配置状态，避免误写路径。&lt;/p>
&lt;h3 id="33-deepseek-真链路验证">3.3 DeepSeek 真链路验证
&lt;/h3>&lt;p>我重新执行带 DeepSeek 配置的运行命令。&lt;/p>
&lt;p>结果是模型链路跑通，真实生成成功。&lt;/p>
&lt;p>这个节点很关键，说明我已经从本地降级模式切回目标模式。&lt;/p>
&lt;h2 id="4-阶段-c">4. 阶段 C
&lt;/h2>&lt;p>这个阶段是方向纠偏，时间段是 18 点 36 到 18 点 56。&lt;/p>
&lt;p>核心变化只有一句话，批量优先替代单条打磨。&lt;/p>
&lt;p>我在这个阶段做了三件大事。&lt;/p>
&lt;ol>
&lt;li>新增批处理子命令。&lt;/li>
&lt;li>处理 Windows 编码崩溃。&lt;/li>
&lt;li>落地批处理汇总产物。&lt;/li>
&lt;/ol>
&lt;h3 id="41-批处理子命令落地">4.1 批处理子命令落地
&lt;/h3>&lt;p>我在 &lt;code>src/bili_content_fetcher/cli.py&lt;/code> 加了 &lt;code>batch&lt;/code> 子命令体系。&lt;/p>
&lt;p>支持参数包含：&lt;/p>
&lt;ul>
&lt;li>&lt;code>--max-items&lt;/code>&lt;/li>
&lt;li>&lt;code>--fail-fast&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>并新增批处理汇总文件机制，输出 &lt;code>batch_summary_*.json&lt;/code>。&lt;/p>
&lt;p>我同时同步改了 &lt;code>README.md&lt;/code>，保证命令文档可直接执行。&lt;/p>
&lt;h3 id="42-windows-编码崩溃修复">4.2 Windows 编码崩溃修复
&lt;/h3>&lt;p>这一步是阶段 C 的关键故障。&lt;/p>
&lt;p>我当时遇到错误：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">UnicodeEncodeError: &amp;#39;gbk&amp;#39; codec can&amp;#39;t encode character &amp;#39;\ufeff&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>触发点是批量输入文件首行 BOM 加上控制台输出编码冲突。&lt;/p>
&lt;p>我按三步修复。&lt;/p>
&lt;ol>
&lt;li>&lt;code>_load_batch_inputs&lt;/code> 改成 &lt;code>utf-8-sig&lt;/code> 读取。&lt;/li>
&lt;li>输入行统一剥离 &lt;code>\ufeff&lt;/code> 前缀。&lt;/li>
&lt;li>控制台输出前做安全预览过滤，剔除不可编码字符。&lt;/li>
&lt;/ol>
&lt;p>修完后我马上复跑批量命令。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">bili-note&lt;/span> &lt;span class="n">batch&lt;/span> &lt;span class="n">batch_links&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">txt&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-max-items&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>结果是 &lt;code>2/2&lt;/code> 成功。&lt;/p>
&lt;p>并产出汇总文件：&lt;/p>
&lt;p>&lt;code>output/batch_summary_20260506_185559.json&lt;/code>&lt;/p>
&lt;h2 id="5-阶段-d">5. 阶段 D
&lt;/h2>&lt;p>这个阶段是视频笔记质量二次修复，时间段是 18 点 56 到 19 点 02。&lt;/p>
&lt;h3 id="51-英文噪声词进入概念区">5.1 英文噪声词进入概念区
&lt;/h3>&lt;p>我发现视频类笔记的概念区混入了 &lt;code>and&lt;/code> &lt;code>the&lt;/code> &lt;code>add&lt;/code> &lt;code>no&lt;/code> 这类词。&lt;/p>
&lt;p>这是明显质量缺陷。&lt;/p>
&lt;p>我做了三项补丁。&lt;/p>
&lt;ol>
&lt;li>增加英文停用词 &lt;code>EN_STOPWORDS&lt;/code>。&lt;/li>
&lt;li>增加英文术语白名单 &lt;code>EN_TERM_ALLOWLIST&lt;/code>。&lt;/li>
&lt;li>非股票场景的问题标题改成稳定框架，避免弱标题漂移。&lt;/li>
&lt;/ol>
&lt;h3 id="52-模型结果被回退过度覆盖">5.2 模型结果被回退过度覆盖
&lt;/h3>&lt;p>我还发现质量修订链有副作用。&lt;/p>
&lt;p>多轮修订后，较好的模型版本有时会被过度回退。&lt;/p>
&lt;p>我在 &lt;code>_ensure_quality&lt;/code> 里加了保留策略。&lt;/p>
&lt;p>当结构可用且占位残留已清空时，优先保留最后模型版本。&lt;/p>
&lt;p>这一步直接改善了成文自然度。&lt;/p>
&lt;h3 id="53-阶段-d-复跑">5.3 阶段 D 复跑
&lt;/h3>&lt;p>我用视频批处理单条做复验。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">bili-note&lt;/span> &lt;span class="n">batch&lt;/span> &lt;span class="n">batch_video_only&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">txt&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-max-items&lt;/span> &lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>结果是视频学习报告稳定生成，英文噪声问题消失。&lt;/p>
&lt;h2 id="6-阶段-e">6. 阶段 E
&lt;/h2>&lt;p>这个阶段是大改造，时间段是 19 点 02 到 19 点 28。&lt;/p>
&lt;p>目标很明确，把 Bili 项目和 XHS 项目做同构对齐。&lt;/p>
&lt;h3 id="61-同构基线">6.1 同构基线
&lt;/h3>&lt;p>我先对齐目标模块清单：&lt;/p>
&lt;ul>
&lt;li>cli&lt;/li>
&lt;li>config&lt;/li>
&lt;li>workflow&lt;/li>
&lt;li>fetcher&lt;/li>
&lt;li>media&lt;/li>
&lt;li>video_tools&lt;/li>
&lt;li>deepseek&lt;/li>
&lt;li>markdown_writer&lt;/li>
&lt;li>obsidian&lt;/li>
&lt;li>url_parser&lt;/li>
&lt;li>ocr_engine&lt;/li>
&lt;/ul>
&lt;h3 id="62-新增模块">6.2 新增模块
&lt;/h3>&lt;p>我新增了以下文件。&lt;/p>
&lt;ol>
&lt;li>&lt;code>src/bili_content_fetcher/url_parser.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/fetcher.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/media.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/video_tools.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/ocr_engine.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/deepseek.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/markdown_writer.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/obsidian.py&lt;/code>&lt;/li>
&lt;li>&lt;code>src/bili_content_fetcher/workflow.py&lt;/code>&lt;/li>
&lt;/ol>
&lt;h3 id="63-重构模块">6.3 重构模块
&lt;/h3>&lt;p>我重点重构了两个文件。&lt;/p>
&lt;ol>
&lt;li>&lt;code>config.py&lt;/code>
&lt;ul>
&lt;li>增加本地配置文件 &lt;code>~/.bili-content-fetcher/config.json&lt;/code>&lt;/li>
&lt;li>保留 &lt;code>.env&lt;/code> 兼容链路，兼容历史配置&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>cli.py&lt;/code>
&lt;ul>
&lt;li>从 Typer 切到 &lt;code>argparse&lt;/code>&lt;/li>
&lt;li>统一成与 XHS 对齐的 &lt;code>run&lt;/code> &lt;code>config&lt;/code> &lt;code>batch&lt;/code> 命令体系&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="64-文档和入口">6.4 文档和入口
&lt;/h3>&lt;p>我同步重写：&lt;/p>
&lt;ol>
&lt;li>&lt;code>README.md&lt;/code>&lt;/li>
&lt;li>&lt;code>pyproject.toml&lt;/code> 脚本入口，改为 &lt;code>bili_content_fetcher.cli:main&lt;/code>&lt;/li>
&lt;/ol>
&lt;h3 id="65-阶段-e-验收">6.5 阶段 E 验收
&lt;/h3>&lt;p>我执行整套验收。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">pytest&lt;/span> &lt;span class="n">-q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">bili_content_fetcher&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cli &lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="n">-help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">bili_content_fetcher&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cli &lt;/span>&lt;span class="n">run&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">bili_content_fetcher&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cli &lt;/span>&lt;span class="n">batch&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-help&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>结果：&lt;/p>
&lt;ol>
&lt;li>&lt;code>pytest -q&lt;/code> 变为 &lt;code>8 passed&lt;/code>&lt;/li>
&lt;li>CLI 帮助命令全部可用&lt;/li>
&lt;/ol>
&lt;p>随后我提交并推送。&lt;/p>
&lt;ul>
&lt;li>commit &lt;code>03ac851&lt;/code>&lt;/li>
&lt;li>message &lt;code>feat: align bili workflow with xhs architecture and add full batch CLI&lt;/code>&lt;/li>
&lt;li>push &lt;code>origin/main&lt;/code> 成功&lt;/li>
&lt;/ul>
&lt;h2 id="7-阶段-f">7. 阶段 F
&lt;/h2>&lt;p>这个阶段是最终验收，时间点约 20 点 02。&lt;/p>
&lt;p>目标只有一个，Obsidian 可见。&lt;/p>
&lt;p>我执行命令：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">bili_content_fetcher&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cli &lt;/span>&lt;span class="n">run&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;opus链接&amp;gt;&amp;#34;&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-vault-dir&lt;/span> &lt;span class="s2">&amp;#34;C:\Users\yourp\Documents\Obsidian Vault&amp;#34;&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-notes-folder&lt;/span> &lt;span class="s2">&amp;#34;BiliNotes&amp;#34;&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-open-obsidian&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>验收结果：&lt;/p>
&lt;ol>
&lt;li>DeepSeek 生成成功&lt;/li>
&lt;li>图片 7&lt;/li>
&lt;li>评论 18&lt;/li>
&lt;li>OCR 7&lt;/li>
&lt;li>笔记写入 Vault 成功&lt;/li>
&lt;li>Obsidian 可直接查看&lt;/li>
&lt;/ol>
&lt;p>本次验收产物路径：&lt;/p>
&lt;p>&lt;code>C:\Users\yourp\Documents\Obsidian Vault\BiliNotes\ru-he-zai-5000jia-gu-piao-zhong-shai-xuan-chu-long-tou-gu-bi-li-bi-li\ru-he-zai-5000jia-gu-piao-zhong-shai-xuan-chu-long-tou-gu-bi-li-bi-li.md&lt;/code>&lt;/p>
&lt;h2 id="8-问题清单汇总">8. 问题清单汇总
&lt;/h2>&lt;p>我把全过程问题收敛成七类。&lt;/p>
&lt;ol>
&lt;li>笔记里有占位和模板痕迹。&lt;/li>
&lt;li>评论区代表性不足，回复利用不足。&lt;/li>
&lt;li>项目缺 DeepSeek 配置。&lt;/li>
&lt;li>批处理不是主链路。&lt;/li>
&lt;li>Windows BOM 和编码导致批处理崩溃。&lt;/li>
&lt;li>视频笔记出现英文噪声概念。&lt;/li>
&lt;li>项目结构和 XHS 不一致。&lt;/li>
&lt;/ol>
&lt;p>对应修复策略分别是：&lt;/p>
&lt;ol>
&lt;li>质量校验加自动重写加密度约束。&lt;/li>
&lt;li>评论评分筛选加逐条提炼。&lt;/li>
&lt;li>&lt;code>.env&lt;/code> 补齐加 CLI 缺 Key 明确报错。&lt;/li>
&lt;li>&lt;code>batch&lt;/code> 子命令加失败续跑和汇总。&lt;/li>
&lt;li>&lt;code>utf-8-sig&lt;/code> 加 BOM 剥离加安全输出。&lt;/li>
&lt;li>停用词加白名单加标题稳态框架。&lt;/li>
&lt;li>同构重构模块加统一 CLI 和配置体系。&lt;/li>
&lt;/ol>
&lt;h2 id="9-关键命令流水">9. 关键命令流水
&lt;/h2>&lt;h3 id="91-质量回归">9.1 质量回归
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">pytest&lt;/span> &lt;span class="n">-q&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="92-单条链路">9.2 单条链路
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">bili-note&lt;/span> &lt;span class="n">run&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;链接&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">bili_content_fetcher&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cli &lt;/span>&lt;span class="n">run&lt;/span> &lt;span class="s2">&amp;#34;&amp;lt;链接&amp;gt;&amp;#34;&lt;/span> &lt;span class="p">...&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="93-批量链路">9.3 批量链路
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">bili-note&lt;/span> &lt;span class="n">batch&lt;/span> &lt;span class="n">links&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">txt&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-max-items&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">bili_content_fetcher&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cli &lt;/span>&lt;span class="n">batch&lt;/span> &lt;span class="n">links&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">txt&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-max-items&lt;/span> &lt;span class="mf">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="94-配置检查">9.4 配置检查
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">bili-note&lt;/span> &lt;span class="n">check&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">python&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="n">bili_content_fetcher&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nb">cli &lt;/span>&lt;span class="n">config&lt;/span> &lt;span class="n">show&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="95-版本管理">9.5 版本管理
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">git&lt;/span> &lt;span class="n">commit&lt;/span> &lt;span class="n">-m&lt;/span> &lt;span class="s2">&amp;#34;...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">git&lt;/span> &lt;span class="n">push&lt;/span> &lt;span class="n">origin&lt;/span> &lt;span class="n">main&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="10-最终状态">10. 最终状态
&lt;/h2>&lt;p>我在导出时间点确认的状态如下。&lt;/p>
&lt;ol>
&lt;li>代码已提交并推送到远程主分支。&lt;/li>
&lt;li>CLI 的 &lt;code>run&lt;/code> &lt;code>batch&lt;/code> &lt;code>config&lt;/code> 全量可用。&lt;/li>
&lt;li>DeepSeek 真链路实跑通过。&lt;/li>
&lt;li>Obsidian 实跑可见笔记。&lt;/li>
&lt;li>测试状态 &lt;code>8 passed&lt;/code>。&lt;/li>
&lt;/ol>
&lt;h2 id="11-我这次最关键的决策">11. 我这次最关键的决策
&lt;/h2>&lt;p>第一，先把批处理链路立成主线，单条只做回归样本。&lt;/p>
&lt;p>第二，把输出质量做成程序约束，不靠模型临场发挥。&lt;/p>
&lt;p>第三，把项目结构和 XHS 同构，换来后续维护和迁移的确定性。&lt;/p>
&lt;h2 id="12-下一步计划">12. 下一步计划
&lt;/h2>&lt;p>下一步我会继续补三组能力。&lt;/p>
&lt;ol>
&lt;li>断点续跑，降低长任务重跑成本。&lt;/li>
&lt;li>OCR 和 LLM 缓存，降低重复计算成本。&lt;/li>
&lt;li>结构化日志，细化阶段耗时和错误分类。&lt;/li>
&lt;/ol>
&lt;p>这次项目的核心结果不是某一条笔记写得好看。&lt;/p>
&lt;p>真正的结果是我把一条从抓取到笔记落地的链路做成了可批量执行、可定位故障、可重复验收的工程系统。&lt;/p></description></item></channel></rss>