用CrewAI代理自动化漫画创作:创新内容生成技巧


6 个月前

引言

从前,创作一本漫画书是一个繁琐的过程,需要作家、插画师和无数小时的努力。如今,人工智能已成为一种强大的工具,增强了创意专业人士的能力。想象一下,把一个短故事交给人工智能,看看它如何帮助将这个故事转变为生动、视觉震撼的漫画书——同时保留创作者独特的视角。这不再只是幻想;这是由尖端生成性人工智能模型实现的现实。在这篇博客中,我们将探讨 CrewAI LLM 代理如何提升漫画书创作的创意过程,深入了解使这一魔法成为可能的架构和实现。

示例:从《潘查塔特拉》创作故事书

为了演示这个过程,我们使用《潘查塔特拉》中的一个短故事——这是一个以智慧和道德教训著称的古印度寓言集。考虑一下《狮子与兔子》的故事:

短故事 : “从前,有一只名叫巴苏拉卡的强大狮子,它在丛林中横行霸道。动物们厌倦了它的暴政,决定每天给它送一只猎物。一天,轮到一只聪明的兔子,它制定了一个计划,想要摆脱狮子。它把巴苏拉卡引到一个深井边,骗它说那里住着另一只狮子。巴苏拉卡看到水中的倒影,愤怒地吼叫着跳进了井里,再也没有回来。”

使用 CrewAI 框架,我们将遵循以下步骤:

  1. 剧本编写代理 : 剧本编写者将故事分解为场景,例如:

    • 场景 1:狮子在丛林中横行霸道。
    • 场景 2:动物们决定每天送一只猎物。
    • 场景 3:兔子计划欺骗狮子。
    • 场景 4:狮子跳进井里。
  2. 视觉艺术家代理 : 视觉艺术家随后为每个场景生成插图,描绘关键时刻,比如狮子在丛林中吼叫、兔子引导狮子到井边,以及狮子跳入水中的最后一幕。

  3. 合成器代理 : 最后,合成器将所有这些场景和图像结合成一本连贯的故事书,准备好供人观看和分享。

有关《潘查塔特拉》故事的更多细节,您可以参考外部资源,如 维基百科上的潘查塔特拉潘查塔特拉故事集

使用 LLM 代理自动化创意生成

生成性人工智能代理可以被视为一个数字“团队”,共同执行复杂的创意过程。通过将特定任务分配给各个 AI 代理,创作整本漫画图画书的过程变得更加高效和自动化。在下面的图示中,专业代理协同工作:

None

  1. 剧本编写者 : 负责将短故事转化为详细的分场景。
  2. 视觉艺术家 : 负责将每个场景转化为引人入胜的视觉艺术作品。
  3. 合成器 : 负责将所有生成的场景及其对应的图像结合成一本完整的漫画书。合成器确保叙事流畅,最终产品准备好出版。

这些代理之间的协同作用自动化了漫画书创作的过程,使创意工作流程高效。关键在于以协调的方式利用生成性语言模型和图像生成 AI 系统的能力。

架构概述

这种自动化的架构简单而有效。该过程从一个短故事开始,依次进行:

  1. 短故事输入 : 该过程以一个短叙述作为输入,作为漫画书的基础。
  2. 剧本编写代理 : 该代理将短故事分解为离散场景,每个场景捕捉故事情节中的重要部分。在图示中,这被标记为“场景 1、场景 2、场景 3”等,直到整个故事被分成几个较小的场景。
  3. 视觉艺术家代理 : 视觉艺术家根据每个场景描述创建视觉表现,有效地为漫画绘制插图。视觉元素被创建为代表场景的图像,比如阳光下的狮子、狮子与兔子的相遇等。
  4. 合成器 : 最后,所有场景及其对应的图像由合成器代理结合,创建一本完整的图画书。

整个过程旨在无缝地将叙述转化为引人入胜的漫画书,所需的人为干预最小。

使用 CrewAI 框架的实现

为了实现这一愿景,我们实施了 CrewAI 框架,三个代理和谐工作。以下是实现过程中涉及的详细步骤,并附有代码片段的占位符,以帮助您逐步重现该过程:

定义代理和任务 : 我们使用 CrewAI 框架定义两个代理——代理 1(剧本编写者)和代理 2(视觉艺术家)。这两个代理都有特定的角色,它们的任务相互关联,以实现高效的工作流程。

# 代理
scriptwriter:
  role: >
    为儿童短故事编写场景剧本
  goal: >
    为儿童图画书编写简单、清晰且引人入胜的场景剧本。
  backstory: >
    你是一个剧本编写者,专注于将儿童短故事转化为可表演或制作动画的剧本。
  llm: llm_model               

# 任务
scriptwriting:
  description: >
    你将获得一个关于学习生活重要教训的儿童短故事。该故事需要转化为图画书,以便儿童愉快阅读和参与。你负责将故事分解为 {number_of_scenes} 个独特场景,每个场景专注于故事中的特定事件或时刻。每个场景将转化为图像。你必须生成以下信息,遵循指定的 pydantic 模式:
    
    - 故事的合适名称 
    - 故事的简短总结 
    - 提供给读者的重要背景信息的简短叙述。
    - 每个场景的详细叙述,至少一到两句。
    - 故事中学到的最终教训。
    
    <short_story>    
      {story_text}
    </short_story>   
  expected_output: >   
    输出必须严格遵循 pydantic 模式。如果不遵循,将会受到惩罚。       
  agent: scriptwriter

# 代理
visualartist:
  role: >
    为故事书创作视觉插图
  goal: >
    创建引人入胜的图画书。
  backstory: >
    擅长创作图画故事书的专家。
  llm: llm_model

# 任务
illustration:
  description: > 
    你将获得一个关于学习生活重要教训的儿童短故事。该故事将转化为图画书,以便儿童愉快阅读和参与。故事已经分解为独特的场景。
    
    以下是故事中某个特定场景的描述,以及相应的简短总结。 
    
    生成一个可以用于文本到图像模型的提示,以生成该场景的图像。将提示发送到提供的工具,以生成符合场景要求的角色和背景的图像。角色应为卡通风格。提示应少于 40 个单词。
    
    <story_summary>
      {story_summary}
    <story_summary>
    
    <scene_description>
      {scene_description}
    </scene_description>
  expected_output: >   
    输出必须严格遵循 pydantic 模式。如果不遵循,将会受到惩罚。       
  agent: visualartist

Crew 配置: 定义代理生成响应的结构化模式和 LLM 模型,如 OpenAI 和 DaLLE 模型,并将代理与其任务绑定。

dalle_tool = DallETool(model="dall-e-3",
                       size="1024x1024",
                       quality="standard",
                       n=1)

# 定义单个场景的类
class StoryScene(BaseModel):
    scene_number: int 
    narration: str

# 定义故事场景列表的类
class StoryScenes(BaseModel):
    story_name: str 
    summary: str 
    background: str 
    lesson: str 
    scenes: List[StoryScene]

# 定义单个场景的类
class SceneImage(BaseModel):
    prompt: str = Field(description="用于生成图像的文本提示", max_length=50)
    image_url: str = Field(description="生成工具的图像 URL")

@CrewBase
class StoryCrew():
    """故事团队"""
    
    agents_config = 'config/story/agents.yaml'
    tasks_config = 'config/story/tasks.yaml'
    
    @llm
    def llm_model(self):
        return ChatOpenAI(temperature=0.0,  # 设置为 0 以获得确定性输出
                          model="gpt-4o-mini",  # 使用 GPT-4 Turbo 模型
                          max_tokens=8000) 
    
    @agent
    def scriptwriter(self) -> Agent:
        return Agent(
            config=self.agents_config['scriptwriter'],
            output_pydantic=StoryScenes,   
            verbose=True
        )
    
    @task
    def scriptwriting(self) -> Task:
        return Task(
            config=self.tasks_config['scriptwriting'],
            output_pydantic=StoryScenes,   
        )
    
    @crew
    def crew(self) -> Crew:
        """创建故事团队"""
        script_crew = Crew(
            agents=self.agents,  # 由 @agent 装饰器自动创建
            tasks=self.tasks,  # 由 @task 装饰器自动创建
            process=Process.sequential,
            verbose=True,
            # process=Process.hierarchical, # 如果您想使用该选项,请参见 https://docs.crewai.com/how-to/Hierarchical/
        )
        
        return script_crew
     
@CrewBase
class ArtistCrew():
    
    agents_config = 'config/visual/agents.yaml'
    tasks_config = 'config/visual/tasks.yaml'
    
    @llm
    def llm_model(self):
        return ChatOpenAI(temperature=0.0,  # 设置为 0 以获得确定性输出
                          model="gpt-4o-2024-08-06",  # 使用 GPT-4 Turbo 模型
                          max_tokens=8000) 
    
    @agent
    def visualartist(self) -> Agent:
        return Agent(
            config=self.agents_config['visualartist'],
            tools=[dalle_tool],   
            verbose=True
        )
    
    @task
    def illustration(self) -> Task:
        return Task(
            config=self.tasks_config['illustration'],
            output_pydantic=SceneImage,      
            output_file='report.md'
        )
    
    @crew
    def crew(self) -> Crew:
        """创建图画书团队"""
        artist_crew = Crew(
            agents=self.agents,  # 由 @agent 装饰器自动创建
            tasks=self.tasks,  # 由 @task 装饰器自动创建
            process=Process.sequential,
            verbose=True,
            # process=Process.hierarchical, # 如果您想使用该选项,请参见 https://docs.crewai.com/how-to/Hierarchical/
        ) 
    
        return artist_crew

主要工作流程: 确保两个代理之间的适当交接。例如,一旦剧本编写者完成一个场景,它会自动将其传递给视觉艺术家,确保工作流程的连续性。

agentops.start_session(tags=['story', 'scripts'])

# 使用 QuestCrew 创建假设或生成问题
inputs = {
    'number_of_scenes': int(number_of_scenes),
    'story_text': story_text,
}

scenes_list = StoryCrew().crew().kickoff(inputs=inputs)

agentops.end_session("成功")

if scenes_list is not None:        
    print(f"剧本编写的原始结果: {scenes_list.raw}")

slist = scenes_list.pydantic
story_summary = slist.summary
for scene in slist.scenes:
    print(f"场景: {scene.narration}") 

scene_input = [{"story_summary": story_summary,
                'scene_description': scene.narration} for i, scene in enumerate(slist.scenes)]

agentops.start_session(tags=['scene', 'illustration'])

# 运行代理
result_images = ArtistCrew().crew().kickoff_for_each(inputs=scene_input)

print("result_images : {result_images.raw}")

结论

生成性人工智能的力量在于它能够增强和支持创意过程,为内容创作者提供新的工具,以实现他们的想法。CrewAI LLM 代理帮助将一个简单的短故事转变为引人入胜的漫画图画书,帮助讲故事的人在每个阶段的旅程中。通过自动化剧本分解和视觉生成等重复性任务,人工智能使艺术家和作家能够更多地专注于核心创意元素,保留他们独特的艺术风格。这一实现展示了生成性人工智能如何增强创意产业,提供了一个未来的展望,在这个未来中,创造力和技术无缝地协同工作。

如果您想了解更多关于 CrewAI 的信息或对为您的项目实施类似的创意解决方案有疑问,请告诉我!

推荐阅读:

FluxAI 中文

© 2025. All Rights Reserved