<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>20Bytes Log</title><description>20Bytes Log - 记录技术与生活</description><link>https://20bytes.github.io</link><item><title>低空具身智能：从空中 VLN 到空中 VLA</title><link>https://20bytes.github.io/blog/%E4%BD%8E%E7%A9%BA%E5%85%B7%E8%BA%AB</link><guid isPermaLink="true">https://20bytes.github.io/blog/%E4%BD%8E%E7%A9%BA%E5%85%B7%E8%BA%AB</guid><description>梳理空中具身智能中 Aerial VLN 与 Aerial VLA 的定义边界、代表性论文、Action 争议与入局路线。</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;区分空中 VLN 与 VLA&lt;/h2&gt;
&lt;p&gt;2025-2026 年出现的一批空中具身工作会让 VLN / VLA 的边界显得很模糊：它们都在解决“无人机如何听懂语言并飞到目标位置”的问题，但有的论文叫 VLN，有的论文叫 VLA。这个模糊感是合理的，因为大模型正在把“找路（Navigation / Planning）”和“控制（Action / Control）”揉进同一个网络里。&lt;/p&gt;
&lt;p&gt;核心判断不要看论文任务名，而要看两个东西：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;神经网络最后一层的输出空间（Output Space）。&lt;/li&gt;
&lt;li&gt;系统架构中是否仍然依赖传统规划器或控制器兜底。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;判别标准&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;空中 VLN（Aerial Vision-Language Navigation）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;网络输出：离散的高级指令（如前、后、左、右、上、下、停止）或三维空间航点（Waypoints，&lt;code&gt;x/y/z&lt;/code&gt; 坐标）。&lt;/p&gt;
&lt;p&gt;架构特征：AI 当“向导”，传统模块当“飞行员”。大模型主要负责理解语言、看图、选目标点或生成航点，然后交给传统局部规划器或控制器去执行，例如 &lt;code&gt;A*&lt;/code&gt;、&lt;code&gt;Receding-Horizon Planner&lt;/code&gt;、路径平滑、MPC 或避障模块。&lt;/p&gt;
&lt;p&gt;关键点：导航和路径选择是显式的，底层飞行控制没有被神经网络完全接管。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;空中 VLA（Aerial Vision-Language-Action）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;网络输出：底层的、连续的物理控制信号。在没有机械臂的纯飞行任务中，通常就是连续速度控制指令，例如三轴线速度 &lt;code&gt;v_x/v_y/v_z&lt;/code&gt; 加偏航角速度 &lt;code&gt;yaw rate&lt;/code&gt;；如果带机械臂，还可能包括夹爪、关节角或末端执行器动作。&lt;/p&gt;
&lt;p&gt;架构特征：AI 同时当“向导”和“飞行员”。系统强调端到端（End-to-End），网络高频输出下一步物理动作，避障、减速、侧移、绕行等行为都由策略网络隐式完成，而不是显式交给外部传统规划器。&lt;/p&gt;
&lt;p&gt;关键点：动作直接改变具身智能体的物理状态，网络不只是告诉无人机“去哪”，而是直接决定“此刻怎么飞 / 怎么动”。&lt;/p&gt;
&lt;h2&gt;概念对比&lt;/h2&gt;
&lt;p&gt;| 维度 | 空中 VLN | 空中 VLA |
| :--- | :--- | :--- |
| 通俗比喻 | 活地图 / 飞行向导 | 自动驾驶飞行员 / 空中具身智能体 |
| 核心任务 | 听懂指令，规划三维路线，到达目的地 | 听懂指令，直接控制底层飞行动作，甚至进行物理交互 |
| 输出层 | 离散方向、目标点、航点序列、候选目标 | 连续速度、角速度、姿态、推力、机械臂关节或夹爪动作 |
| 系统架构 | 模块化，常带传统 Planner / Controller | 端到端，网络直接输出 Action |
| 研究重点 | 语言理解、视觉定位、航点选择、长程规划 | 视觉-语言-动作对齐、动态控制、避障、Sim-to-Real |
| 判断关键词 | &lt;code&gt;waypoint&lt;/code&gt;、&lt;code&gt;candidate goal&lt;/code&gt;、&lt;code&gt;planner&lt;/code&gt;、&lt;code&gt;navigation&lt;/code&gt; | &lt;code&gt;velocity command&lt;/code&gt;、&lt;code&gt;action space&lt;/code&gt;、&lt;code&gt;end-to-end&lt;/code&gt;、&lt;code&gt;visuomotor policy&lt;/code&gt; |&lt;/p&gt;
&lt;h2&gt;VLA 是否涵盖 VLN？&lt;/h2&gt;
&lt;p&gt;可以从两个层面回答：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;严格算法定义上：VLN 不是 VLA 的简单子集。&lt;/strong&gt; VLN 是宏观规划层面的任务，强调“根据语言和视觉找到路”；VLA 是动作控制层面的范式，强调“根据语言和视觉直接输出动作”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;任务能力和系统能力上：VLA 可以涵盖 VLN。&lt;/strong&gt; 如果一个 VLA 模型接收“飞到红色屋顶上方”的语言指令，并通过连续速度控制最终到达目标位置，那么它已经完成了 VLN 的导航任务。区别是传统 VLN 把“找路”显式输出为航点或决策序列，而 VLA 把“找路”内化到神经网络隐藏状态中，直接吐出最终物理动作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更直观地说：VLN 像导航地图，告诉你路线；VLA 像自动驾驶系统，不仅知道路线，还直接控制方向、速度和避障。因此，在能力上可以认为 VLA 向下兼容 VLN，但在论文分类时仍要看输出空间和系统架构。&lt;/p&gt;
&lt;h2&gt;Action 的边界争议&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;广义 VLA：Locomotion Action&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在无人机领域，端到端输出速度本身就可以被视为 Action。原因是无人机需要在三维空间中对抗重力、气流和动态障碍，保持稳定飞行并完成长程导航。这个控制难度不亚于很多地面机器人的运动控制。因此，&lt;code&gt;Velocity Commands&lt;/code&gt;、姿态控制或高频运动控制可以构成空中 VLA 的动作空间。&lt;/p&gt;
&lt;p&gt;这类工作通常也可以叫 &lt;strong&gt;Locomotion VLA&lt;/strong&gt;，也就是移动控制型 VLA。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;狭义 VLA：Manipulation Action&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更严格的具身智能定义会要求智能体不仅移动，还要改变物理世界状态，例如抓取、搬运、投放、组装或操作工具。对应到无人机场景，完全体空中 VLA 往往是“无人机 + 机械臂 / 夹爪”的 Aerial Manipulation，需要同时控制飞行平台和末端执行器。&lt;/p&gt;
&lt;p&gt;这类工作更接近 &lt;strong&gt;Locomotion + Manipulation&lt;/strong&gt; 的完整 VLA。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Title Inflation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当前学术界存在一定的“标题通胀”：VLA 是热门关键词，很多过去可能被称为 &lt;code&gt;visuomotor policy&lt;/code&gt; 或端到端控制策略的工作，现在会被包装成 VLA。判断时不要只看标题，要回到输出空间：如果只是输出航点并依赖 Planner，仍然更接近 VLN；如果直接输出速度、姿态或机械动作，才更接近 VLA。&lt;/p&gt;
&lt;h2&gt;代表性论文分类&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;阵营一：模块化 Aerial VLN&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OnFly: Onboard Zero-Shot Aerial Vision-Language Navigation toward Safety and Efficiency&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;归类：标准的零样本空中 VLN。&lt;/li&gt;
&lt;li&gt;原因：核心思路是让 VLM 输出目标候选点（Candidate Goals），再通过语义几何验证器和传统局部规划器（如 Receding-Horizon Planner）保证安全与效率。&lt;/li&gt;
&lt;li&gt;判断：AI 主要负责看图找航点，最后怎么飞过去、怎么避障，仍由规划器兜底，因此是典型 VLN 范式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenFly: Aerial Vision-Language Navigation via Supervised-to-Reinforced Adaptation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;归类：基于学习的空中 VLN。&lt;/li&gt;
&lt;li&gt;原因：它关注从监督学习到强化学习的适应过程，用 RL 提升长序列路径决策的成功率，核心仍是“如何更好地到达终点”。&lt;/li&gt;
&lt;li&gt;判断：优化对象是导航决策序列，而不是直接高频输出底层飞行控制信号，因此属于 VLN。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;阵营二：端到端 Aerial VLA&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AutoFly: Vision-Language-Action Model for UAV Autonomous Navigation in the Wild&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;归类：典型的 Locomotion VLA。&lt;/li&gt;
&lt;li&gt;原因：论文强调端到端 VLA，并直接输出无人机速度控制指令（UAV Velocity Commands）。&lt;/li&gt;
&lt;li&gt;判断：它抛弃预设航点和传统规划器，让网络直接根据视觉、语言和空间编码输出飞行动作，实现自主避障和导航，因此属于 VLA。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AerialVLA: A Vision-Language-Action Model for Aerial Navigation with Online Dialogue&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;归类：交互式 Aerial VLA。&lt;/li&gt;
&lt;li&gt;原因：它不仅输出移动动作（Moving Action），还将“向人提问 / 请求澄清”建模为查询动作（Query Action）。&lt;/li&gt;
&lt;li&gt;判断：系统输出直接决定具身智能体下一步行为：飞行、停留、询问或继续探索。这种把移动与交互都纳入 Action Space 的设计，体现了 VLA Agent 的思想。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;一句话判断法&lt;/h2&gt;
&lt;p&gt;看模型结构图的最后一层：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果输出的是坐标点、航点、离散方向，或者系统框图里还有 &lt;code&gt;Planner&lt;/code&gt;、&lt;code&gt;A*&lt;/code&gt;、&lt;code&gt;MPC&lt;/code&gt;、&lt;code&gt;Receding-Horizon Planner&lt;/code&gt; 等模块，优先归为 &lt;strong&gt;VLN&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;如果网络直接输入图像和语言，直接输出 &lt;code&gt;speed&lt;/code&gt;、&lt;code&gt;velocity command&lt;/code&gt;、姿态控制、推力、机械臂关节参数，并强调 &lt;code&gt;End-to-End&lt;/code&gt;，优先归为 &lt;strong&gt;VLA&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;空中具身的发展路线&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;阶段一：纯 Aerial VLN。&lt;/strong&gt; AI 做向导，传统规划与控制模块兜底。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阶段二：移动控制型 Aerial VLA。&lt;/strong&gt; 端到端输出速度或姿态动作，完成避障、抗扰和导航。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阶段三：空中移动操作。&lt;/strong&gt; 无人机搭载机械臂或夹爪，实现抓取、搬运和投放等物理交互。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阶段四：多智能体协作 VLA。&lt;/strong&gt; 无人机蜂群通过大模型进行协同搜索、救援、搭建或巡检。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;入局建议&lt;/h2&gt;
&lt;p&gt;对于刚进入空中具身领域的研究者，较稳妥的路线不是继续卷纯找路 VLN，也不是一开始就做复杂的无人机机械臂真机控制，而是选择 &lt;strong&gt;Benchmark + Locomotion VLA&lt;/strong&gt; 的组合。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;学习新一代物理仿真平台，例如 Nvidia Isaac Sim 或 Genesis，尽量避免完全依赖较老的 AirSim 流程。&lt;/li&gt;
&lt;li&gt;复现一个端到端输出速度的 baseline，用模仿学习（IL）或强化学习（RL）跑通从文本、图像到三轴线速度 / 角速度的完整数据流。&lt;/li&gt;
&lt;li&gt;做一个“小而美”的空中具身 benchmark，例如动态风扰、狭窄空间穿越、空中磁吸 / 抓取、长程语言导航中的实时避障。&lt;/li&gt;
&lt;li&gt;做 Sim-to-Real 闭环验证，例如使用 Crazyflie 这类轻量、耐摔、飞控开源的平台，把模型部署到真实无人机上，形成物理世界中的闭环展示。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;基建方面&lt;/h2&gt;
&lt;h3&gt;Base Model&lt;/h3&gt;
&lt;h3&gt;Dataset&lt;/h3&gt;
&lt;h3&gt;Benchmark&lt;/h3&gt;
&lt;h3&gt;Framework&lt;/h3&gt;
&lt;h2&gt;VLA&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Task：类似于机器人领域的 VLA 任务，只不过这里的 A (Action) 是描述无人机的速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;VLN（视觉语言导航）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Task：给定一个自然语言指令，指导无人机在环境中导航。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1. 什么是空中视觉语言导航？&lt;/h3&gt;
&lt;p&gt;| 输入 (Input) | 处理 (Process) | 输出 (Output) |
| :--- | :---: | :--- |
| 📜 &lt;strong&gt;自然语言指令&lt;/strong&gt;  📽️ &lt;strong&gt;自我中心视觉流&lt;/strong&gt; | ➡️ &lt;strong&gt;🧠 UAV 智能体&lt;/strong&gt; ➡️ | ✈️ &lt;strong&gt;飞行轨迹&lt;/strong&gt;  ⚙️ &lt;strong&gt;低级控制指令&lt;/strong&gt; |&lt;/p&gt;
&lt;p&gt;| 特征维度 | 地面VLN | 空中VLN (Air VLN) |
| :--- | :--- | :--- |
| &lt;strong&gt;环境尺度&lt;/strong&gt; | 房间级、街道级（路径通常小于100米） | 城市级、大型室外区域（路径超过600米） |
| &lt;strong&gt;动作空间&lt;/strong&gt; | 二维/二维半（前进、转向、停止） | 三维/六自由度（上升/下降、翻滚、俯仰、偏航） |
| &lt;strong&gt;路径复杂性&lt;/strong&gt; | 受走廊、街道约束；常基于预定义图 | 无约束的三维轨迹；规划复杂度呈指数级增长 |
| &lt;strong&gt;语义密度&lt;/strong&gt; | 高（房间/街道中有密集的物体和地标） | 稀疏且多变（物体更小、更远） |
| &lt;strong&gt;主要挑战&lt;/strong&gt; | 在杂乱场景中的跨模态对齐 | 长时程规划、三维空间推理、模拟到现实的迁移鸿沟 |&lt;/p&gt;
&lt;h3&gt;2. 空中视觉语言导航的独特挑战：&lt;/h3&gt;
&lt;h4&gt;三维路径规划与六自由度控制&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;维度增加&lt;/strong&gt;。无人机在完整的6 DOF（自由度）空间中运行，导致动作空间的复杂性呈指数级增长，使传统规划算法在计算上难以处理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;从路径到轨迹&lt;/strong&gt;。挑战不仅在于找到航点（路径规划），还在于生成平滑且动态可行的飞行轨迹（轨迹规划），必须考虑无人机的物理约束。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;三维障碍物规避&lt;/strong&gt;。碰撞规避不再是二维问题。无人机必须在杂乱的三维环境中导航，避开静态和动态障碍物，需要实时、全方位的感知。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;从空中视角进行语义理解&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多变的视角&lt;/strong&gt;。无人机灵活的视角导致在不同高度和角度下对物体的感知发生巨大的变化，使得一致性识别变得困难。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;稀疏的语义信息&lt;/strong&gt;。空中视角通常覆盖广阔区域，与指令相关的地标可能很小、很远或在视觉上不突出，形成稀疏的语义景观。使得跨模态对齐变得更具挑战性。（vision-language alignment）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对鲁棒语义分割的需求&lt;/strong&gt;。智能体必须对航拍图像进行鲁棒的语义分割，将像素分类为“建筑”、“道路”等类别，以理解环境结构。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;连接仿真与真实世界的无人机部署&lt;/h4&gt;</content:encoded><h:img src="https://img.20bytes.top/6d0e4e52dfc9c0cf740b9f3c6594a96d.webp"/><enclosure url="https://img.20bytes.top/6d0e4e52dfc9c0cf740b9f3c6594a96d.webp"/></item><item><title>用 GitHub Actions 把关注圈动态整理成每日邮件摘要</title><link>https://20bytes.github.io/blog/feed-digest</link><guid isPermaLink="true">https://20bytes.github.io/blog/feed-digest</guid><description>GitHub Dashboard 信息太杂？本文介绍如何用 Python + GitHub Actions 构建一个零成本的自动化工具，每天把你关注的人的动态整理成一封结构化的 HTML 邮件发给自己。</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;每天打开 GitHub Dashboard，几百条动态刷出来：某个大厂仓库被几十个人同时 star、机器人在各种 PR 里留评论、&lt;code&gt;github-actions[bot]&lt;/code&gt; 贡献了大半的活动量……真正有价值的信号——&quot;某个你关注的人开始了一个新项目&quot;、&quot;某个朋友 fork 了一个不起眼但很有意思的库&quot;——全被淹没在噪声里。&lt;/p&gt;
&lt;p&gt;这篇文章记录我是怎么解决这个问题的：用 Python 写一个脚本，搭配 GitHub Actions 每天自动跑，把真正值得看的动态整理成一封 HTML 邮件发给自己，零服务器成本。&lt;/p&gt;
&lt;h2&gt;1. 问题拆解&lt;/h2&gt;
&lt;p&gt;解决之前先想清楚&quot;好的摘要&quot;长什么样。我给自己列了三条标准：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;聚焦个人行为&lt;/strong&gt;：我更想知道&quot;张三今天创建了一个新仓库&quot;，而不是&quot;anthropics/claude-code 今天被 40 个人 star 了&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大厂项目只看数字&lt;/strong&gt;：Google、Anthropic、OpenAI 这类大厂的项目每天都会有大量 star，列出所有 star 的人名没有意义，只需要知道&quot;今天涨了多少&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过滤掉机器人&lt;/strong&gt;：&lt;code&gt;github-actions[bot]&lt;/code&gt;、&lt;code&gt;dependabot&lt;/code&gt;、&lt;code&gt;renovate&lt;/code&gt; 这类账号的活动对我没有信息量，应该直接剔除。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2. 技术选型&lt;/h2&gt;
&lt;p&gt;| 需求 | 方案 |
|---|---|
| 获取关注人的动态 | GitHub REST API |
| 定时运行 | GitHub Actions（免费） |
| 发送邮件 | Python &lt;code&gt;smtplib&lt;/code&gt; + Gmail App Password |
| AI 摘要（可选） | 兼容 OpenAI 格式的 API |&lt;/p&gt;
&lt;p&gt;没有服务器、没有数据库、没有额外费用。整个系统的&quot;基础设施&quot;就是一个 GitHub 仓库和一个 YAML 文件。&lt;/p&gt;
&lt;h2&gt;3. 核心思路：用对 API 端点&lt;/h2&gt;
&lt;p&gt;这是整个项目最关键的设计决策，也是最容易走弯路的地方。&lt;/p&gt;
&lt;p&gt;GitHub 有一个看起来很合适的接口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /users/{username}/received_events/public
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它会返回你 Dashboard 上的聚合动态流。但实际用下来会发现一个严重问题：&lt;strong&gt;它会静默丢弃很多事件&lt;/strong&gt;。Dashboard 上明明显示的动态，这个接口可能根本不返回。&lt;/p&gt;
&lt;p&gt;正确做法是分两步走：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;第一步：GET /users/{me}/following
         → 拿到你关注的所有人的 login 列表

第二步：对每个人循环调用
         GET /users/{user}/events/public
         → 拿到他们各自的公开动态
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样等于把 GitHub 内部的聚合逻辑自己实现了一遍，结果和 Dashboard 完全一致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API 调用量估算&lt;/strong&gt;：假设你关注了 100 人，每天有活动的可能有 30 人：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 次 &lt;code&gt;/following&lt;/code&gt; 请求&lt;/li&gt;
&lt;li&gt;100 次 &lt;code&gt;/events/public&lt;/code&gt; 请求&lt;/li&gt;
&lt;li&gt;30 次 &lt;code&gt;/users/{user}&lt;/code&gt; 请求（只对有活动的人拉 profile 用于显示真名）&lt;/li&gt;
&lt;li&gt;共 ~131 次，而 GitHub 认证用户每小时限额 5000 次，完全够用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 整体架构&lt;/h2&gt;
&lt;p&gt;项目分成五个模块，按流水线顺序执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main.py
  ↓
[1] fetcher.py   — 拉 following 列表 + 每人的动态
  ↓
[2] aggregator.py — 分组、去重、过滤机器人、识别大厂项目
  ↓
[3] summarizer.py — 调用 AI 接口生成 3-6 条摘要（可选）
  ↓
[4] renderer.py   — 生成 HTML 邮件
  ↓
[5] mailer.py     — 通过 SMTP 发送
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每一步只负责自己的事，输出传给下一步，方便单独测试和修改。&lt;/p&gt;
&lt;h2&gt;5. 聚合层的关键设计&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aggregator.py&lt;/code&gt; 是整个系统信息质量的核心，几个重要决策：&lt;/p&gt;
&lt;h3&gt;5.1 机器人过滤&lt;/h3&gt;
&lt;p&gt;GitHub 的官方机器人账号都带有 &lt;code&gt;[bot]&lt;/code&gt; 后缀，直接按字符串匹配就能过滤：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def _is_bot(login: str) -&gt; bool:
    if login.endswith(&quot;[bot]&quot;):
        return True
    # 少数没有 [bot] 后缀的常见机器人账号
    return login.lower() in {&quot;dependabot&quot;, &quot;renovate&quot;, &quot;codecov&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 大厂项目识别&lt;/h3&gt;
&lt;p&gt;维护一个大厂组织名单，对这些 org 下的仓库在 trending 区只显示数量，不列人名：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;BIG_ORGS = {
    &quot;anthropics&quot;, &quot;google&quot;, &quot;google-gemini&quot;,
    &quot;openai&quot;, &quot;microsoft&quot;, &quot;meta&quot;, &quot;nvidia&quot;,
    &quot;huggingface&quot;, &quot;MiniMax-AI&quot;,
    # ... 可以按需扩充
}

def _is_big_org(repo_full_name: str) -&gt; bool:
    org = repo_full_name.split(&quot;/&quot;)[0]
    return org.lower() in {o.lower() for o in BIG_ORGS}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 个人亮点提取&lt;/h3&gt;
&lt;p&gt;从所有事件里按优先级提取&quot;值得单独展示&quot;的个人行为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;优先级排序：
  新建仓库 (CreateEvent)  &gt;  发布版本 (ReleaseEvent)
  &gt; fork 了小众项目 (ForkEvent)  &gt; star 了小众项目 (WatchEvent)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大厂仓库的 star 和 fork 不进入个人亮点，避免被大厂活动主导。&lt;/p&gt;
&lt;h2&gt;6. 邮件结构&lt;/h2&gt;
&lt;p&gt;最终邮件分为四个区块，从上到下信息密度递减：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;🤖 AI 速览         — 3-6 条 AI 提炼的要点（可选）
👤 个人亮点        — 新建仓库、发布版本、fork/star 小众项目
🔥 关注圈热门      — 小众热门（带 @who）/ 大厂项目（只看数量）
👥 按人分组        — 每人完整动态，过滤机器人后按事件数排序
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时展示 GitHub 登录名和真实显示名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;👤 个人亮点
🆕 Peter Steinberger (@steipete) 创建了新仓库 steipete/openclaw
⭐ Vincent Qin (@vincentqyw) star 了 isaaccorley/rsim
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;7. GitHub Actions 配置&lt;/h2&gt;
&lt;p&gt;核心是这一段 cron 配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;on:
  schedule:
    - cron: &quot;0 23 * * *&quot;   # UTC 23:00 = 北京时间 07:00
  workflow_dispatch: {}     # 支持手动触发
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所有敏感信息通过 GitHub Secrets 注入，脚本里不硬编码任何账号信息：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;env:
  GH_USERNAME: ${{ secrets.GH_USERNAME }}
  GH_TOKEN: ${{ secrets.GH_PAT }}
  SMTP_HOST: ${{ secrets.SMTP_HOST }}
  SMTP_PORT: ${{ secrets.SMTP_PORT }}
  SMTP_USER: ${{ secrets.SMTP_USER }}
  SMTP_PASS: ${{ secrets.SMTP_PASS }}
  MAIL_FROM: ${{ secrets.MAIL_FROM }}
  MAIL_TO: ${{ secrets.MAIL_TO }}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;8. 本地测试&lt;/h2&gt;
&lt;p&gt;用 &lt;code&gt;SKIP_EMAIL=1&lt;/code&gt; 环境变量可以跳过发邮件，只在本地生成 HTML 文件查看效果：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 复制 .env.example 并填好配置
cp .env.example .env

# 加载配置，跳过发邮件，只生成 HTML
export $(cat .env | grep -v &apos;^#&apos; | xargs)
SKIP_EMAIL=1 python main.py

# 用浏览器打开查看效果
xdg-open output/digest-*.html   # Linux
open output/digest-*.html        # macOS
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;9. 几个踩过的坑&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;received_events 的坑&lt;/strong&gt;：最开始用 &lt;code&gt;/received_events/public&lt;/code&gt;，发现大量关注的人的活动根本不出现。排查了很久才意识到是 GitHub 那边的聚合策略问题，换成逐人拉取后完全解决。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SMTP 端口类型错误&lt;/strong&gt;：在 GitHub Secrets 里填写端口号时，值被 Actions 读取后如果带了多余空格会导致 &lt;code&gt;int()&lt;/code&gt; 转换失败。确保填入的是纯数字，没有引号和空格。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;机器人噪声&lt;/strong&gt;：最初的版本里 &lt;code&gt;github-actions[bot]&lt;/code&gt; 贡献了超过 60 条&quot;动态&quot;，占据了大半版面。加了 bot 过滤后，邮件内容密度一下子提高了很多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大厂项目列人名&lt;/strong&gt;：早期版本在 trending 区把 &lt;code&gt;anthropics/claude-code&lt;/code&gt; 的 35 个 starer 全部列出来，用处不大还占空间。按 org 分类后改成&quot;35 人 star&quot;，清晰多了。&lt;/p&gt;
&lt;h2&gt;10. 可扩展的方向&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DIGEST_HOURS 参数&lt;/strong&gt;：改成 168 就变成每周摘要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事件类型过滤&lt;/strong&gt;：不关心 &lt;code&gt;IssueCommentEvent&lt;/code&gt; 的话，直接在 aggregator 里注释掉&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大厂名单&lt;/strong&gt;：&lt;code&gt;BIG_ORGS&lt;/code&gt; 是一个普通的 Python set，按需增删&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邮件样式&lt;/strong&gt;：&lt;code&gt;renderer.py&lt;/code&gt; 顶部的 &lt;code&gt;CSS&lt;/code&gt; 常量可以直接改&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;11. 总结&lt;/h2&gt;
&lt;p&gt;这个项目的核心并不复杂，一个 300 行的 Python 脚本加上一个 40 行的 GitHub Actions YAML，就能把一个每天手动刷 Dashboard 的习惯变成一封每天自动送到邮箱的摘要。&lt;/p&gt;
&lt;p&gt;真正花时间的不是写代码，而是想清楚&quot;什么信息对我有价值&quot;——过滤掉机器人、区分大厂和小众项目、把个人行为置顶——这几个决策让最终的邮件质量差别很大。&lt;/p&gt;
&lt;p&gt;如果你也被 GitHub Dashboard 的信息量压倒，可以参考这个思路自己搭一套。&lt;/p&gt;</content:encoded><h:img src="https://img.20bytes.top/fa4ccae4c6fc97d4244856aebb70f37b.webp"/><enclosure url="https://img.20bytes.top/fa4ccae4c6fc97d4244856aebb70f37b.webp"/></item><item><title>GitHub PR 流程指南：从 Fork 到 Merge 的标准七步法</title><link>https://20bytes.github.io/blog/github-pr</link><guid isPermaLink="true">https://20bytes.github.io/blog/github-pr</guid><description>用一篇文章讲清 GitHub Pull Request 的标准流程：Fork、Clone、Branch、Commit、Push、Open PR、Review，以及协作中最常见的注意事项。</description><pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PR 是协作的核心。即便你只是修复一个很小的 Bug，比如某个 Issue 里提到的边界情况问题，最终也往往要通过 Pull Request 把修改提交给维护者审查、讨论，再合并进主分支。&lt;/p&gt;
&lt;p&gt;如果你是第一次给别人的仓库贡献代码，最容易卡住的并不是写代码本身，而是不清楚整套流程该怎么走。本文就按照一个最常见的开源协作场景，把 GitHub PR 的标准流程完整走一遍。&lt;/p&gt;
&lt;h2&gt;1. 标准 PR 七步法&lt;/h2&gt;
&lt;p&gt;| 步骤 | 作用 | 命令 / 动作 |
| --- | --- | --- |
| 1. Fork | 把别人的仓库复制到自己的 GitHub 账号下 | 点击原仓库右上角 &lt;code&gt;Fork&lt;/code&gt; |
| 2. Clone | 把自己账号下的仓库下载到本地 | &lt;code&gt;git clone https://github.com/你的名字/仓库名.git&lt;/code&gt; |
| 3. Branch | 为本次修改创建独立分支，不直接改 &lt;code&gt;main&lt;/code&gt; | &lt;code&gt;git checkout -b fix-bug-description&lt;/code&gt; |
| 4. Commit | 编写代码并提交，提交信息要清晰 | &lt;code&gt;git commit -m &quot;fix: handle empty array in geval&quot;&lt;/code&gt; |
| 5. Push | 把本地分支推送到自己的 GitHub 仓库 | &lt;code&gt;git push origin fix-bug-description&lt;/code&gt; |
| 6. Open PR | 从你的分支发起 Pull Request | GitHub 页面点击 &lt;code&gt;Compare &amp;#x26; pull request&lt;/code&gt; |
| 7. Review | 等待审核并根据反馈继续修改 | 回复评论、追加提交，直到被合并 |&lt;/p&gt;
&lt;p&gt;先记住一句最重要的话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;永远不要直接在 &lt;code&gt;main&lt;/code&gt; 分支上改代码并提交 PR。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这样做的好处是，你的每一次修改都是独立、可回退、可审查的，不会把别的实验性代码混在一起。&lt;/p&gt;
&lt;h2&gt;2. 开始前先理解：PR 到底是什么&lt;/h2&gt;
&lt;p&gt;PR 的全称是 Pull Request。它并不是“把代码直接塞给别人”，而是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你先在自己的分支完成修改。&lt;/li&gt;
&lt;li&gt;然后发起一个“请把我这部分改动拉进来”的请求。&lt;/li&gt;
&lt;li&gt;维护者查看差异、提出意见、要求修改或直接合并。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以 PR 本质上既是代码提交方式，也是沟通方式。好的 PR 不只是在“交代码”，更是在告诉 reviewer：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我改了什么&lt;/li&gt;
&lt;li&gt;为什么这样改&lt;/li&gt;
&lt;li&gt;影响范围是什么&lt;/li&gt;
&lt;li&gt;我已经怎么验证过&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 第一步：Fork 仓库&lt;/h2&gt;
&lt;p&gt;如果你没有原仓库的直接写权限，通常第一步就是 Fork。&lt;/p&gt;
&lt;p&gt;Fork 的作用是把原仓库复制一份到你自己的账号下。比如原仓库是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;https://github.com/original-author/project
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fork 之后，你会得到：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;https://github.com/your-name/project
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后续你的所有修改，都会先推到你自己的这个仓库里，而不是直接推到原作者的仓库。&lt;/p&gt;
&lt;p&gt;适用场景很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开源项目贡献代码：通常需要 Fork&lt;/li&gt;
&lt;li&gt;团队内部仓库且你有写权限：有时可以直接拉分支，不一定需要 Fork&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 第二步：Clone 到本地&lt;/h2&gt;
&lt;p&gt;Fork 完成后，把自己的仓库克隆到本地：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/your-name/project.git
cd project
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步的作用是把远程代码下载到你电脑上，方便你本地开发、运行和测试。&lt;/p&gt;
&lt;p&gt;如果你准备长期给这个项目贡献代码，推荐额外配置一个 &lt;code&gt;upstream&lt;/code&gt;，也就是原仓库地址：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add upstream https://github.com/original-author/project.git
git remote -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样以后同步原仓库更新会更方便。&lt;/p&gt;
&lt;h2&gt;5. 第三步：创建分支&lt;/h2&gt;
&lt;p&gt;不要在 &lt;code&gt;main&lt;/code&gt; 上直接开发，而是为这次任务单独建一个分支：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout -b fix-bug-description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你已经提前配置了 &lt;code&gt;upstream&lt;/code&gt;，更稳妥的做法是先同步原仓库主分支，再切新分支：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout main
git pull upstream main
git checkout -b fix-bug-description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分支命名建议做到“看名字就知道在做什么”，常见格式如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fix-empty-array-bug&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs-update-pr-guide&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feat-user-profile&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;分支名不要起成 &lt;code&gt;test&lt;/code&gt;、&lt;code&gt;new-branch&lt;/code&gt;、&lt;code&gt;update&lt;/code&gt; 这种信息量太低的名字，否则后面自己都容易看不懂。&lt;/p&gt;
&lt;h2&gt;6. 第四步：编码并提交 Commit&lt;/h2&gt;
&lt;p&gt;接下来就是正常改代码、运行测试、确认修改没有问题，然后提交。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &quot;fix: handle empty array in geval&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Commit message 最好满足两个要求：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一眼能看懂你改了什么&lt;/li&gt;
&lt;li&gt;使用动词开头，尽量具体&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;几个对比：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;好的写法：&lt;code&gt;fix: handle empty array in geval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;好的写法：&lt;code&gt;docs: add pull request workflow guide&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不推荐：&lt;code&gt;update code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不推荐：&lt;code&gt;fix bug&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果改动比较复杂，也可以拆成多次 commit。比起一个超大的提交，reviewer 通常更喜欢一组边界清晰的小提交。&lt;/p&gt;
&lt;h2&gt;7. 第五步：Push 到自己的远程仓库&lt;/h2&gt;
&lt;p&gt;本地提交完成后，把分支推送到 GitHub：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push origin fix-bug-description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次推送新分支时，也可以这样写：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push -u origin fix-bug-description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加上 &lt;code&gt;-u&lt;/code&gt; 后，Git 会记住本地分支和远程分支的跟踪关系。以后你再执行 &lt;code&gt;git push&lt;/code&gt;、&lt;code&gt;git pull&lt;/code&gt; 会更省事。&lt;/p&gt;
&lt;p&gt;推送成功后，GitHub 通常会提示你这个分支刚刚更新，并给出一个快捷入口，让你直接发起 PR。&lt;/p&gt;
&lt;h2&gt;8. 第六步：Open PR&lt;/h2&gt;
&lt;p&gt;现在回到 GitHub 页面，你会看到一个 &lt;code&gt;Compare &amp;#x26; pull request&lt;/code&gt; 按钮。点击之后，就进入创建 PR 的页面。&lt;/p&gt;
&lt;p&gt;这里最重要的是检查两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;base repository&lt;/code&gt; 和 &lt;code&gt;base branch&lt;/code&gt; 是否正确&lt;/li&gt;
&lt;li&gt;&lt;code&gt;head repository&lt;/code&gt; 和 &lt;code&gt;compare branch&lt;/code&gt; 是否是你刚才推送的分支&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;多数情况下，你的目标应该是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;base: original-author/project &amp;#x3C;- main
compare: your-name/project &amp;#x3C;- fix-bug-description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PR 标题建议直接概括这次改动，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fix: handle empty array in geval&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs: add GitHub PR workflow guide&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feat: support custom avatar upload&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PR 描述则建议至少写清楚这几件事：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;## 变更内容
- 修复空数组情况下的异常处理

## 为什么修改
- 某些输入会导致函数提前报错

## 如何验证
- 补充了测试用例
- 本地执行相关测试通过

## 影响范围
- 仅影响 `geval` 的边界处理逻辑
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是界面类修改，附上截图；如果关联某个 Issue，也可以写上 &lt;code&gt;Closes #8613&lt;/code&gt; 之类的说明，让 GitHub 在 PR 合并后自动关闭对应 Issue。&lt;/p&gt;
&lt;h2&gt;9. 第七步：Review 与二次修改&lt;/h2&gt;
&lt;p&gt;发起 PR 并不意味着流程结束，很多时候这一步才是真正的协作开始。&lt;/p&gt;
&lt;p&gt;维护者可能会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接通过并合并&lt;/li&gt;
&lt;li&gt;提出代码风格建议&lt;/li&gt;
&lt;li&gt;要求补测试&lt;/li&gt;
&lt;li&gt;询问为什么这样实现&lt;/li&gt;
&lt;li&gt;建议换一种更稳妥的写法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你需要做的是继续在同一个分支上修改，然后再次提交并 push：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add .
git commit -m &quot;refactor: simplify edge case handling&quot;
git push origin fix-bug-description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不需要重新开一个新的 PR。只要你继续往这个分支 push，当前 PR 会自动更新。&lt;/p&gt;
&lt;p&gt;这也是很多新手第一次用 PR 时最容易误解的地方：PR 不是“一次性投递”，而是“围绕同一个分支持续迭代”。&lt;/p&gt;
&lt;h2&gt;10. 新人最常见的三个坑&lt;/h2&gt;
&lt;h3&gt;10.1 直接在 &lt;code&gt;main&lt;/code&gt; 上改代码&lt;/h3&gt;
&lt;p&gt;这是最常见的问题。这样做会让你的工作分支混乱，也不利于后续继续同步上游仓库。&lt;/p&gt;
&lt;h3&gt;10.2 PR 太大&lt;/h3&gt;
&lt;p&gt;如果一个 PR 同时改了 Bug、重构、文档、样式、命名，reviewer 会很难看。尽量做到一个 PR 只解决一个明确问题。&lt;/p&gt;
&lt;h3&gt;10.3 只写标题，不写描述&lt;/h3&gt;
&lt;p&gt;对你自己来说你当然知道改了什么，但 reviewer 不一定知道。PR 描述写得越清楚，审核速度通常越快。&lt;/p&gt;
&lt;h2&gt;11. 一套适合直接照抄的完整命令&lt;/h2&gt;
&lt;p&gt;下面是一套最常见的开源贡献命令流，你可以直接代入仓库地址和分支名：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. 克隆自己的 Fork
git clone https://github.com/your-name/project.git
cd project

# 2. 添加上游仓库
git remote add upstream https://github.com/original-author/project.git

# 3. 同步主分支
git checkout main
git pull upstream main

# 4. 新建功能分支
git checkout -b fix-bug-description

# 5. 修改代码后提交
git add .
git commit -m &quot;fix: handle empty array in geval&quot;

# 6. 推送到自己的仓库
git push -u origin fix-bug-description
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后回到 GitHub 页面，点击 &lt;code&gt;Compare &amp;#x26; pull request&lt;/code&gt;，补全标题和描述，等待 review 即可。&lt;/p&gt;
&lt;h2&gt;12. 总结&lt;/h2&gt;
&lt;p&gt;一个标准的 GitHub PR 流程，可以概括为：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fork -&gt; Clone -&gt; Branch -&gt; Commit -&gt; Push -&gt; Open PR -&gt; Review&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把这七步跑顺之后，你就已经具备参与大多数开源项目协作的基础能力了。真正的重点不只是“把代码传上去”，而是通过清晰的分支、提交和 PR 描述，让别人更容易理解并接受你的修改。&lt;/p&gt;
&lt;p&gt;如果你把 PR 当成一次正式沟通，而不仅仅是一段代码上传，协作体验会顺畅很多。&lt;/p&gt;
&lt;h2&gt;13. 参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/github/collaborating-with-pull-requests/working-with-forks/about-forks&quot;&gt;GitHub Docs: About forks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests&quot;&gt;GitHub Docs: About pull requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/articles/creating-a-pull-request&quot;&gt;GitHub Docs: Creating a pull request&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork&quot;&gt;GitHub Docs: Creating a pull request from a fork&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests&quot;&gt;GitHub Docs: Pull requests documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/git/tutorials/making-a-pull-request&quot;&gt;Atlassian Git Tutorials: Making a Pull Request&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/584834288&quot;&gt;知乎：如何在 Github 上规范的提交 PR（图文详解）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://img.20bytes.top/bc21f8a30e71257ec8b6cef4fe1b88c6.webp"/><enclosure url="https://img.20bytes.top/bc21f8a30e71257ec8b6cef4fe1b88c6.webp"/></item><item><title>构建个人学术追踪系统：自动化 arXiv 论文监控实践</title><link>https://20bytes.github.io/blog/arxiv-reader</link><guid isPermaLink="true">https://20bytes.github.io/blog/arxiv-reader</guid><description>分享如何从零搭建一个自动化arXiv论文追踪系统，涵盖爬虫逻辑、智能翻译、个性化筛选与Web展示等完整技术方案。</description><pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在AI领域，每天arXiv上都会涌现大量新论文。对于专注于特定方向的研究者来说， manually 浏览和筛选既耗时又低效。这篇文章将分享我搭建的一套自动化论文追踪系统的完整思路，希望能给有类似需求的同学一些参考。&lt;/p&gt;
&lt;h2&gt;项目动机&lt;/h2&gt;
&lt;p&gt;在关注 Vision-Language-Action (VLA)、Vision-Language Navigation (VLN) 等具身智能方向时，我遇到了几个痛点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;信息过载&lt;/strong&gt;：arXiv每天上新数百篇论文，手动筛选效率极低&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语言障碍&lt;/strong&gt;：英文标题和摘要阅读成本高，快速理解核心贡献需要时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;兴趣匹配&lt;/strong&gt;：不同研究方向关注点不同，需要个性化过滤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识管理&lt;/strong&gt;：看过的论文容易遗忘，缺乏系统化的标记和回顾机制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基于这些需求，我设计并实现了一套自动化解决方案。&lt;/p&gt;
&lt;h2&gt;系统架构概览&lt;/h2&gt;
&lt;p&gt;整个系统由三个核心模块组成：&lt;/p&gt;
&lt;p&gt;| 模块 | 功能 | 技术方案 |
|------|------|----------|
| 数据采集 | 从arXiv抓取目标领域论文 | arxiv-python + 定时任务 |
| 内容处理 | 翻译、格式化、去重 | DeepSeek API + 缓存机制 |
| 展示交互 | Web端展示与个性化标记 | GitHub Pages + localStorage |&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│   arXiv     │────▶│   Python     │────▶│   GitHub    │
│   API       │     │   处理脚本   │     │   Pages     │
└─────────────┘     └──────────────┘     └─────────────┘
                           │                    │
                           ▼                    ▼
                    ┌──────────────┐     ┌─────────────┐
                    │  DeepSeek    │     │  用户标记   │
                    │  翻译服务    │     │  &amp;#x26; 筛选    │
                    └──────────────┘     └─────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;核心实现细节&lt;/h2&gt;
&lt;h3&gt;1. 精准的关键词检索策略&lt;/h3&gt;
&lt;p&gt;不同于简单的关键词匹配，系统支持多维度复合检索。以VLA领域为例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;keywords:
  &quot;VLA&quot;:
    filters:
      - &quot;Vision-Language-Action Model&quot;
      - &quot;Vision Language Action&quot;
      - &quot;VLA Model&quot;
      - &quot;RT-2&quot;
      - &quot;OpenVLA&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过 &lt;code&gt;OR&lt;/code&gt; 逻辑组合多个相关关键词，可以最大程度避免遗漏，同时通过分层配置支持多领域并行追踪。&lt;/p&gt;
&lt;h3&gt;2. 智能双语展示&lt;/h3&gt;
&lt;p&gt;论文标题和摘要的翻译是提升阅读效率的关键。系统采用了以下策略：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;翻译流程&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首次遇到论文时，调用大模型API进行翻译&lt;/li&gt;
&lt;li&gt;翻译结果缓存到本地JSON文件，避免重复调用&lt;/li&gt;
&lt;li&gt;增量更新机制，只处理新增论文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;提示工程&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;system_prompt = (
    &quot;Translate the paper title and abstract into Chinese. &quot;
    &quot;Return only JSON with keys: title_zh, abstract_zh.&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种结构化的翻译要求确保输出格式统一，便于后续处理。&lt;/p&gt;
&lt;h3&gt;3. HJFY集成：便捷的PDF访问&lt;/h3&gt;
&lt;p&gt;系统集成了 HJFY 学术搜索服务，为每篇论文生成直接访问链接。这解决了arXiv访问不稳定的问题，提供了更流畅的PDF阅读体验。&lt;/p&gt;
&lt;h3&gt;4. Web端个性化标记&lt;/h3&gt;
&lt;p&gt;在生成的GitHub Pages页面中，每篇论文都配有交互式评估按钮：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;已读&lt;/strong&gt;：标记已浏览过的论文&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;跳过&lt;/strong&gt;：不感兴趣，后续可过滤&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;收藏&lt;/strong&gt;：重要论文，需要深度阅读&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;技术实现&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 使用localStorage保存用户标记
const storageKey = (id) =&gt; `vlm_arxiv_daily_eval:${id}`;
localStorage.setItem(storageKey(arxivId), evaluation);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种设计的好处是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无需后端服务器，纯前端实现&lt;/li&gt;
&lt;li&gt;用户数据保存在本地，隐私安全&lt;/li&gt;
&lt;li&gt;跨会话持久化，刷新不丢失&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 摘要独立页面&lt;/h3&gt;
&lt;p&gt;为了提供更好的阅读体验，系统为每篇论文生成独立的摘要页面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中英文摘要对照展示&lt;/li&gt;
&lt;li&gt;简洁的排版设计&lt;/li&gt;
&lt;li&gt;一键返回主列表&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些页面通过脚本自动生成，维护成本极低。&lt;/p&gt;
&lt;h2&gt;自动化运维&lt;/h2&gt;
&lt;h3&gt;GitHub Actions 定时任务&lt;/h3&gt;
&lt;p&gt;利用GitHub Actions实现每日自动更新：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;on:
  schedule:
    - cron: &apos;0 1 * * *&apos;  # 每天凌晨1点执行
  workflow_dispatch:     # 支持手动触发

jobs:
  update-papers:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run crawler
        run: python daily_arxiv.py
      - name: Commit changes
        run: |
          git add .
          git commit -m &quot;Update daily papers&quot;
          git push
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;增量更新机制&lt;/h3&gt;
&lt;p&gt;为了避免重复处理，系统实现了多层缓存：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;翻译缓存&lt;/strong&gt;：已翻译的论文ID和结果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;论文数据缓存&lt;/strong&gt;：arXiv元数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;摘要缓存&lt;/strong&gt;：英文原文存储&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种设计使得每日更新通常在几秒内完成，API调用成本也大幅降低。&lt;/p&gt;
&lt;h2&gt;技术亮点与优化&lt;/h2&gt;
&lt;h3&gt;1. 优雅的错误处理&lt;/h3&gt;
&lt;p&gt;网络请求和API调用都有完善的异常处理：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;try:
    resp = requests.post(url, headers=headers, json=payload, timeout=60)
    resp.raise_for_status()
except Exception as exc:
    logging.warning(f&quot;Translation failed: {exc}&quot;)
    return {}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Markdown到HTML的灵活转换&lt;/h3&gt;
&lt;p&gt;系统支持生成多种输出格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;README.md&lt;/code&gt;：GitHub仓库展示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs/index.html&lt;/code&gt;：GitHub Pages交互式页面&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docs/wechat.md&lt;/code&gt;：微信公众号文章格式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过配置灵活切换，一份代码满足多平台需求。&lt;/p&gt;
&lt;h3&gt;3. 数学公式排版优化&lt;/h3&gt;
&lt;p&gt;针对论文标题中常见的LaTeX数学公式，实现了简单的格式化：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def pretty_math(s: str) -&gt; str:
    # 处理 $...$ 格式的行内公式
    match = re.search(r&quot;\$.*\$&quot;, s)
    if match:
        # 添加适当的空格，提升渲染效果
        ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;实际效果&lt;/h2&gt;
&lt;p&gt;经过几个月的运行，这套系统带来了显著的效率提升：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;时间节省&lt;/strong&gt;：从每天30-40分钟的浏览筛选，缩短到5分钟快速浏览&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信息完整&lt;/strong&gt;：双语展示降低了理解门槛&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识沉淀&lt;/strong&gt;：通过标记系统建立了个人论文库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社区价值&lt;/strong&gt;：开源后帮助了同领域的研究者&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;扩展思路&lt;/h2&gt;
&lt;p&gt;这个系统的架构可以很容易地扩展到其他场景：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;多领域追踪&lt;/strong&gt;：通过修改配置文件，可以追踪任意arXiv分类&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邮件订阅&lt;/strong&gt;：增加邮件推送功能，每日发送精选论文&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSS输出&lt;/strong&gt;：生成RSS feed，方便集成到阅读器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协作标记&lt;/strong&gt;：结合后端数据库，实现团队共享的论文库&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;这套系统的核心思想是：&lt;strong&gt;自动化处理重复性工作，保留人的判断和决策&lt;/strong&gt;。技术本身并不复杂，关键在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;清晰定义需求，解决真实痛点&lt;/li&gt;
&lt;li&gt;合理选择技术方案，避免过度工程化&lt;/li&gt;
&lt;li&gt;注重用户体验，降低使用门槛&lt;/li&gt;
&lt;li&gt;保持可扩展性，预留迭代空间&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于研究者来说，工具的价值不在于功能多复杂，而在于能否真正提升工作效率。希望这篇文章能给正在考虑搭建类似系统的同学一些启发。&lt;/p&gt;
&lt;h2&gt;致谢&lt;/h2&gt;
&lt;p&gt;本项目基于 &lt;a href=&quot;https://github.com/Vincentqyw/cv-arxiv-daily&quot;&gt;cv-arxiv-daily&lt;/a&gt; 二次开发，在此感谢原作者 &lt;a href=&quot;https://github.com/Vincentqyw&quot;&gt;@Vincentqyw&lt;/a&gt; 的开源贡献。同时也要感谢 &lt;a href=&quot;https://hjfy.top/&quot;&gt;HJFY&lt;/a&gt; 提供的学术搜索服务，让论文PDF访问更加便捷。&lt;/p&gt;
&lt;p&gt;开源社区的力量让这些工具不断完善，如果你也从中受益，欢迎star和支持相关项目。&lt;/p&gt;
&lt;h2&gt;参考资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/help/api/&quot;&gt;arXiv API Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pages&quot;&gt;GitHub Pages Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions&quot;&gt;GitHub Actions Workflow Syntax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://img.20bytes.top/2209ac45f63ef424665b77aabc9a1d98.webp"/><enclosure url="https://img.20bytes.top/2209ac45f63ef424665b77aabc9a1d98.webp"/></item><item><title>Git 实用指南：从重置仓库到代码贡献标准工作流</title><link>https://20bytes.github.io/blog/github</link><guid isPermaLink="true">https://20bytes.github.io/blog/github</guid><description>涵盖如何保留本地代码重建 GitHub 仓库，以及团队协作中标准的 Git 提交流程与规范。</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. 从本地代码重建全新的 GitHub 仓库&lt;/h2&gt;
&lt;p&gt;有时候本地已经有一份代码，但原来的 Git 仓库历史不再需要。最直接的做法是删除旧的 Git 信息，然后在 GitHub 上新建一个空仓库重新提交。&lt;/p&gt;
&lt;h3&gt;核心步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;删除本地旧 Git 信息&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /path/to/your/project-name
rm -rf .git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;这会清空提交历史和远程关联，但保留代码文件。&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重新初始化本地仓库&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git init
git branch -M main
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 GitHub 新建空仓库&lt;/strong&gt;：不要勾选 README、.gitignore 或 License。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关联新的远程仓库并推送&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add origin [https://github.com/your-username/your-repo-name.git](https://github.com/your-username/your-repo-name.git)
git add .
git commit -m &quot;Initial commit&quot;
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;2. 代码贡献与团队协作标准工作流 (Workflow)&lt;/h2&gt;
&lt;p&gt;对于参与团队项目，我们有一套标准的协作流程。强烈建议在开始前系统学习 Git 的版本管理。&lt;/p&gt;
&lt;h3&gt;2.1 环境准备与克隆&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;登录&lt;/strong&gt;：使用加入了该 repo 权限的 GitHub 账号登录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下载 Git&lt;/strong&gt;：&lt;a href=&quot;https://git-scm.com/downloads/win&quot;&gt;Git 官方下载&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;克隆仓库&lt;/strong&gt;：获取远程代码到本地，请务必使用 &lt;code&gt;git clone&lt;/code&gt; 而不是直接 Download ZIP。&lt;em&gt;(如果国内使用不稳定，建议配置好网络环境)&lt;/em&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone [https://github.com/your-organization/your-repo-name.git](https://github.com/your-organization/your-repo-name.git)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 同步主分支与创建开发分支&lt;/h3&gt;
&lt;p&gt;每次开发新功能前，确保基于最新的 &lt;code&gt;main&lt;/code&gt; 分支拉取新的工作分支：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 切换到主分支并同步远程最新代码
git checkout main 
git pull 

# 创建并切换到新分支进行开发
git checkout -b feature-your-new-task
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;分支命名规范：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个分支只对应&lt;strong&gt;一个任务&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;名称通常为 2-3 个单词，尽量简洁明了（如 &lt;code&gt;feature-login-page&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;如果可能重名，可以加时间戳避免冲突（如 &lt;code&gt;feature-login-250601&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;好例子&lt;/strong&gt;：&lt;code&gt;issue-15&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;坏例子&lt;/strong&gt;：&lt;code&gt;yaml&lt;/code&gt;（缺乏信息量）、&lt;code&gt;branch-new-feature&lt;/code&gt;（没必要加 branch 前缀）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.3 编写代码与提交 (Commit)&lt;/h3&gt;
&lt;p&gt;修改代码时，请始终确保自己在刚才创建的任务分支上工作（可通过 VSCode 左下角状态栏确认）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI 辅助&lt;/strong&gt;：尽量利用 AI（Cursor / Claude / Trae）辅助编程，可通过 &lt;code&gt;@&lt;/code&gt; 引入文件或整个代码库上下文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提交原则&lt;/strong&gt;：提交前必须进行测试。每次提交应尽可能&lt;strong&gt;小但完整&lt;/strong&gt;。切勿提交庞大的数据文件！&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提交流程&lt;/strong&gt;：强烈建议使用 VSCode 自带的图形化界面（Source Control）进行 &lt;code&gt;add&lt;/code&gt; 和 &lt;code&gt;commit&lt;/code&gt;，这比纯命令行更直观。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Commit Message 规范：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;标题行&lt;/strong&gt;（首行）：5-10 个词，简明扼要。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;详细正文&lt;/strong&gt;（可选）：与标题行空一行，用 1-3 句话描述复杂的变更细节。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.4 发布分支与合并请求 (Pull Request)&lt;/h3&gt;
&lt;p&gt;尽早与 Reviewer 分享你的代码以获取反馈。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;推送分支&lt;/strong&gt;：点击 VSCode 中的 Publish/Push 按钮，或者运行：
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push -u origin your-branch-name
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建 PR&lt;/strong&gt;：在 GitHub 上针对刚才推送的分支发起 Pull Request (PR)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：非常小心地检查 PR 的目标分支（通常是 &lt;code&gt;origin/main&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR 标题&lt;/strong&gt;：一般 5-10 个单词，&lt;strong&gt;以动词开头&lt;/strong&gt;（例如：&quot;add user login feature&quot;）。不要用 &quot;fix a bug&quot; 这种过于宽泛的标题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR 描述&lt;/strong&gt;：如有需要，请将测试结果、详细说明粘贴到评论中，附上截图更佳。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.5 代码审查 (Review)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 GitHub 上请求审阅（Request Reviews），或者在评论中 &lt;code&gt;@reviewer&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;若具备权限，推荐添加 GitHub Copilot 等 AI 工具作为辅助审阅者。&lt;/li&gt;
&lt;li&gt;根据反馈修改代码，提升 PR 质量，直到获得 &lt;code&gt;Approval&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;3. 学习资源与参考资料&lt;/h2&gt;
&lt;p&gt;如果你想深入学习 Git，以下资源非常值得推荐：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;官方与图形化教程&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/git/tutorials/&quot;&gt;Atlassian Git Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/sourcecontrol/overview&quot;&gt;VSCode 中的 Git 使用指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可视化交互式学习&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=zh_CN&quot;&gt;Learn Git Branching&lt;/a&gt;（强推！以可视化的方式学习 Git 分支）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;底层原理解读&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1xb411A7ac&quot;&gt;【中文字幕】Linus 在 2007 年 Google Talk 上介绍 Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://waynerv.com/posts/git-merge-intro/&quot;&gt;深入理解 Git Merge 工作原理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://img.20bytes.top/9d96cf695bbc10741cee799f58de9ba4.webp"/><enclosure url="https://img.20bytes.top/9d96cf695bbc10741cee799f58de9ba4.webp"/></item><item><title>WSL Ubuntu 22.04（Bot）创建流程文档</title><link>https://20bytes.github.io/blog/wsl</link><guid isPermaLink="true">https://20bytes.github.io/blog/wsl</guid><description>使用 --import（tar 模式）在自定义目录创建 Ubuntu 22.04 WSL 实例 Bot 的完整流程。</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;一、目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;新建 WSL 实例&lt;/li&gt;
&lt;li&gt;名称：&lt;code&gt;Bot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;系统：Ubuntu 22.04&lt;/li&gt;
&lt;li&gt;安装位置：&lt;code&gt;F:\WSL\Bot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用方式：&lt;code&gt;--import&lt;/code&gt;（tar 模式，推荐）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、准备工作&lt;/h2&gt;
&lt;h3&gt;1. 创建安装目录&lt;/h3&gt;
&lt;p&gt;在 PowerShell 执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;mkdir F:\WSL\Bot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;三、下载 Ubuntu 22.04 WSL rootfs&lt;/h2&gt;
&lt;p&gt;官方目录：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;https://cloud-images.ubuntu.com/wsl/jammy/current/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下载文件（普通 PC 选择 amd64）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下载后放在：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;F:\WSL\
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;F:\WSL\ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;四、导入为新的 WSL 实例&lt;/h2&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl --import Bot F:\WSL\Bot F:\WSL\ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz --version 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;操作成功完成。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;五、启动系统&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl -d Bot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首次进入默认是 &lt;code&gt;root&lt;/code&gt; 用户：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;root@xxx:#
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;六、创建普通用户（推荐）&lt;/h2&gt;
&lt;h3&gt;1. 创建用户&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;adduser bot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;填写密码，其余信息直接回车。&lt;/p&gt;
&lt;h3&gt;2. 添加 sudo 权限&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;usermod -aG sudo bot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;七、设置默认登录用户（永久）&lt;/h2&gt;
&lt;p&gt;编辑配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;nano /etc/wsl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;[user]
default=bot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存退出后，在 PowerShell 执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl --shutdown
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新进入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl -d Bot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应显示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;bot@xxx:~$
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;八、初始化系统（推荐）&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update &amp;#x26;&amp;#x26; sudo apt upgrade -y
sudo apt install build-essential git curl wget -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更新系统&lt;/li&gt;
&lt;li&gt;安装基础开发工具&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;九、验证安装&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl -l -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应显示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Blogs_U24
Bot
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;最终结构&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;F:\WSL\
├── Bot
└── ubuntu-jammy-wsl-amd64-ubuntu22.04lts.rootfs.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关键说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;推荐使用 &lt;code&gt;--import&lt;/code&gt;（tar 模式），不依赖微软商店&lt;/li&gt;
&lt;li&gt;可自定义安装位置&lt;/li&gt;
&lt;li&gt;方便备份与迁移&lt;/li&gt;
&lt;li&gt;更适合开发环境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你需要，我可以再给你整理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WSL 迁移流程&lt;/li&gt;
&lt;li&gt;备份恢复流程&lt;/li&gt;
&lt;li&gt;性能优化配置&lt;/li&gt;
&lt;li&gt;Python / Docker 初始化模板&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="https://img.20bytes.top/cb29c1af3f0cd15d08772c67ad073933.webp"/><enclosure url="https://img.20bytes.top/cb29c1af3f0cd15d08772c67ad073933.webp"/></item><item><title>经典基础网络回顾</title><link>https://20bytes.github.io/blog/%E7%BB%8F%E5%85%B8%E5%B7%A5%E4%BD%9C</link><guid isPermaLink="true">https://20bytes.github.io/blog/%E7%BB%8F%E5%85%B8%E5%B7%A5%E4%BD%9C</guid><description>梳理深度学习中具代表性的网络架构的演进脉络（从 CNN 到 Attention）</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;论文速览&lt;/h2&gt;
&lt;p&gt;| 论文 | 年份 | 方向 |
| --- | --- | --- |
| LeNet-5 | 1998 | CNN 早期代表：卷积+池化+端到端训练（IEEE 1998） |
| AlexNet | 2012 | ImageNet 突破：GPU+ReLU/Dropout 等（NeurIPS 2012） |
| VGG | 2014 | 3×3 小卷积核深层堆叠，迁移友好（ICLR 2015） |
| Inception-v1 (GoogLeNet) | 2014 | 多尺度并行卷积，控开销（CVPR 2015） |
| ResNet | 2015 | 残差连接，深层可训练（CVPR 2016） |
| DenseNet | 2016/2017 | 稠密连接，特征复用强、参数高效（CVPR 2017） |
| Transformer | 2017 | 自注意力范式：从 NLP 扩展到视觉（NeurIPS 2017） |&lt;/p&gt;
&lt;h2&gt;LeNet-5 (1998)&lt;/h2&gt;
&lt;h2&gt;AlexNet&lt;/h2&gt;
&lt;h2&gt;VGG&lt;/h2&gt;
&lt;h2&gt;Inception-v1 (GoogLeNet)&lt;/h2&gt;
&lt;h2&gt;ResNet&lt;/h2&gt;
&lt;h2&gt;DenseNet&lt;/h2&gt;
&lt;h2&gt;Transformer&lt;/h2&gt;</content:encoded><h:img src="https://img.20bytes.top/24965832e23c55f5ac27bee6ae970e7b.webp"/><enclosure url="https://img.20bytes.top/24965832e23c55f5ac27bee6ae970e7b.webp"/></item><item><title>目标检测发展进程</title><link>https://20bytes.github.io/blog/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B</link><guid isPermaLink="true">https://20bytes.github.io/blog/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B</guid><description>目标检测经典方法</description><pubDate>Sat, 21 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;方法分类总览&lt;/h2&gt;
&lt;p&gt;| 大类 | 子类 | 代表论文 |
| --- | --- | --- |
| Two-stage | R-CNN 系谱 | R-CNN（CVPR 2014）、SPPnet（ECCV 2014）、Fast R-CNN（ICCV 2015）、Faster R-CNN（NeurIPS 2015）、FPN（CVPR 2017）、Mask R-CNN（ICCV 2017） |
| One-stage | YOLO | YOLOv1（CVPR 2016）、YOLOv3（arXiv 2018）、YOLOX（arXiv 2021）、YOLOv5（Ultralytics）、YOLOv8（Ultralytics）、YOLO11（Ultralytics）、YOLOv12（arXiv 2025）、YOLO26（Ultralytics） |
| One-stage | Dense / Anchor(-free) | SSD（ECCV 2016）、RetinaNet / Focal Loss（ICCV 2017）、FCOS（ICCV 2019）、CenterNet（CVPR 2019）、ATSS（CVPR 2020）、GFL（CVPR 2021） |
| Transformer | ViT 预备工作 | ViT: An Image is Worth 16x16 Words（ICLR 2021） |
| Transformer | DETR 基线与改进 | DETR（ECCV 2020）、Conditional DETR（ICCV 2021）、Dynamic DETR（ICCV 2021）、Deformable DETR（ICLR 2021）、DAB-DETR（ICLR 2022）、DN-DETR（CVPR 2022）、DINO（ICLR 2023）、DQ-DETR（ECCV 2024）、DEIM（CVPR 2025）、D-FINE（ICLR 2025） |
| Transformer | 实时 DETR | RT-DETR（CVPR 2024）、RT-DETRv2（arXiv 2024）、RT-DETRv3（WACV 2025） |&lt;/p&gt;
&lt;h2&gt;Fast R-CNN 系列（Two-stage）&lt;/h2&gt;
&lt;h3&gt;R-CNN&lt;/h3&gt;
&lt;h3&gt;SPPnet&lt;/h3&gt;
&lt;h3&gt;Fast R-CNN&lt;/h3&gt;
&lt;h3&gt;Faster R-CNN&lt;/h3&gt;
&lt;h3&gt;FPN&lt;/h3&gt;
&lt;h3&gt;Mask R-CNN&lt;/h3&gt;
&lt;h2&gt;One-stage 经典 Dense/Anchor(-free) 路线&lt;/h2&gt;
&lt;h3&gt;SSD&lt;/h3&gt;
&lt;h3&gt;RetinaNet / Focal Loss&lt;/h3&gt;
&lt;h3&gt;FCOS&lt;/h3&gt;
&lt;h3&gt;CenterNet&lt;/h3&gt;
&lt;h3&gt;ATSS&lt;/h3&gt;
&lt;h3&gt;GFL&lt;/h3&gt;
&lt;h2&gt;YOLO 系列（One-stage）&lt;/h2&gt;
&lt;h3&gt;YOLOv1&lt;/h3&gt;
&lt;h3&gt;YOLOv3&lt;/h3&gt;
&lt;h3&gt;YOLOX&lt;/h3&gt;
&lt;h3&gt;YOLOv5（Ultralytics）&lt;/h3&gt;
&lt;h3&gt;YOLOv8（Ultralytics）&lt;/h3&gt;
&lt;h3&gt;YOLO11（Ultralytics）&lt;/h3&gt;
&lt;h3&gt;YOLOv12&lt;/h3&gt;
&lt;h3&gt;YOLO26（Ultralytics）&lt;/h3&gt;
&lt;h2&gt;Transformer 系列&lt;/h2&gt;
&lt;h3&gt;预备工作：ViT&lt;/h3&gt;
&lt;h3&gt;DETR 基线与改进&lt;/h3&gt;
&lt;h4&gt;DETR&lt;/h4&gt;
&lt;h4&gt;Conditional DETR&lt;/h4&gt;
&lt;h4&gt;Dynamic DETR&lt;/h4&gt;
&lt;h4&gt;Deformable DETR&lt;/h4&gt;
&lt;h4&gt;DAB-DETR&lt;/h4&gt;
&lt;h4&gt;DN-DETR&lt;/h4&gt;
&lt;h4&gt;DINO&lt;/h4&gt;
&lt;h4&gt;DQ-DETR&lt;/h4&gt;
&lt;h4&gt;DEIM&lt;/h4&gt;
&lt;h4&gt;D-FINE&lt;/h4&gt;
&lt;h3&gt;实时 DETR 分支&lt;/h3&gt;
&lt;h4&gt;RT-DETR（DETRs Beat YOLOs on Real-time Object Detection）&lt;/h4&gt;
&lt;h4&gt;RT-DETRv2&lt;/h4&gt;
&lt;h4&gt;RT-DETRv3&lt;/h4&gt;</content:encoded><h:img src="https://img.20bytes.top/c8b2cdbe96a0b3ca19a40571181d13e3.webp"/><enclosure url="https://img.20bytes.top/c8b2cdbe96a0b3ca19a40571181d13e3.webp"/></item><item><title>LLM 经典脉络回顾</title><link>https://20bytes.github.io/blog/%E5%A4%A7%E6%A8%A1%E5%9E%8B</link><guid isPermaLink="true">https://20bytes.github.io/blog/%E5%A4%A7%E6%A8%A1%E5%9E%8B</guid><description>按技术演进与公司谱系梳理 LLM 领域最具代表性的论文（Scaling Laws / 对齐 / 推理 / RAG / MoE / 代表模型）</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { ArxivRating, RatingCriteria } from &apos;@/components/advanced&apos;&lt;/p&gt;
&lt;h2&gt;脉络总览（按演进顺序）&lt;/h2&gt;
&lt;p&gt;| 阶段 | 主题 | 代表论文 |
| --- | --- | --- |
| 基础架构 | Transformer 统一序列建模 | Attention Is All You Need（NeurIPS 2017） |
| 预训练范式 | 编码器与通用表征 | BERT（NAACL 2019） |
| LLM 爆发 | 少样本能力与规模效应 | GPT-3 / Language Models are Few-Shot Learners（NeurIPS 2020） |
| 规模方法论 | Scaling Laws 与算力分配 | Scaling Laws for Neural Language Models（2020） |
| 规模方法论 | 计算最优训练（Chinchilla） | Training Compute-Optimal Large Language Models（NeurIPS 2022） |
| 外部知识 | RAG 检索增强生成 | Retrieval-Augmented Generation（NeurIPS 2020） |
| 稀疏计算 | MoE 扩展到万亿参数 | Switch Transformers（JMLR 2022） |
| 对齐与指令跟随 | RLHF 训练指令模型 | Training language models to follow instructions with human feedback（NeurIPS 2022） |
| 推理能力 | CoT 提示引出推理 | Chain-of-Thought Prompting（2022） |
| 开源高效 | 公开数据训练强 LLM | LLaMA（2023） |&lt;/p&gt;
&lt;h2&gt;基础架构&lt;/h2&gt;
&lt;h3&gt;Transformer&lt;/h3&gt;
&lt;h2&gt;预训练范式&lt;/h2&gt;
&lt;h3&gt;BERT&lt;/h3&gt;
&lt;h2&gt;LLM 爆发&lt;/h2&gt;
&lt;h3&gt;GPT-3&lt;/h3&gt;
&lt;h2&gt;规模方法论（Scaling）&lt;/h2&gt;
&lt;h3&gt;Scaling Laws&lt;/h3&gt;
&lt;h3&gt;Chinchilla / 计算最优训练&lt;/h3&gt;
&lt;h2&gt;外部知识与记忆&lt;/h2&gt;
&lt;h3&gt;RAG&lt;/h3&gt;
&lt;h2&gt;稀疏计算（MoE）&lt;/h2&gt;
&lt;h3&gt;Switch Transformers&lt;/h3&gt;
&lt;h2&gt;对齐与指令跟随（Alignment）&lt;/h2&gt;
&lt;h3&gt;InstructGPT / RLHF&lt;/h3&gt;
&lt;h2&gt;推理能力（Reasoning）&lt;/h2&gt;
&lt;h3&gt;Chain-of-Thought&lt;/h3&gt;
&lt;h2&gt;开源高效（Open LLM）&lt;/h2&gt;
&lt;h3&gt;LLaMA&lt;/h3&gt;
&lt;hr&gt;
&lt;h2&gt;公司 / 团队谱系（按机构分类）&lt;/h2&gt;
&lt;h2&gt;DeepSeek（算法 + 训练范式 + 模型演进）&lt;/h2&gt;
&lt;p&gt;| 方向 | 关键词 | 代表论文 |
| --- | --- | --- |
| 强化学习推理 | GRPO | DeepSeekMath（2024） |
| 推理能力 | RL 驱动推理 | DeepSeek-R1（2025） |
| 推理/泛化增强 | Training-Free GRPO | Training-Free GRPO（2025） |
| 模型迭代 | 高效开放模型 | DeepSeek-V3.2（2025） |
| 架构与扩展 | mHC | mHC: Manifold-Constrained Hyper-Connections（2025/2026） |
| 方法总结 | DeepSeek 范式 | DeepSeek: Paradigm Shifts and Technical Evolution…（2025） |&lt;/p&gt;
&lt;h3&gt;DeepSeekMath（GRPO）&lt;/h3&gt;
&lt;h3&gt;DeepSeek-R1&lt;/h3&gt;
&lt;h3&gt;Training-Free GRPO&lt;/h3&gt;
&lt;h3&gt;DeepSeek-V3.2&lt;/h3&gt;
&lt;h3&gt;mHC&lt;/h3&gt;
&lt;h3&gt;DeepSeek 范式总结（含 GRPO/MLA/MoE/MTP 等）&lt;/h3&gt;</content:encoded><h:img src="https://img.20bytes.top/21a08b750a2a89522be8c03f650b881d.webp"/><enclosure url="https://img.20bytes.top/21a08b750a2a89522be8c03f650b881d.webp"/></item><item><title>IsaacGym 环境搭建完整指南</title><link>https://20bytes.github.io/blog/isacc-gym</link><guid isPermaLink="true">https://20bytes.github.io/blog/isacc-gym</guid><description>详细记录在 Ubuntu 18.04 上搭建 IsaacGym 和 unitree_rl_gym 环境的完整流程，包括常见问题的解决方案</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. 前言&lt;/h2&gt;
&lt;p&gt;IsaacGym 是 NVIDIA 推出的高性能物理仿真环境，专为强化学习和机器人研究设计。本文详细记录了在 Ubuntu 18.04 系统上搭建 IsaacGym 和 unitree_rl_gym 环境的完整流程，以及在搭建过程中可能遇到的问题和解决方案。&lt;/p&gt;
&lt;h2&gt;2. 服务器配置&lt;/h2&gt;
&lt;p&gt;本次搭建使用的服务器配置如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作系统&lt;/strong&gt;：Ubuntu 18.04.6 LTS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;：Intel® Core™ i7-8700 CPU @ 3.20GHz × 12&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：15.6 GiB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储&lt;/strong&gt;：1.2 TB（可用 3.3GB）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：GeForce（具体型号未在文档中说明）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 安装步骤&lt;/h2&gt;
&lt;h3&gt;步骤 1：下载 unitree_rl_gym 项目&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;/home/ros-melodic/Desktop&lt;/code&gt; 目录下载 unitree_rl_gym 项目：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /home/ros-melodic/Desktop
git clone https://github.com/unitreerobotics/unitree_rl_gym.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/unitreerobotics/unitree_rl_gym&quot;&gt;unitreerobotics/unitree_rl_gym&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;步骤 2：创建 Conda 虚拟环境&lt;/h3&gt;
&lt;p&gt;使用 conda 建立虚拟环境，推荐使用 Python 3.8：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda create -n unitree_rl_gym python=3.8
conda activate unitree_rl_gym
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;步骤 3：安装 PyTorch 和 CUDA&lt;/h3&gt;
&lt;p&gt;安装 PyTorch 1.10.0 和对应的 CUDA 11.3 版本：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip3 install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;步骤 4：安装 Isaac Gym&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;从 NVIDIA 官网下载 Isaac Gym Preview 4：&lt;a href=&quot;https://developer.nvidia.com/isaac-gym&quot;&gt;https://developer.nvidia.com/isaac-gym&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将下载的 Isaac Gym 放入 &lt;code&gt;unitree_rl_gym-main&lt;/code&gt; 目录下便于管理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 Isaac Gym：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd isaacgym/python
pip install -e .
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;步骤 5：安装 rsl_rl 算法库&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：项目要求 rsl_rl 版本为 v1.0.2，并非最新 master 版本，且使用 pip 不能指定 v1.0.2 版本，需要通过 git 安装：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/leggedrobotics/rsl_rl.git
cd rsl_rl
git checkout v1.0.2
pip install -e .
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;步骤 6：设置 unitree_rl_gym 环境&lt;/h3&gt;
&lt;p&gt;返回 &lt;code&gt;unitree_rl_gym-main&lt;/code&gt; 目录，设置环境：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd ../unitree_rl_gym-main
pip install -e .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;重要注意事项&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;numpy 版本问题&lt;/strong&gt;：项目会默认安装 numpy 1.20.0 版本（过于古早），推荐使用 1.21.6 版本：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install numpy==1.21.6
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;setuptools 版本问题&lt;/strong&gt;：步骤 2 中安装的 Python 3.8 默认 setuptools 为 72.0.0 版本，可能会导致项目中 import 出现问题，推荐使用 58.0.0 版本，且不能使用 conda 安装：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install setuptools==58.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;步骤 7：测试 demo&lt;/h3&gt;
&lt;p&gt;运行 go2 机器人的训练脚本进行测试：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python legged_gym/scripts/train.py --task=go2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果能够正常运行，说明环境搭建成功。&lt;/p&gt;
&lt;h2&gt;4. 常见问题及解决方案&lt;/h2&gt;
&lt;h3&gt;问题：libpython3.8.so.1.0 缺失&lt;/h3&gt;
&lt;p&gt;在运行 Isaac Gym 时，可能会遇到 &lt;code&gt;libpython3.8.so.1.0&lt;/code&gt; 缺失的错误。以下提供两种解决方案：&lt;/p&gt;
&lt;h4&gt;方案 1：临时设置 LD_LIBRARY_PATH&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;确认 &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; 是否包含 conda 环境的库目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo $LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;查找 &lt;code&gt;libpython3.8.so.1.0&lt;/code&gt; 文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;find $(conda info --base) -name libpython3.8.so.1.0 2&gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;如果找到了文件（假设路径是 &lt;code&gt;/home/ros-melodic/mambaforge/envs/unitree_rl_gym/lib/&lt;/code&gt;），设置环境变量：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export LD_LIBRARY_PATH=/home/ros-melodic/mambaforge/envs/unitree_rl_gym/lib:$LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;永久设置（添加到 &lt;code&gt;~/.bashrc&lt;/code&gt;）：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &apos;export LD_LIBRARY_PATH=/home/ros-melodic/mambaforge/envs/unitree_rl_gym/lib:$LD_LIBRARY_PATH&apos; &gt;&gt; ~/.bashrc
source ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;方案 2：Conda 环境下永久解决方法&lt;/h4&gt;
&lt;p&gt;这是更优雅的解决方案，通过 conda 的环境激活/停用脚本来自动管理环境变量：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确定 &lt;code&gt;libpython3.8.so.1.0&lt;/code&gt; 位置：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo updatedb
locate libpython3.8.so.1.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是在 conda 虚拟环境中安装的，应该位于 &lt;code&gt;$CONDA_PREFIX/lib&lt;/code&gt; 目录。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;创建环境激活/停用脚本目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;conda activate unitree_rl_gym
cd $CONDA_PREFIX
mkdir -p ./etc/conda/activate.d
mkdir -p ./etc/conda/deactivate.d
touch ./etc/conda/activate.d/env_vars.sh
touch ./etc/conda/deactivate.d/env_vars.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;编辑 &lt;code&gt;activate.d/env_vars.sh&lt;/code&gt;，添加以下内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;编辑 &lt;code&gt;deactivate.d/env_vars.sh&lt;/code&gt;，添加以下内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 保存原始的 LD_LIBRARY_PATH
ORIGINAL_LD_LIBRARY_PATH=$LD_LIBRARY_PATH

# 要删除的目录
DIRECTORY_TO_REMOVE=&quot;$CONDA_PREFIX/lib&quot;

# 使用 grep 过滤掉要删除的目录项
NEW_LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr &apos;:&apos; &apos;\n&apos; | grep -v &quot;$DIRECTORY_TO_REMOVE&quot; | tr &apos;\n&apos; &apos;:&apos;)

# 设置新的 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$NEW_LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样设置后，每次激活 conda 环境时会自动添加库路径，停用环境时会自动移除，不会影响其他环境。&lt;/p&gt;
&lt;h2&gt;5. 总结&lt;/h2&gt;
&lt;p&gt;本文详细介绍了 IsaacGym 和 unitree_rl_gym 环境的搭建流程，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完整的 7 步安装流程&lt;/li&gt;
&lt;li&gt;关键依赖版本的选择（Python 3.8、PyTorch 1.10.0、numpy 1.21.6、setuptools 58.0.0）&lt;/li&gt;
&lt;li&gt;常见的 &lt;code&gt;libpython3.8.so.1.0&lt;/code&gt; 缺失问题的两种解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在搭建过程中，特别需要注意版本兼容性问题，尤其是 rsl_rl 必须使用 v1.0.2 版本，以及 numpy 和 setuptools 的版本选择。通过本文的指导，可以顺利完成 IsaacGym 环境的搭建，为后续的强化学习研究和机器人仿真打下基础。&lt;/p&gt;</content:encoded><h:img src="https://img.20bytes.top/d60f29a719f5ad99a1f217d633ff36a9.webp"/><enclosure url="https://img.20bytes.top/d60f29a719f5ad99a1f217d633ff36a9.webp"/></item><item><title>我的第一篇博文</title><link>https://20bytes.github.io/blog/begain-log</link><guid isPermaLink="true">https://20bytes.github.io/blog/begain-log</guid><description>这是 20bytes 的博客开启之路</description><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. 前言&lt;/h2&gt;
&lt;p&gt;作为 AI 领域的 Researcher，我深知技术更新换代的速度之快。为了更好地记录和分享我的学习
与研究过程，我决定开启个人博客。在这里，我将分享我的技术见解、研究成果以及日常生活点滴。&lt;/p&gt;
&lt;h2&gt;2. 我的博客的主要设计&lt;/h2&gt;
&lt;p&gt;本博客基于 Axi-Theme 主题，根据 Axi 的博客指导进行部署，主要记录 Posts 和 Paper Readings 两大类内容，
并拥有 Tags 和 Achives 页面，方便读者浏览和查找感兴趣的内容。&lt;/p&gt;</content:encoded><h:img src="https://img.20bytes.top/7335c2f7bec3acd97e8f13d55b9f0c1f.webp"/><enclosure url="https://img.20bytes.top/7335c2f7bec3acd97e8f13d55b9f0c1f.webp"/></item></channel></rss>