1. 项目概述:基于SpringAI的智能出题助手Agent
去年我在教育科技公司主导了一个智能组卷系统的重构项目,当时最大的痛点就是传统规则引擎生成的题目缺乏灵活性和创造性。直到接触了SpringAI框架,才发现大语言模型(LLM)与ReAct框架的结合能完美解决这个问题。下面分享如何从零搭建一个能理解学科知识点、自主生成高质量题目的智能体。
这个智能出题助手不同于普通题库系统,它能根据教学大纲自动构建知识图谱,通过多轮推理动态生成符合难度要求的题目。比如当要求"生成一道考察二次函数极值点的高中数学题"时,Agent会先检索课程标准确认知识点范围,再结合历年考题分析常见考察形式,最后生成题干和解析——整个过程完全自动化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 SpringAI框架选型
相比LangChain4j,SpringAI的最大优势是与Spring生态的无缝集成。在对比测试中,使用SpringAI调用本地部署的Llama3模型时,吞吐量比LangChain4j高40%。核心配置如下:
java复制@Bean
public ChatClient chatClient() {
return new OpenAiChatClient(apiKey)
.withModel("gpt-4-turbo")
.withTemperature(0.7);
}
关键经验:教育类应用建议temperature设为0.5-0.7,既能保证创造性又避免过度发散
2.2 ReAct模式实现
参考论文《ReAct: Synergizing Reasoning and Acting in Language Models》的实现方案,我们设计了以下工作流:
- Thought阶段:分析用户输入的考察目标和难度要求
- Action阶段:调用知识图谱API检索相关知识点
- Observation阶段:评估检索结果与教学大纲的匹配度
- Final Answer:生成最终题目和解析
典型交互示例:
code复制用户请求:生成考察三角函数图像变换的题目
Thought: 需要确认高中阶段涉及的变换类型
Action: 查询课程标准API参数{grade: "high", subject: "math"}
Observation: 课标要求掌握平移、振幅和周期变换
Thought: 设计包含相位变化的综合题
Final Answer: 题目+解析+难度系数
2.3 工具链集成
智能体需要接入的关键工具:
- 知识图谱服务:Neo4j存储知识点关系
- 难度评估模型:自定义Transformer模型
- 公式渲染:MathJax + LaTeX
- 题目查重:Elasticsearch语义检索
3. 核心实现细节
3.1 动态提示工程
出题质量高度依赖提示词设计,我们采用分层提示模板:
java复制String systemPrompt = """
你是一位经验丰富的%s学科教师,需要根据以下要求出题:
1. 考察重点:%s
2. 难度系数:%s
3. 避免出现:%s
请逐步思考并生成题目""";
String userPrompt = """
分步执行:
1. 确认知识点在%s年级教学范围
2. 分析该知识点的常见考察形式
3. 组合多个考察角度设计题目""";
3.2 质量控制系统
通过三重校验机制保证题目质量:
- 逻辑校验:用规则引擎检查题干条件是否充分
- 难度校准:对比历史题目难度标签
- 多样性检测:计算与现有题集的余弦相似度
校验失败时会触发ReAct循环重新生成,最多迭代3次。
4. 典型问题与优化
4.1 知识幻觉问题
初期测试发现模型会编造超纲内容,通过以下方案解决:
- 在Action阶段强制查询课标数据库
- 设置知识点白名单机制
- 最终输出前执行正则匹配校验
4.2 性能优化
针对高并发场景的改进:
- 实现Streamable HTTP响应
- 对LLM结果做本地缓存
- 批量处理题目生成请求
实测优化后TP99从12s降至3.2s。
5. 扩展应用场景
这套架构经过调整可适用于:
- 自动生成在线测验
- 构建个性化学习路径
- 作业智能批改
- 知识点掌握度分析
我在实际部署中发现,当题目生成量超过1万道时,建议引入离线批处理模式,先用Agent生成题目大纲,再通过分布式任务细化具体内容。
