每到选课季,教务系统的访问高峰能把人逼疯。页面卡顿、课程秒没、好不容易挤进去提交,结果第二天一查,周三下午两门课撞在同一个节次。手动对照培养方案、教室分布、周次循环,往往是拿笔在纸上划来划去,划到最后反而把自己绕晕。不少同学开始尝试用AI来画一份无冲突课表,这里面的门道其实不少:选什么工具、怎么喂数据、提示词怎么写、冲突规则怎么定义,每一步都有讲究。这篇文章就是我实测之后整理出来的完整方案,不绕弯子,直接用一套可复制的流程,教你把“人肉查重”这件事彻底交给AI。
这篇文章适合所有在校大学生,尤其是选课规划时不想熬夜翻课表的同学。就算你是第一次用AI工具、完全没接触过提示词工程,也能照着下面的模板一步步操作。整套流程的核心就一句话:把课表数据整理成结构化表格,让AI用明确的规则去计算冲突,最后再人工复核一遍。
1. 核心思路拆解:为什么选课排课非常适合交给AI
1.1 选课排课的底层逻辑
很多人以为AI排课需要多复杂的算法,其实换个角度看,选课冲突检测就是一个典型的约束满足问题。你需要满足的条件非常明确:课程名称、上课时间、上课周次、节次范围,这些字段一旦摆清楚,规则就是“同一时间不能出现两门课程”。这种规则驱动型的任务,恰恰是大语言模型的舒适区。
我测试下来最直观的感受是,AI在“理解自然语言”和“按格式输出”这两件事上表现非常稳定。你把课程列表扔给它,告诉它“周一1-2节和周三3-4节算不同时间,但同一时间不能出现两门课”,它能老老实实地把冲突列表列出来,速度比你手动翻Excel快得多。
但这不意味着AI能完全替代人工。大模型的本质是“根据上下文推测最优回答”,它不像程序那样有绝对确定的计算逻辑。所以正确的姿势是:让AI做初筛和整理,人工做最终确认。这个定位想清楚之后,整个操作流程就不会跑偏。
1.2 课程数据整理决定了输出质量的上限
有句老话叫“垃圾进,垃圾出”,在AI排课这个场景里体现得淋漓尽致。我见过不少同学直接把教务系统截图丢给AI,然后抱怨AI回答得乱七八糟。实际上问题不在AI,而是输入数据没有结构化。
AI处理一段混杂了课程编号、学分、教师、备注的连续文本时,很容易漏掉信息或者理解错位。但如果你先把课程整理成统一格式的表格,让AI按照字段去读取,出错的概率就会大幅下降。
这里的关键字段包括:
- 课程名称:用于识别和展示
- 课程编号:防止同名课程混淆
- 学分:不参与冲突检测,但关系到选课容量
- 任课教师:有些同学会刻意避开某些老师
- 上课周次:比如1-8周、1-16周,直接影响冲突范围
- 星期几:周一至周日
- 节次范围:如1-2节、3-4节
- 上课地点:跨校区选课时尤其重要
我可以很直接地说,数据整理这一步占整个选课流程百分之六十的工作量。但这一步做得越细,AI后续的表现就越稳。别嫌麻烦,这就像你要让外卖小哥准确送达,至少得把门牌号写清楚。
1.3 冲突规则要自己先定义清楚
这里有一个容易被忽略的坑:AI本身并不知道你学校的作息时间和周次规则。你以为“周二9-10节”和“周二第10节”是一回事,但对AI来说,这是两个不同的输入,它只会机械地比较字段是否一致。
所以在和AI沟通之前,你心里得有几条明确的判断规则:
- 同一星期、同一节次、上课周次有重叠,就判定为冲突
- 跨校区课程即使时间不撞,也要考虑通勤时间是否足够
- 单双周课程和周次循环课程,需要把具体周次列出来,让AI知道哪些周次重叠
- 线上课程不受地点约束,但也占时间
把这些规则写进提示词里,AI的输出才会符合你的真实需求。我见过有同学只写了“帮我检查冲突”,结果AI只查了星期和节次,完全没管单双周,最后出来的结果看似完美,实际上一堆周次重叠。这不是AI笨,是需求没写清楚。
2. 实操准备与提示词设计:手把手教你把AI变成排课助理
2.1 工具选型:不同AI都能干,但体验有差别
实测下来,ChatGPT、Claude、Kimi、豆包、文心一言这些主流大模型产品都能完成排课冲突检测。但基于我的使用体验,可以给你一些选型参考:
- 如果打算让AI直接分析表格或文档,优先选带附件上传功能的工具。比如Claude可以直接读取Excel或CSV,省去复制粘贴的麻烦。
- 如果希望AI不仅能排课,还能帮你写一个Python校验脚本,那就要选带代码解释器或Artifacts能力的工具,比如ChatGPT的Code Interpreter或Claude的Artifacts。
- 如果只是快速做一次自然语言的冲突询问,那么国内的大模型产品完全够用,响应速度快,而且中文理解更贴合校园场景。
我自己的习惯是:用支持附件上传的工具,把课程表整理成CSV文件直接喂进去,然后配合自然语言追问。这样比粘贴大段文本要省心得多,AI对表格数据的解析准确率也更高。
2.2 一份可直接复制的完整提示词模板
考虑到很多人第一次接触提示词,我直接贴一份我调试过多次的模板。核心思路是“分三步走”:第一步让AI整理数据,第二步让AI逐条检查冲突,第三步让AI生成最终课表。
第一步提示词:
你是一名教务排课助理,请根据我提供的课程清单,把每一门课的信息整理成标准格式,并按“星期几”从周一到周五排序。标准格式为:课程名称 | 课程编号 | 学分 | 任课教师 | 上课周次 | 星期 | 节次 | 上课地点。注意,不要修改我提供的任何原始信息,如果发现信息缺失,在对应位置标注“待补充”。
第二步提示词(接在上一步后面):
现在请你根据以下规则检查上述课程之间是否存在时间冲突:规则1,两门课上课星期相同、节次范围有重叠、上课周次有重叠,视为冲突;规则2,单双周课程按已标注的周次判断,未标注则默认每周上课;规则3,同一课程编号且同一上课时间的重复条目不视为冲突,可能是多个教学班,需要保留。请逐条输出有冲突的课程对,并说明冲突原因,标准格式为:课程A(星期/节次/周次) vs 课程B(星期/节次/周次),冲突原因:XXX。
第三步提示词:
请在上一步冲突检查的基础上,优先保留必修课和专业核心课,然后从选修课中做取舍,生成一份无冲突的推荐课表。要求:每周总学分尽量不低于18学分,课程时间尽量分布均匀,避免出现连续三天满课或一天之内只有一节课的情况。输出格式为Markdown表格,行是星期一至星期五,列是节次范围,例如:1-2节、3-4节、5-6节、7-8节、9-10节,单元格内写课程名称和上课地点。
这个模板最大的好处是,把模糊需求变成了明确指令。AI在每一步都知道自己要干什么,而不需要去猜你的意图。
2.3 进阶玩法:让AI帮你写一个冲突校验脚本
如果你对代码不排斥,我强烈建议试试进阶玩法——让AI生成一段Python脚本,用程序逻辑做二次校验。这算是一个“双重保险”,因为大模型的语言理解再强,偶尔也有算错的时候,但脚本的逻辑是确定的。
我让AI生成过一版简化脚本,核心逻辑其实不复杂:把所有课程解析成“星期+节次集合”,然后两两比较是否存在交集。代码大致长这样:
courses = [ {"name": "高等数学A", "weekday": 1, "start": 1, "end": 2, "weeks": "1-16周"}, {"name": "大学英语", "weekday": 3, "start": 3, "end": 4, "weeks": "1-16周"}, {"name": "体育(篮球)", "weekday": 3, "start": 3, "end": 4, "weeks": "1-16周"}, ] def expand_slots(course): return set(range(course["start"], course["end"] + 1)) def has_week_overlap(weeks_a, weeks_b): # 这里根据实际周次字符串解析,简化版默认全部重叠 return True conflicts = [] for i in range(len(courses)): for j in range(i + 1, len(courses)): a, b = courses[i], courses[j] if a["weekday"] == b["weekday"] and has_week_overlap(a["weeks"], b["weeks"]): if expand_slots(a) & expand_slots(b): conflicts.append((a["name"], b["name"])) print("检测到冲突:", conflicts if conflicts else "无冲突")不需要你完全看懂,你只需要把这段代码复制到任何在线Python运行环境里,然后把课程数据替换成自己的,就能得到一个无情的“冲突检测机器”。脚本的结果不是用来替代AI,而是用来排查AI漏掉的问题,两个结果一致,你才能放心。
3. 完整实战演示:从原始课表到无冲突课表全流程
3.1 第一步:把教务系统的数据整理成标准表格
这是我踩过最多坑的一步。教务系统里导出的课程列表常见有两种格式:一种是每个教学班一行,包含完整字段;另一种是混合在同一个页面的文本信息里,需要手动提取。遇到第二种情况,我建议先复制到Excel,再用分列功能处理,别手动一个个敲。
整理时一个小技巧是,把星期统一映射成数字,比如周一用1,周二用2,这样后面给AI或者脚本处理都方便。节次范围统一写成“1-2”“3-4”这种格式,不要写成“第一大节”“第二大节”,不同学校描述习惯不同,统一格式能减少AI理解偏差。
下面是我用来做演示的课程清单,模拟了一个普通大学生最常见的选课情况:
| 课程名称 | 课程编号 | 学分 | 教师 | 上课周次 | 星期 | 节次 | 地点 |
|---|---|---|---|---|---|---|---|
| 高等数学A | MATH101 | 4 | 张老师 | 1-16周 | 1 | 1-2 | 教1-101 |
| 线性代数 | MATH102 | 3 | 刘老师 | 1-16周 | 1 | 3-4 | 教1-102 |
| 程序设计基础 | CS101 | 3 | 赵老师 | 1-16周 | 2 | 5-6 | 实验楼301 |
| 大学英语 | ENGL201 | 3 | 李老师 | 1-16周 | 3 | 3-4 | 教2-201 |
| 体育(篮球) | PE102 | 1 | 王老师 | 1-16周 | 3 | 3-4 | 操场 |
| 中国近代史纲要 | HIST101 | 2 | 周老师 | 1-8周 | 4 | 7-8 | 教3-105 |
| 计算机导论 | CS100 | 2 | 吴老师 | 1-8周单周 | 5 | 5-6 | 实验楼302 |
| 创新创业基础 | INNO201 | 1 | 陈老师 | 9-16周 | 5 | 5-6 | 教4-201 |
你注意看,这个表格里藏着两个冲突点。大学英语和体育(篮球)都在周三3-4节,这是明显的直接冲突。计算机导论是单周上课,创新创业基础是9-16周,虽然都是周五5-6节,但如果单周落在9、11、13、15周,这两门课在数值上也会撞上。这种隐藏冲突靠人眼很难快速识别,但AI按规则来算就很轻松。
3.2 第二步:用两轮对话完成冲突检测
我把上面的表格直接粘贴给AI,然后依次执行第一段和第二段提示词。以我的实测为例,AI的第一轮输出会把课程按周一到周五排好,数据字段完整无遗漏。第二轮输出则会明确列出冲突对,并给出解释。
这里有一点值得注意:AI在遇到“单周”“双周”这种中文描述时,有时候会偷懒,直接当成每周都上。所以我会在第二步末尾追加一句追问:“严格按照我标注的单周/双周/周次范围来判断,不要默认每周都上课。”这句话可以显著降低误报漏报的概率。
针对上面这份课程清单,AI给出的冲突检测结果应该是:
- 大学英语(周三3-4节,1-16周) vs 体育(篮球)(周三3-4节,1-16周),冲突原因:时间完全重叠
- 计算机导论(周五5-6节,1-8周单周) vs 创新创业基础(周五5-6节,9-16周),冲突原因:第9、11、13、15周的重叠需要确认单双周
第一组冲突没悬念,第二组则取决于学校单周的具体定义。如果你所在的学校单双周规则是“开学第1周为单周”,那么9周是单周,二进制的“单周”和“1-8周单周”不一定在同一周重叠,需要再对照校历确认。
3.3 第三步:人工复核与最终课表生成
AI跑完冲突清单之后,别急着生成最终课表,建议做一轮人工复核。我自己的复核习惯是打印一张空课表,拿彩色笔标记各门课。这个做法看着原始,但极其有效,尤其是对于那些AI容易搞混的单双周细节。
复核确认没问题之后,再用第三段提示词让AI生成推荐课表。我把大学英语调到周二3-4节,把体育保留在周三3-4节,创新创业基础和计算机导论保留其中一个,调整之后,AI给出的最终课表示意如下:
| 时间 | 周一 | 周二 | 周三 | 周四 | 周五 |
|---|---|---|---|---|---|
| 1-2节 | 高等数学A | ||||
| 3-4节 | 线性代数 | 大学英语 | 体育(篮球) | ||
| 5-6节 | 计算机导论 | ||||
| 7-8节 | 中国近代史纲要 | ||||
| 9-10节 |
生成课表时我还发现一个小细节:如果你不问,AI默认只把星期一到星期五排满,周末完全不排。如果你有周末课程,记得在提示词里写明“包含周末课程”,否则它会自动忽略。
4. 避坑指南与常见问题:AI排课的五大翻车现场
4.1 AI幻觉:它真的会编造课程
AI幻觉在大模型领域是个绕不开的话题,在排课场景里就是AI会“理直气壮”地生成一门你根本没选的课,或者把一个课程的上课时间改成了完全不同的时间。我遇到过最夸张的一次,AI在没有输入的情况下自动补了一门“马克思主义基本原理”进去,还配了周三5-6节的时间。仔细看才发现,它是在模仿我提供的课程列表格式,但从某个隐藏的推理里“脑补”了一门类似课程。
应对方法很简单:明确要求AI“只能使用我提供的课程信息,不要新增或修改任何字段”,然后人工做一次总数核对。数一下AI输出的课程条数,和你输入的条数是否一致,一旦数量对不上,基本可以断定发生过幻觉。
4.2 漏课:课程越多越容易漏
当你的课程清单超过十门时,AI漏掉一门课的概率会明显上升。这像人看密密麻麻的表格会眼花一样,大模型对超长上下文的注意力也会分散。
针对这个问题,我推荐的做法是“分批处理”。把课程按专业必修课、公共选修课、通识课分成三批,每批做一次冲突检查,最后再把所有结果合并。虽然多了几步操作,但每一步的准确率都会明显提升。如果你把所有课程一次性塞进去,得到的结果虽然快,但你可能需要花更长时间去检查它漏了什么。
4.3 死板处理单双周信息
大多数通用大模型对“单周”“双周”这种周期性描述并不敏感。你把“单周”写进去,它能识别出来,但一旦课程数量增多,它往往会忘记前文设定,又默认成每周上课。
我的解决方案是在提示词里把所有周次信息数值化。比如“计算机导论:1-8周单周”改成“计算机导论:第1、3、5、7周上课”,把单双周转换成具体周次列表,AI理解起来就不费劲了。这一步虽然需要你自己花点时间换算,但比事后排查AI的误判要节省太多时间。
4.4 输出格式不统一
如果你的提示词里没有对输出格式做严格限制,AI给你的内容可能是多段文字,夹杂着各种冒号、箭头和缩进。等你想要复制到表格里时,格式已经乱成一团。
解决办法是在提示词里指定Markdown表格或CSV格式。以我的经验,“输出为Markdown表格,列名固定为课程名称、时间、地点”这句话比任何“请整理清楚”都管用。大模型对格式指令的遵循能力比对内容语义的把握更可靠。
4.5 高峰期页面卡顿,误把AI结果当最终答案
还有个现实问题:很多高校教务系统在选课高峰期会卡死,页面加载不出选课结果。有些同学会着急用AI排出的课表去估算学分,然后在系统恢复后忘了重新核对实际选课结果。
这里必须强调,AI排课只是决策辅助,你最终的课表一定要以教务系统里的选课记录为准。AI的职责是帮你做规划、查冲突,而系统里显示的教学班信息才是你真正需要去上课的班级。每次选课结束后,抽五分钟把教务系统里的最终课表导出来,再和AI生成的推荐课表做一次比对,这个习惯能避免后面整学期的麻烦。
5. 进阶玩法:从AI排课延伸到时间管理
5.1 用同一套方法做一周时间管理
掌握了AI排课的方法论之后,你会发现自己简直打开了一个新世界。因为“约束满足”这个模型不只适用于课表,还适用于几乎所有的时间规划场景。
比如你想把课程学习、社团例会、兼职工作和运动健身都统筹安排好,就可以把每一项活动都当成一门“课程”,填入时间、地点和优先级,然后让AI帮你生成一份“全周时间规划表”。我在学期中就把周一晚上的社团例会、周三晚上的篮球训练、周五下午的兼职都交给AI统一规划,输出的结果比我手动调配快很多,而且AI会主动避开时间冲突,不用我提醒。
5.2 让AI基于推荐课表输出学习计划
更有意思的玩法是,在生成无冲突课表之后,把课表作为上下文,告诉AI你的目标,比如“这学期要准备四级考试”或“期末要考专业前20%”,AI就能基于课表的空余时段生成一份学习计划。
我用这个功能做过一次实验,效果出奇地好。AI会把自己的推荐课表、没选课的空闲时间段、甚至晚自习时间都利用起来,把复习任务拆成一份带有明确时间和内容安排的清单,而且它会优先把难度高的科目安排在精力充沛的上午时段。这套流程已经超出了选课本身,变成了个人效率助手。
5.3 对AI结果保持合理预期
进阶玩法虽然爽,但还是那句话:AI的能力边界在于它没有真正的判断力。它能帮你发现时间冲突,但是它不会知道你在周三下午连续上三节课会不会觉得累;它能帮你排出一份周一到周五分布均匀的课表,但它不知道你周四有社团换届大会需要提前离校。
所以在使用AI做任何时间规划时,都需要在提示词里加入“我的实际限制条件”。比如“周四晚上不排课”“希望周三下午留出运动时间”,这些偏好越早告诉AI,输出的结果越接近你真正想要的。不要等到AI输出了完整方案再让它重做,那样既浪费token,又打击使用热情。
写在最后的一点小建议
我用AI排课表这个流程走了快两学期,最大的感受是,工具本身并不神奇,真正的效率提升来自于把问题定义清楚。你会发现,当你能把课程数据整理成结构化的表格,把冲突规则一条条写明白,把输出格式提前跟AI约定好,AI的可靠性会直线上升。反过来,如果输入模糊、规则含糊,那么AI给出的结果就是在浪费时间。
还有一个非常实用的小技巧想分享给你:每次让AI处理完数据之后,记得把对话记录保存成书签或导出成文本。因为选课期间你可能会反复调整课程,这时候直接在新的对话里重新喂一遍课表太麻烦了,不如把上一轮已经整理干净的结构化课程清单复制出来,改几个条目再发给AI。省下的时间虽然不多,但在选课截止前那种紧张氛围里,每一分钟都珍贵。