Lunwentocode
将论文(Markdown格式)转换为可运行的Python代码(Mineru一键转化pdf为Markdown文件).
Install / Use
/learn @1sdv/LunwentocodeREADME
🎓 LunwenToCode - 科研论文/毕业论文代码生成系统
将论文Markdown自动转换为可运行的Python代码,可以在这里快速体验:https://modelscope.cn/studios/lcclxy/lunwentocode
目录
1. 项目概述
1.1 项目定位
LunwenToCode 是一个基于大语言模型(LLM)的智能代码生成系统,专门用于将科研论文或毕业论文自动转换为可运行的Python代码。系统采用多Agent协作架构,通过分析论文内容、识别研究方法、提取代码需求,最终生成完整的Python项目。
1.2 核心功能
| 功能 | 描述 | |------|------| | 📄 文稿解析 | 支持Markdown和PDF格式论文的读取与解析 | | 🔍 智能分析 | 自动识别论文类型、研究方法和代码需求 | | 💻 代码生成 | 根据论文内容生成完整的Python代码 | | ✅ 自动验证 | 语法检查、导入验证和自动修复 | | 📊 数据支持 | 支持额外Excel/CSV数据文件 |
1.3 支持的论文类型
- 实证研究 (Empirical) - 基于数据的实证分析
- 仿真研究 (Simulation) - 模拟仿真类研究
- 算法设计 (Algorithm) - 算法实现与优化
- 系统设计 (System Design) - 系统架构设计
- 数据分析 (Data Analysis) - 数据处理与分析
- 机器学习 (Machine Learning) - 机器学习模型
2. 系统架构
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────────────────┐
│ LunwenToCode 系统架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ 输入层 │ Markdown/PDF论文 + Excel/CSV数据文件 │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 工作流引擎 (Workflow) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Parser │ → │ Analyzer │ → │ Coder │ → │ Validator │ │ │
│ │ │ Agent │ │ Agent │ │ Agent │ │ Agent │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │
│ │ ↓ ↓ ↓ ↓ │ │
│ │ PDF转MD 提取需求 生成代码 验证修复 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ LLM 服务层 │ │
│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │
│ │ │ Analyzer LLM │ │ Coder LLM │ │ │
│ │ │ (论文分析专用) │ │ (代码生成专用) │ │ │
│ │ └─────────────────────┘ └─────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 输出层 │ Python项目 (代码文件 + requirements.txt + README) │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
2.2 双LLM架构设计
系统采用双LLM架构,将论文分析和代码生成任务分离:
| LLM类型 | 用途 | 使用的Agent | |---------|------|-------------| | Analyzer LLM | 论文内容分析、结构提取 | AnalyzerAgent, ParserAgent | | Coder LLM | 代码生成、代码修复 | CoderAgent, ValidatorAgent |
设计优势:
- 可以为不同任务选择最适合的模型
- 分析任务可使用擅长理解的模型
- 代码任务可使用擅长编程的模型
- 降低单一模型的负载压力
2.3 项目目录结构
lunwentocode/
├── app/ # 核心应用模块
│ ├── __init__.py
│ ├── agents/ # Agent实现
│ │ ├── __init__.py
│ │ ├── analyzer_agent.py # 内容分析Agent
│ │ ├── coder_agent.py # 代码生成Agent
│ │ ├── parser_agent.py # PDF解析Agent
│ │ └── validator_agent.py # 代码验证Agent
│ ├── core/ # 核心模块
│ │ ├── __init__.py
│ │ ├── base_agent.py # Agent基类
│ │ ├── llm.py # LLM封装
│ │ └── workflow.py # 工作流引擎
│ ├── schemas/ # 数据模型
│ │ ├── __init__.py
│ │ └── models.py # Pydantic模型定义
│ ├── config/ # 配置模块
│ │ ├── __init__.py
│ │ └── settings.py # 系统配置
│ └── utils/ # 工具函数
│ ├── __init__.py
│ ├── file_utils.py # 文件处理工具
│ ├── json_utils.py # JSON解析工具
│ └── logger.py # 日志工具
├── output/ # 输出目录
├── main.py # 命令行入口
├── app.py # Web界面入口(Gradio)
├── requirements.txt # 依赖列表
├── .env # 环境变量配置
└── README.md # 项目说明
3. 核心组件详解
3.1 工作流引擎 (ThesisToCodeWorkflow)
文件位置: app/core/workflow.py
工作流引擎是整个系统的核心调度器,负责协调各个Agent完成论文代码生成任务。
主要职责
- 任务管理 - 生成任务ID,创建工作目录
- 流程编排 - 按顺序调用各Agent
- 数据传递 - 在Agent之间传递处理结果
- 结果整合 - 生成最终的项目输出
核心方法
class ThesisToCodeWorkflow:
async def run(
self,
md_path: str, # 论文文件路径
data_dir: Optional[str], # 数据文件目录
output_dir: Optional[str] # 输出目录
) -> ProjectOutput:
"""执行完整的工作流"""
工作流六阶段
| 阶段 | 名称 | 描述 | |------|------|------| | Phase 1 | 读取Markdown文件 | 加载论文内容,支持PDF自动转换 | | Phase 2 | 数据文件扫描 | 扫描并提取Excel/CSV数据文件信息 | | Phase 3 | 内容分析 | 调用AnalyzerAgent分析论文 | | Phase 4 | 代码生成 | 调用CoderAgent生成代码 | | Phase 5 | 代码验证 | 调用ValidatorAgent验证并修复 | | Phase 6 | 生成项目 | 整合输出,生成完整项目 |
3.2 Agent基类 (BaseAgent)
文件位置: app/core/base_agent.py
所有Agent的抽象基类,采用无状态设计,每次调用独立无历史依赖。
设计特点
- 无状态: 每次LLM调用独立,不保留对话历史
- 统一接口: 所有Agent继承相同的基类
- 灵活调用: 支持普通调用和工具调用两种模式
核心方法
class BaseAgent(ABC):
@property
@abstractmethod
def system_prompt(self) -> str:
"""系统提示词 - 每个Agent必须实现"""
pass
@abstractmethod
async def run(self, *args, **kwargs) -> Any:
"""执行Agent任务 - 每个Agent必须实现"""
pass
async def call_llm(self, prompt: str, context: Optional[str] = None) -> str:
"""独立调用LLM(无历史依赖)"""
async def call_llm_with_tools(self, prompt: str, tools: List[Dict], ...) -> Any:
"""使用工具调用LLM"""
3.3 PDF解析Agent (ParserAgent)
文件位置: app/agents/parser_agent.py
负责将PDF论文转换为Markdown格式。
解析策略
PDF输入
│
├─── URL方式 ──→ 直接提交Mineru API
│
└─── 本地文件
│
├─── 尝试上传到Mineru API
│
└─── 失败则使用PyMuPDF本地解析(备用方案)
核心流程
- 判断输入类型 - URL或本地文件
- 调用Mineru API - 云端PDF转Markdown服务
- 轮询任务结果 - 等待转换完成
- 本地备用解析 - 使用PyMuPDF提取文本
- 结构化解析 - 使用LLM提取论文结构
输出结构
ParsedContent(
title="论文标题",
abstract="摘要内容",
keywords=["关键词1", "关键词2"],
chapters={"章节名": "章节内容"},
tables=[{"name": "表格名", "description": "描述"}],
raw_markdown="原始Markdown内容"
)
3.4 内容分析Agent (AnalyzerAgent)
文件位置: app/agents/analyzer_agent.py
分析论文内容,提取代码实现需求。
分析流程
ParsedContent输入
│
▼
┌───────────────────┐
│ 1. 确定数据来源 │ → DataSourceType
└───────────────────┘
│
▼
┌───────────────────┐
│ 2. 分析论文类型 │ → ThesisType + 研究方法
└───────────────────┘
│
▼
┌───────────────────┐
│ 3. 生成代码任务 │ → List[CodeTask]
└───────────────────┘
│
▼
┌───────────────────┐
│ 4. 确定技术栈 │ → tech_stack + libraries
└───────────────────┘
│
▼
AnalysisResult
代码任务类型
| 任务类型 | 描述 |
|----------|------|
| data_preprocessing | 数据预处理 |
| data_analysis | 数据分析 |
| model_training | 模型训练 |
| visualization | 可视化 |
| algorithm_impl | 算法实现 |
| statistical_test | 统计检验 |
| simulation | 仿真模拟 |
| utility | 工具函数 |
3.5 代码生成Agent (CoderAgent)
文件位置: app/agents/coder_agent.py
根据分析结果生成Python代码。
设计特点
- 无状态设计: 每个任务独立调用LLM,不依赖历史
- 工具调用: 使用OpenAI Function Calling生成结构化代码
- 上下文共享: 所有任务共享项目上下文信息
代码生成工具定义
CODER_TOOLS = [{
"type": "function",
"function": {
"name": "generate_code",
"parameters": {
"properties": {
"code": "完整的Python代码",
"file_name": "代码文件名",
"description": "代码功能描述",
"dependencies": "依赖的Python库列表"
}
}
}
}]
生成流程
- 构建上下文 - 整合项目背景、数据信息、任务列表
- 按优先级排序 - 按任务优先级顺序生成
- 独立生成代码 - 每个任务独立调用LLM
- 生成主程序 - 最后生成main.py协调所有模块
代码规范
- 代码必须完整、可直接运行
- 包含必要的import语句
- 添加清晰的中文注释
- 包含main函数作为入口
- 包含错误处理
3.6 代码验证Agent (ValidatorAgent)
文件位置: app/agents/validator_agent.py
验证生成的代码并自动修复错误。
验证流程
GeneratedCode输入
│
▼
┌───────────────────┐
│ 1. 语法检查 │ → ast.parse()
│ (失败则修复) │
└───────────────────┘
│
▼
┌───────────────────┐
│ 2. 导入检查 │ → 检查import语句
│ (失败则修复) │
└───────────────────┘
│
▼
┌───────────────────┐
│ 3. 静态分析 │ → 代码质量检查
└───────────────────┘
│
▼
ValidationResult
验证项目
| 检查项 | 方法 | 说明 |
|--------|------|------|
| 语法检查 | ast.parse() | 检查Python语法正确性 |
| 导入检查 | AST分析 | 检查import语句 |
| 静态分析 | AST遍历 | 检查main函数、异常处理、文档字符串 |
自动修复机制
- 最大重试次数: 5次(可配置)
- 使用LLM修复代码错误
- 修复后重新验证
- 超过重试次数返回失败
3.7 LLM封装 (LLM)
文件位置: app/core/llm.py
统一的LLM调用封装,基于OpenAI SDK。
特性
- 异步调用: 使用AsyncOpenAI客户端
- 超时控制: 默认5分钟超时
- 自动重试: 最多3次重试,指数退避
- 工具调用: 支持Function Calling
核心方法
class LLM:
