更新README 文档,与代码实现保持一致

This commit is contained in:
xin 2025-04-01 01:04:42 +08:00
parent 785d74c653
commit 09447c1df9
3 changed files with 150 additions and 32 deletions

View File

@ -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/目录

69
source/check_ymls.py Normal file
View File

@ -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文件请修复后再运行")

View File

@ -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: