AIGC 诗歌创作实战指南与避坑手册
引言
AI 写诗并非玄学,而是基于大语言模型的文本生成任务。它既能生成具有赛博浪漫色彩的诗句,也可能出现强行押韵或逻辑不通的情况。本文将从技术原理、代码实现到前端集成,系统讲解如何利用 AIGC 进行诗歌创作。
AIGC 写诗原理
核心机制是'给定上文,预测下一个 token'。模型通过训练数据学习语言规律,本质上是一场超大规模的文本接龙游戏。
中文诗的特殊挑战
- 押韵:英文只需关注词尾,中文需遵循《平水韵》等格律,否则读起来像相声。
- 平仄:需要控制节奏感,否则会出现'拖拉机横冲直撞'的韵律。
- 意境:AI 擅长字面组合,但难以理解深层情感和文化隐喻。
主流模型训练机制
训练数据
- 古诗文网爬虫:全唐诗、全宋词及现代诗数据。
- 清洗规则:去除无效字符,统一语气词映射。
- 数据增强:随机替换词汇以增加多样性。
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
实操上手:Python 实现
使用 Hugging Face 上的预训练模型快速验证。
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)
后端接口封装
将模型封装为 API 供前端调用,推荐使用 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)
前端展示与交互
使用 Vue3 + Tailwind 构建古风 UI。
<!-- Vue3 + Tailwind 快速撸一个'赛博文房四宝' -->
<template>
<div>
<h1>AI 赛博诗塾</h1>
<input v-model="keyword" @keyup.enter="getPoem" placeholder="输入关键词,比如'火锅'" />
<svg v-if="loading" viewBox="0 0 100 100">
<text x="50" y="50" text-anchor="middle" fill="#92400e" font-size="20">落笔中...</text>
</svg>
<div v-if="poem">
<p v-for="line in poem.split(',')" :key="line">{{ line }}</p>
</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>
AI 诗歌的优缺点
优点
- 效率:GPU 上跑 1 秒可生成多首。
- 数量:可批量生成不同主题内容。
- 版权:基于概率生成的文本在法律上通常被视为原创。
缺点
- 情感假:缺乏真实情感体验,修辞堆砌感强。
- 文化错:可能出现历史常识错误(如屈原吃粽子)。
- 创新边界:擅长缝合,难跳出既有模式。
常见问题复盘
1. 乱码问题
中文 GPT 遇到生僻字可能输出 [UNK]。解决:提前扩展 tokenizer 字典。
2. 跑题问题
Prompt 上下文干扰导致主题偏离。解决:使用模板锁死 Prompt 结构。
3. 强行押韵
Temperature 过高导致乱押。解决:后处理检查韵脚或在 logits 阶段加惩罚。
4. 文化常识错误
训练数据高频共现导致的脑补。解决:Prompt 中加入事实约束或使用知识图谱过滤。
进阶技巧
情绪标签法
先喂'情绪向量',再让模型生成。例如:'孤独 + 雨夜 +80 年代老磁带'。
散文→诗压缩
先生成散文,再指令压缩为诗,保留关键意象。
人类半截诗续写
提供上半段,要求 AI 续写下半段,保持对仗与押韵。
彩蛋:藏头诗生成
利用模板将特定汉字嵌入每句开头。
heads = ["张","总","英","明","神","武"]
prompt = f"七律,藏头诗,每句首字依次:{''.join(heads)},风格豪放:"



