
1. 项目概述当物理习题集遇上智能体工作流最近在琢磨一个挺有意思的事儿怎么才能源源不断地、高质量地生成物理习题特别是经典力学领域的这听起来像是教育科技公司或者AI训练数据团队才会头疼的问题但作为一个喜欢折腾代码和自动化流程的开发者我发现这里面藏着不少技术乐趣和实用价值。这个项目的核心我称之为“无限问题生成器”它不是一个简单的随机数出题工具而是一个融合了智能体工作流、可验证推理和规模化数据生产的系统。简单说就是让几个“AI智能体”分工合作一个负责出题一个负责解题并验证另一个负责评估和格式化形成一个可以自我迭代、质量可控的自动化流水线。为什么是经典力学因为它规则清晰、逻辑严密是检验物理推理能力的绝佳试金石。无论是训练一个能理解物理世界的大模型还是构建一个自适应学习平台海量且多样化的高质量习题数据都是刚需。手动编写效率太低且难以保证难度和知识点的均匀分布。纯随机生成很容易产生无意义或者违反物理定律的“垃圾题”。所以我们需要一个更聪明的方法。这个项目的目标就是构建一个基于Python的、可验证的、能够规模化生成经典力学推理数据的智能体工作流。它不仅仅是“生成”更重要的是“验证”——确保每一道生成的题目都符合物理规律并且拥有严谨的解题步骤和答案。接下来我会拆解整个系统的设计思路、技术实现细节并分享在搭建过程中踩过的坑和总结的经验。2. 核心架构与智能体工作流设计2.1 为什么选择“智能体工作流”范式传统的自动化脚本通常是线性的执行A然后执行B最后输出C。但在生成复杂内容如物理题时这种线性流程很脆弱。比如生成题目后可能发现无解或者解题步骤出现逻辑循环。智能体工作流则将任务分解给多个具有特定角色的“智能体”它们之间可以通信、协作甚至辩论从而更灵活、更健壮。在这个项目中我设计了三个核心智能体问题生成智能体它的核心职责是根据预设的知识点模板和难度参数构造出题面。它需要理解物理概念并能用自然语言清晰描述一个场景。求解与验证智能体这是系统的“质检员”。它接收题目尝试用符号计算或数值方法求解。如果求解失败、得出无穷解或违反常识如能量不守恒它会将题目标记为“无效”并反馈给生成器。格式化与丰富智能体负责给通过的题目“化妆”。包括生成多种解题思路、绘制示意图描述性文本或调用绘图库并将最终结果题目、多步解析、答案、知识点标签结构化成JSON等机器可读格式。它们通过一个工作流引擎如使用langgraph或prefect构建的有向图来编排。工作流定义了智能体的执行顺序和条件分支例如验证失败则重新生成并管理它们之间的消息传递。2.2 技术栈选型与考量整个系统基于Python构建这是AI和科学计算领域的事实标准。主要依赖库包括核心AI与流程langchain/langgraph。langchain提供了构建智能体所需的基础模块如LLM调用、工具封装而langgraph特别适合描述具有循环和状态依赖的复杂工作流。它的“图”概念非常直观地反映了智能体间的交互。物理计算与验证sympy。这是项目的基石。sympy是一个纯Python的符号计算库可以处理符号代数、微积分、方程求解。我们可以用sympy来建立物理方程如运动学方程、牛顿第二定律并进行符号推导和求解从而在数学层面严格验证题目的正确性。大语言模型接口openai或litellm。智能体的“大脑”是大型语言模型。openai库用于直接调用GPT-4/3.5等模型。而litellm是一个非常有用的抽象层它让你可以用统一的接口调用多种模型如OpenAI, Anthropic, 本地部署的Llama等便于后续切换和降低成本。数据结构与存储pydanticsqlite/chromadb。pydantic用于定义严格的数据结构如题目Schema确保在智能体间传递的数据格式一致。生成的题目数据可以暂存于sqlite或为了后续的检索增强生成而存入向量数据库chromadb。异步与并发asyncio。为了提升生成效率工作流中的多个智能体调用或批量生成任务可以使用异步编程避免I/O等待阻塞整个流程。注意模型选择上初期验证阶段可以使用成本较低的GPT-3.5-Turbo但在生成和验证环节尤其是涉及复杂推理时GPT-4或Claude-3系列模型的准确率会高很多。需要根据预算和精度要求做权衡。2.3 工作流的状态图与循环机制整个工作流可以看作一个状态机。初始状态是“生成题目”。然后进入“求解验证”状态。这里有一个关键判断如果验证通过sympy成功求解且结果物理意义合理则流向“格式化输出”状态最终结束。如果验证失败则带着错误信息如“方程无实数解”回流到“生成题目”状态同时调整生成参数例如修改初始条件范围进行重试。这个循环机制是“无限”且“可验证”的核心。它通过程序化的反馈迫使生成器不断改进其输出直到生产出合格产品。为了避免无限循环必须设置最大重试次数例如5次超过则丢弃该次生成任务并记录日志便于后续分析问题模板的缺陷。3. 问题生成智能体的实现细节3.1 从知识点模板到自然语言描述生成智能体不是凭空创造的它需要“种子”。我们首先需要构建一个经典力学知识点模板库。例如模板ID: CM_Kinematics_01知识点: 匀加速直线运动核心公式:v u a*t,s u*t 0.5*a*t*t,v*v - u*u 2*a*s变量范围: 初速度u ∈ [0, 10] m/s 加速度a ∈ [1, 5] m/s² 时间t ∈ [2, 10] s场景骨架: “一个物体以{初速度}u m/s的初速度开始沿直线做匀加速运动加速度为{加速度}a m/s²。求{时间}t秒后物体的{目标变量}。”生成智能体的任务是将这个骨架实例化。它首先从变量范围内随机采样或按某种分布采样具体的数值代入骨架。然后它需要调用LLM将这种参数化的句子转化为一道流畅、自然的题目。例如将骨架转化为“一辆汽车从静止开始以2 m/s²的加速度在平直公路上加速行驶。请问5秒后汽车的行驶速度是多少行驶的距离又是多少”这里的关键提示词设计是“你是一个物理老师请将以下参数化描述转化为一道通顺、清晰的物理题目只输出题目本身...”。为了防止LLM“自由发挥”改变物理参数需要在提示词中强调严格使用提供的数值。3.2 控制难度与多样性单一的模板会生成大量同质化题目。为了“无限”和“多样”我们需要从多个维度进行控制知识点组合题目可以覆盖单个知识点也可以综合多个。例如将“匀加速直线运动”和“自由落体”结合生成“物体先竖直上抛再自由落体”的题目。未知量变化在同一套公式中所求的未知量可以是不同的。例如已知u, a, t求s也可以已知s, a, t求u。这改变了题目的求解方向。场景多样化同样的物理原理可以套用不同的生活场景汽车、滑雪、电梯、火箭等。这由生成智能体在润色题目时通过LLM实现。数值特性设计可以有意识生成一些数值“巧妙”的题目例如时间取整、结果恰好为整数等这更适合用于实际教学材料。在系统中这些维度被编码为生成智能体的“任务描述”或“元指令”通过系统提示词传递给LLM指导其创作。4. 求解验证智能体的核心符号计算与物理规则校验这是整个系统可靠性的守护者。它的输入是一道自然语言题目输出是验证结果True/False以及可能的错误信息。4.1 从自然语言到符号方程这是最具挑战性的一步。我们需要从文本中提取物理实体、参数和关系。目前完全依靠LLM的零样本抽取并不十分可靠。我的策略是结合两种方法结构化提示抽取要求LLM以指定JSON格式输出识别出的物理量如{“实体”: “汽车” “物理量”: [{“名称”: “初速度” “符号”: “u” “值”: 0 “单位”: “m/s”}, ...]}和涉及的物理定律如“牛顿第二定律”。基于模板的解析由于题目是由我们的模板生成的我们可以反向使用模板。验证智能体首先尝试将题目与已知模板库进行匹配通过关键词或嵌入向量相似度如果匹配成功就可以直接使用该模板的公式和变量映射关系大大降低了解析难度。得到变量映射后验证智能体使用sympy建立符号方程。例如对于匀加速运动它会定义符号u, a, t, s然后建立方程s u*t 0.5*a*t**2。4.2 执行求解与合理性检查建立方程后验证智能体调用sympy.solve进行求解。检查点包括解的存在性方程是否有解solve返回空列表意味着无解题目无效。解的实数性物理量通常是实数。需要检查解是否为实数过滤掉复数解。解的唯一性对于给定条件解是否唯一如果出现多个解需要根据物理上下文判断哪个是合理的例如时间不能为负。物理合理性解是否符合常识例如计算出的速度是否超光速质量是否为负这需要编写一系列简单的规则进行过滤。单位一致性可选但推荐可以使用pint库或手动检查确保计算过程中单位正确。例如将公里每小时转换为米每秒时是否进行了正确的换算。只有通过所有这些检查题目才会被标记为“验证通过”。验证智能体还会保留求解出的符号解或数值解作为标准答案传递给下一个环节。5. 格式化与丰富智能体的后期处理经过验证的题目已经是一道“正确”的题但还不是一份“好”的数据。格式化智能体负责提升其附加值。5.1 生成多步解析与多种解法这是让数据价值倍增的关键。我们再次调用LLM但这次是作为“解题老师”。提示词如下“你是一位经验丰富的物理老师请为以下题目提供详细的、分步的解析过程。首先列出已知条件和未知量。然后阐述解题所依据的物理原理或公式。接着展示具体的计算步骤。最后给出最终答案。请确保解析清晰易懂。”更进一步可以要求“请尝试为这道题提供另一种解法。” 例如运动学问题既可以用基本公式解也可以用v-t图像的面积法来解。这样一条题目数据就附带了丰富的推理路径。5.2 结构化输出与元数据标注最终所有信息被整合到一个结构化的对象中。我使用pydantic定义了一个PhysicsProblem模型from pydantic import BaseModel, Field from typing import List, Optional class PhysicsProblem(BaseModel): problem_id: str problem_text: str topic: str # e.g., Kinematics subtopic: str # e.g., Uniform Acceleration difficulty: float # 1-5 known_variables: dict # e.g., {u: 0, a: 2, t: 5} unknown_variables: List[str] # e.g., [v, s] governing_equations: List[str] # e.g., [v u a*t] solutions: dict # e.g., {v: 10, s: 25} step_by_step_solutions: List[str] # 多种解法的文本描述 alternative_methods: Optional[List[str]] None generated_by: str verification_status: bool verification_log: Optional[str] None这样的数据结构非常适合后续使用可以直接用于微调模型可以导入题库系统也可以用于分析生成题目的质量分布。6. 系统集成、规模化运行与监控6.1 构建可扩展的生成流水线单个工作流处理一道题。要规模化我们需要一个“调度器”。可以使用Celery或Dramatiq这样的任务队列。主程序不断从“任务池”一个包含不同知识点和难度参数的队列中取出生成任务提交给后台的工作流执行器。这样我们可以启动多个工作进程并行生成充分利用计算资源。数据库用于存储任务状态和结果。一个简单的设计是两张表generation_tasks记录任务参数和状态physics_problems存储成功的题目数据。6.2 质量监控与持续改进生成系统不能是黑盒。必须建立监控机制成功率仪表盘跟踪“生成-验证”循环的成功率。如果某个知识点模板的成功率持续低于阈值如30%就需要检查模板设计或验证逻辑。多样性分析定期统计生成题目的知识点分布、难度分布、数值范围分布防止系统陷入某种“舒适区”而生成重复模式。人工审核抽样定期随机抽取一批生成的题目由真人或另一个更强大的模型进行审核评估题目的流畅性、合理性和教育价值。这些反馈可以用于优化生成智能体的提示词。6.3 成本控制与优化策略运行成本主要来自LLM API调用。优化策略包括缓存对常见的、确定性的子任务如某些固定格式的转换结果进行缓存。模型分级让生成智能体使用能力稍弱但便宜的模型如GPT-3.5而让负责复杂验证和生成多步解析的智能体使用更强的模型如GPT-4。批量处理在调用LLM进行题目润色或解析生成时可以将多道题目组合在一个提示词中利用模型的并行处理能力减少请求次数。设置预算与熔断为每天或每个任务设置API调用预算超出后自动暂停防止意外费用。7. 实战踩坑与经验心得在搭建和运行这个系统的过程中我积累了一些宝贵的经验这些是在官方文档里不太容易找到的。7.1 智能体工作流的状态管理陷阱使用langgraph时工作流的状态State是一个字典在所有智能体间共享。初期我直接把复杂的对象如sympy表达式塞进状态里结果在序列化/反序列化比如为了持久化时遇到了麻烦。最佳实践是状态里只存放可JSON序列化的基本数据类型字符串、数字、列表、字典。对于sympy对象可以先将其转换为字符串如srepr(expr)需要使用时再解析回来。7.2 大语言模型的“创造性”与“服从性”矛盾生成智能体有时会过于“聪明”为了题目的“故事性”而修改我们精心设定的物理参数。例如把加速度从2 m/s²改成2.5 m/s²导致后续验证失败。解决方法是在系统提示词中反复、明确地强调“必须严格使用提供的数值和条件”并将此作为一条硬性规则。甚至可以设计一个后置检查步骤用正则表达式从生成的题目中提取数值与原始参数对比如果不一致则触发重生成。7.3 符号求解的数值稳定性问题sympy.solve在解某些非线性方程或方程组时可能会得到非常复杂的符号解或者因为浮点数精度问题导致判断失误。对于数值计算一个稳妥的做法是在符号求解后将已知的数值代入解中使用numpy或math进行快速的数值验算。比较abs(calculated_value - expected_value)是否小于一个很小的容差如1e-9这比单纯依赖符号运算更稳健。7.4 工作流循环的终止条件最初的循环逻辑是“验证失败就重试”但遇到一个设计有根本缺陷的模板时会导致无限循环。除了设置最大重试次数更聪明的做法是引入“错误类型分析”。如果是“数值无解”可以尝试微调参数范围重试如果是“违反物理定律”如能量算出负值则可能直接放弃该模板实例并记录日志供人工审查模板逻辑。这能显著提高系统的整体效率和资源利用率。7.5 数据质量的评估维度如何判断生成的题目是“好”的除了正确性还有清晰度题目描述是否无歧义教育性是否紧扣核心概念能否有效训练推理能力难度适中性生成的难度分布是否符合预期多样性场景、问法、数值是否丰富建立一个自动化的评估智能体是未来的方向。它可以基于一系列规则和另一个LLM的评分对题目进行多维度打分从而形成闭环的优化系统。构建这样一个“无限问题生成器”远不止是调用几个API那么简单。它需要你将软件工程的工作流思想、人工智能的提示工程技术、以及物理领域的专业知识深度融合。这个过程充满了挑战但当看到系统稳定地吐出一道道质量不错的物理题时那种成就感是巨大的。这个框架不仅适用于经典力学完全可以扩展到电磁学、热学乃至其他理科领域。它为我们获取特定领域的高质量推理数据提供了一种可扩展、可验证的自动化思路。