你是否曾经尝试用 AI 工具来写长篇文章,比如小说或技术报告,却发现它们总是在结构上卡壳,或者无法灵活调整思路?今天,我想和你聊聊 WriteHERE 这个框架。它是一个开源项目,专注于通过递归规划来帮助语言模型处理复杂的写作任务。简单来说,它让 AI 像人一样逐步分解任务,结合检索、推理和写作三种能力,来生成高质量的长文。

WriteHERE 不是那种固定流程的工具。它允许在写作过程中实时调整计划,这点特别实用。如果你对 AI 在写作中的应用感兴趣,或者想自己试试构建一个写作助手,这个框架值得一看。下面,我会一步步解释它的工作原理、安装方法和实际应用。如果你有具体问题,比如“WriteHERE 怎么安装?”或者“它在小说写作中表现如何?”,我会尽量在文章中直接回答。

WriteHERE 是什么?

WriteHERE 是一个开源框架,旨在通过人类般的适应性规划来革新长形式写作。不同于传统 AI 写作工具的刚性流程,它动态地将写作任务分解成可管理的子任务,并整合检索、推理和作曲三种基本能力。


  • 递归规划:将复杂任务分解成小块。

  • 异构整合:无缝结合不同类型任务。

  • 动态适应:根据上下文实时调整写作过程。

根据评估,这个方法在小说写作和技术报告生成上都优于现有技术。项目有一个网站:writehere.site,还有 arXiv 论文链接:https://arxiv.org/abs/2503.08275。

WriteHERE Architecture Overview

这个图展示了 WriteHERE 的架构概述。你可以看到任务如何被分解成一个有向无环图(DAG),其中包括不同类型的子任务。

最近有什么更新?

你可能好奇 WriteHERE 的最新进展。2025 年 9 月,这个项目的论文被 EMNLP 2025 接受为口头报告,将在苏州呈现。这是个好消息,表明它在学术界得到了认可。

WriteHERE 的核心原则

为什么选择 WriteHERE?它遵循开源哲学:


  • 完全开源:所有代码在 MIT 许可下免费使用、修改和分发。

  • 非商业:为研究和教育目的开发,没有商业利益。

  • 完全透明:系统架构和决策过程对用户可见。

  • 社区驱动:欢迎贡献、反馈和协作改进。

这些原则让它成为一个可靠的工具,如果你想深入修改代码或参与社区,这很合适。

WriteHERE 如何工作?

现在,让我们聊聊它背后的机制。传统方法依赖预定义的工作流和固定思维模式,先生成大纲再写作。但 WriteHERE 消除了这些限制,通过一个规划机制交织递归任务分解和执行。它支持异构任务分解,整合不同任务类型,并像人类写作一样动态适应。

在评估中,它在小说写作和技术报告生成上都超越了最先进的方法。

为什么需要递归规划?

想象你写一篇长报告:你可能需要先检索信息,然后推理结构,最后作曲文本。WriteHERE 将长形式写作视为一个规划问题,使用异构递归规划(HRP)来处理。

核心是三个认知任务类型:

  1. 检索任务:从环境中获取信息并更新到内存。
  2. 推理任务:基于可用信息推导新知识或决策。
  3. 作曲任务:生成满足要求的文本。

这些任务的信息流不同:检索增强内存,推理转换内存,作曲修改工作区。

Illustration of the WriteHERE framework

这个图展示了框架的核心:一个异构递归规划机制,将复杂写作目标分解成三个认知类别的基本子任务。过程表示为 DAG,使用状态-based 分层任务调度算法管理自适应交织的任务规划和执行。

The abstract flow of tasks

这里是任务的抽象流:箭头表示信息流,系统状态在箭头处被修改。

异构递归规划的细节

HRP 受分层任务网络规划(HTN)启发。每个任务分解成子任务,并递归应用,直到达到基本任务。分解时指定任务类型,这允许异构代理执行和类型-aware 分解。

算法使用状态-based 分层任务调度:任务图是一个 DAG,每个节点有类型、目标和依赖。状态包括 Active、Suspended 或 Silent。算法迭代选择 Active 任务,执行或进一步分解。

内存包括任务图和工作区,上下文控制检索相关知识。

如何开始使用 WriteHERE?

如果你想试试 WriteHERE,这里是详细指南。我会用步骤说明,因为安装和运行是很多人第一个问题:“WriteHERE 怎么安装和运行?”

先决条件


  • Python 3.6 或更高。

  • Node.js 14 或更高(用于前端)。

  • API 密钥:OpenAI(GPT 模型)、Anthropic(Claude 模型)、SerpAPI(用于报告生成的搜索功能)。

快速启动

你可以用两种方式运行:不带可视化界面(适合批量处理)或带可视化界面(实时监控)。

不带可视化运行

这更简单,如果你不需要实时查看过程。

  1. 设置环境

    python -m venv venv
    source venv/bin/activate
    pip install -v -e .
    
    # 创建 api_key.env 文件基于示例
    cp recursive/api_key.env.example recursive/api_key.env
    # 编辑文件添加你的密钥
    nano recursive/api_key.env
    
  2. 直接运行引擎

    cd recursive
    python engine.py --filename <input_file> --output-filename <output_file> --done-flag-file <done_file> --model <model_name> --mode <story|report>
    

    生成故事的例子:

    python engine.py --filename ../test_data/meta_fiction.jsonl --output-filename ./project/story/output.jsonl --done-flag-file ./project/story/done.txt --model gpt-4o --mode story
    

    生成报告的例子:

    python engine.py --filename ../test_data/qa_test.jsonl --output-filename ./project/qa/result.jsonl --done-flag-file ./project/qa/done.txt --model claude-3-sonnet --mode report
    

带可视化界面运行

这提供了一个 Web 界面来可视化和监控写作过程。

  1. 一键设置和启动

    ./setup_env.sh  # 一次性设置环境
    ./start.sh      # 启动应用
    

    这会:


    • 创建一个干净的 Python 虚拟环境。

    • 安装所有所需依赖。

    • 在端口 5001 启动后端服务器。

    • 在端口 3000 启动前端。

    • 在浏览器中打开 http://localhost:3000。

    自定义端口:

    ./start.sh --backend-port 8080 --frontend-port 8000
    

对于 Anaconda/Miniconda 用户

如果遇到依赖冲突:

./run_with_anaconda.sh

这创建一个名为 ‘writehere’ 的专用 Anaconda 环境,并运行服务器。自定义端口:

./run_with_anaconda.sh --backend-port 8080 --frontend-port 8000

手动安装

如果你喜欢手动设置:

后端设置

  1. 创建 Python 虚拟环境:

    python -m venv venv
    source venv/bin/activate
    
  2. 安装主要依赖:

    pip install -v -e .
    
  3. 安装后端服务器依赖:

    pip install -r backend/requirements.txt
    
  4. 启动后端服务器:

    cd backend
    python server.py
    

    自定义端口:

    python server.py --port 8080
    

前端设置

  1. 安装前端依赖:

    cd frontend
    npm install
    
  2. 启动前端开发服务器:

    npm start
    

    自定义端口:

    PORT=8000 npm start
    

故障排除

如果遇到问题,查看 Troubleshooting Guide 以获取常见问题和解决方案。

WriteHERE 的功能

WriteHERE 有这些功能:


  • 递归任务分解:将复杂写作任务分解成可管理子任务。

  • 动态整合:无缝结合检索、推理和作曲任务。

  • 适应性工作流:根据上下文和要求灵活调整写作过程。

  • 多功能应用:支持创意小说和技术报告生成。

  • 用户友好界面:直观的 Web 界面易于交互。

  • 实时可视化:查看代理的“思考过程”。

  • 透明操作:所有代理决策和过程对用户可见。

  • 完全可定制:修改提示、参数和工作流以适合你的需求。

项目结构

项目组织如下:

.
├── backend/               # 后端 Flask 服务器
├── frontend/              # React 前端
├── recursive/             # 核心引擎实现
│   ├── agent/             # 代理实现和提示
│   ├── executor/          # 任务执行模块
│   ├── llm/               # 语言模型集成
│   ├── utils/             # 实用函数和助手
│   ├── cache.py           # 缓存以提高效率
│   ├── engine.py          # 核心规划和执行引擎
│   ├── graph.py           # 任务图表示
│   ├── memory.py          # 内存管理
│   ├── test_run_report.sh # 生成报告的脚本
│   └── test_run_story.sh  # 生成故事的脚本
├── test_data/             # 测试示例数据
└── start.sh               # 一键启动脚本

实时任务可视化

使用可视化界面时,你可以看到任务执行过程实时更新,包括:

  1. 任务的分层分解。
  2. 当前正在处理的任务。
  3. 每个任务的状态(ready、in progress、completed)。
  4. 每个任务的类型(检索、推理、作曲)。

这帮助你理解复杂写作任务如何逐步分解和解决。

如何贡献?

如果你想参与,“WriteHERE 如何贡献?”是个常见问题。这里是指南:

代码贡献

  1. Fork 仓库,从 main 创建你的功能分支。
  2. 按照安装说明设置开发环境。
  3. 进行更改,确保遵循项目编码风格。
  4. 为新功能添加测试。
  5. 运行测试套件确保所有通过。
  6. 提交 pull request,清晰描述更改和益处。

错误报告和功能请求


  • 使用 Issues 标签报告 bug 或建议新功能。

  • 对于 bug,包括重现步骤、预期行为和实际行为。

  • 对于功能请求,描述你想要的功能及其对项目的益处。

文档改进


  • 通过修复错误、添加例子或澄清说明来改进文档。

  • 文档更改像代码更改一样通过 pull request 提交。

社区支持


  • 在 Issues 部分回答其他用户的问题。

  • 分享你的经验和用例。

开发指南


  • 遵循现有代码风格和架构。

  • 文档新函数、类和模块。

  • 写清晰的提交消息解释更改目的。

  • 保持 pull request 专注于单一功能或 bug 修复。

贡献同意你的贡献在项目 MIT 许可下。

引用 WriteHERE

如果你在研究中使用这个代码,请引用论文:

@misc{xiong2025heterogeneousrecursiveplanning,
      title={Beyond Outlining: Heterogeneous Recursive Planning for Adaptive Long-form Writing with Language Models}, 
      author={Ruibin Xiong and Yimeng Chen and Dmitrii Khizbullin and Mingchen Zhuge and Jürgen Schmidhuber},
      year={2025},
      eprint={2503.08275},
      archivePrefix={arXiv},
      primaryClass={cs.AI},
      url={https://arxiv.org/abs/2503.08275}
}

许可

MIT 许可。这个项目开源。你可以自由使用、修改和分发代码,用于研究、教育和个人目的。

深入了解:论文内容

现在,如果你对技术细节感兴趣,让我们聊聊论文“Beyond Outlining: Heterogeneous Recursive Planning for Adaptive Long-form Writing with Language Models”。它解释了 WriteHERE 如何解决长形式写作的挑战。

摘要

长形式写作代理需要灵活整合检索、推理和作曲。当前方法依赖预定义工作流和固定思维模式,导致适应性受限。WriteHERE 通过递归任务分解和三种任务类型的动态整合实现人类般的适应性写作。关键特征:1) 交织递归任务分解和执行的规划机制,消除写作工作流的限制;2) 异构任务分解的整合。评估显示它在小说写作和技术报告生成上优于最先进方法。

引言

长形式写作在叙事生成、学术研究和技术报告中很重要。LLM 在短文生成上出色,但长文保持一致性和适应性有限。近期进展强调预写作规划阶段,但这限制了写作过程中的适应性推理。

WriteHERE 统一写作和大纲在一个目标驱动框架下,使用三种认知任务:检索、推理、作曲。灵感来自 HTN 规划,将写作视为通过三种类别的基本任务实现目标。

相关工作

长形式写作方法采用多阶段范式,但设计特定场景,通用性有限。早期研究强调大纲的重要性。最近方法如 Plan-Write 扩展输出长度,但保持静态工作流。STORM 通过检索增强大纲,但大纲固定。Agent’s Room 使用多代理协作,但角色分工刚性。

任务分解改善 LLM 性能,如 chain-of-thought 和 ReAct。但对于长形式写作,平面规划有挑战。分层分解如 ADaPT 未处理检索和推理的整合。WriteHERE 处理写作任务的异构特性。

公式

写作代理系统是一个元组 Σ_𝒜 = (𝒜, ℳ, D, W),其中 𝒜 是代理内核,ℳ 是内部内存,D 是数据库,W 是工作区。

检索任务:t_a(i) 获取信息并更新内存。

推理任务:t_r(p, K) 基于 K 推导知识。

作曲任务:t_c(s, g, K) 生成文本。

写作规划问题:⟨t_c(g, s_0, K_0), T_p⟩,其中 T_p 是基本任务集。解决方案是实现目标的基本任务序列。

异构递归规划

递归规划:任务分解成子任务,直到基本。

类型整合:子任务指定类型,支持异构代理和类型-aware 分解。

假设:在分层分解中,所有子任务可指定为一个认知类型。

WriteHERE 框架

算法总结在伪代码中:使用内存 ℳ = (G, W),任务图 G,工作区 W。

循环直到所有任务 Silent:选择 Active 任务,获取知识,更新,检查是否原子(执行)或分解(TypedPlan),更新状态。

实验

在小说写作(Tell me a story 数据集)和报告生成(Wildseed 数据集)上评估,优于基线。

例如,一个生成的故事:关于 Emily、Kevin 和狗 Sprite 的山间周末,涉及焦虑和梦境。

潜在风险

幻觉:在事实密集任务中,检索缓解,但来源可能有局限。建议人类验证。

偏见:可能再现训练数据偏见。架构便于整合伦理审查。

许可附录

数据集如 WildSeek (CC BY-SA 4.0),Tell-me-a-story (CC BY 4.0)。

FAQ

WriteHERE 适合初学者吗?

是的,如果你有 Python 基础,它的用户友好界面和详细指南让入门容易。

WriteHERE 和其他 AI 写作工具有什么不同?

它动态适应,而非固定大纲,支持异构任务整合。

我能用 WriteHERE 生成小说吗?

能,使用 story 模式。例子在快速启动中。

如果安装失败怎么办?

检查 Troubleshooting Guide。

WriteHERE 支持哪些模型?

OpenAI GPT 和 Anthropic Claude,通过 API 密钥。

如何可视化过程?

用带界面运行,观察任务分解和状态。

WriteHERE 的性能如何?

评估显示在小说和报告上优于基线。

HowTo: 使用 WriteHERE 生成报告

  1. 准备输入文件,如 qa_test.jsonl。
  2. 设置环境和 API 密钥。
  3. 运行:python engine.py –filename ../test_data/qa_test.jsonl –output-filename ./project/qa/result.jsonl –done-flag-file ./project/qa/done.txt –model claude-3-sonnet –mode report
  4. 检查输出文件。

类似地生成故事。