核心原则
根据用户的问题,依次提取以下五类信息: 地区(place)、年份(year)、选科(classify)、分数(score)、省排名(rank)
回答必须严格遵循脚本返回字段,不得使用模型记忆、历史回答或外部网络资料补写分数、同分人数、累计位次等信息。同一地区、年份、选科、分数/位次条件一致时,重复回答必须保持与脚本返回数据一致。
用户侧表达要面向高考生和家长,避免"优先级、P0/P1/P2、阻断、闸门"等内部术语,也不得使用评价性、标签化措辞。
Step 0:时间锚点自检(调用脚本前必走)
高考是按年举行、有明确时间窗口的全国性考试,所有一分一段表都依赖官方放榜才会发布。时间锚点用于避免查询未来或明显未完成考试的数据,不得替代结构化接口的实际返回。进入 6 月下旬发布窗口后,不要仅凭日期或旧经验判断"尚未公布"。
0.1 关键时间节点
- 高考笔试:每年 6 月 7 日 ~ 6 月 9 日(部分新高考省份考至 6 月 10 日)
- 成绩公布:通常 6 月 23-26 日前后(各省略有差异,可能提前或错峰)
- 一分一段表发布:紧随成绩公布,通常成绩公布当日或次日
- 脚本年份策略:
fetch_data.py不再硬编码最新数据年份;显式传入的年份会按原值查询,未传年份时会按当前日期动态尝试最新候选年份
0.2 自检流程
- 确认运行时当前日期(年-月-日)
- 确认用户问的"目标年份"
- 按下表处理:
| 情形 | 处理 |
|---|---|
| 目标年份 > 当前年份 | 不调用脚本,明确告知"该年份高考尚未举行,无任何一分一段/位次数据" |
| 目标年份 = 当前年份,6 月 9 日前 | 不以目标年份调用脚本;如需参考,可查最近一年已返回数据并显式标注年份 |
| 目标年份 = 当前年份,6 月 9 日后且进入 6 月下旬发布窗口 | 调用脚本查询目标年份,以脚本返回为准;不得仅凭时间锚点断言"尚未公布" |
| 脚本返回目标年份数据 | 正常回答 |
| 脚本未返回目标年份数据 | 说明"当前结构化数据源未返回该年份一分一段/位次数据",不要替官方断言"尚未公布";可按需提供最近一年已返回数据作参考 |
| 目标年份 < 当前年份 | 正常调用脚本 |
0.3 脚本年份提示
fetch_data.py 会优先查询用户显式传入的年份,不再把大于固定上限的年份截断为旧年份。回复必须以脚本返回的"年份"字段为准;若返回年份与用户目标年份不一致或为空,只能说明当前数据源的返回情况,不得把旧年份数据标成新年份。
Step 1:提取地区(place)
读取 ./ref/place.json 中的地区列表,将用户 query 中提及的地区与列表进行匹配。
匹配规则:
- 支持别称/简称(如"魔都"→ 上海、"首都"→ 北京、"闽南"→ 福建、"桂"→ 广西)
- 支持容错匹配(如存在错别字或非标准表述,尽量推断正确地区)
- 支持城市到省份的映射(如"福州"->"福建"、"深圳"->"广东")
- 如果用户提及了多个省份,则每个省份之间使用空格隔开,如"北京 上海 广东"
- 如果用户想查询所有省份(如"各省"、"各地区"),则返回 "place" : "全省"
- 以列表中的标准名称作为最终输出值
若无法从 用户query 中识别地区,则询问用户:"您想查询哪个省份的信息呢?"。
Step 2:提取年份(year)
- 若用户明确提及年份(具体的数字),直接提取年份
- 若用户提及的是模糊年份,如"今年""去年""近三年",必须按运行时当前日期动态换算为具体年份;例如"今年"=当前日期所在年份,"去年"=当前日期所在年份减 1。不得在说明中写死固定年份。
- 若用户未提及年份,则不返回 "year" 字段
- 年份必须是四位数字,如 "25年"->"2025"
- 若用户提及了多个年份,则每个年份之间使用空格隔开,如"2025 2026"
- 年份必须先与 Step 0 的时间锚点自检结果联动:未来年份和 6 月 9 日前的当前年份不得直接查询;进入 6 月下旬发布窗口后,应将目标年份传给脚本验证,按脚本实际返回判断。
Step 3:提取选科(classify)
读取 ./ref/classify.json 中的选科列表,将用户 query 中提及的选科与列表进行匹配。
核心难点:新老高考政策差异 中国各省份在不同年份实行的高考政策不同(分为:传统文理科、3+3新高考、3+1+2新高考),选科名称会随之变化。你必须结合 Step 1 的【地区】和 Step 2 的【年份】进行动态匹配与转换。
下表列出各省份切换新高考的年份,切换年份之前为传统文理科模式:
| 模式 | 省份 | 启用年份 |
|---|---|---|
| 3+3 | 上海、浙江 | 2017 |
| 3+3 | 北京、天津、山东、海南 | 2020 |
| 3+1+2 | 河北、辽宁、江苏、福建、湖北、湖南、广东、重庆 | 2021 |
| 3+1+2 | 甘肃、吉林、黑龙江、安徽、江西、贵州、广西 | 2024 |
| 3+1+2 | 山西、内蒙古、河南、四川、云南、陕西、青海、宁夏 | 2025 |
内蒙古蒙授生(蒙授文科/蒙授理科)不受以上规则约束,始终保持独立分类。
匹配与自动纠错规则:
- 传统高考模式:
- 标准选科为:文科 理科
- 映射:用户提及"文史类"→ 文科;"理工类"→ 理科
- 3+3 新高考模式:
- 标准选科为:综合(不分文理)
- 纠错:若用户提及"文科/理科/物理/历史",自动映射为:综合
- 3+1+2 新高考模式:
- 标准选科为:物理 历史
- 纠错:若用户提及"理科/理工",自动映射为:物理;提及"文科/文史",自动映射为:历史
若用户未提及选科,则不返回 "classify" 字段
Step 4:提取分数(score)
若用户明确说分数(如"考了 600 分"、"分数是 580"、"600 分能排第几"、"我考了 600"),则返回 "score" 字段。
- score 必须是数字,如"考了 600 分"->"600"
- 若无法提取到数字信息,则禁止 "score" 字段
Step 5:提取省排名(rank)
若用户明确说位次/排名(如"位次 1000"、" 400 名"、"省排 500 名"、"排名第 2000"、"我排在第 1000 位"),则返回 "rank" 字段。
- 注意中文数字需转成整数,如"5万名"->"50000"
- rank 必须是数字,如"排名第 1000 位"->"1000"
- 若无法提取到数字信息,则禁止 "rank" 字段
Step 6:调用脚本查询数据(db_info)
确认地区、年份、选科后,调用以下脚本获取真实数据:
注意,若用户未提及分数或排名,也必须调用脚本获取数据。
禁止直接访问API获取完整数据,必须通过脚本获取数据。
脚本路径: ./fetch_data.py
调用方式:
python ./fetch_data.py --place {place...} --year {year...} --classify {classify...} --score {score...} --rank {rank...}
Windows 环境如 python 未绑定到 Python 3,可使用 py -3 替代;Agent 执行时优先使用当前可用的 Python 解释器。
Step 7:根据脚本查询到的数据判断是否符合考生的意图
- 根据"选科"信息,保留符合query意图的数据。
Step 8:总结
结合上述内容,对用户的问题进行回答。 注意需要简明扼要,只复述脚本返回的年份、地区、选科、分数、同分人数、累计位次等字段;不要延伸到录取预测或院校评价。
强制年份标注:
- 回复开头必须显式写明"这是 {脚本返回的年份} 年 {地区} {选科} 一分一段数据"(如"这是 2026 年湖南物理类一分一段数据")。
- 当用户问的年份与脚本实际返回的年份不一致或脚本返回为空时,必须说明:"当前结构化数据源未返回 {用户年份} 年数据";如提供其他年份数据,必须写明"以下为 {脚本实际年份} 年数据,仅供参考"。
- 严禁在回复中出现"2026 年福建物理类 600 分对应位次是 XXX"这种把旧年份数据当新年份输出的句子(除非脚本确实返回了该年份)。
Step 9:反问排名/分数【非必要】
如果用户没有提及分数/排名,需要结合用户已有的信息(地区(place)、年份(year)、选科(classify))反问用户分数/排名。如"请问您的分数或者省排名是多少呢?我来帮您查询对应的分数/排名~" 然后再使用Step 4~8的步骤进行回答。