# ai-science
**Repository Path**: ricky-theseus/ai-science
## Basic Information
- **Project Name**: ai-science
- **Description**: version A
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-24
- **Last Updated**: 2026-09-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🧬 AI Scientist Agent
**双管线科学前沿问题研究系统 · Classic 7-Agent + Co-Scientist Elo Tournament**
[](https://www.python.org/downloads/)
[](https://github.com/langchain-ai/langgraph)
[](https://dashscope.aliyun.com/)
[](https://fastapi.tiangolo.com/)
[]()
[]()
2026 挑战杯 · 阿里云专项赛(XH-202619)
---
## 目录
- [项目简介](#项目简介)
- [双管线架构](#双管线架构)
- [Classic 管线(文件驱动 · 7-Agent 协同)](#classic-管线文件驱动--7-agent-协同)
- [Co-Scientist 管线(Checkpoint 驱动 · Elo 竞技循环)](#co-scientist-管线checkpoint-驱动--elo-竞技循环)
- [管线切换(PIPELINE_MODE)](#管线切换pipeline_mode)
- [设计思路](#设计思路)
- [迭代自优化机制](#迭代自优化机制)
- [Judge 驱动的动态终止](#judge-驱动的动态终止)
- [Rubric 8 维度评估体系](#rubric-8-维度评估体系)
- [精度回滚与幂等写入](#精度回滚与幂等写入)
- [结构化直出策略](#结构化直出策略)
- [事实核查与反幻觉](#事实核查与反幻觉)
- [项目结构](#项目结构)
- [快速开始](#快速开始)
- [API 接口](#api-接口)
- [配置说明](#配置说明)
- [测试](#测试)
- [参考项目](#参考项目)
- [许可证](#许可证)
---
## 项目简介
AI Scientist Agent 接收 **Science 125 个前沿科学问题**之一,通过 7 个专业化 Agent 的协同工作,自动完成从问题分解到论文撰写的全流程研究:
```
输入: "后量子密码学的当前方法有哪些?它们在安全性和效率方面如何比较?"
↓
7-Agent 协同研究管线(多轮迭代)
↓
输出: 结构化研究报告(PDF / LaTeX / Markdown)+ 37篇引用论文 + 2个科学假设 + 证据验证
```
**核心特性:**
- 🔬 **双管线架构** — Classic 7-Agent 文件驱动管线 + Co-Scientist Elo 竞技循环管线,零冲突共存(ADR-12)
- 🔄 **多轮迭代自优化** — Judge 驱动的质量门控 + 反馈循环,自动决定继续迭代或输出
- 🏆 **Elo 锦标赛排名** — 假设两两对决、Elo 评分排序、近邻配对、6 策略进化变异
- 📊 **Rubric 8 维度评估** — 5 假设维度(Popper/Lakatos/Hempel 锚定)+ 3 计划维度,加权评分只记录不做门禁
- 📄 **双持久化模式** — Classic 文件驱动(JSON 文件流 + 断点续跑)| Co-Scientist Checkpoint 驱动(AsyncSqliteSaver + 状态恢复)
- 🧪 **事实核查 + 反幻觉** — 5 条确定性规则 + LLM 引用语义校验,杜绝伪造数据和虚假引用
- 📡 **REST API + SSE 实时推送** — 16 个端点 + 双模式 SSE(Classic 磁盘轮询 / Co-Scientist Checkpoint diff)
- ✅ **1068 项单元测试** — 全量 mock,零 API 调用即可跑通
---
## 双管线架构
系统提供**两套零冲突共存的管线**(ADR-12),通过 `PIPELINE_MODE` 环境变量切换:
| 特性 | Classic(`classic`) | Co-Scientist(`co-scientist`) |
|---|---|---|
| **拓扑** | 线性 7 节点 + 条件重跑边 | 循环 9 节点 + budget 驱动条件边 |
| **状态** | `PipelineState`(7 字段 thin TypedDict) | `CoScientistState`(20+ 字段,含 Pydantic 模型) |
| **持久化** | 文件驱动(`data/runs/{run_id}/*.json`) | Checkpoint 驱动(`AsyncSqliteSaver`) |
| **假设管理** | 扁平列表,每轮覆盖 | Elo 锦标赛排名 + 近邻配对 + 进化变异 |
| **迭代控制** | Feedback Agent 评分 + 收敛计数器 | Budget(成本/轮数/假设数)三重终止 |
| **输出** | 7 阶段 JSON + LaTeX/PDF | 10 字段报告 + LaTeX/PDF |
| **断点续跑** | 检测已存在阶段文件跳过 | LangGraph checkpoint 自动恢复 |
| **SSE 推送** | 磁盘轮询(`disk_poll`) | Checkpoint diff(`checkpoint_diff`) |
| **适用场景** | 单题深研、调试、Demo | 多假设竞技、成本控制、长时间运行 |
### Classic 管线(文件驱动 · 7-Agent 协同)
传统 LLM 应用通常将状态保存在内存中,一旦进程崩溃则全部丢失。Classic 管线采用**文件驱动架构(File-Driven Architecture)**,将管线的控制流与业务数据完全分离:
```mermaid
graph TB
subgraph "PipelineState(控制流 — 7 字段)"
S1["run_id"]
S2["run_dir"]
S3["iteration"]
S4["current_stage"]
S5["error"]
S6["max_iterations"]
S7["human_feedback"]
end
subgraph "data/runs/q_xxx/(业务数据 — 文件系统)"
F1["00_input.json"]
F2["01_supervisor_i1.json"]
F3["02_literature_i1.json"]
F4["03_hypothesis_i1.json"]
F5["04_evidence_i1.json"]
F6["05a_reflection_pre_i1.json"]
F7["05b_reflection_merge_i1.json"]
F8["06_feedback_i1.json"]
F9["07_writer.json"]
F10["final_report.json"]
F11["paper.pdf"]
end
S2 -->|"读写路径"| F1
S2 -->|"读写路径"| F2
S2 -->|"读写路径"| F3
S2 -->|"读写路径"| F9
```
**设计优势:**
| 特性 | 内存状态 | 文件驱动 |
|------|---------|---------|
| 进程崩溃恢复 | ❌ 全部丢失 | ✅ 从文件续跑 |
| API 无状态 | ❌ 需 Session | ✅ 每次从文件读取 |
| 断点调试 | ❌ 不可回溯 | ✅ 任意阶段可回看 |
| 并发安全 | ❌ 需加锁 | ✅ 文件系统天然隔离 |
| 前端解耦 | ❌ 绑定 WebSocket | ✅ REST + SSE 独立消费 |
7 个 Agent 按序执行,每个完成后将结果写入对应的 JSON 文件,下游 Agent 从文件读取上游产出:
```mermaid
graph LR
START((START)) --> Sup[Supervisor
问题分解]
Sup --> Lit[Literature
文献检索]
Lit --> Hyp[Hypothesis
假设生成]
Hyp --> Evi[Evidence
证据验证]
Evi --> RP[Reflection-Pre
初步评分]
RP --> RM[Reflection-Merge
综合评分]
RM --> FB[Feedback
反馈决策]
FB -->|ready_for_output=true| Wrt[Writer
论文撰写]
FB -->|ready_for_output=false
且 iter < max| Lit
Wrt --> END((END))
style Sup fill:#e1f5fe
style Lit fill:#fff3e0
style Hyp fill:#e8f5e9
style Evi fill:#fce4ec
style RP fill:#f3e5f5
style RM fill:#f3e5f5
style FB fill:#fff9c4
style Wrt fill:#e0f2f1
```
### Co-Scientist 管线(Checkpoint 驱动 · Elo 竞技循环)
受 Google Co-Scientist 论文(arXiv:2502.18864)启发,Co-Scientist 管线将假设管理从"每轮覆盖"升级为**Elo 锦标赛竞技循环**——假设两两对决、评分排序、近邻配对、进化变异,budget 驱动自动终止:
```mermaid
graph TB
START --> Supervisor
Supervisor --> Generation
Generation --> Reflection
Reflection --> Proximity
Proximity --> Ranking
Ranking --> Evolution
Evolution --> MetaReview
MetaReview -->|budget 未超额| Generation
MetaReview -->|budget 超额| Render
Render --> END
style Generation fill:#e3f2fd
style Reflection fill:#fff3e0
style Ranking fill:#fce4ec
style Evolution fill:#e8f5e9
style MetaReview fill:#f3e5f5
style Render fill:#e0f2f1
```
**核心节点:**
| 节点 | 职责 | 关键机制 |
|---|---|---|
| **Supervisor** | 解析研究目标,设定初始配置 | 生成 `goal` + `constraints` |
| **Generation** | 基于 goal + 进化提示生成新假设 | 6 策略(combinatorial / fact_density / inverse / mutation / recombination / random)|
| **Reflection** | 对每个假设做同行评审 + 幻觉检测 | 输出 `ReviewRecord`,标记 is_halucination |
| **Proximity** | 构建假设嵌入图,发现近邻簇 | DashScope text-embedding-v3,阈值 0.85 |
| **Ranking** | Elo 锦标赛两两对决,排名排序 | 初始 Elo 1200,K=32,3/2 维持因子 |
| **Evolution** | 根据 Elo 排名 + 近邻配对生成进化提示 | Matchmaker 近邻优先配对 + 去重 |
| **MetaReview** | 全局评估本轮进化质量,决定继续或终止 | Budget 三重终止:成本 / 轮数 / 假设数 |
| **Render** | 生成 10 字段报告 + LaTeX + PDF | ReportRenderer 输出 `research_overview` + `report` |
**终止条件(ADR-7,任一满足即 → Render):**
1. `money_spent >= budget_usd`(成本上限)
2. `len(meta_reviews) >= max_iterations`(最大迭代轮数)
3. `generation_count >= max_iterations × NUM_STRATEGIES`(辅助护栏)
**状态持久化:** `AsyncSqliteSaver`(LangGraph 原生 checkpointer),进程崩溃后自动从最近 checkpoint 恢复。
### 管线切换(PIPELINE_MODE)
两套管线**零冲突共存**(ADR-12),通过环境变量切换:
```bash
# Classic 7-Agent 文件驱动管线(默认)
export PIPELINE_MODE=classic
# Co-Scientist Elo 竞技循环管线
export PIPELINE_MODE=co-scientist
```
`pipeline_router.py` 根据 `PIPELINE_MODE` 返回对应的编译图 + SSE 策略:
- `classic` → `create_pipeline()` + `disk_poll` SSE
- `co-scientist` → `create_co_scientist_pipeline(checkpointer=...)` + `checkpoint_diff` SSE
---
## 设计思路
### 迭代自优化机制
单次 pass 的管线往往产出质量不稳定。我们引入**多轮迭代自优化**机制,由 Feedback Agent 在每轮结束时评估整体质量,决定是继续迭代还是输出结果:
```mermaid
sequenceDiagram
participant P as Pipeline
participant L as Literature
participant H as Hypothesis
participant E as Evidence
participant R as Reflection
participant F as Feedback
Note over P: 第 1 轮迭代
P->>L: 搜索文献
P->>H: 生成假设
P->>E: 验证证据
P->>R: 评分反思
P->>F: 综合反馈
F-->>P: score=4/10, ready=false
Note over P: 第 2 轮迭代(利用反思结果改进)
P->>L: 补充搜索
P->>H: 改进假设
P->>E: 补充验证
P->>R: 重新评分
P->>F: 综合反馈
F-->>P: score=7/10, ready=true
Note over P: 输出最终报告
```
**迭代改进策略:**
- Reflection 将上轮的 `knowledge_gaps` 和 `weaknesses` 注入下轮 prompt,引导 Agent 聚焦薄弱环节
- Feedback 维护 `convergence_counter`:连续 2 轮分数无提升则强制输出,避免无效循环
- `iteration_history` 记录每轮快照,支持前后对比展示
### Judge 驱动的动态终止
每个 Agent 完成后经过两层审查,**仅当两层都通过时才继续**,否则反馈给 Agent 重试:
```mermaid
graph TD
A[Agent 执行完成] --> B{min_iterations
是否满足?}
B -->|否| A
B -->|是| C[Script Review
确定性规则检查]
C -->|不通过| D[反馈问题给 Agent]
D --> A
C -->|通过| E[Judge Review
LLM 质量评估]
E -->|不通过| D
E -->|通过| F[✅ 终止,进入下一 Agent]
style C fill:#e3f2fd
style E fill:#f3e5f5
```
- **Script Review**(零成本):确定性规则检查字段存在性、数量阈值、引用合法性
- **Judge Review**(低成本 qwen-turbo):LLM 评估输出质量,返回 0-10 分 + 具体反馈
- **consecutive_review_fail** 计数器:连续失败 ≥ 3 次则强制通过(防止死循环)
### Rubric 8 维度评估体系
在 Judge 门控之外,系统提供一套**只记录不做门禁**的 Rubric 8 维度评分体系,锚定科学哲学经典框架,为迭代自优化提供定量改进信号:
**假设质量(5 维度)— reflection_merge 后评分:**
| 维度 | 锚定框架 | 0 / 5 / 10 锚点 |
|---|---|---|
| 可证伪性 (falsifiability) | Popper 1959 | 不可证伪 → 路径模糊 → 判别性实验二值化 |
| 新颖性 (novelty) | Lakatos 1978 | 复述已知 → 旧框架新角度 → 新理论框架 |
| 自洽性 (consistency) | 形式逻辑 | 自相矛盾 → 逻辑跳跃 → 闭环无矛盾 |
| 解释力 (explanatory_power) | Hempel 1948 | 单一现象 → 一类现象 → 统一多类现象 |
| 证据支撑 (evidence_support) | 贝叶斯认识论 | 无证据 → 间接证据 → 直接证据充分 |
**研究计划质量(3 维度)— research_plan 后评分:**
| 维度 | 0 / 5 / 10 锚点 |
|---|---|
| 可验证路径 (verifiable_path) | 无法落地 → 缺关键步骤 → 闭环可执行含判别条件 |
| 文献可信度 (literature_credibility) | 编造/不相关 → 真实但浅 → 真实权威直接支撑 |
| 跨学科迁移 (cross_disciplinary) | 只限本题 → 相邻可迁移 → 通用范式 |
- **加权总分**:按 `config/agents.yaml` 的 `rubric.hypothesis.weights` / `rubric.plan.weights` 加权汇总(默认可证伪性权重最高 0.25,可验证路径权重最高 0.45)
- **持久化**:per-iteration 文件(`05d_rubric_hypothesis_i{iter}.json` / `05e_rubric_plan_i{iter}.json`)+ `meta.json` 的 `rubric_history`,供 Phase 4 可视化画"科学目标指标随迭代的定量提升"曲线
- **注入**:上一轮低分维度(≤6)自动注入下一轮 hypothesis / research_plan 的 task prompt,引导 LLM 重点改进
### 精度回滚与幂等写入
管线支持**精确回滚**——当某个 Agent 失败时,仅删除该阶段文件,上游产出不受影响:
```mermaid
graph LR
subgraph "迭代 1 文件"
A1["01_supervisor_i1 ✅"]
A2["02_literature_i1 ✅"]
A3["03_hypothesis_i1 ❌"]
end
subgraph "迭代 2 文件"
B1["01_supervisor_i1 ✅ 不变"]
B2["02_literature_i2 ✅ 覆盖"]
B3["03_hypothesis_i2 ✅ 重试"]
end
A3 -->|"删除 + 重试"| B3
A1 -->|"保留"| B1
A2 -->|"重写"| B2
```
**`determine_failed_stages()`** 根据 `error` 和 `feedback.failed_stages` 精确定位失败阶段,仅回滚必要的文件。幂等写入保证:同迭代号同阶段的文件可直接覆盖,无副作用。
### 结构化直出策略
不同 Agent 使用不同的结构化输出策略,兼顾准确性与效率:
```mermaid
graph TB
subgraph "single_shot_json"
SS["Supervisor / Reflection / Feedback
无工具 Agent"]
SS --> SS1["单次 json_object 调用"]
SS1 --> SS2["structured_output 直接提取"]
end
subgraph "last_iter_json"
LI["Literature / Evidence
有工具 Agent"]
LI --> LI1["多轮 ReAct 工具调用"]
LI1 --> LI2["最后一轮 json_object"]
LI2 --> LI3["structured_output 提取"]
end
subgraph "writer_latex"
WL["Writer
纯文本输出"]
WL --> WL1["单次生成 LaTeX"]
WL1 --> WL2["内容质量检查"]
WL2 --> WL3["XeLaTeX 编译"]
end
```
- **single_shot_json**:无工具 Agent 直接 `response_format=json_object`,一次调用搞定
- **last_iter_json**:有工具 Agent 先执行多轮工具调用,最后一轮强制输出结构化 JSON
- **writer_latex**:Writer 生成 LaTeX 后经过内容质量检查(字数、段数、引用数)+ XeLaTeX 编译,不达标则重试
### 事实核查与反幻觉
LLM 生成内容存在幻觉风险(编造数据、虚假引用、时态不一致)。我们实现**5 条确定性规则 + LLM 引用语义校验**:
```mermaid
graph TD
L[LaTeX 输出] --> R1[Rule 1: Evidence-Gap
证据不足的假设
禁止确认性语言]
L --> R2[Rule 2: Citation-Existence
引用必须在
Paper Registry 中]
L --> R3[Rule 3: No-Fabrication
禁止伪造
实验数据]
L --> R4[Rule 4: Tense-Consistency
未验证假设
使用条件时态]
L --> R5[Rule 5: Minimum-Length
每 section ≥ 400 字符
总字数 ≥ 10000]
R1 --> P{发现问题?}
R2 --> P
R3 --> P
R4 --> P
R5 --> P
P -->|是| F[反馈给 Writer 重试]
P -->|否| C[LLM 引用语义校验
逐引用检查]
style R1 fill:#ffcdd2
style R2 fill:#f8bbd0
style R3 fill:#e1bee7
style R4 fill:#d1c4e9
style R5 fill:#c5cae9
style C fill:#b2dfdb
```
| 规则 | 检测目标 | 示例 |
|------|---------|------|
| Evidence-Gap | 证据不足却用确认语气 | ❌ "证明了X" → ✅ "可能X" |
| Citation-Existence | 引用不存在的论文 | ❌ `\cite{P99}` → ✅ 替换为 `[?]` |
| No-Fabrication | 编造实验数据 | ❌ "准确率 95.3%" → ✅ "预期准确率" |
| Tense-Consistency | 未验证假设用过去时 | ❌ "我们发现了" → ✅ "预计可能发现" |
| Minimum-Length | 内容过短 | ❌ section 仅 50 字 → ✅ ≥ 400 字 |
---
## 项目结构
```
ai-scientist/
├── config/ # 📋 配置驱动(改配置不改代码)
│ ├── agents.yaml # Agent 模型、prompt、工具、策略 + rubric 权重
│ ├── tools.yaml # 工具注册表
│ └── prompts/ # 各 Agent 的 Markdown prompt + JSON Schema
│ ├── supervisor.md
│ ├── literature.md
│ ├── hypothesis.md
│ ├── evidence.md
│ ├── reflection_pre.md
│ ├── reflection_merge.md
│ ├── feedback.md
│ ├── writer.md
│ ├── judge_system.md # Judge + Rubric 8 维度锚点
│ └── judge_agents.md # 各 Agent 评审维度 + rubric 子集
├── src/
│ ├── agent/ # 🤖 Agent 核心
│ │ ├── pipeline.py # Classic 7-Agent 管线(文件驱动)
│ │ ├── co_scientist_pipeline.py # Co-Scientist 管线(checkpoint 驱动)
│ │ ├── agents/ # Co-Scientist 节点
│ │ │ ├── generation_node.py # 6 策略假设生成
│ │ │ ├── reflection_node.py # 同行评审 + 幻觉检测
│ │ │ ├── proximity_node.py # 嵌入图 + 近邻簇
│ │ │ ├── evolution_node.py # 进化变异 + Matchmaker 配对
│ │ │ ├── meta_review_node.py # 全局评估 + budget 终止
│ │ │ └── supervisor_node.py # 目标解析
│ │ ├── ranking/ # Elo 锦标赛
│ │ │ ├── ranking_node.py # 锦标赛编排
│ │ │ ├── elo.py # Elo 评分引擎
│ │ │ ├── matchmaker.py # 近邻优先配对
│ │ │ └── adjudicators.py # 裁判(LLM / 规则)
│ │ ├── judge.py # 两层审查 + Rubric 8 维度评分
│ │ ├── rubric_io.py # Rubric 文件读写 + 注入
│ │ ├── react_loop.py # ReAct 循环引擎(工具调用 + Judge 审查)
│ │ ├── report_renderer.py # 10 字段报告 + LaTeX + PDF
│ │ ├── render_latex.py # xelatex 编译 + BibTeX 生成
│ │ ├── result_parser.py # LLM 输出 → ResearchState 映射
│ │ ├── review_manager.py # 即时审查 + 内容质量检查
│ │ ├── fact_check.py # 5 条确定性规则 + LLM 引用校验
│ │ ├── file_io.py # 文件读写 + 信封格式
│ │ └── ...
│ ├── state/ # Co-Scientist 状态契约
│ │ ├── schema.py # CoScientistState TypedDict(20+ 字段)
│ │ ├── checkpoint.py # AsyncSqliteSaver 工厂
│ │ └── reducers.py # keep_all / queue / override
│ ├── api/ # 🌐 REST API
│ │ ├── main.py # FastAPI 应用(16 个端点)
│ │ ├── pipeline_router.py # 双模式路由(classic / co-scientist)
│ │ ├── task_queue.py # SQLite 任务队列(FIFO + 并发上限)
│ │ ├── task_worker.py # 队列消费守护线程
│ │ └── sse.py # SSE 实时推送
├── frontend/ # 🖥️ Vue3 SPA
│ ├── src/ # 组件、Pinia store、设计 token
│ ├── dist/ # 生产构建(nginx 反代 → FastAPI :8000)
│ └── tests/ # Vitest 单测
├── tests/ # ✅ 测试(1068 项)
├── scripts/ # 🛠️ 运维脚本
│ ├── test_v41_e2e.py # 端到端测试(真实 API)
│ ├── batch_run.py # 批量运行 125 个问题
│ └── analyze_run.py # 运行结果分析
├── docs/ # 设计文档、spec、ADR
├── data/
│ ├── 125.md # Science 125 前沿问题
│ ├── runs/ # 运行产出(gitignored)
│ └── results/ # 批量结果(gitignored)
├── requirements.txt
└── .env.example
```
---
## 快速开始
### 1. 环境准备
```bash
# 克隆项目
git clone https://gitee.com/ricky-theseus/ai-science.git
cd ai-science
# 创建虚拟环境(需要 Python 3.11+)
python -m venv .venv
# 或使用 uv
uv venv --python 3.11
# 激活虚拟环境
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
# 安装依赖
uv pip install -r requirements.txt
```
### 2. 配置 API Key
```bash
# 复制环境变量模板
cp .env.example .env
# 编辑 .env,填入 DashScope API Key
# DASHSCOPE_API_KEY=sk-your-key-here
```
> API Key 获取:[阿里云 DashScope 控制台](https://dashscope.console.aliyun.com/)
### 3. 启动服务
选择管线模式(默认 `classic`):
```bash
# Classic 7-Agent 文件驱动管线
export PIPELINE_MODE=classic
# Co-Scientist Elo 竞技循环管线
export PIPELINE_MODE=co-scientist
```
**方式一:FastAPI 服务(推荐,供前端开发使用)**
```bash
uvicorn src.api.main:app --reload --host 0.0.0.0 --port 8000
```
启动后访问:
- API 文档(Swagger):http://localhost:8000/docs
- API 文档(ReDoc):http://localhost:8000/redoc
**方式二:Vue3 前端(开发模式)**
```bash
cd frontend
npm install
npm run dev
```
启动后访问:http://localhost:5173
**方式三:Vue3 前端(生产模式)**
```bash
cd frontend && npm run build
# dist/ 部署到 nginx,反代 /api → localhost:8000
```
### 4. 发起研究
**cURL:**
```bash
# 启动研究
curl -X POST http://localhost:8000/api/research \
-H "Content-Type: application/json" \
-d '{"question": "后量子密码学的当前方法有哪些?", "max_iterations": 3}'
# 返回: {"run_id": "q_20260810_110532", "status": "running"}
# 查询状态
curl http://localhost:8000/api/runs/q_20260810_110532/status
# 下载 PDF
curl -o report.pdf http://localhost:8000/api/runs/q_20260810_110532/pdf
```
**Python SDK:**
```python
import httpx
# 启动研究
resp = httpx.post("http://localhost:8000/api/research", json={
"question": "后量子密码学的当前方法有哪些?",
"max_iterations": 3
})
run_id = resp.json()["run_id"]
# SSE 实时监听
import sseclient
stream = httpx.get(f"http://localhost:8000/api/runs/{run_id}/stream", stream=True)
client = sseclient.SSEClient(stream)
for event in client.events():
print(event.data)
```
**Python 直调管线:**
```python
from dotenv import load_dotenv
load_dotenv()
from src.agent.pipeline import run_pipeline
result = run_pipeline(
question="后量子密码学的当前方法有哪些?",
max_iterations=3
)
print(f"PDF: {result.get('pdf_path')}")
```
---
## API 接口
完整接口文档见 [docs/api-reference.md](docs/api-reference.md),共 16 个端点:
| 方法 | 路径 | 说明 |
|------|------|------|
| `POST` | `/api/research` | 启动研究,返回 run_id |
| `GET` | `/api/runs/{run_id}/status` | 查询运行状态 |
| `GET` | `/api/runs/{run_id}/stream` | SSE 实时事件流 |
| `GET` | `/api/runs` | 列出所有运行 |
| `GET` | `/api/runs/{run_id}/files` | 列出运行文件 |
| `GET` | `/api/runs/{run_id}/stage/{name}` | 读取阶段输出 |
| `DELETE` | `/api/runs/{run_id}/stage/{name}` | 删除阶段文件 |
| `GET` | `/api/runs/{run_id}/report` | 获取最终报告 |
| `GET` | `/api/runs/{run_id}/pdf` | 导出 PDF |
| `GET` | `/api/runs/{run_id}/latex` | 导出 LaTeX 源码 |
| `GET` | `/api/runs/{run_id}/markdown-file` | 导出 Markdown |
| `GET` | `/api/agents` | 列出所有 Agent |
| `GET` | `/api/agents/{name}` | 获取单个 Agent |
| `PATCH` | `/api/agents/{name}` | 修改 Agent 配置 |
| `GET` | `/api/tools` | 列出所有工具 |
| `GET` | `/api/health` | 健康检查 |
---
## 配置说明
所有 Agent 配置集中在 `config/agents.yaml`,修改配置无需改代码:
```yaml
literature:
model: qwen-max # 使用的大模型
system_prompt_file: prompts/literature.md
output_strategy: last_iter_json # 结构化输出策略
tools: [arxiv_search, semantic_scholar_search]
mandatory_tools: [arxiv_search] # 必须调用的工具
max_iterations: 100 # 安全上限
min_iterations: 3 # 最少轮次
writer:
model: qwen-max
output_strategy: writer_latex
content_quality:
min_total_chars: 10000 # 正文最少 10000 字
min_section_chars: 800 # 每节最少 800 字
min_citations: 8 # 最少 8 条引用
max_retries: 10 # 质量不达标最多重试 10 次
```
**模型选择策略:**
| Agent | 模型 | 理由 |
|-------|------|------|
| Supervisor / Literature / Hypothesis / Writer | qwen-max | 需要高质量推理和长文本生成 |
| Evidence | qwen-plus | 验证逻辑相对简单,节约成本 |
| Reflection / Feedback / Judge | qwen-turbo | 评分和审查任务简单,追求速度 |
也可通过 API 动态修改:
```bash
curl -X PATCH http://localhost:8000/api/agents/literature \
-H "Content-Type: application/json" \
-d '{"model": "qwen-plus", "max_iterations": 5}'
```
---
## 测试
```bash
# 运行全部测试(mock 模式,零 API 调用,1068 项)
uv run pytest -q --ignore=tests/e2e -m "not slow"
# 查看覆盖率
uv run pytest --cov=src --cov-report=term-missing
# 运行 Rubric 专项测试
uv run pytest tests/test_rubric.py tests/test_rubric_io.py -v
# 运行单个模块测试
uv run pytest tests/test_pipeline.py -v
# 运行真实 API 端到端测试(需要 DASHSCOPE_API_KEY)
PYTHONPATH=. .venv/Scripts/python scripts/test_v41_e2e.py
```
当前测试状态:**1068 passed, 0 failed**
---
## 参考项目
本项目的设计借鉴了以下优秀开源项目的思路:
### [AI-Scientist](https://github.com/SakanaAI/AI-Scientist) — Sakana AI
> The First AI Scientist — LLM 驱动的自动化科学研究框架
**借鉴点:**
- 科学研究的流水线化拆解(idea generation → experimentation → paper writing)
- LLM 作为研究助手的角色定义
- 自动化论文撰写 + 同行评审机制
**我们的改进:** AI-Scientist 是单 Agent 端到端模式,我们拆分为 7 个专业化 Agent 协同,引入迭代自优化和质量门控机制,输出质量更稳定。
### [LangGraph](https://github.com/langchain-ai/langgraph) — LangChain
> 基于图结构的多 Agent 编排框架
**借鉴点:**
- StateGraph 的节点-边-条件路由模型
- 多 Agent 间的状态共享机制
- 条件循环(conditional edge)实现迭代
**我们的改进:** LangGraph 默认将所有状态存在内存中,我们改为文件驱动架构(PipelineState 仅 7 个控制字段 + 文件系统存储业务数据),提升了容错性和可观测性。
### [GPT-Researcher](https://github.com/assafelovic/gpt-researcher) — Tavily
> 自主研究 Agent,给定问题自动搜索、整理、生成报告
**借鉴点:**
- 多源搜索聚合(ArXiv + Semantic Scholar 等)
- 子问题分解驱动文献检索
- 结构化报告输出
**我们的改进:** GPT-Researcher 是单次 pass,我们引入 Judge 驱动的多轮迭代 + 精度回滚,输出质量从 4/10 可提升至 7+/10。
### [AutoGen](https://github.com/microsoft/autogen) — Microsoft
> 多 Agent 对话框架,支持 Agent 间的消息传递和协作
**借鉴点:**
- Agent 角色分工和职责边界
- 人类反馈注入(human-in-the-loop)
**我们的改进:** AutoGen 侧重对话式协作,我们侧重流水线式协同(每个 Agent 有明确的输入/输出 schema),更适合自动化科研场景。
---
## 许可证
本项目为 2026 挑战杯参赛作品,仅供学习和评审使用。
---
**Built with ❤️ for the 2026 Challenge Cup**