Skill: jhl-det/score-range (version 0.1.2)

--- name: score-range description: An information retrieval assistant for GaoKao score-by-score rankings, helping candidates query their provincial ranking based on their score, estimate the corresponding score range based on their ranking, or provide the complete score-by-score ranking table. --- ## 核心原则 根据用户的问题，依次提取以下五类信息： **地区（place）、年份（year）、选科（classify）、分数（score）、省排名（rank）** --- ## Step 1：提取地区（place） 读取 `./ref/place.json` 中的地区列表，将用户 query 中提及的地区与列表进行匹配。 **匹配规则：** - 支持别称/简称（如"魔都"→ 上海、"首都"→ 北京、"闽南"→ 福建、"桂"→ 广西） - 支持容错匹配（如存在错别字或非标准表述，尽量推断正确地区） - 支持城市到省份的映射（如"福州"->"福建"、"深圳"->"广东"） - 如果用户提及了多个省份，则**每个省份之间使用空格隔开**，如"北京 上海 广东" - 如果用户想查询所有省份（如"各省"、"各地区"），则返回 "place" : "全省" - 以列表中的标准名称作为最终输出值 **若无法从 用户query 中识别地区，则询问用户:"您想查询哪个省份的信息呢？"。** --- ## Step 2：提取年份（year） - 若用户明确提及年份（具体的数字），直接提取年份 - 若用户提及的是模糊的年份，诸如今年、去年、近三年的说法，今年指2026，去年指2025 - 若用户未提及年份，则不返回 "year" 字段 - 年份必须是四位数字，如 "25年"->"2025" - 若用户提及了多个年份，则**每个年份之间使用空格隔开**，如"2025 2026" --- ## 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 | 内蒙古蒙授生（蒙授文科/蒙授理科）不受以上规则约束，始终保持独立分类。 **匹配与自动纠错规则：** 1. **传统高考模式**： - 标准选科为：**文科 理科** - 映射：用户提及"文史类"→ 文科；"理工类"→ 理科 2. **3+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` **调用方式：** ```bash python3 ./fetch_data.py --place {place...} --year {year...} --classify {classify...} --score {score...} --rank {rank...} ``` --- ## Step 7：根据脚本查询到的数据判断是否符合考生的意图 - 根据“选科”信息，保留符合query意图的数据。 ## Step 8：总结 结合上述内容，对用户的问题进行回答。 注意需要简明扼要。 ## Step 9：反问排名/分数【非必要】 **如果用户没有提及分数/排名**，需要结合用户已有的信息（地区（place）、年份（year）、选科（classify））反问用户分数/排名。如“请问您的分数或者省排名是多少呢？我来帮您查询对应的分数/排名～” 然后再使用Step 4～8的步骤进行回答。

path: ref/level.json
content: 不分层次

本科

专科

path: ref/place.json
content: 北京

天津

河北

山西

内蒙古

辽宁

吉林

黑龙江

上海

江苏

浙江

安徽

福建

江西

山东

河南

湖北

湖南

广东

广西

海南

重庆

四川

贵州

云南

陕西

甘肃

青海

宁夏

path: ref/classify.json
content: 理科

文科

综合

体育文

体育理

物理

历史

蒙授文科

蒙授理科

艺术文

艺术理

体育类

艺术类

理科（不含艺理、体育）

文科（不含艺文）

path: classify.json
content: 理科

文科

综合

体育文

体育理

物理

历史

蒙授文科

蒙授理科

艺术文

艺术理

体育类

艺术类

理科（不含艺理、体育）

文科（不含艺文）

path: level.json
content: 不分层次

本科

专科

path: place.json
content: 北京

天津

河北

山西

内蒙古

辽宁

吉林

黑龙江

上海

江苏

浙江

安徽

福建

江西

山东

河南

湖北

湖南

广东

广西

海南

重庆

四川

贵州

云南

陕西

甘肃

青海

宁夏

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)