故事生成:AI创作故事
--- title: "故事生成:AI创作故事" description: "使用LLM自动生成故事和小说" tags: ["故事生成", "小说创作", "AI写作", "LLM", "创意"] category: "llm" icon: "📖"
故事生成:AI创作故事
故事生成概述
故事生成是利用LLM创建虚构故事、小说和其他叙事内容的技术。
核心功能
1. 故事框架生成
from openai import OpenAI
from typing import Dict, List
from dataclasses import dataclass
@dataclass
class StoryFramework:
"""故事框架"""
title: str
genre: str
setting: str
protagonist: str
antagonist: str
conflict: str
resolution: str
class StoryFrameworkGenerator:
"""故事框架生成器"""
def __init__(self, model: str = "gpt-4"):
self.client = OpenAI()
self.model = model
def generate_framework(self, genre: str, themes: List[str]) -> StoryFramework:
"""生成故事框架"""
themes_str = "、".join(themes)
prompt = f"""请为一个{genre}故事创建框架。
主题:{themes_str}
请提供:
1. 标题
2. 背景设定
3. 主角描述
4. 反派/冲突
5. 主要冲突
6. 结局方向
请以JSON格式返回。"""
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": "你是一个故事架构师。"},
{"role": "user", "content": prompt}
],
temperature=0.7
)
# 解析响应
result = self._parse_framework(response.choices[0].message.content)
return result
def _parse_framework(self, response: str) -> StoryFramework:
"""解析框架"""
import json
import re
# 尝试提取JSON
json_match = re.search(r'\{.*\}', response, re.DOTALL)
if json_match:
try:
data = json.loads(json_match.group())
return StoryFramework(
title=data.get("title", "未命名"),
genre=data.get("genre", ""),
setting=data.get("setting", ""),
protagonist=data.get("protagonist", ""),
antagonist=data.get("antagonist", ""),
conflict=data.get("conflict", ""),
resolution=data.get("resolution", "")
)
except json.JSONDecodeError:
pass
# 默认返回
return StoryFramework(
title="未命名故事",
genre="奇幻",
setting="现代世界",
protagonist="主角",
antagonist="反派",
conflict="主要冲突",
resolution="圆满结局"
)
2. 章节生成器
class ChapterGenerator:
"""章节生成器"""
def __init__(self, model: str = "gpt-4"):
self.client = OpenAI()
self.model = model
def generate_chapter(self, framework: StoryFramework, chapter_number: int,
previous_content: str = None) -> str:
"""生成章节"""
prompt = f"""基于以下故事框架,生成第{chapter_number}章:
标题:{framework.title}
类型:{framework.genre}
背景:{framework.setting}
主角:{framework.protagonist}
冲突:{framework.conflict}
"""
if previous_content:
prompt += f"\n前文内容:\n{previous_content[-500:]}\n"
prompt += "\n请继续故事情节,保持连贯性。"
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": "你是一个小说作家。"},
{"role": "user", "content": prompt}
],
temperature=0.7
)
return response.choices[0].message.content
def generate_chapters(self, framework: StoryFramework, num_chapters: int) -> List[str]:
"""生成多章节"""
chapters = []
previous_content = ""
for i in range(1, num_chapters + 1):
print(f"生成第{i}章...")
chapter = self.generate_chapter(framework, i, previous_content)
chapters.append(chapter)
previous_content = chapter
return chapters
3. 角色生成器
class CharacterGenerator:
"""角色生成器"""
def __init__(self, model: str = "gpt-4"):
self.client = OpenAI()
self.model = model
def generate_character(self, name: str, role: str, genre: str) -> Dict:
"""生成角色"""
prompt = f"""请创建一个{genre}故事中的角色。
姓名:{name}
角色:{role}
请提供:
1. 外貌描述
2. 性格特点
3. 背景故事
4. 动机和目标
5. 弱点和恐惧
6. 人际关系
7. 角色弧线"""
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": "你是一个角色发展专家。"},
{"role": "user", "content": prompt}
],
temperature=0.6
)
return {"name": name, "role": role, "details": response.choices[0].message.content}
def generate_character_interaction(self, character1: Dict, character2: Dict,
situation: str) -> str:
"""生成角色互动"""
prompt = f"""请描述以下两个角色在特定情境下的互动:
角色1:{character1['name']} - {character1['details'][:200]}
角色2:{character2['name']} - {character2['details'][:200]}
情境:{situation}
请描述他们的互动和对话。"""
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": "你是一个对话作家。"},
{"role": "user", "content": prompt}
],
temperature=0.7
)
return response.choices[0].message.content
完整故事创作
class StoryCreationPipeline:
"""故事创作管道"""
def __init__(self):
self.framework_generator = StoryFrameworkGenerator()
self.chapter_generator = ChapterGenerator()
self.character_generator = CharacterGenerator()
def create_story(self, genre: str, themes: List[str], num_chapters: int = 5) -> Dict:
"""创作完整故事"""
# 1. 生成框架
print("生成故事框架...")
framework = self.framework_generator.generate_framework(genre, themes)
# 2. 生成角色
print("生成角色...")
protagonist = self.character_generator.generate_character(
"主角", "protagonist", genre
)
antagonist = self.character_generator.generate_character(
"反派", "antagonist", genre
)
# 3. 生成章节
print("生成章节...")
chapters = self.chapter_generator.generate_chapters(framework, num_chapters)
# 4. 组装故事
full_story = f"# {framework.title}\n\n"
for i, chapter in enumerate(chapters, 1):
full_story += f"## 第{i}章\n\n{chapter}\n\n"
return {
"framework": framework,
"characters": [protagonist, antagonist],
"chapters": chapters,
"full_story": full_story
}
# 使用示例
pipeline = StoryCreationPipeline()
story = pipeline.create_story("奇幻", ["成长", "友谊"], 3)
print(f"标题:{story['framework'].title}")
print(f"章节数:{len(story['chapters'])}")
print("\n故事开头:")
print(story['full_story'][:500])
最佳实践
- 构建框架:先构建完整的故事框架
- 发展角色:创建立体的角色
- 保持连贯:确保故事情节连贯
- 迭代改进:根据反馈迭代改进
总结
故事生成是LLM创意应用的重要组成部分。通过合理使用,可以快速创作各种类型的故事内容。