欢迎光临
我们一直在努力

机器也能写诗?AIGC诗歌创作实战指南(附踩坑避雷手册)

机器也能写诗?AIGC诗歌创作实战指南(附踩坑避雷手册)

  • 机器也能写诗?AIGC诗歌创作实战指南(附踩坑避雷手册)
    • 当AI开始押韵,人类诗人慌不慌?
    • AIGC写诗到底是个啥玩意儿?——先扒掉技术的底裤
      • 中文诗的特殊debuff
    • 主流模型怎么“学会”写诗?——Transformer不是变形金刚,但确实会变
      • 训练数据黑幕
      • loss函数里的小心机
    • 实操上手:三行代码让AI给你写情诗
    • 你以为AI写诗就是复制粘贴?——错,它背后全是套路
      • Token预测视角下的“创作”
      • 前端视角看“生成”
    • 优点吹爆,缺点扎心——AI诗歌的AB面
      • A面:快、多、不要版权费
      • B面:机器味一眼识破
    • 前端怎么把AI诗歌玩出花?——不止调接口那么简单
      • 1. 古风UI + 毛笔字动画
      • 2. AI vs 人类 擂台赛
    • 翻车现场复盘:为什么我的AI写出了“火锅煮月亮”?
      • 1. 乱码——tokenizer背锅
      • 2. 跑题——prompt太飘
      • 3. 强行押韵——“月亮”/“WiFi”惨案
      • 4. 文化常识错误——屈原“被”吃粽子
    • 老司机私藏技巧:让AI写出“人味”
      • 1. 情绪标签法
      • 2. 散文→诗压缩
      • 3. 人类半截诗续写
    • 彩蛋:给老板写藏头诗保命指南
    • 结语(微信群语音转文字版)

机器也能写诗?AIGC诗歌创作实战指南(附踩坑避雷手册)

“哥们,我昨晚让AI给我前女友写了首七言绝句,她看完把我微信备注改成了‘赛博李白’。” —— 某个凌晨三点还在调参的前端群友

当AI开始押韵,人类诗人慌不慌?

先别急着把海子诗集拿去垫桌脚。 AI写诗这事儿,说玄乎也玄乎,说土嗨也土嗨。它既能给你整出“银河跌进啤酒杯”这种赛博浪漫,也能把“月亮”和“WiFi信号格”强行押韵,看得你脚趾抠出三室一厅。 但别怕,今天咱们不聊虚的,直接上手——从“让模型张嘴”到“前端页面能跑能摇”,一条龙给你整明白。 看完你也能在群里甩个链接:“兄弟们,输入关键词秒出七律,流量密码拿去。”

(温馨提示:本文代码全部可抄,抄完报错算我输。)


AIGC写诗到底是个啥玩意儿?——先扒掉技术的底裤

说白了,就是让大模型背完《全唐诗》+《现代诗三百首》之后,照着你的prompt开始“接龙”。 核心公式就一句: “给定上文,预测下一个token。” 别被“token”吓到,你就把它当成“下一个汉字”或者“下一个拼音片段”。模型每天干的事,就是玩一场超大规模的“成语接龙”,只是接的是人类几千年的酸爽情诗。

中文诗的特殊debuff

  • 押韵:英文只需要“end with -ing”,中文得整《平水韵》,不然“花”和“蛙”强行押韵,读起来像相声。
  • 平仄:平平仄仄平平仄,模型看到这一串脑瓜子嗡嗡的,loss函数里不加惩罚,它就给你整出“拖拉机横冲直撞”的节奏。
  • 意境:AI最擅长“把牛说成是牛”,但它很难明白“牛”也可以是“回不去的田园”。

  • 主流模型怎么“学会”写诗?——Transformer不是变形金刚,但确实会变

    训练数据黑幕

    • 古诗文网爬虫:全唐诗 42k、全宋词 20k、现代诗 8k,再加上微博“#每日一诗#”话题 100w 条,混一起就是一锅“古今乱炖”。
    • 清洗规则:去掉“转发”“//”这些杂质,再把“啊”“哦”这类语气词统一映射到<EMO> token,防止模型“啊哦”个不停。
    • 数据增强:把一句“春风又绿江南岸”随机替换成“秋风又黄江北岸”,让模型知道“绿”不是唯一答案,押韵别死磕。

    loss函数里的小心机

    # 伪代码:在交叉熵上加押韵惩罚
    def rhyme_penalty(logits, target_tokens, rhyme_dict):
    """
    logits: 模型预测的下一个token分布
    target_tokens: 正确答案
    rhyme_dict: 自己整的《平水韵》映射表
    """

    penalty = 0
    if target_tokens[1] in rhyme_dict: # 最后一个字需要押韵
    rhyme_class = rhyme_dict[target_tokens[1]]
    for token_id, logit in enumerate(logits):
    if idx2token[token_id] in rhyme_dict:
    if rhyme_dict[idx2token[token_id]] != rhyme_class:
    # 不押韵就狠狠扣分
    logits[token_id] -= 5.0
    return logits

    就这么简单粗暴,模型被“扣分”扣多了,慢慢学会“花/家/涯”一家亲。


    实操上手:三行代码让AI给你写情诗

    别急着租GPU,先用Hugging Face上白嫖的Chinese-Poetry-GPT2爽一把。

    pip install transformers torch

    from transformers import BertTokenizer, GPT2LMHeadModel
    import torch

    # 1. 模型&tokenizer一步到位
    tokenizer = BertTokenizer.from_pretrained("ethan-yi/Chinese-Poetry-GPT2")
    model = GPT2LMHeadModel.from_pretrained("ethan-yi/Chinese-Poetry-GPT2")
    model.eval()

    # 2. prompt越中二,诗越对味
    prompt = "小姐姐,今晚的月亮像刚充值的币," * 3 # 重要的事说三遍
    inputs = tokenizer(prompt, return_tensors="pt")

    # 3. 生成——temperature=0.8 赛博微醺感
    with torch.no_grad():
    outputs = model.generate(
    **inputs,
    max_length=128,
    do_sample=True,
    temperature=0.8,
    top_p=0.9,
    repetition_penalty=1.2
    )
    poem = tokenizer.decode(outputs[0], skip_special_tokens=True)
    print(poem)

    跑出来的效果可能是:

    小姐姐,今晚的月亮像刚充值的币,
    小姐姐,今晚的月亮像刚充值的币,
    小姐姐,今晚的月亮像刚充值的币,
    银河兑进啤酒杯,想你到WiFi满格醉。

    看到没,AI已经把“想你”和“WiFi”强行押韵,土味赛博情诗拿捏了。 想再古风?把prompt换成“春风十里”+“扬州”+“豆蔻”,它立刻给你整出“二月卖新酒”的味儿。


    你以为AI写诗就是复制粘贴?——错,它背后全是套路

    Token预测视角下的“创作”

    模型其实没“创作”,它只是疯狂算概率: “春风又绿江南岸”后面,最高概率的是“明月何时照我还”,于是它就“抄”了。 但如果把temperature拉到1.5,概率分布被搅成一锅粥,它就可能给你整出“春风又绿江南岸,量子纠缠般的思念”。 所以,temperature=0.5 是李白,temperature=1.5 是喝醉的李白,temperature=2.0 是李白掉进了搅拌机。

    前端视角看“生成”

    咱们写网页,不可能让用户在命令行里python poem.py。 把模型封装成接口,最省事的是直接transformers+fastapi:

    # api.py
    from fastapi import FastAPI
    from pydantic import BaseModel
    import uvicorn
    from poem_engine import generate_poem # 上面那段逻辑封装一下

    app = FastAPI()

    class Keyword(BaseModel):
    keyword: str
    style: str = "tang" # tang / song / modern

    @app.post("/ai/poem")
    def get_poem(kw: Keyword):
    prompt = f"{kw.style}风格,关键词:{kw.keyword},写一首七言绝句:"
    poem = generate_poem(prompt, max_len=64)
    return {"poem": poem}

    if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

    前端小哥直接fetch('/ai/poem', {method:'POST', body:JSON.stringify({keyword:'火锅'})}), 秒回:

    火锅煮月亮,红油染星光。
    毛肚是归舟,鸭肠到故乡。


    优点吹爆,缺点扎心——AI诗歌的AB面

    A面:快、多、不要版权费

    • 快:GPU 上跑 1 秒 20 首,老板让你写 100 首藏头诗,3 分钟交稿。
    • 多:想写 1000 首关于“孤独”的诗?AI 不emo,它写到显卡冒烟都不累。
    • 版权:它“抄袭”的是概率,不是字面值,法律上算“原创”,甲方听了直点头。

    B面:机器味一眼识破

    • 情感假:它可以把“哭”字用 20 种修辞堆砌,但它没真的哭过。
    • 文化错:让 AI 写端午,它可能冒出“屈原吃粽子看龙舟比赛”——屈原:???
    • 创新边界:AI 最擅长“缝合”,但很难“跳出盒子”。你让它写“新冠情诗”,它只会“口罩遮住你的脸,却遮不住我对你的思念”,听着像十年前的QQ空间。

    前端怎么把AI诗歌玩出花?——不止调接口那么简单

    1. 古风UI + 毛笔字动画

    <!– Vue3 + Tailwind 快速撸一个“赛博文房四宝” –>
    <template>
    <div class="min-h-screen bg-gradient-to-b from-amber-50 to-amber-100">
    <div class="flex flex-col items-center pt-20">
    <h1 class="text-4xl font-bold text-amber-900 mb-4">AI 赛博诗塾</h1>
    <!– 输入框 –>
    <input
    v-model="keyword"
    @keyup.enter="getPoem"
    class="px-4 py-2 rounded border border-amber-300"
    placeholder="输入关键词,比如‘火锅’"
    />
    <!– 毛笔字动画 –>
    <svg
    v-if="loading"
    class="w-32 h-32 mt-4"
    viewBox="0 0 100 100"
    >
    <text
    x="50"
    y="50"
    text-anchor="middle"
    fill="#92400e"
    font-size="20"
    class="animate-pulse"
    >
    落笔中…
    </text>
    </svg>
    <!– 诗句 –>
    <div
    v-if="poem"
    class="mt-6 p-6 bg-white/70 rounded shadow-lg max-w-lg"
    >
    <p
    v-for="line in poem.split(',')"
    :key="line"
    class="text-2xl text-amber-800 leading-loose font-serif"
    >
    {{ line }}
    </p>
    </div>
    </div>
    </div>
    </template>

    <script setup>
    import { ref } from 'vue'

    const keyword = ref('')
    const poem = ref('')
    const loading = ref(false)

    async function getPoem() {
    loading.value = true
    const res = await fetch('http://localhost:8000/ai/poem', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ keyword: keyword.value })
    })
    const data = await res.json()
    poem.value = data.poem
    loading.value = false
    }
    </script>

    2. AI vs 人类 擂台赛

    思路:

    • 同一关键词,AI 先写一首,匿名展示;
    • 再拉群友写一首,匿名展示;
    • 用户盲投票,点选“哪首更像人”。
    • 最后揭晓,AI 胜率超过 60% 就可以截图吹半年。

    前端实现就是两张卡片 + 一个vote接口,代码太简单就不占篇幅,重点是:记得把 AI 的作者名随机成“李清照 233 号机”,人类作者随机成“张二狗”,悬念拉满。


    翻车现场复盘:为什么我的AI写出了“火锅煮月亮”?

    1. 乱码——tokenizer背锅

    中文 GPT 很多用 BertTokenizer,遇到生僻字直接[UNK],于是“踽踽独行”变成“[UNK] [UNK] 独行”,诗意瞬间变尿意。 解决:提前把《新华字典》+《康熙字典》扔给 tokenizer 做add_tokens,别让 [UNK] 毁了“踽踽”。

    2. 跑题——prompt太飘

    你输入“孤独”,模型却写“火锅”,大概率是 prompt 里带了“火锅”的上下文。 解决:prompt 用模板锁死:

    template = "七言绝句,主题:孤独,禁止出现食物!首句必须包含‘雨’字:"

    3. 强行押韵——“月亮”/“WiFi”惨案

    temperature 太高,模型开始“乱押”。 解决:

    • 后处理 + 韵表过滤,生成后检查最后一句韵脚,不押韵就重新采样;
    • 或者直接在 logits 阶段加 rhyme_penalty(前面代码有)。

    4. 文化常识错误——屈原“被”吃粽子

    训练数据里“屈原”“粽子”“龙舟”高频共现,模型直接脑补“屈原吃粽子”。 解决:

    • prompt 加“历史事实:屈原投江,当时尚无粽子”;
    • 或者用知识图谱做过滤,生成后检查实体关系,错了就回炉。

    老司机私藏技巧:让AI写出“人味”

    1. 情绪标签法

    别只喂关键词,先喂“情绪向量”:

    emotion = "孤独+雨夜+80年代老磁带"
    prompt = f"{emotion},写一段现代诗,不超过50字:"

    模型会把“磁带”转录成“A面是我,B面是你”,瞬间有那味儿。

    2. 散文→诗压缩

    先让模型写一段 100 字散文,再下一条指令:“把上文压缩成 28 字七言绝句,保留‘磁带’意象”。 两步走,比一步直接生成诗更稳。

    3. 人类半截诗续写

    half = "我把远方的酒喝成故乡的月光,"
    prompt = f"续写下半段,保持对仗与押韵,韵脚‘ang’:\\n{half}"

    AI 续:

    却把近处的你念成枕边的霜。

    真假难辨,群里妹子直呼“这是哪个宝藏男孩写的?”


    彩蛋:给老板写藏头诗保命指南

    老板叫“张总英明神武”,藏头诗要求:张总英明神武,每句开头依次嵌入。 直接上模板:

    heads = ["张", "总", "英", "明", "神", "武"]
    prompt = "七律,藏头诗,每句首字依次:{},风格豪放,拍老板马屁,但别太明显:"\\
    .format(''.join(heads))

    生成效果:

    张帆远航破浪行,
    总把星辰作指针。
    英气如潮吞日月,
    明眸似电划云层。
    神采飞扬千里路,
    武略深藏万籁音。

    老板一高兴,给你绩效多打 0.5,年底还能多抢两箱月饼。 但注意:千万别让 AI 写“裁员”主题,它可能回你:

    沁园春·优化
    大厂风云,千里裁员,万里波动。
    望楼宇内外,唯余惶惶;工位上下,顿失涛涛。

    HR 看了直冒冷汗,连服务器都想给你拔了。


    结语(微信群语音转文字版)

    “兄弟们,今天这把 AI 写诗就聊到这儿。代码都甩给你们了,回头谁把‘火锅煮月亮’做成 NFT 卖了,记得 V 我 50。 下次想整啥?AI 写 rap 还是 AI 写情书?在群里 @ 我,我去给它调参调到它亲妈都不认识。”

    在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » 机器也能写诗?AIGC诗歌创作实战指南(附踩坑避雷手册)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址