亚马逊AWS官方博客

基于Strands Agent框架的考题生成及Agent 效果评估

一、项目概述

1.1 项目背景与目标

在教育领域,考试(一年级-高三年级,数学/科学/英语/历史等多学科)作为评估学生学习成果的核心手段,其传统生成方式长期存在诸多痛点:时间成本高昂、质量稳定性不足、题型覆盖局限、迭代效率低下等问题。为解决这些问题,我们开发了基于 Strands Agent 框架的 AI 考试生成项目。该项目依托大语言模型的强大能力实现考试内容自动化生成,核心目标包括将原本小时级的工作量压缩至分钟级、确保考题质量与难度符合预期标准、支持多种题型和难度以适配不同教学场景、能基于参考资料生成考题以提升针对性和实用性。

与此同时,由于项目在考题生成过程中涉及智能体及多个工具的调用,我们同步建立了一套 Agent 效果指标评估流程。该流程可实时记录智能体与工具在工作过程中的成功率、效率等关键指标,旨在及时掌握整体 Demo 及单个工具的工作状态与健康程度,为后续的优化迭代提供依据。

1.2 核心功能

AI 考试生成器可满足各类考试生成需求:

  • 多题型支持涵盖单选题(每题一个正确答案)、多选题(每题多个正确答案)、填空题(需填写特定内容);难度级别调整分为简单(适合入门学习和基础知识检测)、中等(适合常规考核和能力评估)、困难(适合高阶思维和深度理解测试)。
  • 在参考资料处理上,既支持 URL 作为参考(自动获取网页内容生成相关题目),也支持文本作为参考(用户直接提供文本材料作为出题依据)。
  • 生成的考试内容会渲染为交互式 HTML 页面,支持选择、填空等交互操作,界面美观易用;还支持中英文双语界面,可生成不同语言的考题。

此外,通过多个题目并行生成提高效率,缓存已生成题目避免重复生成相似内容,并能自动修复格式问题以确保内容一致性。

图1 AI 考试生成器核心功能图

以下是AI 考试生成器题目生成界面、答题界面:

图2 AI 考试生成器题目生成界面

图3 考试答题页面

1.3 技术栈概览

项目的技术实现涵盖后端架构、前端构建、数据处理及其他支撑技术,各部分协同保障系统运行。后端基于 Strands Agent 框架搭建,该框架提供 Agent 基础能力,负责协调各类工具的调用;采用 Flask 作为 Web 框架,承担 HTTP 服务及页面渲染相关工作;开发语言主要采用 Python;大语言模型能力由 亚马逊云科技 Bedrock(Claude 模型)提供支持。前端部分选用 React 作为核心框架构建用户界面,结合 TypeScript 进行开发以保障类型安全;UI 组件采用 Material-UI 库;构建工具使用 Vite。数据处理环节通过缓存机制基于本地文件实现;多任务的并行生成通过 ThreadPoolExecutor 完成。Markdown 被用作考试内容的中间格式;HTML、CSS 与 JavaScript 共同支撑交互式考试页面的渲染及交互功能实现。

二、系统架构和工作流

2.1 整体架构设计

AI 考试生成Demo项目采用三层架构,通过 HTTP 协议实现组件间通信。前端基于 JavaScript 构建,提供考试参数输入和结果展示功能,通过 HTTP API 与后端交互。后端服务基于 Strands Agent 框架,主Agent 负责处理请求、调度流程,调用4大类、8 种工具函数执行具体任务。渲染服务基于 Flask 实现,将 Markdown 格式的考试内容转换为交互式 HTML,提供静态资源和考试页面访问入口。前端与后端通过 REST API 通信,后端通过 HTTP POST 请求调用渲染服务获取 HTML 页面 URL,通过 亚马逊云科技 Bedrock API 调用 Claude 3.7 模型完成大语言模型交互。

2.2 考试题生成整体工作流

图4 AI 考试生成工作流程

AI考试生成器采用模块化的时序处理架构,通过各组件间的有序协作实现自动化考试生成。

工作流程始于用户提交包含考试参数的请求,Demo系统随即验证模块对请求格式、必要字段和参数有效性进行检查。验证通过后,元数据提取模块从请求中提取科目、年级、难度等关键信息,并处理用户提供的参考资料(URL或文本)。内容规划模块根据提取的元数据制定考试结构方案,包括题型分布和数量分配。题目生成器接收规划方案后,并行处理同时生成单选题、多选题和填空题。内容组装模块负责将生成的题目整合为完整的考试内容,并进行格式验证和自动修复。最后,渲染服务将Markdown格式的考试内容转换为交互式HTML页面,用户可通过返回的链接访问考试内容并答题。

2.3 Agent 执行评估工作流

在AI考试生成系统中,工具调用多、并且执行状态分散,缺乏统一的监控和管理机制。传统的日志记录方式虽然能够记录执行过程,但无法提供实时的状态跟踪、性能分析和异常处理能力。除此之外,由于需要多工具协同完成任务,单个工具的执行失败可能影响整个工作流的完成,而缺乏有效的状态管理机制会导致系统难以进行故障定位、性能优化和质量评估。因此,我们搭建了一个专门的任务管理组件来实现工具调用的全生命周期监控,确保系统的可观测性、可维护性和可优化性。

Agent执行评估工作流(Taskmanager)是基于 Strands Agent 框架的回调机制构建、负责工作流与工具调用的状态监控和管理。回调机制提供的事件监听接口允许 TaskManager 捕获 Agent 运行过程中的状态变更事件,特别是工具调用的执行状态转换。TaskManager 实现了以下核心功能:

(1)工具调用全链路记录:通过监听工具调用的开始、完成和失败事件,记录完整的执行上下文和参数传递信息

(2)性能数据采集:基于事件时间戳计算每个工具调用的实际执行耗时,生成性能统计数据

(3)状态流转管理:维护工具调用的状态转换(运行中→完成 / 失败),确保执行状态的一致性和可追溯性

(4)状态自动判定:针对未明确标记完成状态的工具调用,实现基于上下文的状态自动判定算法

这些功能共同构成了Demo运行时观测能力,支持开发者追踪工作流执行路径,分析性能数据,并基于执行数据优化工具调用策略。

基于以上这些功能设计,TaskManager就像是考试生成系统的智能监控中心,它实时追踪每一次工具调用的执行情况。例如,当用户提交一个”生成一年级数学考试”的请求时,系统会依次调用多个工具——首先用extract_exam_metadata工具提取”一年级数学、10道题、难度中等、单选为主”等元数据,然后用plan_exam_content工具规划考试结构,接着调用generate_single_choice工具生成具体题目,最后用validate_exam_format工具验证格式。TaskManager会精确记录每个工具的开始时间、结束时间和执行结果,比如”元数据提取耗时0.8秒成功完成,内容规划耗时1.2秒成功完成,单选题生成耗时3.5秒成功完成”。如果某个工具执行失败,比如generate_single_choice工具因为网络问题超时,TaskManager会立即标记这个状态并记录失败原因,帮助开发者快速定位问题。通过这些数据,我们可以了解哪些工具是性能瓶颈(比如题目生成工具平均耗时最长),哪些环节容易出错,从而指导产品优化方向,确保整个考试生成流程的稳定性和用户体验。

图5 Agent 评估工作流与主流程的集成

考试生成流程和TaskManager任务监控管理流程紧密协同工作,形成一个完整的系统:

  1. 初始化阶段协同
  • 考试生成流程创建工作流和步骤
  • TaskManager记录工作流和步骤信息
  • 回调机制建立连接
  1. 执行阶段协同
  • 考试生成流程调用各种工具
  • 回调机制捕获工具调用事件
  • TaskManager记录工具调用信息
  1. 完成阶段协同
  • 考试生成流程完成工作流
  • TaskManager更新工作流状态
  • 评估报告生成系统性能指标
  1. 异常处理协同
  • 考试生成流程捕获异常
  • TaskManager记录失败信息
  • 回调机制处理未完成的工具调用

这种协同工作模式确保了系统的可靠性、可追踪性和可评估性。

2.4 核心组件构成

项目采用模块化设计,各核心组件分工明确共同支撑考试生成全流程的高效运行,具体组件及功能如下:

  1. Agent 组件:核心逻辑位于agent.py,承担考试生成流程的全局协调职责。
  2. 工具组件:集中部署于tools/目录,按功能划分为四类工具脚本。
    • content_tools.py:负责考试内容的元数据处理与结构规划
      • extract_exam_metadata:从用户请求中提取年级、科目、题型等核心元数据
      • plan_exam_content:设计考试内容框架,支持复合题型的组合逻辑
      • validate_exam_format:校验生成内容的格式规范性
    • exam_tools.py:专注于具体题型的生成逻辑
      • generate_single_choice_question:接收主题、难度、参考资料等参数,生成单选题
      • generate_multiple_choice_question:基于输入参数生成多选题
      • generate_fill_blank_question:按指定条件生成填空题
    • reference_tools.py:处理参考资料的解析与内容提取
      • fetch_url_content:获取指定 URL 的网页内容,作为出题参考
      • process_reference:从参考资料中提取关键信息,辅助考题生成
    • render_tools.py:提供与内容渲染相关的支撑功能
  3. 缓存组件:实现于exam_tools.py中,采用本地文件作为存储介质。
  4. 渲染组件:部署在flask-service/目录,核心负责内容格式转换与展示。
  5. 任务评估组件:task_manager.py,聚焦流程监控与评估。

三、Strands Agent框架应用

3.1 Strands Agent框架简介

本项目中我们选择了Strands Agent框架来实现该Demo 应用。Strands Agent 框架 是亚马逊云科技(亚马逊云科技)开源推出的一个模型驱动的 AI 智能体(Agent)开发框架,旨在用极简的方式帮助开发者快速构建和部署智能体应用,适合从原型开发到生产环境全流程。

Strands Agent框架的核心特点与架构:

  • 模型驱动:Strands 充分利用现代大语言模型(如 Amazon Bedrock、Anthropic Claude、Meta Llama、Ollama 等)原生的推理、规划与工具使用能力,将任务流程自动交由模型完成,无需繁杂的工作流定义。
  • 三大核心要素
    • 模型:支持主流大模型,实现推理、规划任务与回溯思考。
    • 工具:内置三十多种高效实用工具(文件管理、系统命令、HTTP请求、Python执行等),可拓展自定义工具,每个工具本质上是可被模型自动调用的能力。
    • 提示词(prompt:用自然语言设定智能体目标或任务指令。
  • 智能体循环(Agentic Loop:智能体以“模型—工具—提示词”为循环结构,自动评估当前上下文,选择合适工具,执行任务,不断迭代直到完成目标。
  • 开发与部署灵活:仅需定义提示词与工具列表,通过几行代码即可快速创建本地智能体,并支持容器化、无服务器等多种云原生部署方式。
  • 多智能体协作:支持低门槛构建和编排多智能体协同网络,适合处理复杂流程和集群智能需求。
  • 丰富的定制与可观测性:支持上下文管理、状态记忆、自定义工具选择和行为,还内置监控、日志、权限控制等企业级能力,并可与OpenTelemetry、CloudWatch等平台集成。
  • 高安全性和合规性:支持细粒度权限控制、输入校验、隔离和审计,确保企业数据安全和合规。

整体来说,Strands Agent 框架通过“模型驱动+工具自动调度”大大简化了AI智能体的开发、测试和运维,是目前主流开源智能体领域中结构简洁但功能高度灵活、扩展性强且安全合规的代表性方案。

 3.2 Agent设计与实现

本项目中采用的是单体Agent+工具协作架构。单体Agent+工具协作架构是一种以单个中心化智能体为核心的系统设计模式,该架构中一个基于Strands框架的考试生成Agent作为统一的决策和调度中心,通过智能调用8种专业化工具来完成复杂的考试生成任务,这些工具包括元数据提取、内容规划、单选题生成、多选题生成、填空题生成、格式验证、URL内容获取和参考资料处理等功能模块,底层由Claude模型和AWS Bedrock提供AI能力支撑,同时配备TaskManager实现工作流-步骤-工具调用三层次监控评估体系,最终通过Flask渲染服务将生成的考试内容转换为交互式HTML页面输出给用户。

图6 AI Exam Agent+ Tool 整体架构

下面我们逐一介绍如何基于 Strands Agent 框架设计实现了Agent主体、以及工具组件。

  1. Agent 系统提示词设计

系统提示词是定义 Agent 行为模式与功能边界的核心配置,包含以下关键部分:

(1)角色定义:将 Agent 设定为考试生成专用助手

(2)任务描述:明确 Agent 的核心职责是生成符合要求的考试内容

(3)工作流程:详细规定考试生成的步骤与执行逻辑

(4)输出格式:定义生成内容的结构规范与格式要求

(5)质量标准:设定题目内容的评判维度与合格标准

system_prompt: str = """
    你是一个专业的考试生成助手,能够根据用户需求生成高质量的考试内容。
    ## 执行流程
    1. 分析用户请求,提取考试元数据(年级、科目、题型、题目数量、难度、主题等)
    2. 如果提供了参考资料,处理参考资料(如果是URL,获取内容;如果是文本,直接使用)
    3. 根据元数据和参考资料,生成符合要求的考试题目
    4. 验证生成的考试内容格式是否正确
    5. 如果格式不正确,修复格式问题
    ## 可用工具及用途
    - extract_exam_metadata: 从用户请求中提取考试元数据(年级、科目、题型等)
    - fetch_url_content: 获取URL内容,用于处理参考资料
    - process_reference: 处理参考资料,提取关键信息
    - plan_exam_content: 规划考试内容结构,处理复合题型的情况
    - generate_single_choice_question: 生成单选题,接受主题、难度和参考资料参数
    - generate_multiple_choice_question: 生成多选题,接受主题、难度和参考资料参数
    - generate_fill_blank_question: 生成填空题,接受主题、难度和参考资料参数
    - validate_exam_format: 验证生成的考试内容格式是否正确
    ## 工具使用指南
    - 使用extract_exam_metadata提取用户请求中的元数据
    - 如果有多种题型,必须首先使用plan_exam_content工具规划考试内容结构
      * 这一步很重要,它会确保合理分配每种题型的题目数量
      * 例如,如果用户要求生成5道题目,包括单选题和多选题,plan_exam_content会决定生成3道单选题和2道多选题
    - 如果有参考资料,使用fetch_url_content和process_reference处理
    - 根据plan_exam_content的规划结果,使用对应的生成工具:
      * 单选题:使用generate_single_choice_question
      * 多选题:使用generate_multiple_choice_question
      * 填空题:使用generate_fill_blank_question
    - 使用validate_exam_format验证生成的内容格式
    ## 复合题型处理流程
    1. 使用extract_exam_metadata提取元数据
    2. 使用plan_exam_content规划考试内容结构
    3. 按照规划结果,依次生成各种题型的题目
    4. 将所有题目组合成一个完整的考试
    5. 使用validate_exam_format验证最终内容
    ## 考试格式要求
    生成的考试需要符合markdown格式,包含正确答案标记:
    - 单选题的选项:- (x) 正确选项 或 - ( ) 错误选项
    - 多选题的选项:- [x] 正确选项 或 - [ ] 错误选项
    - 填空题:- R:= 正确答案
    ## 注意事项
    - 根据年级和科目调整题目难度和内容
    - 确保题目内容准确、清晰、无歧义
    - 不要包含任何额外的解释,直接输出考试内容
    - 确保生成的考试内容格式正确,可以被Markdown解析器正确解析
    - 如果参考资料内容过长,优先使用重要和相关的部分
    - 每个题目都应该使用二级标题(##)开头,不要添加额外的一级标题或编号
    - 不要在题目标题中添加编号,例如使用"## 单选题"而不是"## 单选题1"
    - 不要在考试开头添加总标题,直接从第一个题目开始
    """
  1. 工具注册与调用:我们为 Agent 注册了8种工具函数,每类工具对应特定操作:
    # 确定使用的工具
    tools = custom_tools if custom_tools is not None else [
        fetch_url_content,
        process_reference,
        generate_single_choice_question,
        generate_multiple_choice_question,
        generate_fill_blank_question,
        validate_exam_format,
        extract_exam_metadata,
        plan_exam_content
    ]

工具调用流程如下:

(1)Agent 接收用户请求参数

(2)分析请求内容,确定所需调用的工具集

(3)按预定义流程依次调用工具

(4)接收并处理工具返回结果

(5)聚合各工具输出,生成最终结果

  1. 回调机制应用:我们利用 Strands Agent 的回调机制实现工具调用的跟踪与评估:
# 创建回调处理函数 
callback = create_task_tracking_callback(task_manager, workflow_id, step_id)
logging.info(f"为工作流 {workflow_id} 步骤 {step_id} 创建回调处理器") 
     
# 创建Agent,开启callback
        agent = Agent(
            name="ExamGeneratorAgent",
            model=bedrock_model,  # 使用配置好的BedrockModel
            system_prompt=system_prompt,
            tools=tools,
            callback_handler=callback
        )

回调函数可捕获的事件包括:

(1)工具调用开始事件

(2)工具调用完成事件

(3)工具调用失败事件

(4)模型内容生成事件

3.3 工具函数设计

工具函数是 Agent 执行具体任务的操作单元,我们设计了4种类型、共计8种工具。每个工具均有明确的职责与接口规范。

  1. 工具函数的定义与注册:每个工具函数均遵循 Strands Agent 的规范实现,包含名称、描述、输入参数与输出格式,例如:
@tool
def generate_single_choice_question(
    topic: str,
    difficulty: str,
    reference_material: Optional[str] = None
) -> str:
    """
   生成单选题。
    
    根据指定的主题、难度和参考资料(如果提供),生成一道高质量的单选题。
    单选题将包含一个问题和4-5个选项,其中只有一个选项是正确的。
    
    难度级别会影响问题的复杂性和选项的设计:
    - easy: 基础概念,直接从参考资料中提取,选项区分度高
    - medium: 需要理解和应用概念,选项更具迷惑性
    - hard: 需要分析和评估,可能涉及多个概念的综合,选项非常接近
    
    Args:
        topic: 题目主题,指定问题应该关注的具体领域或概念
        difficulty: 难度级别,可选值为"easy"、"medium"或"hard"
        reference: 参考资料(可选),用于提供问题内容的背景信息
        
    Returns:
        生成的单选题Markdown文本,格式如下:
        
        ## 单选题
        
        问题描述
        
        - (x) 正确选项
        - ( ) 错误选项1
        - ( ) 错误选项2
        - ( ) 错误选项3
    """
    # 实现逻辑...
    return question
  1. 工具函数的输入输出设计:我们为每个工具函数制定了明确的输入输出接口规范

(1)输入参数:

  • 通过类型注解明确参数类型
  • 设置默认值与可选参数标识
  • 采用文档字符串说明参数用途与取值范围

(2)输出格式:

  • 统一使用字符串或 JSON 格式输出
  • 复杂输出采用结构化 JSON 格式
  • 保证输出格式的一致性,便于后续处理
  1. 工具函数的错误处理:我们实现了多级错误处理机制

(1)参数验证:

  • 检查参数类型与值范围合法性
  • 对无效参数抛出特定异常

(2)执行错误处理:

  • 捕获并记录执行过程中的异常信息
  • 返回结构化错误信息
  • 实现有限度的自动恢复逻辑

(3)重试机制:

  • 对 API 调用等易失败操作实现重试逻辑
  • 采用指数退避策略控制重试间隔
  • 设置最大重试次数与超时阈值

四、关键技术实现

题目生成模块是系统的核心组件,负责生成各类题目。我们针对不同题型设计了专门的生成算法,并通过精心设计的提示词和后处理流程确保生成题目的质量和一致性。题目生成模块中的主要工具包括考试内容规划、单选题生成、多选题生成、填空题生成、题目格式检验等工具。下面会逐一介绍几个重点工具是如何设计的。

 4.1 考试内容规划工具

在生成具体题目之前,系统首先需要规划整个考试的内容结构。我们设计了plan_exam_content工具来完成这一任务:
plan_exam_content工具接收考试元数据(包括科目、年级、难度、题型分布等),输出一个详细的考试内容规划。这个规划包括:
(1)考试的整体结构(各题型的顺序和布局)
(2)各题型的题目数量分配
(3)题目生成参数(用于后续题目生成)

这个工具的核心逻辑是根据题型和题目总数合理分配各题型的题目数量。例如,如果用户要求生成5道题目,包含单选题和多选题两种题型,工具会自动分配为3道单选题和2道多选题。

以下是plan_exam_content工具的工作流程:

图7 考试内容规划工具工作流程

(1)工具接收考试元数据,包括题型分布和题目数量
(2)根据预设的权重计算各题型的题目数量分配
(3)生成各题型的详细规划
(4)返回完整的考试内容规划

这个工具的输出将指导后续的题目生成过程,确保生成的考试内容结构合理。分数分配则是在前端JavaScript中实现的,而不是在Python工具中。

以下是plan_exam_content工具的部分核心代码:

@tool
def plan_exam_content(metadata: dict) -> dict:
    """规划考试内容结构"""
    types = metadata.get('types', ['singleChoice'])
    count = metadata.get('count', 5)
    topics = metadata.get('topics', [])
    
    # 如果只有一种题型,直接返回
    if len(types) == 1:
        return {
            "plan": f"生成{count}道{_get_type_name(types[0])}",
            "type_counts": {types[0]: count},
            "topics": topics
        }
    
    # 如果有多种题型,需要分配题目数量
    questions_per_type = count // len(types)
    remainder = count % len(types)
    
    # 构建题型数量映射
    type_counts = {}
    for i, t in enumerate(types):
        type_counts[t] = questions_per_type + (1 if i < remainder else 0)
    
    # 构建规划描述
    plan_parts = []
    for t, c in type_counts.items():
        plan_parts.append(f"{c}道{_get_type_name(t)}")
    
    plan = "生成" + "和".join(plan_parts)
    
    return {
        "plan": plan,
        "type_counts": type_counts,
        "topics": topics
    }

4.2 单选题生成工具

单选题是考试中最常见的题型之一,我们设计了专门的工具来生单选题:

(1)题干生成:系统首先根据主题和难度生成题干。题干必须清晰、准确、无歧义,并且难度符合要求。对于简单难度,题干通常直接考察基础概念;中等难度会要求一定的理解和应用;困难难度则可能涉及分析和评估。
(2)选项生成:系统会生成一个正确选项和多个干扰项。干扰项必须合理且具有一定的迷惑性,但不能有明显错误。通常会生成4个选项(A、B、C、D),其中只有一个是正确答案。

我们的单选题生成工具会根据用户提供的主题、难度和参考资料(如果有)生成符合要求的题目。工具会构建精心设计的提示词,引导大语言模型生成高质量的题目,然后对生成的内容进行格式化和验证,确保符合预期格式。

以下是单选题生成工具的部分核心代码:

@tool
def generate_single_choice_question(topic: str, difficulty: str, reference: str = None) -> str:
    # 构建提示词
    prompt = f"""
    请生成一道关于"{topic}"的单选题,难度级别为"{difficulty}"。
    
    题目要求:
    1. 题目应该清晰、准确,没有歧义
    2. 提供4个选项,其中只有1个正确答案
    3. 选项应该合理,不要有明显错误或不相关的选项
    4. 难度应该符合"{difficulty}"级别
    
    请严格使用以下格式:
    
    ## 单选题
    
    [题目描述]
    
    - (x) [正确选项]
    - ( ) [错误选项1]
    - ( ) [错误选项2]
    - ( ) [错误选项3]
    """

4.3  填空题生成工具

填空题是另一种常见的题型,它测试学生对特定概念或事实的记忆和理解:
(1)文本生成:系统首先生成一段包含关键概念的完整文本。这段文本必须上下文清晰,提供足够的信息让学生能够推断出答案。
(2)空白选择:系统会选择适当的关键词或短语作为空白。空白的选择非常关键,它们应该是文本中的重要概念或关键信息,而不是无关紧要的细节。系统会根据难度级别调整空白的数量和位置。
填空题生成工具会使用特定的格式标记空白(通常使用下划线),要求用户在答案部分提供正确的填写内容。

以下是填空题生成工具的部分核心代码:

@tool
def generate_fill_blank_question(topic: str, difficulty: str, reference: str = None) -> str:
    # 构建提示词
    prompt = f"""
    请生成一道关于"{topic}"的填空题,难度级别为"{difficulty}"。
    
    题目要求:
    1. 题目应该清晰、准确,没有歧义
    2. 使用下划线(______)表示需要填写的空白处
    3. 提供正确答案
    4. 难度应该符合"{difficulty}"级别
    
    请严格使用以下格式:
    
    ## 填空题
    
    [题目描述,包含______需要填写的部分]
    
    - R:= [正确答案]
    """

4.4 题目质量控制工具

生成高质量的题目是系统的核心目标,我们实施了多层次的质量控制措施:

(1)提示词优化:我们精心设计了提示词模板,包含详细的要求和示例,引导大语言模型生成符合预期的高质量题目。提示词会明确指定题目的主题、难度、格式要求等,确保生成的内容符合教育标准。

(2)后处理验证:系统会对生成的题目进行严格的格式和内容验证,包括检查题目格式是否符合要求、验证选项和答案的一致性、检测并修复常见问题(如选项重复、格式错误等)。

通过这些质量控制措施,我们确保系统生成的题目不仅格式正确,而且内容准确、难度适当、语言清晰,能够有效地测试学生的知识和能力。

以下是题目质量控制工具控制部分代码:

@tool
def validate_exam_format(markdown_content: str) -> bool:
    """
    验证考试内容格式是否正确。
    
    检查提供的Markdown内容是否符合考试格式要求,包括:
    1. 单选题格式:使用"- (x)"标记正确选项,"- ( )"标记错误选项
    2. 多选题格式:使用"- [x]"标记正确选项,"- [ ]"标记错误选项
    3. 填空题格式:使用"- R:="标记正确答案
    
    此工具会检查每种题型的格式,并验证是否存在格式错误,如:
    - 单选题有多个正确答案
    - 选项标记不一致
    - 缺少正确答案标记
    - Markdown语法错误
    
    Args:
        markdown_content: Markdown格式的考试内容
        
    Returns:
        bool: 如果格式完全正确返回True,否则返回False
        
    示例:
        >>> validate_exam_format("## 单选题\\n\\n问题\\n\\n- (x) 正确选项\\n- ( ) 错误选项")
        True
        >>> validate_exam_format("## 单选题\\n\\n问题\\n\\n- (x) 选项1\\n- (x) 选项2")
  """

五、Agent 任务评估实现

在AI考试生成Demo项目中,Agent需要根据用户指令执行多个复杂步骤来生成高质量的试题内容。为了支持这一过程,我们为Agent定义了丰富的工具集合,包括元数据提取、内容规划、题目生成、格式验证等核心功能模块。然而,在多工具协同的复杂执行环境中,如何确保Agent能够按照预定流程完整、正确地执行每个步骤,并及时发现和处理执行过程中的异常情况,成为了系统可靠性的关键挑战。为了解决这一问题,我们引入了TaskManager组件。TaskManager通过构建层次化的workflow(工作流)和step(步骤)管理体系,对Agent的执行行为进行全方位的约束、监控和记录,确保整个试题生成过程的可控性、可追溯性和可评估性。

5.1 Agent任务评估整体设计

Agent任务评估是我们系统中的核心评估组件,它负责跟踪、记录和分析整个考试生成过程。这个模块不仅记录了工作流的执行情况,还提供了详细的性能指标和统计数据,帮助我们持续优化系统性能。
Agent任务评估采用了分层设计,将题目生成任务管理分为工作流、步骤和工具调用三个层次,每个层次都有完整的生命周期管理和状态跟踪。整体工作流程如下图:

图8 AI Exam Agent任务评估工作流程

模块化设计的核心思想是职责分离。以下是部分核心代码示例。具体代码参见最后一部分开源Repo:

  1. task_manager.py:专注于数据管理,提供方法但不执行业务逻辑。以下是部分核心代码:
class TaskStatus:
    """任务状态枚举定义"""
    PENDING = "pending"      # 待处理
    RUNNING = "running"      # 运行中
    COMPLETED = "completed"  # 已完成
    FAILED = "failed"        # 已失败
    

##工作流创建
def start_workflow(self, name, description=None, input_data=None):
    """创建新的工作流"""
    workflow_id = str(uuid.uuid4())  # 生成唯一ID
    self.tasks[workflow_id] = {
        "id": workflow_id,
        "name": name,
        "description": description,
        "input_data": input_data,
        "status": TaskStatus.RUNNING,
        "start_time": datetime.now().isoformat(),
        "end_time": None,
        "steps": []  # 步骤列表
    }
    self.current_workflow_id = workflow_id
    return workflow_id
  1. server.py:负责工作流(workflow)生命周期管理。以下是部分核心业务代码:
def run_workflow():
    try:
        # 1. 请求处理和验证
        exam_request = request.json
        logger.info(f"收到考试生成请求: {json.dumps(exam_request, ensure_ascii=False)}")
        
        if not exam_request or not isinstance(exam_request, dict):
            return handle_error(ValueError("无效的请求格式"))
        
        # 2. 工作流创建 - 这是工作流生命周期的开始
        workflow_id = task_manager.start_workflow("考试生成", input_data=exam_request)
        logger.info(f"创建工作流: {workflow_id}")
        
        # 3. 系统配置
        aws_config.setup_credentials()  # 设置AWS凭证用于调用Claude模型
        
        # 4. 业务逻辑委托 - 将具体业务逻辑委托给agent.py
        result = generate_exam(exam_request, workflow_id)
  1. agent.py:负责业务逻辑执行和步骤生命周期管理。以下是部分核心代码:
def generate_exam(exam_request, workflow_id):
    """执行考试生成的核心业务逻辑"""
            # 1. 步骤生命周期管理 - 创建和开始步骤
            step_id = task_manager.add_step(workflow_id, "生成考试")
            task_manager.start_step(workflow_id, step_id)
            
            # 2. Agent创建 - 传入workflow_id和step_id用于回调跟踪
            agent = create_agent(workflow_id, step_id)
            
            # 3. 提示词构建
            prompt = create_exam_generation_prompt(exam_request)
            
            # 4. Agent执行 - 这里会触发多个工具调用
            result = agent(prompt)
  1. 回调函数:负责连接Strands Agent和TaskManager,实现实时状态跟踪
def create_task_tracking_callback(task_manager, workflow_id, step_id):
    # ID映射表 - 解决两套ID系统的对应问题
    tool_call_map = {}  # Strands工具ID -> TaskManager工具调用记录ID
    
    def callback_handler(**kwargs):
        """实际的回调处理函数"""
        
        # 获取上一个工具调用ID(用于自动完成逻辑)
        last_tool_id = getattr(callback_handler, 'last_tool_id', None)
        
        # 调试日志
        logging.debug(f"回调接收到事件: {kwargs.keys()}")
        
        # 处理模型生成事件
        if "data" in kwargs:
            logging.debug(f"模型生成: {kwargs['data']}")
            
        # 处理工具调用事件
        elif "current_tool_use" in kwargs:
            tool_use = kwargs["current_tool_use"]
            tool_id = tool_use.get("toolUseId")      # Strands的工具ID
            tool_name = tool_use.get("name")         # 工具名称
            tool_status = tool_use.get("status")     # 工具状态
            logging.info(f"工具调用: {tool_name}, 状态: {tool_status}, ID: {tool_id}")

5.2 评估报告生成

评估报告是任务评估系统的重要输出,它提供了工作流执行的详细统计和性能指标,帮助我们了解Agent的运行情况和性能瓶颈。

1. 评估报告生成流程: TaskManager提供了“generate_evaluation_report”方法,用于生成评估报告。下面是部分代码示例:

def _generate_workflow_report(self, workflow_id):
    # 生成报告
    report = {
        "workflow_id": workflow_id,
        "workflow_name": workflow["name"],
        "status": workflow["status"],
        "execution_time": None,
        "tool_call_statistics": {
            "total": total_tool_calls,
            "successful": successful_tool_calls,
            "failed": failed_tool_calls,
            "success_rate": successful_tool_calls / total_tool_calls if total_tool_calls > 0 else 0
        },
        "tool_distribution": tool_distribution,
        "step_statistics": {
            "total": total_steps,
            "completed": completed_steps,
            "failed": failed_steps,
            "completion_rate": completed_steps / total_steps if total_steps > 0 else 0
        },
        "performance_metrics": {
            "average_tool_execution_time": avg_tool_time
        }
    }
    return report
  1. 评估报告内容

生成的评估报告包含以下主要内容:

(1)工作流基本信息:

  • 工作流ID和名称
  • 工作流状态(完成、失败等)
  • 总执行时间

(2)工具调用统计:

  • 总工具调用次数
  • 成功的工具调用次数
  • 失败的工具调用次数
  • 工具调用成功率

(3)工具分布:

  • 各工具的调用次数
  • 各工具的成功/失败次数
  • 各工具的平均执行时间

(4)步骤统计:

  • 总步骤数
  • 完成的步骤数
  • 失败的步骤数
  • 步骤完成率

这些内容使我们能够全面了解工作流的执行情况,识别性能瓶颈和问题点,为系统优化提供依据。

5.3 评估报告分析

以下是一个评估报告示例:

{
  "execution_time": 57.709012,
  "performance_metrics": {
    "average_tool_execution_time": 5.2745411
  },
  "status": "completed",
  "step_statistics": {
    "completed": 1,
    "completion_rate": 1,
    "failed": 0,
    "total": 1
  },
  "tool_call_statistics": {
    "failed": 0,
    "success_rate": 1,
    "successful": 10,
    "total": 10
  },
  "tool_distribution": {
    "extract_exam_metadata": {
      "average_execution_time": 4.868112,
      "failed": 0,
      "successful": 1,
      "total": 1
    },
    "generate_fill_blank_question": {
      "average_execution_time": 3.708187,
      "failed": 0,
      "successful": 1,
      "total": 1
    },
    "generate_multiple_choice_question": {
      "average_execution_time": 3.47331866666667,
      "failed": 0,
      "successful": 3,
      "total": 3
    },
    "generate_single_choice_question": {
      "average_execution_time": 3.528803,
      "failed": 0,
      "successful": 3,
      "total": 3
    },
    "plan_exam_content": {
      "average_execution_time": 4.543524,
      "failed": 0,
      "successful": 1,
      "total": 1
    },
    "validate_exam_format": {
      "average_execution_time": 18.619223,
      "failed": 0,
      "successful": 1,
      "total": 1
    }
  },
  "workflow_id": "32013399-d744-4775-8d50-7fa46d3d711c",
  "workflow_name": "考试生成"
}

从这份评估报告中,我们可以得出以下结论:

  1. 工作流执行情况
    (1)工作流成功完成,总执行时间约为57.7秒
    (2)工作流包含1个步骤,该步骤成功完成
    2. 工具调用情况
    (1)总共进行了10次工具调用,全部成功完成
    (2)平均工具执行时间约为5.27秒
    3. 工具分布与性能
    (1)`validate_exam_format`工具执行时间最长,约18.62秒,是性能瓶颈
    (2)`generate_multiple_choice_question`工具执行时间最短,平均约3.47秒
    (3)生成题目的工具(单选题、多选题、填空题)执行时间相近,都在3.5秒左右
    (4)`extract_exam_metadata`和`plan_exam_content`执行时间中等,约4.5-4.9秒
    4. 优化方向
    (1)重点优化`validate_exam_format`工具,可考虑增量验证或并行验证
    (2)进一步优化题目生成工具,提高缓存命中率
    (3)考虑并行执行`extract_exam_metadata`和`plan_exam_content`

5.4  QuickSight 数据展示和分析(可选部分)

Amazon QuickSight 是 亚马逊云科技 提供的基于云的商业智能(BI)服务,支持多种数据源接入,可快速构建数据可视化仪表板、报告和嵌入式分析,具备云原生、自动扩展、按需计费及自然语言智能分析等特点,适合企业大规模安全地实现数据洞察和共享。

将上一步中获得的json格式分析报告,转为csv文件格式并自动送入到QuickSight产品中,得到下面可视化分析展示:

  1. 工具调用情况分析

图9 AI Exam Agent任务评估工具调用执行时长可视化

图10  AI Exam Agent任务评估工具调用次数/成功率可视化

图11 AI Exam Agent Workflow/工具执行情况可视化

  1. Workflow整体情况分析

图12 AI Exam Agent Workflow执行情况可视化

六、总结和展望

本项目基于Strands Agent框架的AI考试生成器项目成功实现了从传统手工出题到智能化自动生成的转变,将考试生成时间从小时级压缩至分钟级。项目在技术上将Strands Agent框架应用于教育领域,构建了完整的8种工具函数生成链,同时也设计了TaskManager任务评估体系,通过”工作流-步骤-工具调用”三层次架构实现了对Agent执行过程的全方位监控管理,实现了多工具协同场景下的状态跟踪和性能评估。并结合QuickSight可视化分析平台,将Agent执行数据转化为直观的性能报告和优化建议,为复杂AI系统的可观测性和可维护性提供了完整解决方案。

未来,项目将重点优化工具的执行效率,实现基于学习者画像的个性化出题,并探索多Agent协作模式以处理更复杂的教学场景。

七、附录

以下是该项目的全套开源代码:

https://github.com/Anya2089/exam_generator_strands/tree/main

*前述特定亚马逊云科技生成式人工智能相关的服务目前在亚马逊云科技海外区域可用。亚马逊云科技中国区域相关云服务由西云数据和光环新网运营,具体信息以中国区域官网为准。

本篇作者

延诤

亚马逊云科技生成式 AI 实验室资深架构师。曾经在联想、58 同城、京东等知名企业担任产研负责人,积累了深厚的行业经验与前沿视野。自加入亚马逊云科技后,致力于生成式 AI 技术领域,专注于推动 AI 在国内及全球企业客户中的实际应用、高效落地与广泛推广。

姬军翔

亚马逊云科技视频媒体相关服务资深架构师,负责基于亚马逊云科技的媒体相关服务方案的设计和咨询。专注于视频媒体相关服务的推广和应用,深度参与了很多使用亚马逊云科技媒体相关服务的直播和点播项目的构建以及优化。在视音频编转码以及视频平台的搭建上有丰富经验。

谢川

亚马逊云科技资深生成式 AI 技术专家,负责基于亚马逊云科技生成式 AI 解决方案的设计、实施和优化。曾在通信、电商、互联网等行业有多年的产研经验,在数据科学、推荐系统、LLM、RAG、Agent 应用等方面有丰富的实践经验,并且拥有多个 AI 相关产品技术发明专利。