- AI 应用
- NLP
- 计算机视觉
- 教育
【免费下载链接】WriteGPT
由图灵的猫开发,基于开源GPT2.0的初代创作型人工智能 | 可扩展、可进化
导读
WriteGPT(又称 EssayKiller)是一个由 OCR 与 NLP 最新模型构建的生成式文本创作 AI 框架,目前第一版微调模型聚焦于高考议论文写作,能够端到端完成"试卷识别 → 文本摘要 → 文章生成 → 通顺度判分 → 自动排版 → 答题卡输出"的完整流水线。本文以仓库 README.md 为主线,结合各子模块源码(识别网络、BERT 摘要、GPT-2 生成、判分与排版),系统讲解其架构设计、模型构成、数据集处理、训练与推理命令,帮助读者完整掌握这套可扩展、可进化的创作型 AI 框架的落地路径。
项目背景与设计目标
WriteGPT 由图灵的猫(Y1ran)开发,定位为"通用型议论文创作人工智能框架,仅限交流与科普"。项目的核心目标并非复刻通用文本生成模型,而是构建一条针对**高考作文(议论文)**这一垂直场景的端到端生产链路:
- 输入是高考语文试卷的作文题目(纸质卷面);
- 通过 OCR 识别网络将卷面文字数字化;
- 由 BERT 摘要网络提炼题目主旨、过滤考试专用套话;
- 由 17 亿参数的 GPT-2 中文模型生成符合人类认知的文章;
- 由判分网络评估通顺度,再由排版脚本按高考作文格式规范重新分段;
- 最终通过外接 CNC 书写装置将成文写到答题卡上。
根据 README.md 的说明,多数生成文章经过测试可以达到正常高中生及格作文水平。这一设定决定了整个框架的技术选型:语言类 AI 的绝大部分参数集中在语言网络,识别与判分网络则保持轻量。
总体架构:五模块异构深度神经网络
整个框架分为 EAST、CRNN、BERT、GPT-2、DNN 五个模块,各模块网络单独训练、参数相互独立,推理阶段通过 pipeline 串联。README 给出的模型结构概览如下:
从仓库源码结构可以推断出该流水线的物理落点:
| 模块 | 仓库位置 | 职责 |
|---|---|---|
| EAST 文本检测 | RecognizaitonNetwork/(另有 CTPN 实现) | 定位卷面中的文本区域 |
| CRNN 文本识别 | RecognizaitonNetwork/densenet/、train/ | 对文本区域做字符识别 |
| BERT 文本摘要 | LanguageNetwork/BERT/ | 提炼作文题主旨、过滤题干套话 |
| GPT-2 文本生成 | LanguageNetwork/GPT2/ | 基于主旨句生成整篇议论文 |
| DNN 判分 | ScoringNetwork/ | 通顺度/流畅度打分与排版 |
整个 AI 的参数量分布极不均匀:GPT-2(15 亿)约占 88%,BERT(1.1 亿)约占 7%,识别网络与判分网络共占约 5%,这是典型的"语言类 AI"参数分布特征(README.md)。
输入与识别网络:从纸质试卷到数字化文本
输入
流水线的起点是高考语文试卷作文题(纸质图像)。识别网络的作用是将其转换为计算机可处理的文本,为后续语言网络提供干净的"题干"。
EAST 文本检测
EAST(Efficient and Accurate Scene Text Detector)是一个基于 FCN 的文本检测模型,能够在 720p 图像上以 13 帧/秒实时检测任意方向文本,其核心亮点(README.md):
- 简单管道即可实现当时较高精度的文本检测;
- 图像通过 FCN 处理产生像素级文本缩放图和几何图形多频道输出;
- 支持可旋转文本框,既能检测文本行也能检测单词。
数据集处理要求:中文文本识别数据集必须按原作者命名方式组织——图片与标注文本一一对应命名(如图片1.jpg与图片1.txt),即使使用 ICDAR2013 这类标准数据集也需修改命名方式;由于代码通过获取文件类型后按原类型重新命名保存,文本数据与图片数据需要分开处理(README.md)。
README 中给出的是 EAST 原项目的多 GPU 训练命令模板:
python multigpu_train.py --gpu_list=0 --input_size=512 --batch_size_per_gpu=14 \ --checkpoint_path=/tmp/east_icdar2015_resnet_v1_50_rbox/ --text_scale=512 \ --training_data_path=/data/ocr/icdar2015/ --geometry=RBOX --learning_rate=0.0001 \ --num_readers=24 --pretrained_model_path=/tmp/resnet_v1_50.ckpt需要说明的是,当前仓库实际托管的是CTPN 文本检测实现(位于 RecognizaitonNetwork/ctpn/),其检测配置集中在 text.yml:
EXP_DIR: ctpn_end2end NET_NAME: VGGnet ANCHOR_SCALES: [16] NCLASSES: 2 USE_GPU_NMS: True TRAIN: max_steps: 50000 SOLVER: Adam RPN_BATCHSIZE: 300 LEARNING_RATE: 0.00001 MOMENTUM: 0.9 GAMMA: 0.1 STEPSIZE: 30000 # 每迭代 STEPSIZE 次,LEARNING_RATE *= GAMMA RPN_POSITIVE_OVERLAP: 0.7 WEIGHT_DECAY: 0.0005 TEST: DETECT_MODE: O checkpoints_path: checkpoints/CTPN 训练入口为 train_net.py,使用 VGGnet 作为基础网络、加载data/pretrain_model/VGG_imagenet.npy预训练权重,并按text.yml中的max_steps迭代训练。仓库同时提供了已训练好的 CTPN 权重(checkpoints)与演示数据(data/demo),可直接运行 demo.py 体验检测效果。
CRNN 文本识别
文本识别部分参考了 chinese-ocr 项目,采用DenseNet + CTC的识别方案。仓库中的实现包括:
- densenet.py:定义 DenseNet 卷积结构(
conv_block/dense_block/transition_block),以 64 个初始卷积核起步,经三层 dense block(每层增长率为 8)逐步扩展到 128/192 通道,最终接TimeDistributed+ softmax 输出字符概率; - model.py:构建输入为
(32, None, 1)(高 32、宽可变、单通道)的模型,加载 weights_densenet.h5,通过argmax + 去重解码(decode函数)还原文本,并支持黑底白字自动反色等预处理逻辑; - train/train.py 与字符表 char_std_5990.txt。
数据准备:训练集约 364 万张图片,按 99:1 划分训练集与验证集。数据利用中文语料库(新闻 + 文言文),通过字体、大小、灰度、模糊、透视、拉伸等变换随机生成,覆盖汉字、英文字母、数字和标点共5990 个字符,每个样本固定 10 个字符、分辨率统一为 280x32。训练前需修改train/config.py中的train_data_root、validation_data_root与image_path(README.md)。
训练命令:
cd train python train.pyREADME 记录的 Keras 训练日志(DenseNet + CTC)显示,模型在第 3 个 epoch 即达到约 98% 的准确率,随后稳步提升:
Epoch 3/100 - loss: 0.1035 - acc: 0.9816 - val_loss: 0.1060 - val_acc: 0.9823 Epoch 8/100 - loss: 0.0645 - acc: 0.9903 - val_loss: 0.0771 - val_acc: 0.9888端到端识别流程:仓库中的 ocr.py 将 CTPN 检测与 DenseNet 识别串成一条链路:text_detect得到文本行包围盒 →sort_box按纵向坐标排序 →charRec逐框计算倾斜角、用仿射变换矫正后送入识别模型。此外还提供基于 OpenCV EAST 检测器权重(frozen_east_text_detection.pb)的独立检测脚本 text_detection.py 与视频版 text_detection_video.py。
语言网络:BERT 摘要 + GPT-2 生成的组合拳
BERT 文本摘要:提炼主旨,过滤套话
BERT(Bidirectional Encoder Representation from Transformers)本质是双向 Transformer 的 Encoder,其预训练创新在于Masked LM与Next Sentence Prediction两种任务,分别捕捉词语级与句子级的 representation。对比单向的 OpenAI GPT,BERT 的双向连接直觉上效果更好(README.md)。
Masked LM 规则:输入中 15% 的 token 会被随机改变,其中 80% 替换为[MASK]、10% 替换为随机 token、10% 保持不变但需要被预测。
下一句预测规则:50% 的下一句(随机)成为连续句子(Label = IsNext),50% 成为不关联句子(Label = NotNext)。
BERT 摘要模块的仓库实现位于 LanguageNetwork/BERT/:
- predict.py:加载 checkpoint 构建
Summarizer模型并执行预测,支持-encoder(transformer/rnn/baseline 等)、-batch_size、-test_from、-block_trigram、-visible_gpus等参数; - sentence_encoder.py:调用多语言 SentenceTransformer 为摘要候选句生成向量,并与原文拼接成带向量的扩展语料;
- 数据预处理链路见 utils/prepropress/data_builder.py。
README 给出的摘要训练命令为:
python run.py --model bert训练语料包括:哈工大的新浪微博短文本摘要数据集 LCSTS、教育新闻自动摘要语料 chinese_abstractive_corpus。
关键细节:测试阶段需要用正则表达式过滤考试专用词,包括"阅读下面的材料,根据要求写作"、"要求:xxx"、"请完成/请结合/请综合xx"等题干套话,保证进入生成阶段的是干净的主旨句。README 中给出的示例主旨句为:
人们用眼睛看他人、看世界,却无法直接看到完整的自己。所以,在人生的旅程中,我们需要寻找各种"镜子"、不断绘制"自画像"来审视自我,尝试回答"我是怎样的人""我想过怎样的生活""我能做些什么""如何生活得更有意义"等重要的问题。
GPT-2 文本生成:15 亿参数的中文议论文引擎
文本生成是整条流水线的核心输出模块,预训练语料来自 THUCNews 与 nlp_chinese_corpus,清洗后总文本量约15G;微调语料来自历年满分高考作文、优质散文集与近现代散文作品,约1000 篇(README.md)。预训练阶段参考 GPT2-ML 框架,使用 Quadro RTX 8000 训练 28 万步。
仓库中的 GPT-2 模块(LanguageNetwork/GPT2/)包含三档模型配置:
| 配置 | vocab_size | hidden_size | layers | heads | intermediate | 参数量级 |
|---|---|---|---|---|---|---|
| base.json | 50270 | 768 | 12 | 12 | 3072 | 基础档 |
| large.json | — | — | 24 | — | — | 大模型档 |
| mega.json | 8021 | 1536 | 48 | 24 | 6144 | 15 亿参数档 |
其中mega.json即线上 demo 使用的 1.5B 模型:48 层、hidden size 1536、24 个注意力头、intermediate 6144、最大位置编码 1024。分词使用 BERT 风格的分词器(tokenization.py),词表为 CLUE 中文词表 clue-vocab.txt(do_lower_case=True)。
微调数据流水线(README.md):
# 1、进入 dataset 目录,将原始语料转换为 JSONL(1024 长度、stride 768) python pre_data.py --filepath /data/home/share1/gpt2-ml-Finetune/data-mayun_xiugai \ --outfile /data/home/share1/gpt2-ml-Finetune/data/22.json # 2、生成 tfrecord 训练数据 python prepare_data.py -input_fn /data/home/share1/gpt2-ml-Finetune/data # 3、finetune CUDA_VISIBLE_DEVICES=0 python train/train_wc.py \ --input_file=/data/EssayKiller/gpt2-ml-Finetune/data/train.tfrecord \ --output_dir=/data/EssayKiller/gpt2-ml-Finetune/finetune_model \ --init_checkpoint=/data/EssayKiller/gpt2-ml/models/mega/model.ckpt-220000其中 pre_data.py 的实现细节值得注意:它以 stride 768、最大长度 1024 滑动切分长文本,并用三类正则过滤噪声——去掉段首非句首碎片(^[^。!?]*)、保留完整句子(.*[。!?])、剔除"高考满分作文""作者""译者""章节"等元信息词以及非中文/非标点字符,最后按。!?断句并以换行拼接。数据转换脚本 prepare_data.py 与示例数据 test.json 均可直接复用。
推理脚本:demo.py 是单机交互式生成入口,核心参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
-config_fn | configs/mega.json | 模型结构配置 |
-ckpt_fn | ../models/mega/model.ckpt | 微调 checkpoint |
-top_p | 0.95 | top-p 采样概率阈值 |
-min_len | 1024 | 生成最短长度 |
-eos_token | 102 | 结束符 token id |
-samples | 5 | 每次生成的篇数 |
-batch_size | 1 | 并行生成数量,超限自动分块 |
推理时,脚本用FullTokenizer将用户输入句子编码为 token id 序列,构造initial_context喂入sample函数,通过 top-p 采样逐 token 生成,最终调用coarse_formatter排版并逐字流式打印(immediate_print)。同一句可反复输入,每次输出都不相同;也可设置-samples一次生成多篇。
Colab 线上作文生成:三步上手
考虑到国内缺乏足够显存的免费 GPU 平台,项目将训练好的 AI 核心(Language Network 写作模块)配合 Google Drive 迁移到 Colab,开放文本生成功能:输入对应句子,AI 返回生成文章;同一个句子可输入多次,每次输出不同,也可选择同时生成多篇(README.md)。完整 Notebook 见 colab_online.ipynb。
- 第一步:安装环境—— 在首个代码单元安装固定版本依赖(pandas 0.24.2、regex 2019.4.14、numpy 1.18.4、tensorflow-gpu 1.15.2 等):
- 第二步:加载模型—— 克隆项目并下载 1.5B 微调 checkpoint(
model.ckpt-280000):
- 第三步:文章生成—— 设置"作文最小篇幅"(默认 1024,范围 800~1024 个汉字,越短表现越好)与"生成作文篇数"(默认 1,最多 100),随后执行:
PYTHONPATH=$(pwd) python scripts/demo.py -ckpt_fn finetune/trained_models/model.ckpt-280000 \ -min_len $作文最小篇幅 -samples $生成作文篇数 PYTHONPATH=$(pwd) python scripts/formatter.py -org_text result.txt- 写作效果:生成完成后自动调用排版脚本输出格式化文章:
判分网络与排版脚本
DNN 判分:通顺度打分
判分部分直接调用百度 API 的通顺度打分能力(DNN_Scorer.py),其原理是语言模型:通过计算给定词组成的句子的概率,判断句子是否符合客观语言表达习惯,通常用于机器翻译、拼写纠错、语音识别、问答系统等场景。脚本按 125 字符步长将长文切句,逐句请求 API 获取 ppl(困惑度)分数并求和作为整篇通顺度依据(README.md)。DNN_API 的 Java 调用封装见 DNN_API.java。
高考排版器 AutoFormatter
由于模型输出不保证换行与分段,需要排版脚本按高考作文规范重排。标题部分复用 BERT 摘要生成的 Top3 NER 粒度 token 作为标题;主体部分遵循议论文格式要求(README.md):
- 标题居中,一般少于 20 字;
- 每段段首缩进两格;
- 每个字符尽量保持在字体框内;
- 字数不能过长或过短。
排版脚本 formatter.py 实现了coarse_formatter:以句号切分全文,按"开头 3 句 + 中间每 5 句 + 段尾若干句"的统计规律分段,每段段首加 4 个空格缩进;短文本(不足 10 句)则退化为三段式划分。线上版还实现了immediate_print打字机式输出(逐字打印并随机间隔 0.05s)。仓库另有更精细的排版模块 ScoringNetwork/AutoFormatter/(含 formatter.py、sentence_produce.py、token_reader.py 等)。README 指出:大多数情况下分段排版的结果都比较合理。
输出:答题卡与外接 CNC 书写装置
流水线的最终输出是答题卡。仓库展示了识别、排版后的成品效果:
书写装置基于 aedraw——一款开源的 CNC(Computer Numerical Control,数控机床)画图机器人,支持绘制图案、写字,也可升级为激光雕刻等用途。原版输出临摹装置存在速度慢和格式不准的问题,项目通过改装硬件与修改源码(grbl_output_machine)加以优化,将排好的作文通过外接装置直接书写到答题卡上(README.md)。需注意:当时的手写装置偶尔存在漏写、越格问题,展示视频中的作文经过后期人工处理补上了漏字。
本地运行环境
README 记录的开发环境(README.md)基于 TF 1.x 生态,Docker 化安装脚本见 setup.sh(基于tensorflow/tensorflow:1.15.0-gpu-py3-jupyter):
| 依赖 | 版本 |
|---|---|
| Ubuntu | 18.04.2 |
| Tensorflow-gpu | 1.15.2 |
| Tensorboard | 1.15.2 |
| Pandas | 0.24.2 |
| Numpy | 1.16.2 |
| OpenCV | 3.4.2 |
| h5py | 2.9.0 |
| Regex | 2019.4.14 |
| Requests | 2.22.0 |
| CUDA / CuDNN | >= 10.0 / >= 7.6.0 |
EAST 文本检测器要求 OpenCV 3.4.2 或更高版本;由于中文场景与英文自然场景差异较大,若要获得更好的中文检测效果仍需针对中文数据重新训练模型。
预训练模型清单
| 模型 | 参数量 | 备注 |
|---|---|---|
| EAST | < 0.1 Billion | 文本检测模型 |
| CRNN | < 0.1 Billion | 字符识别模型 |
| BERT | 0.1 Billion | 文本摘要模型 |
| GPT-2 | 1.5 Billion | 文本生成模型(48 层 mega 配置) |
说明:以上模型的具体下载地址见 README.md 中的预训练模型表,训练/微调 checkpoint 也可通过 colab_online.ipynb 与 setup.sh 中的下载脚本获取(1.5B 模型为
model.ckpt-280000)。
当前问题与已知限制
作者在 README 中坦诚列举了项目的当前问题(README.md):
- 输出格式与高考作文要求尚未完美契合,部分排版参数需要微调;
- 生成的 100 篇作文中相当一部分不算合格,多数勉强及格,极少数可能拿零分,说明 GPT-2 的生成能力存在上限——展示视频中只挑选了相对较好的几篇;
- 英文版说明尚未完成。
Q&A:开源范围与设计取舍
- 能否用 EssayKiller 帮自己写作业?不能。项目从一开始即明确:完全开源会被别有用心者用于牟利甚至不法用途,因此只开源了可独立复用的部分——检测网络、文本摘要网络、文本生成网络、判分网络与排版脚本,而隐藏了 pipeline、输入输出等关键文件,部分文件还加了盐。
- 为什么不用 GPT-3?训练一个中文 GPT-3 的预估成本至少 1200 万美元,项目没有该量级的算力资源。
- 训练整套 pipeline 需要多少钱?从头到尾训练完整流水线约需 1K~100K 人民币,取决于是否拥有分布式集群。
扩展:仓库可复用的核心源码速查
- 流水线入口与总览:README.md 第 76-77 行描述的五模块结构;
- OCR 检测 + 识别串联:ocr.py、densenet/model.py、densenet/densenet.py;
- CTPN 检测训练:train_net.py、text.yml;
- BERT 摘要:predict.py、sentence_encoder.py;
- GPT-2 生成与微调:demo.py、pre_data.py、prepare_data.py、tokenization.py、模型配置 mega.json;
- 排版与判分:formatter.py、ScoringNetwork/AutoFormatter/、DNN_Scorer.py;
- 线上 Demo:colab_online.ipynb。
免责声明
本项目(WriteGPT / EssayKiller)内容仅供技术研究与科普,不作为任何结论性依据,不提供任何商业化应用授权。读者在复现与扩展时请遵守开源许可与作者声明,注意数据版权与使用边界。
- AI 应用
- NLP
- 计算机视觉
- 教育
【免费下载链接】WriteGPT
由图灵的猫开发,基于开源GPT2.0的初代创作型人工智能 | 可扩展、可进化
相关推荐
WriteGPT 全解析:基于 EAST、CRNN、BERT 与 GPT-2 串联的高考议论文生成 AI 框架
WriteGPT 全解析:基于 EAST、CRNN、BERT 与 GPT 2 串联的高考议论文生成 AI 框架 导读 WriteGPT 是一个由「图灵的猫」团队
AI 应用NLP计算机视觉教育Mac Mouse Fix:5分钟让10美元鼠标的4个闲置键位变成第二块触控板
Mac Mouse Fix:5分钟让10美元鼠标的4个闲置键位变成第二块触控板 你手上的鼠标,中键和侧键多半在吃灰,滚轮还是一格一跳。Mac Mouse Fix
桌面应用系统编程RapidOCR 推理提速指南:多引擎选型的 5 个关键手段与落地配置
RapidOCR 推理提速指南:多引擎选型的 5 个关键手段与落地配置 你的离线 OCR 服务,首张图要等模型下载加冷启动,之后每张还要几十毫秒起步,高峰期业务
人工智能计算机视觉OCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考