2025-09-04 15:41:55 +08:00
|
|
|
|
import asyncio
|
|
|
|
|
import logging
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
# 导入现有工具类(不创建新类)
|
|
|
|
|
from TeacherHelper.Kit.TeacherHelper import (
|
|
|
|
|
LLMClient,
|
|
|
|
|
save_lesson_plan
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 配置日志
|
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def generate_gravitation_homework():
|
|
|
|
|
"""生成万有引力课后作业的异步函数
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
异步生成器: 流式返回作业内容
|
|
|
|
|
"""
|
|
|
|
|
# 系统指令 - 符合布鲁姆认知分类和双减政策
|
2025-09-04 16:01:49 +08:00
|
|
|
|
system_prompt = "你是命题专家,熟悉布鲁姆认知分类和'双减'政策。你需要根据用户提供的题目材料来生成作业,而不是自己创造题目。客观题采用'四选一'单选,难度比例易:中:难=6:3:1;主观题设置2小问,第1问'解释现象'对应'理解',第2问'方案设计'对应'创新'。题量控制为20分钟完成。"
|
2025-09-04 15:41:55 +08:00
|
|
|
|
|
|
|
|
|
# 创建LLM客户端实例(使用现有类)
|
|
|
|
|
llm_client = LLMClient(system_prompt=system_prompt) # 修改为与T3_KeJian.py一致
|
|
|
|
|
|
2025-09-04 16:01:49 +08:00
|
|
|
|
# 读取题目材料 - 使用绝对路径
|
|
|
|
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
project_root = os.path.dirname(current_dir)
|
|
|
|
|
yunxiao_path = os.path.join(project_root, "static", "YunXiao.txt")
|
|
|
|
|
|
|
|
|
|
with open(yunxiao_path, "r", encoding="utf-8") as f:
|
|
|
|
|
question_material = f.read()
|
|
|
|
|
|
2025-09-04 15:41:55 +08:00
|
|
|
|
# 作业生成提示词
|
2025-09-04 16:01:49 +08:00
|
|
|
|
prompt = f"""请根据以下'万有引力'相关题目材料,输出课后作业,满分100分,含:
|
2025-09-04 15:41:55 +08:00
|
|
|
|
A. 客观题(8题×5分=40分)
|
2025-09-04 16:01:49 +08:00
|
|
|
|
- 从提供的材料中选择题目,并按要求重新组织
|
2025-09-04 15:41:55 +08:00
|
|
|
|
- 前3题考'史实&概念'识记
|
|
|
|
|
- 中间3题考'公式变形&比例'理解
|
|
|
|
|
- 后2题考'情境估算'应用
|
|
|
|
|
B. 主观题(2题,30+30分)
|
|
|
|
|
- 题1:结合'天问一号'发射新闻,解释地球与火星之间的引力如何变化
|
|
|
|
|
- 题2:设计一个实验,用智能手机+免费APP估算地球质量,写出步骤与所需测量量
|
|
|
|
|
C. 评分标准(主观题分点给分,每点10分)
|
|
|
|
|
D. 参考答案与解析(客观题给出选项+一句话解析;主观题给出关键公式与评分关键词)
|
|
|
|
|
|
2025-09-04 16:01:49 +08:00
|
|
|
|
以下是题目材料:
|
|
|
|
|
{question_material}
|
|
|
|
|
|
2025-09-04 15:41:55 +08:00
|
|
|
|
【格式要求】
|
|
|
|
|
### A. 客观题
|
|
|
|
|
<ul>
|
|
|
|
|
<li>1. ……</li>
|
|
|
|
|
……
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
### B. 主观题
|
|
|
|
|
#### 1. ……
|
2025-09-04 16:01:49 +08:00
|
|
|
|
#### 2. ………
|
2025-09-04 15:41:55 +08:00
|
|
|
|
|
|
|
|
|
### C. 评分标准
|
|
|
|
|
……
|
|
|
|
|
|
|
|
|
|
### D. 参考答案与解析
|
|
|
|
|
……"""
|
|
|
|
|
|
|
|
|
|
# 流式响应生成器
|
|
|
|
|
async def get_homework():
|
|
|
|
|
async for chunk in llm_client.get_response(prompt, stream=True):
|
|
|
|
|
yield chunk
|
|
|
|
|
|
|
|
|
|
return get_homework()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def test_generate_homework():
|
|
|
|
|
"""测试生成万有引力课后作业并保存"""
|
|
|
|
|
print("===== 开始生成万有引力课后作业 =====")
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# 修复:添加await关键字获取生成器
|
|
|
|
|
homework_generator = await generate_gravitation_homework()
|
2025-09-04 16:01:49 +08:00
|
|
|
|
|
|
|
|
|
# 使用绝对路径保存文件
|
|
|
|
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
output_path = os.path.join(current_dir, "markdown", "万有引力作业.md")
|
2025-09-04 15:41:55 +08:00
|
|
|
|
|
|
|
|
|
# 修复:正确调用save_lesson_plan函数,使用位置参数而非关键字参数
|
|
|
|
|
full_content, success = await save_lesson_plan(
|
|
|
|
|
homework_generator,
|
|
|
|
|
output_path, # 修改为位置参数
|
|
|
|
|
stream_print=True
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if success:
|
|
|
|
|
print(f"\n作业生成成功!文件路径: {os.path.abspath(output_path)}")
|
|
|
|
|
return full_content
|
|
|
|
|
else:
|
|
|
|
|
print("\n作业生成失败")
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"生成过程中发生错误: {str(e)}", file=sys.stderr)
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
# 运行异步测试函数
|
|
|
|
|
asyncio.run(test_generate_homework())
|