← 返回首页
🧠

故事生成:AI创作故事

📂 llm ⏱ 3 min 480 words

--- 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])

最佳实践

  1. 构建框架:先构建完整的故事框架
  2. 发展角色:创建立体的角色
  3. 保持连贯:确保故事情节连贯
  4. 迭代改进:根据反馈迭代改进

总结

故事生成是LLM创意应用的重要组成部分。通过合理使用,可以快速创作各种类型的故事内容。