diff --git a/README.md b/README.md index b5c626e..7c20bcd 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,90 @@ # AI作业批改系统 -本项目通过调用Dify Workflow API,实现自动化AI作业批改功能。系统读取本地Excel作业提交记录和随作业提交的YML配置文件,自动完成作业批改流程。 +本项目通过调用Dify Workflow API,实现自动化AI作业批改功能。系统包含两个核心脚本: +1. `grade_assignments.py` - 主批改程序 +2. `check_ymls.py` - YML配置文件验证工具 -## 功能特点 +## 核心功能 -- 自动读取学生作业提交记录(Excel格式) -- 解析学生提交的YML配置文件 +- 读取Excel作业提交记录(使用openpyxl) +- 验证YML配置文件的完整性和格式 - 调用Dify API进行作业批改 -- 支持文件上传和API结果返回 +- 自动保存批改结果 +- 提供详细的错误报告 -## 安装依赖 +## 系统要求 ```bash pip install -r requirements.txt ``` -## 配置说明 +## 文件结构 -1. 在`source/grade_assignments.py`中配置Dify API参数: - ```python - # API配置 - DIFY_API_KEY = "your_api_key_here" # 替换为实际API Key - DIFY_API_URL = "http://192.168.100.143/v1" # Dify API地址 - FILE_UPLOAD_URL = f"{DIFY_API_URL}/files/upload" # 文件上传地址 - ``` +``` +ai_homework_correction/ +├── ai作业/ # 作业相关文件 +│ ├── AI考试作业.xlsx # 学生作业提交Excel +│ └── 作业/ # 学生YML作业文件 +├── results/ # 批改结果输出 +├── docs/ # 文档 +├── source/ +│ ├── grade_assignments.py # 主批改程序 +│ ├── check_ymls.py # YML验证工具 +│ └── test_script.py # 测试脚本 +``` -2. 准备学生作业提交Excel文件,格式如下: - | 学生姓名 | 学号 | 提交时间 | 作业状态 | - |----------|------|----------|----------| +## 使用指南 -3. 每个学生作业需包含一个YML配置文件,描述作业内容 +### 1. 验证YML文件 -## 使用说明 +```bash +python source/check_ymls.py +``` -1. 将学生作业Excel文件放在`data/`目录下 -2. 将学生作业YML文件放在`assignments/`目录下 -3. 运行主程序: +功能: +- 检查每个学生是否有对应的YML文件 +- 验证YML文件格式有效性 +- 生成详细检查报告 + +### 2. 执行批改 ```bash python source/grade_assignments.py ``` -4. 查看批改结果,结果将保存在`results/`目录下 +流程: +1. 读取Excel学生名单 +2. 匹配对应的YML作业文件 +3. 调用Dify API批改 +4. 保存结果到results/ -## 测试 +## 配置说明 -运行测试用例验证系统功能: - -```bash -python source/test_grade.py +1. 在`source/grade_assignments.py`中配置: +```python +API_KEY = "your-api-key" # Dify API密钥 +WORKFLOW_ID = "your-workflow-id" # 工作流ID +API_BASE_URL = "http://your-dify-server/v1" # API地址 ``` +2. Excel文件要求: +- 必须包含列:填写人、工作流程描述、Dify工作流解决方案设计 +- 文件路径:ai作业/AI考试作业.xlsx + +3. YML文件要求: +- 存放在ai作业/作业/目录下 +- 文件名格式:*_学生姓名_*.yml + ## API文档 -详细API调用规范请参考[docs/workflow_api.md](docs/workflow_api.md) +详细规范参考:[docs/workflow_api.md](docs/workflow_api.md) ## 注意事项 -- 确保网络可以访问Dify API服务器 -- 上传文件大小不超过API限制 -- 作业YML文件需符合规范格式 +1. 确保: +- 网络可访问Dify服务器 +- 文件大小符合API限制 +- YML文件格式正确 +2. 建议: +- 先运行check_ymls.py验证文件 +- 定期清理results/目录 diff --git a/source/check_ymls.py b/source/check_ymls.py new file mode 100644 index 0000000..2d40d87 --- /dev/null +++ b/source/check_ymls.py @@ -0,0 +1,69 @@ +import os +import yaml +import openpyxl +from grade_assignments import ASSIGNMENT_DIR, find_assignment_yml, EXCEL_PATH + +def check_all_ymls(): + """检查Excel中记录的YML文件是否存在且有效""" + print(f"正在检查Excel: {EXCEL_PATH}") + + # 读取Excel获取学生名单 + try: + wb = openpyxl.load_workbook(EXCEL_PATH) + ws = wb.active + + # 获取标题行确定列索引 + headers = [cell.value for cell in ws[1]] + name_col = headers.index('填写人') + + students = [] + for row in ws.iter_rows(min_row=2, values_only=True): + if len(row) > name_col and row[name_col]: # 确保有足够列且姓名不为空 + students.append(row[name_col]) + + print(f"找到 {len(students)} 条学生记录") + except Exception as e: + print(f"读取Excel失败: {str(e)}") + return False + + # 检查每个学生的YML文件 + missing_files = [] + invalid_files = [] + valid_count = 0 + + for student in students: + yml_path = find_assignment_yml(student) + if not yml_path: + missing_files.append(student) + continue + + try: + with open(yml_path, 'r', encoding='utf-8') as f: + yaml.safe_load(f) + valid_count += 1 + print(f"[✓] {os.path.basename(yml_path)} - 有效") + except Exception as e: + invalid_files.append(student) + print(f"[×] {os.path.basename(yml_path)} - 无效: {str(e)}") + + # 输出汇总报告 + print("\n检查完成:") + print(f"- 有效文件: {valid_count}/{len(students)}") + + if missing_files: + print("\n以下学生缺少YML文件:") + for name in missing_files: + print(f" - {name}") + + if invalid_files: + print("\n以下学生的YML文件无效:") + for name in invalid_files: + print(f" - {name}") + + return not (missing_files or invalid_files) + +if __name__ == "__main__": + if check_all_ymls(): + print("\n所有YML文件检查通过") + else: + print("\n发现无效YML文件,请修复后再运行") diff --git a/source/grade_assignments.py b/source/grade_assignments.py index d703a60..d59126d 100644 --- a/source/grade_assignments.py +++ b/source/grade_assignments.py @@ -39,6 +39,21 @@ def read_excel_submissions(): }) return submissions +def check_yml_files(submissions): + """检查Excel中的提交记录是否有对应的YML文件""" + missing_files = [] + for sub in submissions: + yml_path = find_assignment_yml(sub['name']) + if not yml_path: + missing_files.append(sub['name']) + + if missing_files: + print("\n以下提交记录缺少对应的YML文件:") + for name in missing_files: + print(f"- {name}") + return False + return True + def find_assignment_yml(name): """根据姓名查找对应的YML作业文件""" for filename in os.listdir(ASSIGNMENT_DIR): @@ -151,6 +166,12 @@ def save_results(results): def main(): # 读取Excel中的作业提交 submissions = read_excel_submissions() + + # 检查YML文件是否存在 + if not check_yml_files(submissions): + print("\n请补充缺少的YML文件后再运行批改") + return + results = [] for sub in submissions: