此示例展示了如何使用结构化输出与 AI 代理,以生成格式良好的电影剧本概念。它展示了两种方法:

  1. JSON 模式:传统的 JSON 响应解析
  2. 结构化输出:增强的结构化数据处理

可以尝试的示例提示:

  • “东京” - 获取一个设定在未来日本的高科技惊悚片
  • “古罗马” - 体验一部史诗历史剧
  • “曼哈顿” - 探索一部现代浪漫喜剧
  • “亚马逊雨林” - 在异国情调的地点进行冒险
  • “火星殖民地” - 太空定居点中的科幻小说

代码

structured_output.py
from textwrap import dedent
from typing import List

from agno.agent import Agent, RunResponse  # noqa
from agno.models.openai import OpenAIChat
from pydantic import BaseModel, Field


class MovieScript(BaseModel):
    setting: str = Field(
        ...,
        description="对电影主要地点和时代背景的丰富细节和氛围描述。包含感官细节和情绪。",
    )
    ending: str = Field(
        ...,
        description="将所有情节线索联系起来的电影精彩结局。应具有情感冲击力和满意度。",
    )
    genre: str = Field(
        ...,
        description="电影的主要和次要类型(例如,“科幻惊悚片”、“浪漫喜剧”)。应与设定和基调保持一致。",
    )
    name: str = Field(
        ...,
        description="一个引人注目、令人难忘的标题,捕捉故事的精髓并吸引目标受众。",
    )
    characters: List[str] = Field(
        ...,
        description="4-6 位主要角色,带有独特的姓名和简短的角色描述(例如,“Sarah Chen - 拥有黑暗秘密的杰出量子物理学家”)。",
    )
    storyline: str = Field(
        ...,
        description="一个引人入胜的三句话情节摘要:铺垫、冲突和风险。用悬念和情感吸引读者。",
    )


# 使用 JSON 模式的代理
json_mode_agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    description=dedent("""\
        你是一位著名的好莱坞编剧,以创作令人难忘的卖座大片而闻名!🎬
        结合了克里斯托弗·诺兰、艾伦·索金和昆汀·塔伦蒂诺的故事叙述能力,
        你创作出能够吸引全球观众的独特故事。

        你的专长是将地点变成鲜活的人物,推动叙事发展。\
    """),
    instructions=dedent("""\
        在构思电影概念时,请遵循以下原则:

        1. 情境即角色:
           - 让地点充满感官细节,栩栩如生
           - 包含影响故事的氛围元素
           - 考虑时代对叙事的影响

        2. 角色发展:
           - 让每个角色都有独特的声音和明确的动机
           - 创造引人入胜的关系和冲突
           - 确保多元化代表性和真实背景

        3. 故事结构:
           - 以吸引人的开头开始
           - 通过不断升级的冲突来建立紧张感
           - 提供令人惊讶但又不可避免的结局

        4. 类型精通:
           - 在拥抱类型惯例的同时,加入新颖的转折
           - 深思熟虑地混合类型以创造独特的组合
           - 在整个过程中保持一致的基调

        将每个地点都变成一次难忘的电影体验!\
    """),
    response_model=MovieScript,
)

# 使用结构化输出的代理
structured_output_agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    description=dedent("""\
        你是一位著名的好莱坞编剧,以创作令人难忘的卖座大片而闻名!🎬
        结合了克里斯托弗·诺兰、艾伦·索金和昆汀·塔伦蒂诺的故事叙述能力,
        你创作出能够吸引全球观众的独特故事。

        你的专长是将地点变成鲜活的人物,推动叙事发展。\
    """),
    instructions=dedent("""\
        在构思电影概念时,请遵循以下原则:

        1. 情境即角色:
           - 让地点充满感官细节,栩栩如生
           - 包含影响故事的氛围元素
           - 考虑时代对叙事的影响

        2. 角色发展:
           - 让每个角色都有独特的声音和明确的动机
           - 创造引人入胜的关系和冲突
           - 确保多元化代表性和真实背景

        3. 故事结构:
           - 以吸引人的开头开始
           - 通过不断升级的冲突来建立紧张感
           - 提供令人惊讶但又不可避免的结局

        4. 类型精通:
           - 在拥抱类型惯例的同时,加入新颖的转折
           - 深思熟虑地混合类型以创造独特的组合
           - 在整个过程中保持一致的基调

        将每个地点都变成一次难忘的电影体验!\
    """),
    response_model=MovieScript,
)

# 使用不同地点的示例用法
json_mode_agent.print_response("Tokyo", stream=True)
structured_output_agent.print_response("Ancient Rome", stream=True)

# 更多示例可以尝试:
"""
创意地点提示以供探索:
1. “水下研究站” - 用于幽闭恐怖的科幻惊悚片
2. “维多利亚时代的伦敦” - 用于哥特式悬疑片
3. “2050 年迪拜” - 用于未来抢劫电影
4. “南极研究基地” - 用于生存恐怖故事
5. “加勒比海岛” - 用于热带冒险浪漫片
"""

# 若要在变量中获取响应:
# from rich.pretty import pprint

# json_mode_response: RunResponse = json_mode_agent.run("New York")
# pprint(json_mode_response.content)
# structured_output_response: RunResponse = structured_output_agent.run("New York")
# pprint(structured_output_response.content)

用法

1

创建虚拟环境

打开 Terminal 并创建一个 python 虚拟环境。

python3 -m venv .venv
source .venv/bin/activate
2

安装库

pip install openai agno
3

运行代理

python structured_output.py