更新README 文档,与代码实现保持一致
This commit is contained in:
parent
785d74c653
commit
09447c1df9
92
README.md
92
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/目录
|
||||
|
||||
69
source/check_ymls.py
Normal file
69
source/check_ymls.py
Normal 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文件,请修复后再运行")
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user