ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

GPT-2文本生成多格式导出实战:3步让JSON、纯文本、Markdown一键落地

GPT-2文本生成多格式导出实战:3步让JSON、纯文本、Markdown一键落地 GPT-2文本生成多格式导出实战3步让JSON、纯文本、Markdown一键落地【免费下载链接】gpt-2Code for the paper Language Models are Unsupervised Multitask Learners项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-2GPT-2是OpenAI开源的文本生成模型其官方仓库提供交互式与批量两种生成脚本但原始输出只会黑底白字地打在控制台上。本文围绕GPT-2输出格式化这一痛点带你通过扩展代码为项目新增JSON、纯文本、Markdown三种导出格式让生成结果真正「即产即用」。一段真实的使用痛点命令行里翻屏找文本的日子小张是内容团队里负责批量生产文案的人。他用GPT-2生成产品介绍每次都盯着终端翻屏复制粘贴出来的文本带着 SAMPLE 1 这种分隔符直接发给编辑会被嫌弃「格式乱」想入库做数据统计又没法解析。最崩溃的是只要关了终端窗口这一批生成结果就全没了。他需要的不是能生成而是生成的文本能被直接拿去用——要么是结构化数据要么是排版好的文档。需求拆解先明确这次改造要交付什么把「输出即用」这个大目标拆开其实只有几件小事。读完本文你将能说清GPT-2的输出链路token序列 →encoder.decode()→ 文本用约60行代码的src/formatter.py同时支撑JSON、纯文本、Markdown三种格式给interactive_conditional_samples.py加上--output_format与--output_file两个参数批量生成一键落盘且导出的JSON文件始终是合法数组摸清最常见的5个坑并能把格式自由扩展成自己的如CSV、HTML设计思路用「策略 工厂」让格式与生成彻底解耦先看GPT-2原始输出长什么样。在src/interactive_conditional_samples.py和src/generate_unconditional_samples.py中生成循环的核心只有三行# src/generate_unconditional_samples.py原样 text enc.decode(out[i]) # 1. token 转文本 print( * 40 SAMPLE str(generated) * 40) print(text) # 2. 直接打印无格式可言痛点很明显生成逻辑和输出逻辑完全耦合格式想变就得改生成代码。而且这个仓库里有两个生成脚本交互式一个、批量一个同样的改动要做两遍。所以方案的核心是引入两层设计策略模式每种格式一个类统一实现format(text, metadata)接口生成脚本只调用接口、不关心细节工厂模式用一个FormatterFactory集中注册格式以后新增格式只改一处两个生成脚本零改动复用。整体调用链路如下用户 prompt │ ▼ 生成脚本(sample_sequence 产 token ──► encoder.decode 得文本) │ ▼ FormatterFactory.get_formatter(output_format) │ ├── PlainTextFormatter ──► 规范化的纯文本 ├── JsonFormatter ──► 结构化 JSON 对象 └── MarkdownFormatter ──► 带标题与元数据的 Markdown │ ▼ 控制台打印 按格式追加写入 output_file这样设计的好处一句话就能讲清生成脚本永远只做「把文本交给工厂」这一件事格式怎么变都跟它无关未来加HTML、LaTeX也只是多注册一个类。核心实现一新建 src/formatter.py把「格式」变成独立模块在src/目录下新建formatter.py实现三个格式器和一个工厂。这是整个改造的地基# src/formatter.py新增文件 import json, re class OutputFormatter: 所有格式器的统一基类约定 format 入口 def format(self, text, metadataNone): raise NotImplementedError class PlainTextFormatter(OutputFormatter): # 纯文本把连续空白折叠成规范段落去掉分隔符残留 def format(self, text, metadataNone): paras re.split(r\n\s*\n, text.strip()) return \n\n.join(re.sub(r\s, , p) for p in paras) class JsonFormatter(OutputFormatter): # JSON文本 长度/词数 生成元数据可直接入库 def format(self, text, metadataNone): result {text: text, length: len(text), tokens: len(text.split())} if metadata: result.update(metadata) return json.dumps(result, ensure_asciiFalse, indent2) class MarkdownFormatter(OutputFormatter): # Markdown一级标题 段落 「生成信息」小节即写即发 def format(self, text, metadataNone): md f# {metadata.get(title, GPT-2 生成文本)}\n\n paras re.split(r\n\s*\n, text.strip()) md \n\n.join(re.sub(r\s, , p) for p in paras) if metadata: md \n\n## 生成信息\n md \n.join(f- **{k}**: {v} for k, v in metadata.items() if k ! title) return md class FormatterFactory: 格式工厂新增格式只需在这里加一行注册 _formatters {text: PlainTextFormatter, json: JsonFormatter, markdown: MarkdownFormatter} staticmethod def get_formatter(fmt): cls FormatterFactory._formatters.get(fmt) if cls is None: raise ValueError(fUnsupported format: {fmt}) return cls()关键点只有两个一是所有格式器共享同一个format签名生成脚本永远只调这一个方法二是metadata由生成侧传入格式器不关心元数据从哪来职责边界清晰。核心实现二改造交互式脚本让每条输出可选格式并落盘接着修改src/interactive_conditional_samples.py。改动分三处加参数、加一个写文件的辅助函数、在生成循环里调用格式器。先看参数与文件写入# src/interactive_conditional_samples.py修改 import os, datetime # 新增 os、datetime from formatter import FormatterFactory # 新增导入格式模块 def interact_model( # ... 原有参数全部保留不动 ... output_formattext, # 新增text / json / markdown output_fileNone, # 新增导出路径None 则仅打印 ):文件写入抽成一个独立函数因为JSON和另外两种格式的追加方式完全不同# src/interactive_conditional_samples.py新增辅助函数 def append_sample(output_file, formatted, fmt): 把一条结果写入文件JSON 需要维护成合法数组 if fmt ! json: # 非 JSON 直接追加即可 with open(output_file, a, encodingutf-8) as f: f.write(formatted \n\n) return with open(output_file, a, encodingutf-8) as f: if os.path.getsize(output_file) 0: # 首次写数组开头 f.write([\n) else: # 之后把结尾 ] 换成 ,\n f.seek(0, os.SEEK_END) f.seek(f.tell() - 1, os.SEEK_SET) f.truncate() f.write(,\n) f.write(formatted \n]) # 每次补回结尾然后改生成循环把原先直接print(text)的地方换成「格式化 → 打印 → 落盘」三步# src/interactive_conditional_samples.py修改生成循环 text enc.decode(out[i]) formatter FormatterFactory.get_formatter(output_format) # 拿格式器 metadata { # 组装元数据 sample_id: generated, prompt: raw_text, timestamp: datetime.datetime.now().isoformat(), model_name: model_name, temperature: temperature, top_k: top_k, } formatted formatter.format(text, metadata) # 格式化 print( * 40 SAMPLE str(generated) * 40) print(formatted) # 控制台照常输出 if output_file: append_sample(output_file, formatted, output_format) # 落盘到这里交互式脚本只多了约15行但能力完全变了以前是「看一眼就没了」现在是「生成即沉淀」。核心实现三改造批量脚本一键导出结构化数据src/generate_unconditional_samples.py的改法与交互式几乎同构只差没有prompt字段。加参数、加append_sample导入、改循环其余与原文一致此处省略重复代码只贴循环核心# src/generate_unconditional_samples.py修改生成循环 text enc.decode(out[i]) formatter FormatterFactory.get_formatter(output_format) metadata { sample_id: generated, timestamp: datetime.datetime.now().isoformat(), model_name: model_name, temperature: temperature, top_k: top_k, top_p: top_p, } formatted formatter.format(text, metadata) print( * 40 SAMPLE str(generated) * 40) print(formatted) if output_file: append_sample(output_file, formatted, output_format) # 复用同一写入函数注意append_sample是从交互式脚本里复制过来的为了彻底避免重复你也可以把它单独放进formatter.py里导出——这正是把公共能力下沉到独立模块的典型收益。实战演练从下载模型到三种格式落地全流程第一步克隆仓库并下载124M模型约500MB只需一次git clone https://gitcode.com/GitHub_Trending/gp/gpt-2 cd gpt-2 python download_model.py 124M第二步批量生成3条样本并以JSON格式落地python src/generate_unconditional_samples.py --model_name124M --nsamples3 --length100 --output_formatjson --output_filebatch_output.json控制台与文件里会得到类似下面的内容batch_output.json[ { text: The economic consequences of the new policy are likely to be significant, as firms adjust their expectations..., length: 120, tokens: 22, sample_id: 3, timestamp: 2026-08-13T18:20:11.482913, model_name: 124M, temperature: 1, top_k: 0, top_p: 1 } ]第三步试试交互式模式的Markdown输出python src/interactive_conditional_samples.py --model_name124M --nsamples1 --length120 --output_formatmarkdown --output_filesample.md在Model prompt 后输入一句话sample.md里就会自动出现标题、正文和生成信息小节直接扔给公众号编辑器就能用。新增参数汇总如下参数名类型默认值说明output_formatstringtext输出格式可选 text / json / markdownoutput_filestringNone导出文件路径不指定则仅控制台输出nsamplesinteger1生成样本数量批量脚本默认0无限lengthinteger512生成token长度不能超过模型窗口temperaturefloat1随机性越小越确定top_kinteger0采样候选数0表示不限制top_pfloat1核采样阈值0~1避坑指南新手最容易踩的 5 个坑问题原因解决Unknown command: --output-formatfire把参数名直接映射成CLI参数用连字符会识别失败参数里下划线必须原样保留用--output_formatjsonNotFoundError: ... checkpoint not found模型还没下载就运行脚本先执行python download_model.py 124M再运行ModuleNotFoundError: No module named formatterformatter.py没放在src/目录下与三个脚本放同目录或把它移到仓库根目录并调整导入UnicodeEncodeError中文打印乱码Windows控制台默认编码不是UTF-8运行前设置PYTHONIOENCODINGutf-8或直接重定向到文件手改JSON文件后追加导致括号错乱手动编辑破坏了[/]的配对导出文件用脚本维护别手改需要灵活读写就改用JSONL每行一个JSON对象另外提醒一个易被忽略的旧约束nsamples必须能被batch_size整除否则脚本会直接assert报错——把nsamples设成batch_size的整数倍即可。进阶玩法从「多格式导出」到「内容生产线」格式层一旦解耦扩展就变成「写一个类 注册一行」的机械劳动。比如CSV格式只需# src/formatter.py新增 class CsvFormatter(OutputFormatter): def format(self, text, metadataNone): clean text.replace(, ).replace(\n, \\n) return f{metadata.get(sample_id, )},{clean} # 工厂里加一行csv: CsvFormatter在此基础上更值得做的方向支持HTML/LaTeX文档直接可发布或转PDF自定义模板引入Jinja2让用户定义输出排版而不是写死标题Web封装用Flask包一个/generate接口output_format由请求参数决定JSON天然是API响应格式自动命名按时间戳格式自动生成文件名免去手动指定--output_file批处理加速格式转换放在生成循环外批量做配合异步I/O减少落盘等待。如果要做成产品可以按这个TODO推进格式注册表支持用户自定义配置驱动而非代码硬编码输出前做格式校验JSON用json.loads自检增加失败重试与日志生成出错时回退为纯文本提供批处理模式--batch-file从文件读prompt批量生成。结语让GPT-2输出真正「即产即用」这次改造只用了约80行新增代码却解决了从「终端里看文本」到「结构化数据直接入库、Markdown文档直接发布」的全链路痛点。核心收获不是那三个格式器而是「生成与格式解耦」的设计意识——它让后续每一次新格式、新模板、新出口都变成加一行注册的事。欢迎你到项目仓库 fork 一份代码动手跑通本文的改造把你自己的CSV、HTML格式甚至Web封装PR回来让这套多格式导出能力惠及更多使用者。【免费下载链接】gpt-2Code for the paper Language Models are Unsupervised Multitask Learners项目地址: https://gitcode.com/GitHub_Trending/gp/gpt-2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表