研究论文工作流完整指南
Research Paper Workflow: From Search to Publication - Complete Guide
发布日期: 2026年2月13日
工作流版本: v1.0
核心工具: SearxNG + Python + Hugo + Git
📋 执行摘要
本文档完整记录了从论文搜索 → 综述撰写 → 博客发布的端到端工作流。这个工作流已在实际项目中验证,可以在 2.5-3.5 小时内完成一份高质量的学术综述发布。
关键成果:
- ✅ 自动化论文搜索(SearxNG)
- ✅ 系统化综述撰写(模板化)
- ✅ 一键博客发布(内外网同步)
- ✅ 完整的可复用流程
🎯 工作流概览
┌─────────────────────────────────────────────────────────────┐
│ 研究论文工作流全景 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 第一阶段:论文搜索 (10-15 分钟) │
│ ├─ 定义搜索关键词 (5-8 个) │
│ ├─ 使用 SearxNG API 搜索 │
│ ├─ 过滤 arXiv 学术论文 │
│ └─ 去重并排序 (目标: 20-40 篇) │
│ │
│ 第二阶段:综述撰写 (2-3 小时) │
│ ├─ 提取论文详细信息 │
│ ├─ 分析论文核心贡献 │
│ ├─ 撰写执行摘要和关键发现 │
│ ├─ 创建技术对比矩阵 │
│ └─ 提供实际系统启示 (4,000-5,000 字) │
│ │
│ 第三阶段:博客发布 (5 分钟) │
│ ├─ 格式化和验证 │
│ ├─ 运行发布脚本 │
│ ├─ 自动 Git 提交和推送 │
│ └─ Vercel 自动部署 │
│ │
│ 总耗时: 2.5-3.5 小时 │
│ │
└─────────────────────────────────────────────────────────────┘
🔍 第一阶段:论文搜索
工具配置
SearxNG Wrapper
- 地址: http://127.0.0.1:8765
- API Key:
eCsZLy8b384nYvT4T4ydkO66gBg2_LCI3L0Q_ZcOV30 - 格式: JSON
- 排序: date(最新优先)
搜索参数
| 参数 | 类型 | 必需 | 示例 | 说明 |
|---|---|---|---|---|
q | string | ✅ | multi+agent+system | 搜索词(用 + 替代空格) |
format | string | ✅ | json | 必须是 JSON |
api_key | string | ✅ | Your API key | 认证密钥 |
sort | string | ❌ | date | 按日期排序 |
filter_domain | string | ❌ | arxiv.org | 域名过滤 |
lang | string | ❌ | en | 语言过滤 |
基础命令
# 单个查询
curl "http://127.0.0.1:8765/search?q=agent+orchestration&format=json&api_key=eCsZLy8b384nYvT4T4ydkO66gBg2_LCI3L0Q_ZcOV30&sort=date" | jq '.results[] | select(.domain | contains("arxiv"))'
# 过滤 arXiv 论文
curl "http://127.0.0.1:8765/search?q=multi+agent+system&format=json&api_key=API_KEY" | jq '.results[] | select(.domain == "arxiv.org")'
Python 搜索脚本
#!/usr/bin/env python3
import subprocess
import json
from datetime import datetime, timedelta
API_KEY = "eCsZLy8b384nYvT4T4ydkO66gBg2_LCI3L0Q_ZcOV30"
BASE_URL = "http://127.0.0.1:8765/search"
def search_papers(queries, max_per_query=5):
"""使用 SearxNG 搜索论文"""
print(f"🔍 搜索论文...\n")
all_results = {}
for query in queries:
print(f"📝 搜索: {query.replace('+', ' ')}")
try:
cmd = f'curl -s "{BASE_URL}?q={query}&format=json&api_key={API_KEY}&sort=date"'
output = subprocess.check_output(cmd, shell=True, text=True, timeout=10)
data = json.loads(output)
if 'results' in data:
# 过滤 arXiv 论文
arxiv_results = [r for r in data['results'] if r.get('domain') == 'arxiv.org']
for result in arxiv_results[:max_per_query]:
arxiv_id = result.get('arxiv_id')
if arxiv_id and arxiv_id not in all_results:
all_results[arxiv_id] = {
'title': result.get('title'),
'url': result.get('url'),
'abstract': result.get('abstract', '')[:250],
'arxiv_id': arxiv_id,
'query': query
}
print(f" ✅ {result.get('title')[:60]}...")
except Exception as e:
print(f" ❌ 错误: {e}")
print(f"\n📊 总共找到 {len(all_results)} 个独特论文\n")
return all_results
# 使用示例
if __name__ == "__main__":
queries = [
"multi+agent+orchestration",
"agent+framework+coordination",
"LLM+agent+system",
"agent+collaboration+protocol",
"autonomous+agent+architecture",
"agent+workflow+management",
"multi+agent+protocol",
"agent+coordination+system",
]
papers = search_papers(queries, max_per_query=5)
# 保存结果
with open('/tmp/papers.json', 'w') as f:
json.dump(papers, f, indent=2, ensure_ascii=False)
print(f"✅ 结果已保存到 /tmp/papers.json")
关键点
✅ 端口: 使用 8765(Wrapper),不是 8080
✅ 格式: 必须指定 format=json
✅ 认证: 必须包含 api_key
✅ 过滤: 过滤 domain == 'arxiv.org' 获取学术论文
✅ 去重: 按 arxiv_id 去重
✅ 排序: 使用 sort=date 获取最新论文
📝 第二阶段:综述撰写
综述结构
1. 执行摘要 (Executive Summary)
- 核心发现
- 研究范围
- 主要贡献
2. 核心定义 (Core Definitions)
- 定义关键概念
- 建立术语体系
3. 论文详细分析 (Detailed Paper Analysis)
- 论文 1: 信息 + 核心贡献 + 启示
- 论文 2: ...
- 论文 3: ...
- 论文 4: ...
- 论文 5: ...
4. 论文关系图 (Relationship Diagram)
- 展示论文间的演进关系
- ASCII 图表
5. 关键研究发现 (Key Research Findings)
- 发现 1 + 结论
- 发现 2 + 结论
- 发现 3 + 结论
- ...
6. 技术对比矩阵 (Technical Comparison Matrix)
- 多维度对比
- 表格形式
7. 对 OpenClaw 的启示 (Implications for OpenClaw)
- 架构设计建议
- 实现方法论
- 最佳实践
8. 未来研究方向 (Future Research Directions)
- 短期 (6-12 个月)
- 中期 (1-2 年)
- 长期 (2+ 年)
9. 结论 (Conclusion)
- 核心观点总结
- 关键启示
- 行动建议
10. 参考文献 (References)
- 完整引用信息
Front Matter 模板
---
title: "English Title for Display"
date: 2026-02-13T05:00:00+08:00
draft: false
tags: ["tag1", "tag2", "tag3", "tag4", "tag5"]
description: '技术博客文章'
categories: ["Research", "Category1", "Category2"]
---
内容要求
| 要求 | 标准 | 说明 |
|---|---|---|
| 字数 | 4,000-5,000 | 学术级深度 |
| 论文数 | 5-10 | 代表性样本 |
| 结构 | 分层清晰 | H1/H2/H3 层级 |
| 图表 | ASCII + 表格 | 易于理解 |
| 实用性 | 包含启示 | 对实际系统的指导 |
| 语言 | 英文标题 | 内容可双语 |
撰写时间分配
| 部分 | 时间 | 说明 |
|---|---|---|
| 执行摘要 | 10 分钟 | 概览全文 |
| 每篇论文分析 | 15-20 分钟 | 5 篇 = 75-100 分钟 |
| 关键发现 | 15 分钟 | 提炼核心 |
| 对比矩阵 | 10 分钟 | 表格整理 |
| 启示和结论 | 15 分钟 | 实践指导 |
| 校对和格式 | 10 分钟 | 质量检查 |
| 总计 | 2-3 小时 | 5 篇论文 |
📤 第三阶段:博客发布
文件命名规范
格式: YYYY-MM-DD-descriptive-title.md
示例:
- ✅
2026-02-13-autonomous-agents-survey.md - ✅
2026-02-13-agent-orchestration-survey.md - ❌
autonomous-agents-survey.md(缺少日期) - ❌
survey.md(不规范)
发布脚本
python3 /home/chengzh/clawd/skills/blog-publish/scripts/publish_blog.py \
--file /tmp/survey.md \
--title "Your Survey Title"
发布位置
| 位置 | 路径 | 说明 |
|---|---|---|
| 本地博客 | /home/chengzh/myblog/content/posts/ | 开发环境 |
| 公网博客 | /home/chengzh/clean-vercel-blog/content/posts/ | 生产环境 |
| Git 仓库 | GitHub cloudzun/clean-vercel-blog | 版本控制 |
访问地址
发布后,文章可通过以下地址访问:
- 外网: https://blog.huaqloud.com/posts/YYYY-MM-DD-title/
- 内网: https://clawblog.huaqloud.com/posts/YYYY-MM-DD-title/
发布流程
1. 准备文件
├─ 验证文件名格式
├─ 检查 Front Matter
└─ 确认内容完整
2. 运行发布脚本
├─ 复制到本地博客
├─ 复制到公网博客
└─ 自动 Git 操作
3. 验证部署
├─ 检查本地文件
├─ 检查公网文件
├─ 验证 Git 提交
└─ 测试访问链接
4. 完成
├─ Vercel 自动部署
├─ 约 1-2 分钟后上线
└─ 分享链接
✅ 完整工作流检查清单
搜索阶段
- 定义搜索关键词(5-8 个多角度查询)
- 运行搜索脚本
- 验证结果数量(目标: 20-40 篇)
- 去重并按时间排序
- 选择 Top 5-10 篇进行深入分析
- 保存搜索结果到 JSON
撰写阶段
- 获取论文摘要和详细信息
- 组织论文信息结构
- 撰写执行摘要
- 详细分析每篇论文
- 论文信息(标题、作者、日期)
- 核心贡献
- 关键洞察
- 绘制论文关系图
- 提取 5-7 个关键研究发现
- 创建技术对比矩阵
- 撰写对 OpenClaw 的启示
- 撰写未来研究方向
- 撰写结论
- 校对和格式检查
- 验证字数(4,000-5,000)
发布阶段
- 确保文件名格式正确(YYYY-MM-DD-title.md)
- 验证 Front Matter 完整
- title
- date
- draft: false
- tags (5+ 个)
- categories (2+ 个)
- 运行发布脚本
- 验证本地博客发布
- 验证公网博客发布
- 检查 Git 提交信息
- 测试外网访问链接
- 测试内网访问链接
- 分享链接给用户
📊 性能指标
搜索性能
| 指标 | 数值 | 说明 |
|---|---|---|
| 单个查询 | 1-2 秒 | 包括网络延迟 |
| 8 个查询 | 10-15 秒 | 总搜索时间 |
| 平均论文数 | 32 篇 | 8 查询 × 4 篇/查询 |
| 去重后 | 20-30 篇 | 实际独特论文 |
撰写性能
| 阶段 | 时间 | 说明 |
|---|---|---|
| 执行摘要 | 10 分钟 | 概览全文 |
| 论文分析 | 75-100 分钟 | 5 篇 × 15-20 分钟 |
| 关键发现 | 15 分钟 | 提炼核心 |
| 其他部分 | 35-50 分钟 | 对比、启示、结论 |
| 总计 | 2-3 小时 | 完整综述 |
发布性能
| 步骤 | 时间 | 说明 |
|---|---|---|
| 文件准备 | 2 分钟 | 验证和格式化 |
| 脚本执行 | 1 分钟 | 复制和处理 |
| Git 操作 | 1-2 分钟 | 提交和推送 |
| Vercel 部署 | 1-2 分钟 | 自动部署 |
| 总计 | 5-7 分钟 | 完整发布 |
端到端时间
搜索: 10-15 分钟
撰写: 2-3 小时
发布: 5-7 分钟
────────────────────
总计: 2.5-3.5 小时
🐛 常见问题和解决方案
Q1: SearxNG 返回空结果
症状: 搜索返回 0 个结果
原因:
- API Key 错误
- 查询词不合适
- 网络连接问题
解决:
# 验证 API Key
curl "http://127.0.0.1:8765/search?q=test&format=json&api_key=YOUR_KEY"
# 尝试更简单的查询词
curl "http://127.0.0.1:8765/search?q=agent&format=json&api_key=YOUR_KEY"
# 检查网络连接
ping 127.0.0.1
Q2: JSON 解析失败
症状: json.JSONDecodeError: Expecting value
原因:
- 返回格式不是 JSON
- 端口错误
- API Key 错误
解决:
# 确保使用 port 8765(不是 8080)
curl "http://127.0.0.1:8765/search?q=test&format=json&api_key=KEY"
# 验证返回是否是 JSON
curl "http://127.0.0.1:8765/search?q=test&format=json&api_key=KEY" | head -c 100
Q3: 文件名格式错误
症状: 发布脚本报错 “Invalid filename”
原因: 缺少日期前缀
解决:
# ❌ 错误
autonomous-agents-survey.md
# ✅ 正确
2026-02-13-autonomous-agents-survey.md
Q4: 发布后无法访问
症状: 链接返回 404
原因:
- Git 推送失败
- Vercel 部署延迟
- 链接格式错误
解决:
# 检查 Git 状态
cd /home/chengzh/clean-vercel-blog
git status
# 检查最新提交
git log --oneline -3
# 等待 Vercel 部署(通常 1-2 分钟)
# 验证链接格式
# ✅ https://blog.huaqloud.com/posts/2026-02-13-title/
# ❌ https://blog.huaqloud.com/posts/title/
🚀 优化建议
搜索优化
-
多角度查询
- 使用 8-10 个不同角度的查询词
- 覆盖主题的不同方面
- 例: “agent”, “orchestration”, “framework”, “protocol” 等
-
时间过滤
- 指定时间范围(如最近 3 个月)
- 获取最新研究
-
质量过滤
- 按引用数排序
- 优先选择高影响力论文
撰写优化
-
使用模板
- 为每篇论文创建标准分析模板
- 加速撰写过程
-
重用结构
- 保存常用的架构图
- 复用对比矩阵格式
-
维持风格一致
- 建立术语表
- 统一表达方式
发布优化
-
自动化文件名
from datetime import datetime filename = datetime.now().strftime('%Y-%m-%d') + "-title.md" -
批量发布
- 一次发布多篇综述
- 减少重复操作
-
定期计划
- 每周发布一篇
- 建立内容日历
📚 完整工作流脚本
research_workflow.py
#!/usr/bin/env python3
"""
完整研究论文工作流
1. 搜索论文
2. 撰写综述
3. 发布到博客
"""
import subprocess
import json
import os
from datetime import datetime
from pathlib import Path
class ResearchWorkflow:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "http://127.0.0.1:8765/search"
self.papers = {}
def search(self, queries, max_per_query=5):
"""搜索论文"""
print(f"🔍 搜索论文...\n")
for query in queries:
cmd = f'curl -s "{self.base_url}?q={query}&format=json&api_key={self.api_key}&sort=date"'
output = subprocess.check_output(cmd, shell=True, text=True, timeout=10)
data = json.loads(output)
if 'results' in data:
for result in data['results']:
if result.get('domain') == 'arxiv.org':
arxiv_id = result.get('arxiv_id')
if arxiv_id and arxiv_id not in self.papers:
self.papers[arxiv_id] = result
print(f"✅ 找到 {len(self.papers)} 篇论文\n")
return self.papers
def publish(self, file_path, title):
"""发布到博客"""
print(f"📤 发布到博客...\n")
cmd = [
'python3',
'/home/chengzh/clawd/skills/blog-publish/scripts/publish_blog.py',
'--file', file_path,
'--title', title
]
subprocess.run(cmd, check=True)
filename = os.path.basename(file_path)
print(f"✅ 发布成功")
print(f"外网: https://blog.huaqloud.com/posts/{filename[:-3]}/")
print(f"内网: https://clawblog.huaqloud.com/posts/{filename[:-3]}/")
# 使用示例
if __name__ == "__main__":
api_key = "eCsZLy8b384nYvT4T4ydkO66gBg2_LCI3L0Q_ZcOV30"
workflow = ResearchWorkflow(api_key)
# 搜索
queries = ["query1", "query2", "query3"]
papers = workflow.search(queries)
# 发布
workflow.publish("/tmp/survey.md", "Survey Title")
🎯 总结
关键要点
- 完整工作流 - 从搜索到发布的端到端自动化
- 时间高效 - 2.5-3.5 小时完成高质量综述
- 质量保证 - 学术级内容 + 实践指导
- 易于复用 - 标准化流程和模板
- 自动化部署 - 一键发布到内外网
下一步
- ✅ 工作流已固化
- ✅ Skill 已创建
- ✅ 文档已发布
- ⏳ 建立定期发布计划
- ⏳ 集成到 OpenClaw 自动化系统
📖 参考资源
- Blog Publish Skill:
/home/chengzh/clawd/skills/blog-publish/SKILL.md - Research Workflow Skill:
/home/chengzh/clawd/skills/research-paper-workflow/SKILL.md - Memory:
/home/chengzh/clawd/memory/2026-02-13-research-workflow.md - SearxNG: http://127.0.0.1:8765
- Hugo Blog: https://blog.huaqloud.com/
文档作者: Claude (OpenClaw Assistant)
最后更新: 2026年2月13日 UTC
版本: v1.0
状态: 已验证和测试