用 AI 写古风小说:世界观设定、角色塑造、风格一致性的三难问题
2026/7/22 17:33:50 网站建设 项目流程

用 AI 写古风小说:世界观设定、角色塑造、风格一致性的三难问题

一、个性化深度引言

去年尝试用 AI 辅助写古风小说。第一版生成出来:主角在唐朝用手机 App 点外卖。这算 Bug 还是算创意?模型没有时代意识,它只会根据概率拼接——而“手机”和“吃饭”在语料中的共现概率极高。

古风创作有三个特殊挑战:世界观必须自洽(不能出现时代错位)、角色必须一致(同一个人不能上一章腹黑下一章天真)、语言必须纯正(不能冒出“好的亲”这种现代口语)。见证奇迹的时刻,是我们发现这三者不是独立问题而是一个耦合问题——世界观约束角色,角色约束语言。

二、个性化原理剖析

三难问题的耦合关系

解决方案:三层约束注入

第一层:世界观注入(System Prompt 级)

将世界观设定作为系统级约束,永久生效。包括时代背景、技术上限、语言规范。

第二层:角色注入(User Prompt 级)

在每次生成前,注入当前出场角色的人物档案。包括性格、目标、当前状态。

第三层:风格注入(Few-shot 级)

提供 3-5 个同风格的段落示例,让模型学习具体的语言节奏。

一致性校验机制

生成完成后,运行三层校验:

  1. 时代一致性:检查是否存在时间错位词(如古代语境中出现“手机”“WiFi”)
  2. 角色一致性:检查角色的行为和语气是否符合人物设定
  3. 风格一致性:检查相邻段落的语言风格是否突变

三、个性化代码实践

from typing import List, Dict, Optional from dataclasses import dataclass, field import re @dataclass class WorldSetting: """世界观设定""" dynasty: str # 朝代 tech_level: str # 科技水平 forbidden_terms: List[str] # 禁止词汇 allowed_greetings: List[str] # 允许的称谓 @dataclass class CharacterProfile: """角色档案""" name: str title: str # 称号/身份 personality: str # 性格描述 speech_style: str # 说话风格 motivation: str # 核心动机 forbidden_actions: List[str] # 不允许的行为 class AncientStyleWriter: """古风小说辅助写作工具""" # 设计原因:时代违禁词库——古风写作中最基础的过滤层 MODERN_TERMS = { "唐朝": ["手机", "电脑", "WiFi", "App", "地铁", "飞机", "电话", "网络", "微信", "外卖", "快递", "共享"], "宋代": ["手机", "电脑", "WiFi", "App", "地铁", "飞机", "电话", "网络", "微信", "外卖", "快递", "共享"], # 通用古代禁止词 "通用": ["OK", "好的亲", "宝子", "集美", "栓Q"], } def __init__( self, world: WorldSetting, characters: Dict[str, CharacterProfile], ): self.world = world self.characters = characters def build_system_prompt(self) -> str: """构建世界观 System Prompt""" # 设计原因:三层约束分离注入——系统级、角色级、风格级 forbidden = self.MODERN_TERMS.get( self.world.dynasty, self.MODERN_TERMS["通用"] ) prompt = f"""# 世界观设定 - 故事发生在 {self.world.dynasty},科技水平:{self.world.tech_level} - 人物称谓使用古语,避免任何近现代词汇 - 禁止使用以下词汇:{', '.join(forbidden)} # 语言风格 - 使用古风书面语,偶尔使用文言句式 - 对话允许口语化,但不能出现网络用语 - 描写重视意象和氛围,多用五感描写""" return prompt def build_character_prompt( self, character_id: str ) -> str: """构建角色 User Prompt""" # 设计原因:每次只注入当前场景出场角色,避免上下文过长 char = self.characters.get(character_id) if not char: return "" return f"""# 当前主角:{char.name} - 身份:{char.title} - 性格:{char.personality} - 说话风格:{char.speech_style} - 动机:{char.motivation} - 行为限制:{', '.join(char.forbidden_actions)}""" def check_era_consistency(self, text: str) -> Dict: """时代一致性检查""" # 设计原因:生成后必须校验,不能假设 Prompt 能完美约束模型 issues = [] forbidden = self.MODERN_TERMS.get( self.world.dynasty, self.MODERN_TERMS["通用"] ) for term in forbidden: if term in text: # 找到违禁词所在的句子 for sentence in text.split("。"): if term in sentence: issues.append({ "term": term, "context": sentence.strip() + "。", "severity": "high" if term not in ["OK", "好的亲"] else "medium", }) return { "passed": len(issues) == 0, "issues": issues, "score": 1.0 - len(issues) * 0.1, } def check_character_consistency( self, text: str, character_id: str ) -> Dict: """角色一致性检查""" # 设计原因:用关键词匹配检测角色行为是否越界 char = self.characters.get(character_id) if not char: return {"passed": True, "issues": [], "score": 1.0} issues = [] for action in char.forbidden_actions: if action in text: issues.append({ "character": char.name, "forbidden": action, "severity": "medium", }) return { "passed": len(issues) == 0, "issues": issues, "score": 1.0 - len(issues) * 0.15, } def check_style_consistency( self, paragraphs: List[str] ) -> Dict: """段落间风格一致性检查""" # 设计原因:相邻段落风格突变会影响阅读体验 if len(paragraphs) < 2: return {"passed": True, "score": 1.0} # 计算相邻段的句长差异 issues = [] for i in range(len(paragraphs) - 1): len_a = len(paragraphs[i].replace(" ", "")) len_b = len(paragraphs[i + 1].replace(" ", "")) # 设计原因:相邻段长度比超过 3 倍视为风格突变 ratio = max(len_a, len_b) / max(min(len_a, len_b), 1) if ratio > 3: issues.append({ "para": i + 1, "ratio": ratio, "severity": "low", }) return { "passed": len(issues) == 0, "issues": issues, "score": 1.0 - len(issues) * 0.05, } # 使用示例 world = WorldSetting( dynasty="唐朝", tech_level="冷兵器时代,无电力", forbidden_terms=[], allowed_greetings=["公子", "娘子", "陛下", "大人"], ) characters = { "li_mo": CharacterProfile( name="李墨", title="剑客/前朝遗孤", personality="冷峻寡言,但内心重情义", speech_style="话极少,每句不超过15字,不用敬语", motivation="为家族复仇", forbidden_actions=["哭泣", "示弱", "长篇大论", "开玩笑"], ), } writer = AncientStyleWriter(world, characters) system_prompt = writer.build_system_prompt() character_prompt = writer.build_character_prompt("li_mo") print("=== System Prompt ===") print(system_prompt[:200]) print("\n=== Character Prompt ===") print(character_prompt[:200]) # 一致性校验示例 test_text = "李墨掏出手机看了看时间,心想该出发了。这位剑客哭了。" era_result = writer.check_era_consistency(test_text) char_result = writer.check_character_consistency(test_text, "li_mo") style_result = writer.check_style_consistency(test_text.split("\n\n")) print(f"\n时代一致性: {'通过' if era_result['passed'] else '未通过'}") if era_result["issues"]: for issue in era_result["issues"]: print(f" 违禁词「{issue['term']}」:{issue['context']}") print(f"角色一致性: {'通过' if char_result['passed'] else '未通过'}") if char_result["issues"]: for issue in char_result["issues"]: print(f" {issue['character']} 执行了禁止行为「{issue['forbidden']}」")

四、个性化边界权衡

约束策略自由度一致性错误率写作体验
无约束自由生成极高极低高(出现现代词)随意但混乱
仅 System Prompt中低较自然
System + 角色 Prompt中高中低有一定方向感
三层约束 + 生成后校验中低像填表格,缺乏惊喜
人工自由写作极高依赖作者低(知识正确)最佳

关键权衡:

  1. 约束 vs 惊喜:强约束确实能避免错误,但也会扼杀模型自发产生的创意表达。比如禁止“手机”可能也扼杀了“手执木机”(古代一种算命工具)。
  2. 泛化 vs 定制:通用古风 Prompt 在大多数场景下够用,但涉及特定朝代(如唐朝的“坊市制度”)时需要定制化知识库。
  3. 自动校验的局限:关键词过滤只能检测最表面的错误。深层的时代错位——如唐朝人用明代典故——需要领域知识图谱。

五、总结

AI 辅助古风小说创作的三大难题——世界观设定、角色塑造、风格一致性——是具有强耦合关系的系统性问题。世界观约束角色的行为边界和语言选择,角色的性格决定其表达方式,语言的连贯性反哺风格统一。技术上,建议采用“三层注入 + 生成后校验”的策略:System Prompt 注入世界观,User Prompt 注入角色档案,Few-shot 注入风格示例;生成后在时代一致性、角色一致性和风格一致性三个维度进行校验。工程上,违禁词库是最基础也最有效的一致性保障手段,但深层错误需要配合知识图谱进行检测。最终,AI 的角色是辅助工具而非替代者——它可以帮你避免低级错误,但无法替你判断哪句话更好。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询