Skill: aurora-1412/arxiv-reader (version 1.0.3)

--- name: Arxiv Paper Reader description: 利用python，指定某个arxiv_id/url， 基于 LLM Agent 对这篇arxiv论文进行分类与深度阅读，直接print打印阅读笔记 metadata: {"openclaw":{"requires":{"bins":["uv"],"env":["LLM_API_KEY","LLM_BASE_URL","LLM_TEMPERATURE","LLM_MAX_TOKENS"]},"primaryEnv":"LLM_API_KEY"}} --- ## 快速开始 ### 1. 配置 `.env` ```bash cp .env.example .env # 或直接编辑 .env ``` 确定你已经配置了： - `LLM_API_KEY` — OpenAI 或兼容 API 的密钥 - `LLM_BASE_URL` — API 地址 ### 2. 运行 ```bash uv venv uv pip install -r "{baseDir}/requirements.txt" # 单篇论文模式：指定 arxiv_id 或 URL uv run python "{baseDir}/main.py" --arxiv-id 2401.12345 uv run python "{baseDir}/main.py" --arxiv-id https://arxiv.org/abs/2401.12345 uv run python "{baseDir}/main.py" --arxiv-id https://arxiv.org/pdf/2401.12345.pdf # 指定以特定类别阅读 uv run python "{baseDir}/main.py" --arxiv-id xxxx --category yyy # 查看所有类别 uv run python "{baseDir}/main.py" --list ``` ## 添加新的阅读分类 在 `skills/` 下新建文件夹，包含两个文件： ``` skills/your_new_category/ ├── _metadata.md # 分类描述（告诉 Classifier 什么论文属于这个类别） └── reading_prompt.md # 阅读指南（告诉 Reader Agent 重点关注什么） ``` 重启即可自动识别，无需修改任何代码。 ## Python包 - LangChain 1.x — Agent 框架（基于 LangGraph） - LangChain OpenAI — LLM 接口（兼容 DeepSeek 等 OpenAI-compatible API） - arxiv — 官方 Python 库 - arxiv-to-prompt 获取arxiv论文latex源码

path: main.py
content: #!/usr/bin/env python3
"""Single arXiv paper reader entrypoint.

Usage:
    python main.py --list
    python main.py --arxiv-id 2401.12345
    python main.py --arxiv-id https://arxiv.org/abs/2401.12345
    python main.py --arxiv-id 2401.12345 --category rag_and_retrieval
"""

from __future__ import annotations

import argparse
import sys

# Ensure project root is on sys.path
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent))

from arxiv_fetcher.fetcher import ArxivFetcher
from skills.loader import load_all_skills
from agents.classifier_agent import ClassifierAgent
from agents.reader_agent import ReaderAgent
from agents.summary_agent import SummaryAgent
from paper_reader.latex_parser import parse_latex
from utils.logger import get_logger

logger = get_logger("daily-arxiv")


def process_single_paper(arxiv_id_or_url: str, category: str | None = None) -> str:
    """Read one paper and return raw markdown text."""
    logger.info("=" * 60)
    logger.info("Single Paper Mode")
    logger.info("=" * 60)

    skills = load_all_skills()
    if not skills:
        raise RuntimeError("No skills loaded. Please check the skills/ directory.")

    fetcher = ArxivFetcher()

    logger.info(f"Fetching paper: {arxiv_id_or_url}")
    paper = fetcher.fetch_single_paper(arxiv_id_or_url)
    if not paper:
        raise RuntimeError("Failed to fetch paper.")

    selected_category = category
    if selected_category is None:
        classifier = ClassifierAgent(skills)
        selected_category = classifier.classify(paper["title"], paper.get("abstract", ""))

    if selected_category not in skills:
        valid = ", ".join(sorted(skills.keys()))
        raise ValueError(f"Unknown category '{selected_category}'. Available: {valid}")

    # Build agents
    reader_agents: dict[str, ReaderAgent] = {}
    for skill_name, skill_config in skills.items():
        if skill_name != "general":
            reader_agents[skill_name] = ReaderAgent(skill_name, skill_config)
    summary_agent = SummaryAgent(skills.get("general", {"reading_prompt": ""}))

    logger.info(f"Processing as category: {selected_category}")

    if selected_category != "general" and selected_category in reader_agents:
        notes = _deep_read(
            fetcher,
            reader_agents[selected_category],
            paper,
            summary_agent,
        )
        return notes

    return summary_agent.summarize(paper)


def _deep_read(
    fetcher: ArxivFetcher,
    reader: ReaderAgent,
    paper: dict,
    fallback_agent: SummaryAgent,
 ) -> str:
    """
    Attempt deep two-pass reading.
    """
    arxiv_id = paper["arxiv_id"]

    # Fetch LaTeX source
    latex_source = fetcher.fetch_latex_source(arxiv_id)
    if not latex_source:
        logger.warning(f"  No LaTeX source for {arxiv_id}, falling back to summary.")
        return fallback_agent.summarize(paper)

    # Parse LaTeX
    parsed = parse_latex(latex_source)

    if not parsed.abstract and not parsed.sections:
        logger.warning(f"  LaTeX parsing yielded nothing for {arxiv_id}, falling back.")
        return fallback_agent.summarize(paper)

    # Two-pass reading
    return reader.read_paper(paper, parsed)


# ── CLI ───────────────────────────────────────────────────────


def main():
    parser = argparse.ArgumentParser(
        description="Single arXiv paper reader"
    )
    parser.add_argument(
        "--list",
        action="store_true",
        help="List available paper categories (skills)",
    )
    parser.add_argument(
        "--arxiv-id",
        type=str,
        default=None,
        help="Read a single paper by arXiv ID or URL",
    )
    parser.add_argument(
        "--category",
        type=str,
        default=None,
        help="Optional: force a specific category (skill folder name)",
    )
    args = parser.parse_args()

    skills = load_all_skills()

    if args.list:
        for name in sorted(skills.keys()):
            print(name)
        return

    if not args.arxiv_id:
        parser.error("--arxiv-id is required unless --list is used")

    notes = process_single_paper(args.arxiv_id, category=args.category)
    print(notes)


if __name__ == "__main__":
    main()


path: requirements.txt
content: langchain>=1.2.9
langchain-openai>=1.1.7
requests>=2.31.0
python-dotenv>=1.0.0
arxiv>=2.1.0
arxiv-to-prompt


path: config.py
content: """
Global configuration module.
Loads all settings from .env file at project root.
"""

import os
from pathlib import Path
from dotenv import load_dotenv

# ── Project Root ──────────────────────────────────────────────
PROJECT_ROOT = Path(__file__).parent.resolve()
load_dotenv(PROJECT_ROOT / ".env")

# ── LLM ──────────────────────────────────────────────────────
LLM_BASE_URL = os.getenv("LLM_BASE_URL", "https://api.openai.com/v1")
LLM_API_KEY = os.getenv("LLM_API_KEY", "")
LLM_MODEL = os.getenv("LLM_MODEL", "gpt-4o")
LLM_TEMPERATURE = float(os.getenv("LLM_TEMPERATURE", "0.3"))
LLM_MAX_TOKENS = int(os.getenv("LLM_MAX_TOKENS", "16000"))

# ── Skills ───────────────────────────────────────────────────
SKILLS_DIR = PROJECT_ROOT / "skills"


path: .env
content: # ==========================================
# Daily Arxiv Paper Reader - Configuration
# ==========================================

# LLM Configuration (DeepSeek)
LLM_BASE_URL=https://api.deepseek.com/v1
LLM_API_KEY=
LLM_MODEL=deepseek-chat
LLM_TEMPERATURE=0.6
LLM_MAX_TOKENS=32000

# ArXiv Configuration
ARXIV_CATEGORIES=cs.AI,cs.LG,cs.CL,cs.CV
ARXIV_MAX_RESULTS=500
FETCH_LOOKBACK_DAYS=3


path: skills/loader.py
content: """
Skill Loader — scans the skills/ directory structure and loads
category metadata + reading prompts for each sub-folder.
"""

from pathlib import Path
from typing import Dict, Any

import config
from utils.logger import get_logger

logger = get_logger(__name__)

METADATA_FILE = "_metadata.md"
READING_PROMPT_FILE = "reading_prompt.md"


def _read_md(path: Path) -> str:
    """Read a markdown file, return empty string if missing."""
    if path.exists():
        return path.read_text(encoding="utf-8")
    return ""


def load_all_skills() -> Dict[str, Dict[str, Any]]:
    """
    Load every skill category from the skills/ directory.

    Returns:
        {
            "agent_systems": {
                "name": "agent_systems",
                "metadata": "<content of _metadata.md>",
                "reading_prompt": "<content of reading_prompt.md>",
            },
            ...
        }
    """
    skills_dir = config.SKILLS_DIR
    skills: Dict[str, Dict[str, Any]] = {}

    if not skills_dir.exists():
        logger.warning(f"Skills directory not found: {skills_dir}")
        return skills

    for child in sorted(skills_dir.iterdir()):
        if child.is_dir() and not child.name.startswith("_"):
            metadata = _read_md(child / METADATA_FILE)
            reading_prompt = _read_md(child / READING_PROMPT_FILE)

            if not metadata:
                logger.warning(
                    f"Skill '{child.name}' has no {METADATA_FILE}, skipping."
                )
                continue

            skills[child.name] = {
                "name": child.name,
                "metadata": metadata,
                "reading_prompt": reading_prompt,
            }
            logger.info(f"Loaded skill: {child.name}")

    return skills


def get_categories_description(skills: Dict[str, Dict[str, Any]]) -> str:
    """
    Build a textual description of all categories (used by the classifier).
    """
    lines: list[str] = []
    for name, info in skills.items():
        if name == "general":
            continue  # general is the fallback, not a classification target
        lines.append(f"### {name}\n{info['metadata']}\n")
    return "\n".join(lines)


path: skills/inference_accelerate/_metadata.md
content: # Inference Acceleration & Efficiency

本分类涵盖与 **模型推理性能优化、计算效率提升及部署技术** 相关的论文，包括但不限于：

* **模型压缩技术**：量化（PTQ/QAT）、权重/激活剪枝、稀疏化（Sparsity）、知识蒸馏（Distillation）。
* **推理算法优化**：投机采样（Speculative Decoding）、早停机制（Early Exit）、并行解码（Parallel Decoding）。
* **显存与带宽优化**：KV Cache 管理（如 PagedAttention）、长文本推理优化、模型并行（TP/PP）调度。
* **系统层与内核优化**：算子融合（Kernel Fusion）、FlashAttention 系列、低比特计算算子、定制化 CUDA Kernel。
* **硬件协同设计**：针对特定硬件（NVIDIA/AMD GPU、端侧 NPU/FPGA）的部署优化及硬件感知架构搜索（NAS）。
* **服务治理与调度**：连续批处理（Continuous Batching）、Prefill 与 Decode 分离、负载均衡。

**典型关键词**: inference, acceleration, latency, throughput, quantization, pruning, distillation, speculative decoding, KV cache, kernel fusion, PagedAttention, FlashAttention, efficiency, hardware-aware


path: skills/inference_accelerate/reading_prompt.md
content: # 推理加速论文阅读指南

阅读此类论文时，请记录以下要点：

### 1. 该加速方案针对什么场景？解决的核心瓶颈是什么？

* **目标模型与任务**：明确加速的对象（如 LLM、扩散模型、多模态、推荐系统等）。
* **核心瓶颈**：确定该方案解决的是 **显存受限（Memory-bound）**、**计算受限（Compute-bound）** 还是 **通信受限（Communication-bound）**？（例如：KV Cache 爆炸、自注意力计算量大、预填充阶段太慢等）。

### 2. 核心加速机制是什么？其技术实现逻辑是怎样的？

* **加速手段分类**：属于哪种技术路线？（如：量化 PTQ/QAT、剪枝、蒸馏、算子融合、投机采样、并行策略、KV Cache 管理、硬件协同设计等）。
* **具体细节**：详细描述论文中方法的实现细节，包括数学公式，代码分析等

### 3. 与主流 Baseline 的对比如何？该方案的“杀手锏”在哪？

* **对比对象**：是否与业内标准（如 vLLM, TensorRT-LLM, DeepSpeed-Inference, FlashAttention 等）进行了对比？
* **关键差异**：
* **精度 vs. 速度**：是否实现了无损加速？如果有损，精度下降了多少？
* **通用性**：是针对特定架构（如 Transformer）的定制优化，还是通用的框架优化？

* **核心优势**：例如“在长文本场景下比 vLLM 吞吐量高出 2 倍”或“首次在移动端实现了 Llama-3 的实时推理”。

### 4. 实验评估指标有哪些？在不同硬件/负载下的表现如何？

* **核心指标**：记录论文提供的 **首字延迟 (TTFT)**、**每个 Token 的延迟 (TPOT)**、**吞吐量 (Throughput)**、**显存占用 (VRAM)** 及 **加速比 (Speedup)**。
* **实验环境**：测试所用的硬件（如 A100, H100, 消费级 RTX 4090 或嵌入式端侧设备）。
* **结果分析**：该方案在什么情况下效果最明显？在什么情况下可能会失效或性能下降？

### 5. 该方案的部署难度与工程可行性如何？

* **兼容性**：是否需要重新训练模型？是否需要特殊的硬件指令集支持（如 NVIDIA Tensor Cores）？
* **集成成本**：是作为独立的推理引擎存在，还是可以作为插件集成到现有框架中？
* **开源情况**：作者是否提供了可复用的代码库或预编译算子？


---

**总结要求：**
注意：在有例子可举例时，你生成的笔记里一定要包含一个示例！示例是化抽象为具体，有助于理解的最好方法！
在最终生成笔记时，首先进行一句话总结（概括其核心创新点与加速效果），再按以上 5 点逐条回答，要求清晰、专业、直击技术痛点。


path: skills/agent_systems/_metadata.md
content: # Agent Systems

本分类涵盖与 **AI Agent / 智能体系统** 相关的论文，包括：

- AI Agent 架构设计（ReAct, Plan-and-Execute, Reflexion, AutoGuide），以及各类LLM multiagent框架设计
- 工具使用（Tool Use），skills，mcp相关
- Agent 记忆系统（Memory, RAG-augmented Agent）相关
- Agent 评估框架
- 设计broswer、search，deepresearch，具身智能、导航等垂域agent内容

注意，本类别主要聚焦于agent系统，并非agent/agentic模型训练。

**典型关键词**: agent, tool use, planning, multi-agent, function calling,
action, memory, decision-making, reflection, self-improvement


path: skills/agent_systems/reading_prompt.md
content: # Agent Systems 论文阅读指南

阅读此类论文时，请记录以下要点：

1. 论文的动机和核心创新点是什么？论文是如何建模一个问题的？
2. **Agent 架构设计**：系统整体架构是什么？有哪些模块/子agent、如何协作？每个模块的输入、功能和输出分别是什么？有没有反思等机制？
3. **工具使用方式**：Agent 如何选择和调用工具？工具接口如何设计？是否支持动态工具发现？
4. **记忆与状态管理**：如何管理长期记忆和短期上下文？是否使用外部存储？
5. **多 Agent 协作**（如涉及）：Agent 之间如何通信和协调？角色如何分配？
6. **评估方法**：使用了哪些评估指标(metric)和 Benchmark？能介绍一下这些benchmark吗？成功率如何衡量？
7. **与现有方法对比**：相比已有方法有何改进？
8. **局限性**：存在哪些未解决问题？是否有token消耗过大/时间过长/场景单一/依赖具体prompt等问题？

在最终生成笔记时，首先进行一句话总结，再按条回答上述问题，要严谨、专业。如果有上面没有提到的关键问题，也请在笔记中补充。


path: skills/llm_training/_metadata.md
content: # LLM Training & Alignment

本分类涵盖与 **大语言模型训练、微调和对齐** 相关的论文，包括但不限于：

- 预训练方法与架构改进（Scaling Laws, MoE, 新型 Attention 等）
- 监督微调（SFT）和指令微调（Instruction Tuning）
- RLHF / DPO / PPO 等对齐技术
- 数据工程（数据质量、数据配比、合成数据）
- 模型压缩与高效训练（量化、蒸馏、LoRA、Adapter）
- 长上下文训练与处理
- 安全对齐与价值对齐

**典型关键词**: pre-training, fine-tuning, RLHF, DPO, alignment, instruction tuning,
scaling law, LoRA, quantization, distillation, data curation, safety


path: skills/llm_training/reading_prompt.md
content: # LLM Training & Alignment 论文阅读指南

阅读此类论文时，请特别关注以下方面：

## 1. 训练范式与训练方法
- **训练范式**：明确指出论文使用的训练范式
  - 预训练（Pre-training）
  - 监督微调（SFT / Supervised Fine-tuning）
  - 指令微调（Instruction Tuning）
  - 强化学习（RL）：PPO、REINFORCE、RRHF 等
  - 偏好对齐：RLHF、DPO、IPO、KTO、ORPO 等
  - 持续学习（Continual Learning）
  - 其他范式（Multi-task Learning、Meta-learning 等）
  
- **训练方法**：明确指出具体的训练技术
  - 全参微调（Full Fine-tuning）
  - 参数高效微调：LoRA、QLoRA、Adapter、Prefix-tuning、P-tuning 等
    - 如果使用 LoRA：秩（rank）、alpha、目标模块、dropout 等配置
  - 量化训练：QAT、PTQ、具体 bit 数
  - 知识蒸馏（Knowledge Distillation）
  - 其他方法
  
- **相关领域**： 明确指出论文是针对垂域任务，还是通用任务

## 2. 算法核心细节（必须讲清楚）
- **具体优化点是什么**：
  - 相比 baseline 或已有方法，本文的创新改进在哪里？
  - 是改进了损失函数、采样策略、数据构建，还是其他？
  
- **损失函数**：
  - 完整的损失函数表达式（数学公式）
  - 各项的含义与权重配置
  - 是否有正则化项、辅助损失等
  
- **模型参数更新方式**：
  - 使用什么优化器（Adam, AdamW, SGD, Lion 等）？
  - 学习率设置与调度策略（常数、余弦衰减、线性 warm-up 等）
  - Batch size、梯度累积步数
  - 梯度裁剪、权重衰减等配置
  - 参数更新频率（特别是 RL 中的策略更新）

## 3. 训练数据
- **数据来源**：
  - 在哪些数据上进行训练？
  - 数据规模（样本数、token 数）
  - 数据类型（文本、代码、多模态等）
  
- **数据收集方式**：
  - 公开数据集、爬虫、人工标注、模型生成（self-instruct, distillation）？
  - 数据清洗与质量控制流程
  - 数据去重、过滤规则
  
- **数据配比与采样**：
  - 不同数据源的混合比例
  - 采样策略（均匀采样、重要性采样等）

## 4. 训练效果与实验结果
- **主要 Benchmark 表现**：
  - 在哪些评测集上测试？
  - 具体得分与 SOTA 对比
  
- **消融实验**：
  - 各组件/超参数的影响分析
  - 哪些因素对性能影响最大？
  - 消融实验的具体数据与结论
  
- **与已有方法的对比**：
  - 对比了哪些 baseline 或竞品方法？
  - 在相同数据/计算资源下的公平对比
  - 性能提升幅度与统计显著性

## 5. 其他关键要素
- **数据策略**：训练数据如何构建？数据质量如何保证？
- **架构创新**（如有）：在 Transformer 基础上做了哪些改进？
- **Scaling 分析**：是否有 scaling law 分析？不同规模模型的表现趋势？
- **效率优化**：计算效率、内存优化、训练加速方面有何创新？
- **局限性与展望**：尚有哪些不足，未来工作方向
---

请在生成笔记时使用以下结构：
- **一句话总结**
- **训练范式与方法**（明确列出范式和方法）
- **核心算法**：
  - 具体优化点
  - 损失函数（数学公式）
  - 参数更新方式
- **训练数据**：
  - 数据来源与规模
  - 数据收集与处理方式
- **实验结果**：
  - 主要 benchmark 得分
  - 与已有方法对比
- **消融实验要点**
- **创新点**
- **局限性**

要求准确、专业，对技术细节要具体明确，不能含糊其辞。


path: skills/rag_and_retrieval/_metadata.md
content: # RAG & Retrieval

本分类涵盖与 **检索增强生成（RAG）和信息检索** 相关的论文，包括但不限于：

- 检索增强生成（RAG）架构与优化
- 向量检索与嵌入模型
- 知识库构建与管理
- 文档解析与分块策略（Chunking）
- 查询改写与意图理解
- 混合检索（稀疏 + 稠密）
- 长文档处理与摘要

**典型关键词**: RAG, retrieval, embedding, vector search, knowledge base,
document parsing, chunking, reranking, hybrid search, dense retrieval


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)