首页
/ 基于 CAMEL PPTXToolkit 与 Streamlit 构建 AI 驱动的 PPT 自动生成应用

基于 CAMEL PPTXToolkit 与 Streamlit 构建 AI 驱动的 PPT 自动生成应用

2026-09-13 23:59:43作者:庞眉杨Will

本文围绕 CAMEL 仓库中的 pptx_toolkit_usecase 示例,完整讲解如何用 CAMEL 的 PPTXToolkit 搭配 OpenAI 与 Streamlit,在数秒内从任意主题自动生成结构完整、图文并茂的专业 PPTX 演示文稿。读者将掌握"LLM 生成结构化幻灯片 JSON → 工具包渲染 PPTX"的完整流水线,理解 PPTXToolkit 的 JSON 数据契约、步骤图/表格/图片渲染原理,并可直接运行一个可复用的 Streamlit 应用。

应用概览:一个"主题到 PPTX"的端到端 Demo

examples/usecases/pptx_toolkit_usecase/ 目录下存放着一个可直接运行的 AI PPT 生成器应用,其核心文件与资源包括:

根据 README 的说明,该应用具备以下特性:

  • 即时生成:为任意主题生成包含多张幻灯片的 PPTX 文件;
  • 内容智能生成:使用 OpenAI 模型生成要点(bullet)、步骤式(step-by-step,以五边形/箭头形状呈现)和表格(table)三种类型幻灯片;
  • 可选图片支持:配置 Pexels API Key 后,可自动检索并插入配图;
  • 100% 本地输出:所有生成结果都在本地完成并可直接下载。

整体技术栈为 CAMEL-AI(PPTXToolkit 模块)+ OpenAI + Streamlit。

环境准备与安装

README 给出了推荐的标准安装流程,核心命令如下:

# 1. 创建全新的虚拟环境(推荐)
python3 -m venv .venv
source .venv/bin/activate  # Windows 下使用 .venv\Scripts\activate

# 2. 安装指定版本的 CAMEL-AI 及其依赖
pip install camel-ai[all]==0.2.62 streamlit openai

# 3. (可选)如果需要生成带图片的幻灯片,到 Pexels 申请 API Key

需要说明的是,示例目录下的 requirements.txt 记录的依赖版本为 camel-ai[all]==0.2.80,并额外显式声明了 python-pptxPPTXToolkit 底层的 PPTX 操作库)。两者对 camel-ai 的版本约束不同,安装时以你使用的版本为准;python-pptx 是渲染 PPTX 的必需底层依赖。

运行前需要准备两个 API Key:

Key 用途 是否必须
OpenAI API Key 驱动 ChatAgent 生成幻灯片结构化内容 必须
Pexels API Key 通过 img_keywords 关键词自动检索并插入配图 可选(不填则无图)

快速启动:五分钟跑通 Streamlit 应用

按照 README 的使用说明,启动流程如下:

  1. 获取 OpenAI API Key(https://platform.openai.com/account/api-keys);

  2. (可选)获取 Pexels API Key;

  3. 克隆仓库并进入示例目录,或直接把 app_pptx.py 复制到自己的工作目录:

    git clone https://github.com/camel-ai/camel
    cd examples/usecases/pptx_toolkit_usecase
    
  4. 启动 Streamlit 应用:

    streamlit run app_pptx.py
    
  5. 浏览器打开默认地址 http://localhost:8501;

  6. 在侧边栏填入两个 API Key,输入主题、设定幻灯片数量,点击 Generate Presentation 按钮即可生成并下载 PPTX。

应用的交互界面由 app_pptx.py 中的 Streamlit 代码搭建:侧边栏(st.sidebar)提供 OpenAI Key 与 Pexels Key 两个密码输入框;主区域提供主题输入框(st.text_input)与幻灯片数量滑块(st.slider,取值范围 3~10,默认 5,不含标题页)。未填写 OpenAI Key 时应用会通过 st.info 提示并 st.stop() 终止,避免无效调用。生成成功后通过 st.download_button 提供 PPTX 文件的下载入口(MIME 类型为 application/vnd.openxmlformats-officedocument.presentationml.presentation)。

工作原理:两段式流水线

README 的 "How it Works" 一节概述了整体机制,结合 app_pptx.py 的实现可以拆解为两个阶段:

阶段一:LLM 生成结构化幻灯片内容。 用户提供主题(topic)与目标幻灯片数量后,应用构建一段严格的指令 Prompt(见 pptx_prompt 函数),要求模型输出符合 PPTXToolkit 约定的 JSON 结构。README 指出默认使用 GPT-4o 或 GPT-4(可在代码中修改模型),而当前示例代码中 ModelFactory.create 实际配置的是 ModelType.GPT_4_1,并将 temperature 设为 0.0 以降低随机性、保证输出格式稳定。

阶段二:PPTXToolkit 渲染成 .pptx 文件。 将阶段一生成的 JSON 传入 PPTXToolkit.create_presentation,工具包按 JSON 中的幻灯片类型分别渲染标题页、要点页、步骤图页、表格页与图片页,最终生成以主题命名的 .pptx 文件供下载。

README 还强调两条内容约束:至少包含一张步骤式幻灯片和一张表格幻灯片若提供了 Pexels API Key,则至少两张幻灯片会带图片。这些约束通过 Prompt 中的强制要求(pptx_prompt 中的第 2、3、4 条)实现。

结构化输出:Pydantic Schema 与示例 Prompt 结构

README 提供了一个完整的示例 JSON 结构(见 "Example Prompt Structure" 折叠块),它定义了 PPTXToolkit 接受的数据契约:

[
  {"title": "AI Agents", "subtitle": "Exploring the world of artificial intelligence agents"},
  {"heading": "Types of AI Agents", "bullet_points": ["Intelligent Virtual Agents", "Autonomous Agents", "Collaborative Agents"], "img_keywords": "AI, technology"},
  {"heading": "Creating an AI Agent", "bullet_points": [">> Step 1: Define the goal", ">> Step 2: Choose algorithms", ">> Step 3: Implement and test"], "img_keywords": "workflow, robotics"},
  {"heading": "Comparison of AI Agents", "table": {"headers": ["Type", "Capabilities", "Examples"], "rows": [["Virtual", "Conversational AI", "Siri"], ["Autonomous", "Self-learning", "Robots"]]}, "img_keywords": "comparison chart, table"}
]

其中:

  • 列表第一个元素是标题页,包含 titlesubtitle
  • bullet_points 中以 >> 开头的条目会被渲染为步骤式流程
  • table 对象由 headers(表头)与 rows(行数据)组成,用于表格页
  • img_keywords 是图片检索关键词(不是 URL),用于 Pexels 配图。

在应用实现层面,app_pptx.py 更进一步:用 Pydantic 定义了 TitleSlideTableDataBulletSlideTableSlidePresentationSlides 五个模型来约束模型输出,并在 agent.step(full_prompt, response_format=PresentationSlides) 中通过结构化输出能力强制模型返回符合 Schema 的 JSON,随后用 PresentationSlides.model_validate_json 校验,再转换为上面展示的纯 JSON 列表交给 create_presentation。这比直接让模型输出自由 JSON 更可靠,可有效避免字段缺失或类型错误。

PPTXToolkit 源码级解析:JSON 到 PPTX 的渲染机制

PPTXToolkit 位于 camel/toolkits/pptx_toolkit.py,继承自 BaseToolkit,并用 @MCPServer() 装饰(意味着其能力可被包装为 MCP 工具服务)。get_tools() 返回一个 FunctionTool,暴露的唯一核心工具就是 create_presentation

入口与参数

create_presentation(content: str, filename: str, template: Optional[str] = None) -> str

  • content:JSON 字符串,必须是一个字典列表(结构如上文示例);
  • filename:输出文件名或路径,相对路径会解析到工作目录下;
  • template:可选的 PPTX 模板路径,用于复用既有版式。

工具会自动为文件名补上 .pptx 后缀(若缺失),并通过 _sanitize_filename 将空格与特殊字符替换为下划线。从源码结构看,若传入的 JSON 无法解析或不是列表,会返回错误提示字符串(如 "Failed to parse content as JSON" / "PPTX content must be a list of dictionaries"),而不是抛出异常——这一点由测试用例 test_create_presentation_invalid_content_type 直接验证。

工作目录解析

构造器 __init__(working_directory=None, timeout=None) 按优先级确定输出目录:

  1. 显式传入的 working_directory
  2. CAMEL_WORKDIR 环境变量;
  3. 默认 ./camel_working_dir

目录不存在时会自动创建。注意示例应用 app_pptx.py 第 167 行调用的是 PPTXToolkit(output_dir="outputs"),这是该脚本编写时对应版本的历史 API 命名;当前仓库主分支源码中的参数名为 working_directory,使用时请与所安装的 camel-ai 版本保持一致。测试 test_pptx_toolkit.py 中的 pptx_toolkit fixture 使用临时目录验证了初始化行为,并断言 working_directory.exists()

幻灯片类型分发

_write_pptx_file 按如下规则分发渲染(对应 README 描述的 bullet / step-by-step / table 三类幻灯片):

  • 首元素固定为标题页,写入 titlesubtitle
  • table 键的字典 → _handle_table,在标题与正文占位符位置插入 len(rows)+1 行 × len(headers) 列的表格,表头加粗;
  • bullet_points 且任意条目以 >> (常量 STEP_BY_STEP_PROCESS_MARKER)开头 → _handle_step_by_step_process,渲染步骤图;
  • bullet_points 但无步骤标记 → _handle_default_display,渲染普通要点页。

要点页支持嵌套列表_get_flat_list_of_contents 会递归展平为带层级 level 的条目,并设置段落缩进级别),还支持 Markdown 加粗 **bold** 与斜体 *italic*(由 BOLD_ITALICS_PATTERN 正则解析后按 run 拆分写入)。

步骤图的自动布局

_handle_step_by_step_process 根据步骤数量自动选择版式(代码可验证):

  • 3~4 步:水平排列 CHEVRON(箭头/菱形) 形状,居中对齐、垂直居中;
  • 5~6 步:垂直排列 PENTAGON(五边形) 形状,逐步向右下方错位排布。

这正是 README 中 "pentagon/chevron" 说法的实现来源。步骤条文案会通过 removeprefix('>> ') 去掉前缀后居中显示,字号固定为 14pt。

图片插入:URL 直取与 Pexels 检索

_handle_display_image__in_foreground 使用"图片与文字"布局(slide_layouts<a href="https://link.gitcode.com/i/ae49aa6a0d87186a92bdc7c85a6619ec" target="_blank">8],Picture with Caption)创建幻灯片,并由 @api_keys_required([("api_key", "PEXELS_API_KEY")]) 装饰器强制校验 Pexels Key 的存在性(该校验装饰器实现在 [camel/utils/commons.py)。图片来源有两种:

  1. img_keywordshttp://https:// 开头,则视为图片 URL,直接下载插入;
  2. 否则作为关键词调用 Pexels 搜索 API(https://api.pexels.com/v1/search,参数 querysize=mediumper_page=3),随机选取一张结果的大图(src.largesrc.original)下载插入。

值得注意的实现细节:配图是概率性的_handle_default_display 中只有当 random.random() < IMAGE_DISPLAY_PROBABILITY(常量 1/3)时才尝试走图片布局;图片插入失败(网络错误、图片无效等)时会优雅回退为纯文本要点页,不会导致整个生成流程中断——测试用例 test_create_presentation_invalid_image_url 专门验证了"无效图片 URL 依然成功生成文件"这一容错行为。README 中"至少两张幻灯片含图片"的约束主要由 Prompt 要求 img_keywords 非空来保证。

模板支持

create_presentationtemplate 参数允许传入一个已有的 .pptx 模板文件(如示例目录中的 urban_monochrome.pptx)。从 _write_pptx_file 的实现看,模板加载后会清空其全部现有幻灯片,仅继承母版、版式与主题样式;若模板文件不存在则回退到默认模板并记录 warning。

关键调用链与完整流程回顾

综合 README 与源码,一次完整的生成请求在应用内部经历以下调用链:

用户输入 topic + slide_count
        │
        ▼
pptx_prompt() 构造严格指令 Prompt
        │
        ▼
ChatAgent.step(prompt, response_format=PresentationSlides)   # GPT-4.1, temperature=0
        │
        ▼
PresentationSlides.model_validate_json() 校验并转换
        │
        ▼
构建纯 JSON 列表(title / bullet / step / table 幻灯片)
        │
        ▼
PPTXToolkit.create_presentation(json_str, out_name)           # 输出到 outputs/
        │
        ▼
_write_pptx_file() → _handle_table / _handle_step_by_step_process / _handle_default_display / _handle_display_image__in_foreground
        │
        ▼
演示文稿保存为 .pptx → Streamlit 下载按钮

从源码结构还可以推断,PPTXToolkitcreate_presentation 在渲染前会先 json.loads 解析内容、校验列表类型,随后才进入渲染,因此它既可以作为 Agent 的工具被调用,也可以像示例应用这样由上层 Python 代码直接驱动——这正是 test_all_exports.py 等测试所保证的公开 API 形态。

质量保障:测试覆盖的行为契约

test/toolkits/test_pptx_toolkit.pyPPTXToolkit 提供了 13 个测试用例,覆盖了 README 场景背后的关键行为契约:

  • test_get_toolsget_tools() 恰好返回 1 个工具,名为 create_presentation
  • test_create_presentation_basic:1 张标题页 + 2 张内容页 → 生成 3 张幻灯片的合法 PPTX;
  • test_create_presentation_with_images:带图片 URL 的幻灯片在设置 PEXELS_API_KEY 后可成功生成;
  • test_create_presentation_missing_fields:缺少 subtitleimg_keywords 等可选字段时依然成功;
  • test_create_presentation_invalid_image_url:图片下载失败不影响文件生成;
  • test_create_presentation_invalid_content_type:非法 JSON / 非列表 JSON 返回明确错误信息;
  • test_create_presentation_auto_extension:自动补全 .pptx 后缀;
  • test_sanitize_and_resolve_filepath:带空格与特殊字符的文件名被清理为下划线形式;
  • test_create_presentation_empty_content:空内容列表也能生成合法文件(0 张幻灯片)。

这些测试从侧面印证了 README 所宣称的"即输即用、容错友好":即便内容字段不完整、图片链接失效或输入格式有误,工具都能给出明确反馈而不崩溃。

扩展方向

结合 README 与源码,可以低成本地对这个 Demo 做如下扩展:

  • 更换模型:将 app_pptx.pyModelFactory.createmodel_platform / model_type 替换为其他平台与模型(CAMEL 支持多平台模型工厂),即可接入不同 LLM;
  • 使用自定义模板:在调用 create_presentation 时传入 template 参数指向自己的 .pptx 母版文件,即可批量产出统一品牌风格的演示文稿;
  • 调整图片策略:修改 camel/toolkits/pptx_toolkit.py 中的 IMAGE_DISPLAY_PROBABILITY 常量可控制配图密度;
  • 接入 Agent 工作流PPTXToolkitFunctionTool 形式暴露工具,可将其注册到 CAMEL Agent 的 toolkits 列表,让 Agent 在对话中自主生成演示文稿,而非局限于 Streamlit 表单。

需要注意的是,README 所述 GPT-4o/GPT-4 与示例代码当前使用的 GPT-4.1 存在差异,这是示例随版本演进的正常现象;实际运行时以所安装 camel-ai 版本中的代码为准。本文所有实现细节均以当前仓库 camel/toolkits/pptx_toolkit.pyapp_pptx.py 的源码为依据。

登录后查看全文
热门项目推荐
相关项目推荐