当前位置: 首页 > article >正文

第45篇:文本生成实战:使用GPT-2创作故事——体验AI的“创造力”(项目实战)

文章目录项目背景技术选型架构设计核心实现1. 准备模型与分词器2. 构建文本生成函数3. 体验不同的生成策略踩坑记录效果对比与项目扩展项目背景在之前的项目中我们处理的多是分类、预测等“理解型”任务。这次我想带大家玩点不一样的——让AI“创造”一个故事。文本生成尤其是开放式故事创作是检验语言模型“智能”程度的绝佳试金石。我记得第一次用GPT-2生成文本时那种看着连贯、甚至富有想象力的句子从模型里“流”出来的感觉非常震撼。它不再是简单地复述而是在“编造”。本项目我们就用Hugging Facetransformers库基于预训练的GPT-2模型从零搭建一个故事生成器亲身体验AI的“创造力”边界。技术选型为什么选择GPT-2而不是更新、更大的GPT-3或GPT-4这基于几个务实的考虑资源友好GPT-2特别是小号和小小号版本可以在消费级GPU甚至CPU上运行而GPT-3/4的API调用有成本且大模型本地部署门槛极高。开源可控GPT-2完全开源我们可以深入模型内部调整生成策略进行微调学习整个流程。这对于理解和掌握文本生成技术至关重要。效果足够对于故事生成这个场景GPT-2特别是774M参数版本的能力已经能产生令人惊喜的结果足以让我们体验核心乐趣和技术要点。因此我们的技术栈非常清晰核心模型Hugging Facetransformers库中的gpt2(或gpt2-medium)深度学习框架PyTorch辅助工具torch,transformers,tqdm(用于进度条)架构设计这个项目的架构非常简单直接是一个典型的“预训练模型生成策略”流水线。我们不涉及复杂的服务部署聚焦于生成逻辑本身。用户输入故事开头/提示词 ↓ [文本预处理与Tokenization] ↓ [加载预训练GPT-2模型与分词器] ↓ [核心文本生成循环] ├── 策略选择贪婪搜索、集束搜索、Top-k采样、Top-p采样 └── 生成控制最大长度、重复惩罚、温度参数 ↓ [Token解码为文本] ↓ 输出生成的故事段落核心在于生成循环和解码策略。不同的策略会极大影响生成故事的“创造性”、“连贯性”和“可读性”。核心实现让我们一步步用代码实现这个生成器。首先确保环境已安装必要库pip install transformers torch tqdm。1. 准备模型与分词器fromtransformersimportGPT2LMHeadModel,GPT2Tokenizerimporttorch# 加载预训练模型和分词器# 使用 gpt2 (124M参数) 以在CPU或内存较小的GPU上快速运行# 如果想效果更好可以尝试 gpt2-medium (774M参数)model_namegpt2tokenizerGPT2Tokenizer.from_pretrained(model_name)modelGPT2LMHeadModel.from_pretrained(model_name)# 将模型设置为评估模式关闭dropout等训练层model.eval()# 如果可用使用GPU加速devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)model.to(device)踩坑提示1GPT-2的分词器默认不会添加padding token。如果后续需要批量生成需要手动设置tokenizer.pad_token tokenizer.eos_token。我们本次是单条生成可暂不处理。2. 构建文本生成函数这是项目的核心。我们将实现一个支持多种解码策略的生成函数。defgenerate_story(prompt,max_length150,num_return_sequences1,strategytop_p,temperature1.0,top_k50,top_p0.95): 使用GPT-2生成故事续写。 参数: prompt: 故事开头的提示文本。 max_length: 生成文本的最大总长度包括提示。 num_return_sequences: 生成几个不同的故事版本。 strategy: 解码策略可选 greedy, beam, top_k, top_p。 temperature: 温度参数越高越随机越低越确定。 top_k: Top-k采样中的k值。 top_p: Top-p核采样中的p值。 # 将提示文本编码为模型输入的token IDinput_idstokenizer.encode(prompt,return_tensorspt).to(device)# 根据策略配置生成参数generation_config{max_length:max_length,num_return_sequences:num_return_sequences,pad_token_id:tokenizer.eos_token_id,# 设置结束符也为padding符do_sample:True,# 默认启用采样对于贪婪和集束搜索会覆盖temperature:temperature,}ifstrategygreedy:# 贪婪搜索每一步都选择概率最高的词generation_config.update({do_sample:False,num_beams:1})elifstrategybeam:# 集束搜索每一步保留多个最有可能的序列generation_config.update({do_sample:False,num_beams:5,early_stopping:True})elifstrategytop_k:# Top-k采样每一步从概率最高的k个词中随机选一个generation_config.update({top_k:top_k})elifstrategytop_p:# Top-p核采样每一步从累积概率超过p的最小词集合中随机选一个generation_config.update({top_p:top_p,top_k:0})# top_k0表示禁用top-k# 使用模型生成文本withtorch.no_grad():# 禁用梯度计算加快推理速度减少内存占用output_sequencesmodel.generate(input_idsinput_ids,**generation_config)# 解码生成的token ID为可读文本generated_stories[]forgenerated_sequenceinoutput_sequences:# 跳过输入提示部分只解码新生成的部分generated_sequencegenerated_sequence[len(input_ids[0]):]texttokenizer.decode(generated_sequence,skip_special_tokensTrue,clean_up_tokenization_spacesTrue)generated_stories.append(text)returngenerated_stories3. 体验不同的生成策略现在让我们用一个简单的提示词对比不同策略的效果。prompt在一个遥远的未来机器人学会了做梦。print(f提示词:{prompt}\n)strategies[greedy,beam,top_k,top_p]forsinstrategies:print(f--- 使用策略:{s.upper()}---)storiesgenerate_story(prompt,max_length100,strategys,temperature0.8ifsin[top_k,top_p]else1.0)print(stories[0][:200]...)# 打印前200个字符print()运行这段代码你会直观地看到贪婪搜索Greedy生成的故事通常最连贯、最安全但也最容易陷入重复循环比如不停地重复“机器人做梦做梦做梦……”缺乏新意。集束搜索Beam Search连贯性比贪婪搜索更好能一定程度避免重复但生成的故事可能过于“平庸”或模板化。Top-k / Top-p 采样这是让故事变得“有趣”和“有创意”的关键。通过引入随机性生成的情节往往更出人意料。Top-p核采样通常比Top-k更灵活和有效因为它动态调整候选词集合的大小。踩坑记录在实际操作中我遇到了几个典型问题这里分享给大家生成结果重复或退化这是文本生成的经典难题。表现为模型开始不断重复同一句话或词语。解决方案除了使用Top-p采样还可以在generate函数中设置repetition_penalty参数大于1.0如1.2对已出现过的token进行概率惩罚。或者使用no_repeat_ngram_size参数禁止特定长度的短语重复出现。生成内容无关或跑题模型可能会从“机器人做梦”突然跳到谈论“今天的天气”。解决方案这通常与提示词不够具体有关。尝试给出更详细、更具约束性的开头。例如“在一个遥远的未来一个负责清理城市的旧型号机器人第一次在待机时体验到了类似人类做梦的数据流。它梦见了”。此外适当降低temperature值如从1.0降到0.7可以让生成内容更聚焦。生成速度慢尤其是在使用beam search或生成长文本时。解决方案对于交互式应用可以考虑使用更小的模型distilgpt2。在生成时使用max_new_tokens参数替代max_length精确控制新生成长度避免不必要的计算。如果使用支持CUDA的GPU确保模型和输入数据都已.to(device)。奇怪的分词和空格生成文本中可能出现奇怪的符号或多余空格。解决方案确保在tokenizer.decode()时设置了skip_special_tokensTrue和clean_up_tokenization_spacesTrue。对于中文或其他语言可能需要使用专门的分词器如gpt2-chinese。效果对比与项目扩展经过多次尝试我发现在故事生成任务上“Top-p采样p值0.9-0.95配合适当的温度0.7-0.9”是平衡创造性、连贯性和趣味性的最佳组合。贪婪和集束搜索更适合需要高确定性的任务如代码补全或翻译。项目扩展思路微调模型找一些科幻小说、童话故事的文本数据对GPT-2进行微调让它生成特定风格的故事。构建Web应用使用Gradio或Streamlit快速搭建一个交互界面让用户输入提示词选择风格实时生成故事。多轮对话式生成模拟一个“AI说书人”用户输入“然后呢”来推动故事发展这需要维护一个不断增长的对话历史上下文。加入条件控制使用CTRL或Prompt Tuning等技术控制故事的情感悲伤/欢乐、流派科幻/武侠等属性。通过这个实战项目我们不仅运行了一个GPT-2模型更重要的是我们亲手调试了那些控制AI“创造力”的旋钮——温度、Top-p、重复惩罚等。你会发现所谓的AI创造力目前很大程度上是“可控的随机性”。如何设置这些参数让生成的故事既天马行空又不至于胡言乱语正是这门技术的艺术所在。动手试试吧给你的AI一个开头看看它会还你一个怎样的世界。如有问题欢迎评论区交流持续更新中…

相关文章:

第45篇:文本生成实战:使用GPT-2创作故事——体验AI的“创造力”(项目实战)

文章目录项目背景技术选型架构设计核心实现1. 准备模型与分词器2. 构建文本生成函数3. 体验不同的生成策略踩坑记录效果对比与项目扩展项目背景 在之前的项目中,我们处理的多是分类、预测等“理解型”任务。这次,我想带大家玩点不一样的——让AI“创造”…...

BiliTools:你的全能B站资源管家,轻松管理哔哩哔哩内容

BiliTools:你的全能B站资源管家,轻松管理哔哩哔哩内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliT…...

Python边缘AI部署太重?揭秘TensorFlow Lite与ONNX Runtime轻量化对比:实测推理速度提升4.7倍

更多请点击: https://intelliparadigm.com 第一章:Python边缘AI部署的轻量化挑战与演进趋势 在资源受限的边缘设备(如树莓派、Jetson Nano、ESP32-S3 搭载 NPU 的模组)上部署 Python 编写的 AI 模型,正面临模型体积、…...

Book118文档下载器:快速获取在线文档的完整解决方案

Book118文档下载器:快速获取在线文档的完整解决方案 【免费下载链接】book118-downloader 基于java的book118文档下载器 项目地址: https://gitcode.com/gh_mirrors/bo/book118-downloader 你是否经常需要查阅学术文献或技术文档,却因为付费墙或下…...

思源宋体CN:7款免费开源中文字体完整使用教程

思源宋体CN:7款免费开源中文字体完整使用教程 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 想要在项目中免费使用高质量中文字体吗?**Source Han Serif CN&am…...

MediaCreationTool.bat:3大智能模式颠覆传统Windows安装体验

MediaCreationTool.bat:3大智能模式颠覆传统Windows安装体验 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...

别再只用js-audio-recorder录音了!结合WaveSurfer.js,给你的Vue项目加个酷炫音频波形图

在Vue中打造专业级音频应用:js-audio-recorder与WaveSurfer.js的深度整合 当我们需要在Web应用中实现音频录制功能时,js-audio-recorder确实是一个简单易用的选择。但如果你想让你的音频应用脱颖而出,仅靠基础功能远远不够。想象一下&#xf…...

Qwen3.5-4B-AWQ一文详解:3GB显存跑通全能力大模型的部署逻辑

Qwen3.5-4B-AWQ一文详解:3GB显存跑通全能力大模型的部署逻辑 1. 模型概述 Qwen3.5-4B-AWQ-4bit是阿里云通义千问团队推出的轻量级大语言模型,通过4bit AWQ量化技术实现了惊人的低资源占用。这个模型在保持强大能力的同时,将显存需求压缩到仅…...

基于策略模式与异步编排的抖音批量下载解决方案:实现高效内容采集的技术深度解析

基于策略模式与异步编排的抖音批量下载解决方案:实现高效内容采集的技术深度解析 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, a…...

c++怎么利用std--span在不拷贝的情况下解析大规模文件映射【进阶】

std::span不能直接绑定mmap内存但可安全指向——它不管理生命周期,需手动确保指针有效、长度准确且映射未释放;常见崩溃源于未检查MAP_FAILED、size越界或MAP_PRIVATE导致msync失效。std::span 能不能直接绑定 mmap 的内存不能直接构造,但可以…...

终极指南:HMCL跨平台Minecraft启动器完全使用教程

终极指南:HMCL跨平台Minecraft启动器完全使用教程 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Launcher&…...

高谱成像高光谱相机助力浙江大学团队在《Light: Science Applications》发表多维度伪装突破性成果

近日,国际光学领域顶级期刊《Light: Science & Applications》(Nature子刊,影响因子>18)在线发表了浙江大学李强、朱桓正的研究论文 “Multi-dimensional camouflage against VIS-NIR hyperspectral, MIR intensity, and M…...

Figma中文界面终极指南:5分钟让Figma说中文的完整解决方案

Figma中文界面终极指南:5分钟让Figma说中文的完整解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否因为Figma的英文界面而感到困扰?想要用母语进行…...

解锁Godot游戏资源:Python解包工具深度解析与应用实战

解锁Godot游戏资源:Python解包工具深度解析与应用实战 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 在游戏开发的世界里,Godot引擎以其开源特性和强大的功能吸引了众多开发…...

【技术干货】打破协议壁垒:基于 GB28181/RTSP 的 AI 视频管理平台架构解析(附源码交付与边缘计算实践)

引言:安防开发的“第一公里”梦魇 作为一名在安防行业摸爬滚打十年的架构师,我深知开发者在面对多厂商、异构协议时的绝望。 海康的私有 SDK、大华的码流封装、宇视的信令差异,加上 GB28181 国标协议那复杂的 140 页文档…… 每一个新项目的…...

#P4227.第2题-动态注意力掩码调度问题

第2题-动态注意力掩码调度问题 - problem_ide - CodeFun2000 import sys import numpy as np import mathdef solve():data sys.stdin.read().split()if not data:returnn int(data[0])d int(data[1])idx 2x np.array(list(map(float, data[idx:idx n * d]))).reshape(n…...

避坑指南:解决VS2022连接SQL Server最常见的‘登录失败’与连接字符串问题

避坑指南:解决VS2022连接SQL Server最常见的‘登录失败’与连接字符串问题 在开发基于SQL Server的应用程序时,连接数据库是最基础也是最重要的一环。然而,即使是经验丰富的开发者,也常常会在VS2022与SQL Server的连接配置上遇到各…...

从CTF题到实战:手把手教你用Python脚本破解RSA+Base64隐写(附完整代码)

从CTF题到实战:Python脚本破解RSA与Base64隐写全解析 在网络安全竞赛和实际渗透测试中,RSA加密与Base64隐写的组合经常出现。本文将从一个典型CTF题目入手,带你深入理解这两种技术的结合应用,并手把手教你编写完整的Python破解脚本…...

别再死记硬背π了!用Python割圆法动态可视化,5分钟看懂圆周率怎么算出来的

用Python动画解密圆周率:割圆法的视觉化实践 圆周率π这个神秘的数字,从古至今让无数数学家和编程爱好者着迷。但与其死记硬背3.1415926...,不如亲手用代码"割"出一个π来!本文将带你用Python的matplotlib库&#xff0c…...

ESP-ADF避坑指南:从零搭建MAX98357播放器,搞定自定义Touch控制与DAC音量调节

ESP-ADF实战:MAX98357音频系统开发全流程与深度优化 硬件选型与系统架构设计 在嵌入式音频系统开发中,ESP32MAX98357的组合因其高性价比和简洁的硬件设计而备受开发者青睐。MAX98357作为一款集成I2S接口的D类放大器,相比传统音频方案具有明显…...

【Linux驱动开发】第一天:用户态与内核态通俗讲解+最简字符设备驱动实战

一、通俗类比:把Linux系统比作国际机场 快速建立认知,秒懂底层权限模型:计算机系统国际机场 类比硬件资源(CPU、内存、硬盘、外设)机场跑道、设施、物资、场地Linux 内核机场管理局空管工作人员用户态应用(…...

Docker AI Toolkit 2026新特性全解密(Agent沙箱+模型热插拔+联邦学习容器化),90%工程师尚未启用的3个关键开关

更多请点击: https://intelliparadigm.com 第一章:Docker AI Toolkit 2026 新特性全景概览 Docker AI Toolkit 2026 是面向生成式AI与边缘智能工作流深度优化的容器化开发套件,原生集成模型编译、量化推理、分布式训练协调与合规性审计能力。…...

Agent经典论文——ReAct框架

目录 1、论文概述 1.1 研究背景 1.2 现有方法局限 1.3 核心贡献 1.4 摘要 2、ReAct方法 2.1 智能体与环境交互的一般设置 2.2 动作空间扩展与生成流程 2.3 独特特征 3、实验 3.1 知识密集型推理任务 3.2 决策任务 4、结论 1、论文概述 在开始分享这篇论文之前&…...

前端三件套:构建现代网页的基石

在踏入Web开发的奇妙世界时,你一定会反复听到一个核心概念——“前端三件套”。它们是 HTML、CSS 和 JavaScript。这三者协同工作,共同构建了我们每天在浏览器中看到和交互的每一个网页与应用。可以把它们想象成建造一栋房子:HTML (结构层): …...

为什么你的devcontainer.json在Mac上秒启,在Linux服务器却崩溃?跨平台兼容性避坑指南(含内核参数适配表)

更多请点击: https://intelliparadigm.com 第一章:为什么你的devcontainer.json在Mac上秒启,在Linux服务器却崩溃?跨平台兼容性避坑指南(含内核参数适配表) DevContainer 的跨平台一致性常被高估——Mac&a…...

别再傻等Gradle下载了!手把手教你用国内镜像源和离线包搞定Android Studio报错

高效解决Gradle下载难题:国内镜像与离线包实战指南 每次新建Android项目时,那个令人焦虑的Gradle下载进度条是否让你抓狂?尤其是在网络环境不理想的情况下,看着下载速度从KB/s逐渐降到0,最终弹出刺眼的红色错误提示——…...

如何快速解锁加密音乐:终极免费音乐解密工具使用指南

如何快速解锁加密音乐:终极免费音乐解密工具使用指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https:…...

Universal Android Debloater:无需Root的安卓设备瘦身神器

Universal Android Debloater:无需Root的安卓设备瘦身神器 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of your de…...

DICOM多序列融合渲染崩溃频发?C++引擎内存池碎片率超68%的隐蔽诱因及工业级RAII重构模板(含FDA Class II认证代码片段)

更多请点击: https://intelliparadigm.com 第一章:DICOM多序列融合渲染崩溃频发的临床影响与系统级定位 临床决策链路的中断风险 当放射科医师在阅片工作站中执行T1/T2/FLAIR/DWI多序列DICOM融合渲染时,若渲染引擎异常退出,将直…...

从Livox Viewer2到ROS:HAP激光雷达点云数据处理的进阶玩法(bag转pcd实战)

从Livox Viewer2到ROS:HAP激光雷达点云数据处理的进阶玩法(bag转pcd实战) 激光雷达技术正在重塑三维感知的边界,而Livox HAP作为一款高性价比的中距雷达,其点云数据蕴含的丰富环境信息正吸引着越来越多的开发者。当您已…...