
电子科技大学成都学院 开放原子开源社团 Lycorius
开篇钩子:
还在问"用什么AI工具好"?工具只是手段,流程才是关键。这篇不是PPT里的流程图,而是真实跑通的AI文创项目全流程,含完整代码,直接能用。
拆解需求用三个维度过滤:
核心是识别哪些环节AI能替代人、哪些必须人来把关:
文本生成层:
图像生成层:
工作流编排层:
核心思路:结构化Prompt + 分段生成 + 一致性校验
import anthropic
import json
client = anthropic.Anthropic() # 默认读取 ANTHROPIC_API_KEY 环境变量
# ── 世界观种子:人工定义的核心设定,AI 不能改动这部分 ──
WORLD_SEED = {
"name": "艾瑟兰",
"core_conflict": "魔法与机械文明的百年冷战",
"tone": "蒸汽朋克 + 克苏鲁恐怖",
"forbidden": ["现代科技词汇", "地球地名"] # 禁止出现的元素
}
def generate_lore_section(section_name: str, context: str) -> str:
"""
生成单个世界观章节
Args:
section_name: 章节名称,如 "地理志" / "种族志"
context: 已生成的前置内容,用于保持一致性(关键!)
"""
prompt = f"""你是一位严谨的世界观构建者。
## 世界核心设定(不可违背)
{json.dumps(WORLD_SEED, ensure_ascii=False, indent=2)}
## 已有世界观内容(保持一致)
{context if context else "(首章,无前置内容)"}
## 当前任务
撰写「{section_name}」章节,要求:
1. 与核心设定完全一致
2. 不出现禁止元素:{WORLD_SEED['forbidden']}
3. 字数 800-1200 字
4. 末尾附「内部矛盾检查」:列出本章节与已有内容的潜在冲突点
只输出章节正文和矛盾检查,不要其他说明。"""
message = client.messages.create(
model="claude-opus-4-5",
max_tokens=2048, # 控制单次输出上限,避免超长漂移
temperature=0.7, # 0.7 在创意性和一致性间取平衡,世界观不建议超过 0.8
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
# ── 分段生成,每次把前文作为 context 传入 ──
sections = ["地理志", "种族志", "魔法体系", "历史年表"]
lore_doc = {}
accumulated_context = ""
for section in sections:
print(f"正在生成:{section}...")
content = generate_lore_section(section, accumulated_context)
lore_doc[section] = content
# 只取前 500 字作为 context,避免 token 爆炸
accumulated_context += f"\n\n## {section}\n{content[:500]}..."关键参数说明:
temperature=0.7:世界观文档不能太随机,0.7是经验值上限context[:500]:截断是必要的,全量传入会导致后期章节token超限forbidden字段:显式约束比隐式期望可靠得多角色立绘需要风格一致,手写Prompt很难保证。解决方案:把角色属性结构化,程序化生成Prompt。
from dataclasses import dataclass
from typing import Optional
@dataclass
class CharacterPromptBuilder:
"""角色 Prompt 构建器——确保同一角色在不同场景下风格一致"""
# ── 固定元素:每张图都必须有,保证角色识别度 ──
character_name: str
base_appearance: str # 如 "silver hair, amber eyes, scar on left cheek"
art_style: str # 如 "concept art, detailed illustration, muted palette"
# ── 可变元素:根据场景调整 ──
scene: Optional[str] = None
emotion: Optional[str] = None
lighting: Optional[str] = None
# ── 负面 Prompt:全局固定,避免常见问题 ──
NEGATIVE_BASE = (
"extra fingers, deformed hands, blurry, low quality, "
"watermark, text, signature, multiple characters"
)
def build(self) -> dict:
"""
返回可直接传给 SD API 的参数字典
"""
positive_parts = [
self.base_appearance, # 角色固定特征放最前,权重最高
self.art_style,
]
if self.scene:
positive_parts.append(self.scene)
if self.emotion:
positive_parts.append(f"expression: {self.emotion}")
if self.lighting:
positive_parts.append(f"{self.lighting} lighting")
return {
"prompt": ", ".join(positive_parts),
"negative_prompt": self.NEGATIVE_BASE,
"steps": 30, # 30 步在质量和速度间平衡,概念图可降到 20
"cfg_scale": 7.5, # 7-8 是通用安全区,太高会过饱和
"width": 768,
"height": 1024, # 竖版适合角色立绘
"seed": -1 # -1 = 随机;固定 seed 用于复现特定结果
}
# ── 使用示例 ──
kira = CharacterPromptBuilder(
character_name="Kira",
base_appearance="silver hair, amber eyes, scar on left cheek, leather armor",
art_style="steampunk concept art, detailed illustration, muted earth tones"
)
# 生成不同场景的立绘,角色特征始终一致
battle_prompt = kira.build()
battle_prompt["prompt"] # 追加战斗场景描述
portrait_prompt = kira.build()
portrait_prompt["seed"] = 42 # 固定 seed,用于官方头像的复现世界观文档写多了,前后矛盾是必然的。用embedding做语义相似度检索,自动找潜在冲突:
from openai import OpenAI
import numpy as np
client = OpenAI()
def check_consistency(new_content: str, existing_docs: list[str]) -> list[dict]:
"""
检查新内容与已有文档的语义冲突
原理:把所有文档切成句子,用 embedding 找与新内容最相似的句子,
再让 LLM 判断是否存在矛盾(而不是相似)
"""
def get_embedding(text: str) -> list[float]:
resp = client.embeddings.create(
input=text,
model="text-embedding-3-small" # 小模型够用,成本低 10 倍
)
return resp.data[0].embedding
def cosine_similarity(a, b) -> float:
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
new_emb = get_embedding(new_content)
conflicts = []
for doc in existing_docs:
# 按句切分,粒度更细
sentences = [s.strip() for s in doc.split("。") if len(s.strip()) > 10]
for sent in sentences:
sim = cosine_similarity(new_emb, get_embedding(sent))
# 相似度 > 0.75:内容相关,值得检查
# 相似度 > 0.95:几乎相同,可能是重复
if 0.75 < sim < 0.95:
conflicts.append({
"existing": sent,
"similarity": round(sim, 3),
"flag": "需人工确认"
})
# 按相似度降序,优先看最可能冲突的
return sorted(conflicts, key=lambda x: x["similarity"], reverse=True)[:10]坑1:上下文窗口的"记忆幻觉"
坑2:Prompt工程的"过拟合"
坑3:图像一致性的"漂移问题"
坑4:自动化流程的"静默失败"
坑5:版权与风格"撞车"
价值总结:
这套流程让你一个人能做团队的事。核心不是工具多厉害,而是"需求拆解→工具匹配→迭代验证"的思维框架。AI负责批量生产,人负责质量把控和创意方向。结构化输入、分段生成、自动校验、人工审核,四个环节缺一不可。记住:工具只是手段,流程才是核心竞争力。
行动号召:
👉 关注+收藏,获取完整代码仓库链接
💬 评论区聊聊:你在AI文创项目中踩过哪些坑?
🔗 加入社团技术交流群,获取更多AI协作实战经验
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。