ai-paper-reader
SKILL.md
AI 论文阅读笔记生成器
核心目标
生成可直接发布到技术社区的论文阅读笔记(知乎、掘金、公众号等)。
笔记要求:
- 内容完整:核心技术细节不遗漏,创新点深刻阐述
- 专业易读:技术博客风格,既有深度又便于理解
- 客观准确:基于论文内容分析,不添加主观臆断
- 深度思考:通过 Q&A 环节帮助读者深入理解
写作规范
应该做
-
专业准确的表述
- 使用领域内规范的术语
- 公式和符号严格对应论文原文
- 技术细节描述清晰无歧义
-
深入浅出的解释
- 复杂概念先给直觉,再给细节
- 用类比帮助理解抽象概念
- 公式逐项解释变量含义
-
结构清晰的组织
- 逻辑层次分明
- 重点内容突出
- 适当使用图表辅助说明
-
有价值的深度分析
- 分析设计选择背后的原因
- 对比与相关工作的异同
- 指出方法的适用范围和局限
必须避免
-
AI 套话和模板句式
- ❌ "本文的核心贡献是..."
- ❌ "该方法的优势在于..."
- ❌ "综上所述..."
- ❌ "值得注意的是..."
- ❌ "具有重要意义/广泛应用前景..."
-
空洞的总结和评价
- ❌ "这是一篇重要的工作"
- ❌ "为该领域提供了新思路"
- ❌ 不带具体分析的泛泛而谈
-
过度的格式装饰
- ❌ 大量 emoji
- ❌ 每句话都加粗
- ❌ 过多层级嵌套
-
不必要的第一人称
- ❌ "我认为..."
- ❌ "我的理解是..."
- 保持客观叙述视角
笔记结构
零、元信息(笔记开头)
每篇笔记开头需包含以下信息,帮助读者快速判断是否继续阅读:
> **论文**:Actions Speak Louder than Words: Trillion-Parameter Sequential Transducers for Generative Recommendations
> **作者**:Meta AI
> **发表**:ICML 2024
> **阅读时长**:约 15 分钟
> **难度**:⭐⭐⭐⭐ (需要 Transformer、推荐系统基础)
> **前置知识**:Attention 机制、DLRM、Scaling Law 概念
难度等级说明:
- ⭐ 入门级:无需专业背景
- ⭐⭐ 基础级:了解深度学习基础
- ⭐⭐⭐ 进阶级:熟悉相关领域
- ⭐⭐⭐⭐ 专业级:需要较深的领域知识
- ⭐⭐⭐⭐⭐ 专家级:涉及复杂数学或前沿研究
一、TL;DR
用 2-3 句话概括论文的核心创新,让没时间细读的读者快速抓住重点。
## TL;DR
DLRM 等传统推荐模型依赖大量人工特征且无法 scale,本文提出将推荐问题转化为序列生成问题。核心创新是 HSTU 架构:用 Pointwise Attention 替代 Softmax 来保留用户偏好的绝对强度信息,使推荐系统首次展现出类似 LLM 的 Scaling Law。
要求:
- 2-3 句话,不超过 100 字
- 必须包含:问题背景 + 核心方案 + 关键创新点
- 避免泛泛而谈,要有具体技术点
二、论文概述
简明扼要地回答三个问题:
- 解决什么问题:一句话描述
- 核心方案:一句话概括
- 主要贡献:2-3 点列举
## 论文概述
**问题**:大规模推荐系统无法像 LLM 一样通过增加计算量持续提升质量
**方案**:将推荐问题从"特征工程+判别式模型"转变为"序列建模+生成式模型"
**贡献**:
1. 提出 Generative Recommenders (GRs) 范式,实现推荐系统的 Scaling Law
2. 设计 HSTU 架构,用 Pointwise Attention 替代 Softmax 保留强度信息
3. 提出 M-FALCON 推理算法,实现高效的候选打分
三、背景与动机
说明现有方法的问题,以及为什么需要新方法:
- 现有方法怎么做的
- 存在什么问题/瓶颈
- 问题的根本原因是什么
四、核心方法(重点)
这是笔记的核心部分,要求完整、深入、不遗漏。
组织方式
-
整体架构
- 给出架构图
- 说明数据流向
- 标注关键模块
-
核心模块详解(对每个关键模块)
- 输入输出说明
- 核心公式 + 逐项解释
- 伪代码/代码实现
- 设计选择的原因分析
-
关键技术细节
- 训练策略
- 超参数设置
- 实现 tricks
示例格式
## 核心方法
### 整体架构
[架构图]
数据流:用户历史序列 → Embedding → HSTU Layers × L → 预测头
### HSTU Layer 详解
#### 输入输出
- 输入:X ∈ R^{N×d},N 为序列长度,d 为嵌入维度
- 输出:Y ∈ R^{N×d}
#### 核心公式
**Pointwise Projection**:
$$U, V, Q, K = \text{Split}(\phi_1(f_1(X)))$$
其中:
- $\phi_1$:SiLU 激活函数
- $f_1$:单层线性变换
- Split 将输出分为四个向量
**Spatial Aggregation**:
$$A(X)V(X) = \phi_2(Q(X)K(X)^T + r_{ab}) V(X)$$
关键点:使用 SiLU 而非 Softmax,保留注意力的绝对强度信息。
#### 代码实现
```python
class HSTULayer(nn.Module):
def forward(self, x):
# Pointwise Projection
projected = F.silu(self.proj_in(x))
u, v, q, k = projected.split([...], dim=-1)
# Spatial Aggregation (不是 Softmax!)
attn = F.silu(q @ k.T + self.rel_bias)
out = self.norm(attn @ v) * u
return x + self.proj_out(out)
设计分析
为什么用 SiLU 而不是 Softmax?
Softmax 会将注意力归一化到概率分布,这在推荐场景下会丢失重要信息...
### 五、实验分析
不是罗列数字,而是提炼关键结论:
- **主实验结果**:与 baseline 对比的核心发现
- **消融实验**:各组件的贡献分析
- **Scaling 分析**:计算量与性能的关系(如有)
- **局限性**:方法在什么情况下效果不好
### 六、深度理解问答
通过精心设计的问题,帮助读者深入理解论文的关键点。
**问答直接展示,不使用折叠**。
```markdown
## 深度理解问答
### Q1: 为什么 Softmax Attention 不适合推荐场景?
推荐场景需要预测用户偏好的**绝对强度**(如观看时长),而非只是**相对排序**。
考虑两个用户:
- 用户 A:10 次历史交互
- 用户 B:100 次历史交互
使用 Softmax 时,两者的注意力权重都会被归一化到 [0,1],导致"用户 B 更活跃"这一信息丢失。
而 Pointwise Attention 保留了累加的原始 magnitude,模型可以学到活跃度差异。
### Q2: HSTU 如何用 2 个线性层替代 Transformer 的 6 个?
标准 Transformer 每层需要:
- Q, K, V 投影:3 个线性层
- Output Projection:1 个线性层
- FFN:2 个线性层(扩展+压缩)
HSTU 的简化:
1. **融合 Q, K, V, U 投影**:一个线性层同时生成四个向量
2. **用 U 门控替代 FFN**:`output * U` 实现类似的非线性变换
代价是单层表达能力下降,但可以通过堆叠更多层来补偿。
### Q3: Stochastic Length 训练为什么能丢弃 70% token 而效果几乎不变?
关键在于用户行为的**统计特性**:
1. **时间重复性**:用户会反复与相似内容交互,信息冗余度高
2. **兴趣低秩性**:10000 次交互可能只涉及 20 个主要兴趣点
3. **最近优先**:采样时对最近行为加权,保留最相关的信息
只要采样数量大于兴趣类别数的一定倍数,就能以高概率覆盖所有兴趣。
七、总结与思考
客观总结论文的贡献和局限:
## 总结
### 核心贡献
- 证明了推荐系统可以遵循 Scaling Law
- 提出了适合推荐场景的 Attention 变体
### 局限性
- 冷启动场景:历史序列太短时优势不明显
- 计算成本:需要大量 GPU 资源
- 实时性:长序列推理的延迟挑战
### 适用场景
- 用户历史丰富的场景(>100 次交互)
- 有充足计算资源
- 对实时性要求不是极端严格
目录结构规范
论文和阅读笔记应组织在统一的子目录下,便于管理和检索:
paper-notes/
├── hstu/ # 每篇论文一个目录,使用简短名称
│ ├── paper.pdf # 原始论文 PDF
│ ├── README.md # 阅读笔记(主文件)
│ └── images/ # 提取的图表
│ ├── fig1_architecture.png
│ ├── fig2_method.png
│ └── fig3_scaling.png
│
├── attention-is-all-you-need/
│ ├── paper.pdf
│ ├── README.md
│ └── images/
│
└── din-deep-interest-network/
├── paper.pdf
├── README.md
└── images/
命名规范:
- 目录名:论文简称或关键词,小写,用
-连接 - 笔记文件:统一命名为
README.md,便于 GitHub 直接预览 - 图片目录:统一命名为
images/
图片命名规范:
fig{序号}_{类型}_{简述}.png
类型:
- arch: 架构图
- method: 方法流程
- result: 实验结果
- ablation: 消融实验
- compare: 对比图
示例:
- fig1_arch_overall.png
- fig2_method_attention.png
- fig3_result_scaling.png
Q&A 环节设计指南
问题类型
-
原理理解类
- 为什么这样设计?
- 与替代方案相比有何优势?
-
细节辨析类
- 某个符号/操作的具体含义
- 容易混淆的概念区分
-
边界条件类
- 什么情况下方法会失效?
- 假设条件是什么?
-
延伸思考类
- 能否迁移到其他场景?
- 有哪些可能的改进方向?
答案要求
- 直接展示:不使用折叠,读者可以顺畅阅读
- 有理有据:答案要有论证,不是简单断言
- 适当举例:用具体例子帮助理解
- 承认不确定:对于论文未说明的部分,可以标注"推测"
图表处理
必须提取的图表
- 整体架构图
- 核心方法流程图
- 关键实验结果(Scaling Law 曲线等)
图表说明规范

**图示内容**:HSTU 的整体架构,左侧为 DLRM 对比
**关键信息**:
- 输入为统一的物品-行为交替序列
- HSTU Layer 可以无限堆叠
- 输出为多任务预测头
**与正文对应**:第 3.2 节详细描述
图片提取工具
学术论文中的图表有两种类型,需要不同的提取方式:
| 类型 | 特点 | 提取方法 |
|---|---|---|
| 嵌入式图片 | 作者插入的 PNG/JPEG | get_images() |
| 矢量图形 | 架构图、流程图等绘制的图形 | cluster_drawings() |
方法 1: 提取嵌入式图片
适用于论文中直接插入的位图(如实验结果截图、照片等):
import fitz # PyMuPDF
import os
def extract_embedded_images(pdf_path, output_dir):
"""提取 PDF 中嵌入的位图"""
os.makedirs(output_dir, exist_ok=True)
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc[page_num]
images = page.get_images(full=True)
for img_idx, img in enumerate(images):
xref = img[0]
base = doc.extract_image(xref)
image_bytes = base["image"]
image_ext = base["ext"]
# 过滤过小的图片(可能是图标/装饰)
if base["width"] > 100 and base["height"] > 100:
output_path = f"{output_dir}/page{page_num+1}_img{img_idx+1}.{image_ext}"
with open(output_path, "wb") as f:
f.write(image_bytes)
doc.close()
方法 2: 提取矢量图形(推荐)
适用于论文中绑制的架构图、流程图、图表等矢量图形:
import fitz
import os
def extract_vector_figures(pdf_path, output_dir, dpi=200, min_size=100):
"""
使用 cluster_drawings() 识别矢量图形区域并截图
Args:
pdf_path: PDF 文件路径
output_dir: 输出目录
dpi: 输出分辨率(默认 200,可提高到 300 获得更清晰的图片)
min_size: 最小尺寸阈值,过滤装饰线条(默认 100pt)
"""
os.makedirs(output_dir, exist_ok=True)
doc = fitz.open(pdf_path)
figures = []
for page_num in range(len(doc)):
page = doc[page_num]
# 识别矢量图形的聚类区域
# x_tolerance/y_tolerance 控制相邻元素的合并距离
try:
drawing_rects = page.cluster_drawings(
x_tolerance=3,
y_tolerance=3
)
except Exception:
# 某些 PDF 可能不支持,跳过
continue
for idx, rect in enumerate(drawing_rects):
# 过滤过小的区域(可能是线条/装饰)
if rect.width < min_size or rect.height < min_size:
continue
# 扩展边界,避免裁切太紧
rect = rect + (-10, -10, 10, 10)
# 确保不超出页面边界
rect = rect & page.rect
# 高分辨率截图
zoom = dpi / 72
mat = fitz.Matrix(zoom, zoom)
pix = page.get_pixmap(matrix=mat, clip=rect)
output_path = f"{output_dir}/page{page_num+1}_fig{idx+1}.png"
pix.save(output_path)
figures.append({
"page": page_num + 1,
"path": output_path,
"rect": rect
})
doc.close()
return figures
方法 3: 手动指定区域截取
当自动识别效果不理想时,可手动指定坐标:
import fitz
def crop_figure(pdf_path, page_num, rect, output_path, dpi=200):
"""
从 PDF 指定页面裁剪特定区域
Args:
pdf_path: PDF 路径
page_num: 页码(从 1 开始)
rect: (x0, y0, x1, y1) 坐标,单位为点(pt),72pt = 1英寸
output_path: 输出图片路径
dpi: 分辨率
"""
doc = fitz.open(pdf_path)
page = doc[page_num - 1]
clip = fitz.Rect(rect)
zoom = dpi / 72
mat = fitz.Matrix(zoom, zoom)
pix = page.get_pixmap(matrix=mat, clip=clip)
pix.save(output_path)
doc.close()
# 使用示例:裁剪第 2 页的某个区域
# 坐标可通过 PDF 阅读器查看,或先用方法 2 识别后微调
crop_figure(
"paper.pdf",
page_num=2,
rect=(50, 100, 550, 400), # 左上角(50,100) 到 右下角(550,400)
output_path="./images/fig1_architecture.png"
)
智能提取(综合方案)
自动尝试多种方法,提取所有图表:
import fitz
import os
def smart_extract_figures(pdf_path, output_dir, dpi=200):
"""
智能提取论文中的所有图表
1. 先使用 cluster_drawings 识别矢量图形
2. 再提取嵌入式位图
3. 自动过滤和去重
"""
os.makedirs(output_dir, exist_ok=True)
doc = fitz.open(pdf_path)
results = {"vector": [], "embedded": []}
for page_num in range(len(doc)):
page = doc[page_num]
# 1. 提取矢量图形
try:
rects = page.cluster_drawings(x_tolerance=3, y_tolerance=3)
for idx, rect in enumerate(rects):
if rect.width > 100 and rect.height > 100:
rect = (rect + (-10, -10, 10, 10)) & page.rect
zoom = dpi / 72
pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom), clip=rect)
path = f"{output_dir}/p{page_num+1}_vec{idx+1}.png"
pix.save(path)
results["vector"].append(path)
except:
pass
# 2. 提取嵌入式图片
for img_idx, img in enumerate(page.get_images(full=True)):
xref = img[0]
base = doc.extract_image(xref)
if base["width"] > 100 and base["height"] > 100:
path = f"{output_dir}/p{page_num+1}_img{img_idx+1}.{base['ext']}"
with open(path, "wb") as f:
f.write(base["image"])
results["embedded"].append(path)
doc.close()
print(f"提取完成: {len(results['vector'])} 个矢量图, {len(results['embedded'])} 个位图")
return results
# 使用示例
results = smart_extract_figures("paper.pdf", "./images/")
常见问题
Q: 提取的图片包含多个 Figure 合在一起?
调小 x_tolerance 和 y_tolerance 参数(如 1-2),使聚类更严格。
Q: 同一个 Figure 被切成多块?
调大容差参数(如 10-20),使相邻元素合并。
Q: 某些 Figure 没有被识别?
- 可能是嵌入式图片,尝试
get_images()方法 - 使用手动指定区域的方法
Q: 图片模糊?
提高 dpi 参数到 300 或更高。
使用方式
基本用法
请阅读这篇论文,生成一篇专业的阅读笔记,适合发布到技术社区。
指定重点
请阅读这篇论文,重点分析:
1. HSTU 与标准 Transformer 的区别
2. Scaling Law 实验的设置和结论
3. 在工业场景的落地可行性
对比分析
请对比分析这两篇论文在 XXX 问题上的不同解法。
技术要求
内容完整性
- 核心公式必须包含,逐项解释
- 关键算法有伪代码实现
- 重要超参数和训练细节不省略
- 消融实验的关键结论要提炼
深度要求
- 分析"为什么这样设计"
- 与相关工作建立联系
- 指出方法的边界和局限
可读性
- 先直觉后细节
- 代码和公式配合
- 长公式分步解释
依赖配置
# 图片提取
pip install pymupdf
# PDF 转图片(可选)
pip install pdf2image
MCP 配置(可选)
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-filesystem", "/path/to/papers"]
},
"notion": {
"command": "npx",
"args": ["-y", "@notionhq/notion-mcp-server"],
"env": {
"OPENAPI_MCP_HEADERS": "{\"Authorization\": \"Bearer YOUR_TOKEN\", \"Notion-Version\": \"2022-06-28\"}"
}
}
}
}