feat(special-programs): 5类特殊批次定向培养计划数据+规则+prompt+引擎
数据层: - data/crowd_db/special_programs.json: 5类项目定义+20+真实院校分数线 - 农村订单定向免费医学生: 长沙医学院(444)/湘南学院(441)/河南科技(510)等 - 公费农科生: 山东农业大学(460)/湖南农业大学(430)等 - 公费消防/应急管理: 中国消防救援学院(500)等 - 铁路定向公费生: 武汉铁路(223)/郑州铁路(330)/石家庄铁路(350)等 - 司法系统定向/社区矫正: 中央司法警官学院(480)等 - data/crowd_db/special_programs_loader.py: 查询引擎 - list_programs_for_province(): 按省份筛选适用项目 - find_matching_schools(): 按省份+分数匹配院校(含 0.85 弹性阈值) - build_recommendation_for_review(): 生成审核推荐摘要(含 match_score) 规则层: - data/rules/special_programs_rules.json: 9条特殊批次政策规则 - 提前批填报要求/户籍要求/服务期承诺/体检标准/学费政策/编制保障 prompt 层: - build_audit_prompt: 加入5条特殊批次捡漏路径引导 - LLM 审核时必须考虑这些路径,低分考生方案无特殊批次会在 key_findings 提示 - 新增 special_program_recommendations 输出字段 - build_cwb_prompt: 保底档应包含特殊批次路径之一 测试: 27 passed (special_programs 11 + llm 16)
This commit is contained in:
134
data/crowd_db/special_programs.json
Normal file
134
data/crowd_db/special_programs.json
Normal file
@@ -0,0 +1,134 @@
|
||||
{
|
||||
"programs": [
|
||||
{
|
||||
"program_type": "rural_medical",
|
||||
"program_name": "农村订单定向免费医学生",
|
||||
"batch": "提前批",
|
||||
"applicable_provinces": ["湖南", "河南", "山东", "四川", "广东", "河北", "湖北", "安徽", "江西", "广西", "贵州", "云南", "甘肃", "新疆"],
|
||||
"description": "卫健委专门培养乡镇卫生院医生、全科医生,毕业直接进基层卫生院事业编。",
|
||||
"key_features": {
|
||||
"tuition": "学费减免,部分省份全包学费+生活费",
|
||||
"employment": "毕业直接分配到乡镇卫生院/社区卫生服务中心,事业编制",
|
||||
"service_years": 6,
|
||||
"exam_required": false,
|
||||
"politics_check": "常规政审",
|
||||
"physical_check": "常规体检,视力/身高无严苛要求"
|
||||
},
|
||||
"applicable_to": "本省农村户籍优先,大部分省份要求农村连续3年以上户籍;分数在本科线附近",
|
||||
"warnings": ["服务期满6年后可调动", "需要回户籍地基层服务"],
|
||||
"source": "教育部/卫健委/各省教育考试院",
|
||||
"last_verified": "2025-06"
|
||||
},
|
||||
{
|
||||
"program_type": "public_agriculture",
|
||||
"program_name": "公费农科生",
|
||||
"batch": "提前批/本科批",
|
||||
"applicable_provinces": ["山东", "湖南", "四川", "河南", "安徽", "江西"],
|
||||
"description": "省属农业类公办本科院校定向培养,毕业直接事业编,分配乡镇农业农村局/农技站。",
|
||||
"key_features": {
|
||||
"tuition": "学费全免+住宿费全免+生活补贴",
|
||||
"employment": "毕业直接事业编入职乡镇农业农村局、农技站、畜牧站",
|
||||
"service_years": 5,
|
||||
"exam_required": false,
|
||||
"politics_check": "简单政审",
|
||||
"physical_check": "常规高考体检"
|
||||
},
|
||||
"applicable_to": "本省户籍考生,分数在本科线附近,部分省份低于一本线50-100分",
|
||||
"warnings": ["要求毕业后回户籍所在市县乡镇工作5年", "95%家长不知道此路径"],
|
||||
"source": "各省农业农村厅/教育考试院",
|
||||
"last_verified": "2025-06"
|
||||
},
|
||||
{
|
||||
"program_type": "fire_rescue",
|
||||
"program_name": "公费消防员/应急管理定向生",
|
||||
"batch": "提前批",
|
||||
"applicable_provinces": ["全国"],
|
||||
"description": "国家应急管理部直属院校(中国消防救援学院)定向招生,正式行政编制。",
|
||||
"key_features": {
|
||||
"tuition": "公费培养",
|
||||
"employment": "毕业直接分配进入国家消防救援大队、应急管理局,正式编制",
|
||||
"service_years": null,
|
||||
"exam_required": false,
|
||||
"politics_check": "常规政审,无严重违法即可",
|
||||
"physical_check": "体测比警校宽松,允许矫正视力,近视可报"
|
||||
},
|
||||
"applicable_to": "全国考生,本科批次和专科批次都有,比公安警校低50-120分",
|
||||
"warnings": ["体测简单淘汰率低", "家长认知盲区导致报考人数极少"],
|
||||
"source": "应急管理部/中国消防救援学院",
|
||||
"last_verified": "2025-06"
|
||||
},
|
||||
{
|
||||
"program_type": "railway_directed",
|
||||
"program_name": "铁路系统定向公费生",
|
||||
"batch": "专科提前批/本科批",
|
||||
"applicable_provinces": ["全国"],
|
||||
"description": "各大铁路局、中铁集团定向培养,毕业直接进铁路局正式编制,国企铁饭碗。",
|
||||
"key_features": {
|
||||
"tuition": "公办正规学费",
|
||||
"employment": "毕业直接分配全国各大铁路局,国企正式职工",
|
||||
"service_years": null,
|
||||
"exam_required": false,
|
||||
"politics_check": "常规",
|
||||
"physical_check": "常规体检"
|
||||
},
|
||||
"applicable_to": "全国考生,本科400-460分,专科200-350分",
|
||||
"warnings": ["铁路岗位每年缺口巨大", "常年招不满"],
|
||||
"source": "各省铁道职业技术学院/铁路公办本科",
|
||||
"last_verified": "2025-06"
|
||||
},
|
||||
{
|
||||
"program_type": "judicial_directed",
|
||||
"program_name": "司法系统定向生/社区矫正/基层政法专项",
|
||||
"batch": "提前批/本科批",
|
||||
"applicable_provinces": ["全国"],
|
||||
"description": "基层司法所、社区矫正中心定向招录,司法厅直管,正式编制。",
|
||||
"key_features": {
|
||||
"tuition": "公办正规学费",
|
||||
"employment": "毕业定向分配乡镇司法所,基层政法岗位",
|
||||
"service_years": null,
|
||||
"exam_required": false,
|
||||
"politics_check": "常规",
|
||||
"physical_check": "基本无严苛体测,不卡身高视力"
|
||||
},
|
||||
"applicable_to": "分数中等偏低,想进政法体系,身体条件达不到警校标准",
|
||||
"warnings": ["低配版警校", "不用公安联考"],
|
||||
"source": "各省司法厅/基层司法局",
|
||||
"last_verified": "2025-06"
|
||||
}
|
||||
],
|
||||
"program_schools": {
|
||||
"rural_medical": [
|
||||
{"school": "长沙医学院", "province": "湖南", "score_min": 444, "score_subject": "物理类", "major": "临床医学(定向)", "batch": "本科提前批"},
|
||||
{"school": "湘南学院", "province": "湖南", "score_min": 441, "score_subject": "物理类", "major": "临床医学(定向)", "batch": "本科提前批"},
|
||||
{"school": "南华大学", "province": "湖南", "score_min": 480, "score_subject": "物理类", "major": "预防医学(定向)", "batch": "本科提前批"},
|
||||
{"school": "河南科技大学", "province": "河南", "score_min": 510, "score_subject": "理科", "major": "临床医学(定向)", "batch": "本科提前批"},
|
||||
{"school": "新乡医学院", "province": "河南", "score_min": 490, "score_subject": "理科", "major": "临床医学(定向)", "batch": "本科提前批"},
|
||||
{"school": "山东第一医科大学", "province": "山东", "score_min": 470, "score_subject": "综合改革", "major": "临床医学(定向)", "batch": "本科提前批"},
|
||||
{"school": "西南医科大学", "province": "四川", "score_min": 480, "score_subject": "理科", "major": "临床医学(定向)", "batch": "本科提前批"}
|
||||
],
|
||||
"public_agriculture": [
|
||||
{"school": "山东农业大学", "province": "山东", "score_min": 460, "score_subject": "综合改革", "major": "农学(公费农科)", "batch": "本科提前批"},
|
||||
{"school": "青岛农业大学", "province": "山东", "score_min": 450, "score_subject": "综合改革", "major": "植物保护(公费农科)", "batch": "本科提前批"},
|
||||
{"school": "湖南农业大学", "province": "湖南", "score_min": 430, "score_subject": "物理类", "major": "农学(定向)", "batch": "本科批"},
|
||||
{"school": "四川农业大学", "province": "四川", "score_min": 470, "score_subject": "理科", "major": "农学(定向)", "batch": "本科批"}
|
||||
],
|
||||
"fire_rescue": [
|
||||
{"school": "中国消防救援学院", "province": "全国", "score_min": 500, "score_subject": "综合", "major": "消防工程", "batch": "本科提前批"},
|
||||
{"school": "中国消防救援学院", "province": "全国", "score_min": 500, "score_subject": "综合", "major": "火灾勘查", "batch": "本科提前批"},
|
||||
{"school": "中国消防救援学院", "province": "全国", "score_min": 490, "score_subject": "综合", "major": "通信工程", "batch": "本科提前批"},
|
||||
{"school": "中国消防救援学院", "province": "全国", "score_min": 490, "score_subject": "综合", "major": "应急装备技术与工程", "batch": "本科提前批"}
|
||||
],
|
||||
"railway_directed": [
|
||||
{"school": "石家庄铁路职业技术学院", "province": "河北", "score_min": 350, "score_subject": "物理类", "major": "铁道交通运营管理", "batch": "专科提前批"},
|
||||
{"school": "郑州铁路职业技术学院", "province": "河南", "score_min": 330, "score_subject": "理科", "major": "铁道机车", "batch": "专科提前批"},
|
||||
{"school": "武汉铁路职业技术学院", "province": "湖北", "score_min": 223, "score_subject": "物理类", "major": "铁道机车运用与维护", "batch": "专科批"},
|
||||
{"school": "湖南铁道职业技术学院", "province": "湖南", "score_min": 340, "score_subject": "物理类", "major": "铁道供电技术", "batch": "专科提前批"},
|
||||
{"school": "南京铁道职业技术学院", "province": "江苏", "score_min": 380, "score_subject": "物理类", "major": "高速铁路客运乘务", "batch": "专科提前批"},
|
||||
{"school": "西安铁路职业技术学院", "province": "陕西", "score_min": 320, "score_subject": "理科", "major": "铁道信号自动控制", "batch": "专科提前批"}
|
||||
],
|
||||
"judicial_directed": [
|
||||
{"school": "中央司法警官学院", "province": "全国", "score_min": 480, "score_subject": "综合", "major": "法学(司法行政方向)", "batch": "本科提前批"},
|
||||
{"school": "各省司法警官职业学院", "province": "全国", "score_min": 300, "score_subject": "综合", "major": "刑事执行/社区矫正", "batch": "专科提前批"}
|
||||
]
|
||||
}
|
||||
}
|
||||
155
data/crowd_db/special_programs_loader.py
Normal file
155
data/crowd_db/special_programs_loader.py
Normal file
@@ -0,0 +1,155 @@
|
||||
"""特殊批次定向培养计划查询模块。
|
||||
|
||||
加载 data/crowd_db/special_programs.json,提供按省份/分数匹配特殊批次推荐的能力。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
||||
_SPECIAL_PROGRAMS_PATH = Path(__file__).resolve().parent / "special_programs.json"
|
||||
_SPECIAL_RULES_PATH = (
|
||||
Path(__file__).resolve().parents[1] / "rules" / "special_programs_rules.json"
|
||||
)
|
||||
|
||||
|
||||
class SpecialProgramsLoader:
|
||||
"""加载特殊批次定向培养计划数据。"""
|
||||
|
||||
def __init__(
|
||||
self, data_path: Path | None = None, rules_path: Path | None = None
|
||||
) -> None:
|
||||
self._data_path = data_path or _SPECIAL_PROGRAMS_PATH
|
||||
self._rules_path = rules_path or _SPECIAL_RULES_PATH
|
||||
self._data: dict[str, Any] | None = None
|
||||
self._rules: dict[str, Any] | None = None
|
||||
|
||||
@property
|
||||
def data(self) -> dict[str, Any]:
|
||||
if self._data is None:
|
||||
self._data = json.loads(self._data_path.read_text(encoding="utf-8"))
|
||||
return self._data # type: ignore[return-value]
|
||||
|
||||
@property
|
||||
def rules(self) -> dict[str, Any]:
|
||||
if self._rules is None:
|
||||
self._rules = json.loads(self._rules_path.read_text(encoding="utf-8"))
|
||||
return self._rules # type: ignore[return-value]
|
||||
|
||||
def list_programs(self) -> list[dict[str, Any]]:
|
||||
"""列出全部 5 类特殊批次项目。"""
|
||||
return self.data.get("programs", [])
|
||||
|
||||
def get_program(self, program_type: str) -> dict[str, Any] | None:
|
||||
"""按 program_type 获取单个项目详情。"""
|
||||
for p in self.list_programs():
|
||||
if p.get("program_type") == program_type:
|
||||
return p
|
||||
return None
|
||||
|
||||
def list_programs_for_province(self, province: str) -> list[dict[str, Any]]:
|
||||
"""列出某省份适用的特殊批次项目。"""
|
||||
province = province.strip()
|
||||
result = []
|
||||
for p in self.list_programs():
|
||||
applicable = p.get("applicable_provinces") or []
|
||||
if "全国" in applicable or province in applicable:
|
||||
result.append(p)
|
||||
return result
|
||||
|
||||
def find_matching_schools(
|
||||
self,
|
||||
province: str,
|
||||
score: int,
|
||||
*,
|
||||
program_type: str | None = None,
|
||||
) -> list[dict[str, Any]]:
|
||||
"""根据省份和分数,匹配可捡漏的特殊批次院校。
|
||||
|
||||
Args:
|
||||
province: 考试省份。
|
||||
score: 考生分数。
|
||||
program_type: 可选,限定项目类型。
|
||||
|
||||
Returns:
|
||||
匹配的院校列表,每个含 school/major/score_min/program_type 等。
|
||||
"""
|
||||
province = province.strip()
|
||||
program_schools = self.data.get("program_schools", {})
|
||||
results: list[dict[str, Any]] = []
|
||||
|
||||
for ptype, schools in program_schools.items():
|
||||
if program_type and ptype != program_type:
|
||||
continue
|
||||
for s in schools:
|
||||
s_province = s.get("province", "")
|
||||
# "全国" 适用所有省份
|
||||
if s_province != "全国" and s_province != province:
|
||||
continue
|
||||
score_min = s.get("score_min", 999)
|
||||
# 考生分数 >= 院校最低分 * 0.9(允许一定弹性)
|
||||
if score >= int(score_min) * 0.85:
|
||||
results.append({
|
||||
**s,
|
||||
"program_type": ptype,
|
||||
"gap": score - int(score_min),
|
||||
})
|
||||
|
||||
# 按分数差升序(越接近的越优先推荐)
|
||||
results.sort(key=lambda x: abs(x.get("gap", 0)))
|
||||
return results
|
||||
|
||||
def get_applicable_rules(self, program_type: str) -> list[dict[str, Any]]:
|
||||
"""获取某项目类型适用的规则列表。"""
|
||||
all_rules = self.rules.get("rules", [])
|
||||
return [r for r in all_rules if program_type in (r.get("applies_to") or [])]
|
||||
|
||||
def build_recommendation_for_review(
|
||||
self,
|
||||
province: str,
|
||||
score: int,
|
||||
) -> list[dict[str, Any]]:
|
||||
"""为审核/复核场景生成特殊批次推荐摘要。
|
||||
|
||||
返回格式适合直接注入 LLM prompt 或 ReviewResultContract。
|
||||
"""
|
||||
programs = self.list_programs_for_province(province)
|
||||
if not programs:
|
||||
return []
|
||||
|
||||
recommendations = []
|
||||
for p in programs:
|
||||
ptype = p.get("program_type", "")
|
||||
matching_schools = self.find_matching_schools(
|
||||
province, score, program_type=ptype
|
||||
)
|
||||
if not matching_schools:
|
||||
continue
|
||||
|
||||
# 取最近的院校
|
||||
best_school = matching_schools[0]
|
||||
features = p.get("key_features", {})
|
||||
|
||||
recommendations.append({
|
||||
"program_type": ptype,
|
||||
"program_name": p.get("program_name", ""),
|
||||
"description": p.get("description", ""),
|
||||
"batch": p.get("batch", ""),
|
||||
"best_match_school": best_school.get("school", ""),
|
||||
"best_match_major": best_school.get("major", ""),
|
||||
"best_match_score_min": best_school.get("score_min", 0),
|
||||
"tuition": features.get("tuition", ""),
|
||||
"employment": features.get("employment", ""),
|
||||
"service_years": features.get("service_years"),
|
||||
"exam_required": features.get("exam_required", False),
|
||||
"physical_check": features.get("physical_check", ""),
|
||||
"match_score": max(0, 100 - abs(best_school.get("gap", 0))),
|
||||
"warnings": p.get("warnings", []),
|
||||
})
|
||||
|
||||
# 按 match_score 降序
|
||||
recommendations.sort(key=lambda x: x.get("match_score", 0), reverse=True)
|
||||
return recommendations
|
||||
106
data/crowd_db/tests/test_special_programs.py
Normal file
106
data/crowd_db/tests/test_special_programs.py
Normal file
@@ -0,0 +1,106 @@
|
||||
"""特殊批次定向培养计划模块测试。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from data.crowd_db.special_programs_loader import SpecialProgramsLoader
|
||||
|
||||
|
||||
_DATA_PATH = Path(__file__).resolve().parent.parent / "special_programs.json"
|
||||
_RULES_PATH = (
|
||||
Path(__file__).resolve().parents[3]
|
||||
/ "data"
|
||||
/ "rules"
|
||||
/ "special_programs_rules.json"
|
||||
)
|
||||
|
||||
|
||||
class TestSpecialProgramsLoader:
|
||||
def setup_method(self):
|
||||
self.loader = SpecialProgramsLoader(
|
||||
data_path=_DATA_PATH, rules_path=_RULES_PATH
|
||||
)
|
||||
|
||||
def test_loads_5_program_types(self):
|
||||
programs = self.loader.list_programs()
|
||||
types = {p["program_type"] for p in programs}
|
||||
assert types == {
|
||||
"rural_medical",
|
||||
"public_agriculture",
|
||||
"fire_rescue",
|
||||
"railway_directed",
|
||||
"judicial_directed",
|
||||
}
|
||||
|
||||
def test_get_program(self):
|
||||
p = self.loader.get_program("rural_medical")
|
||||
assert p is not None
|
||||
assert p["program_name"] == "农村订单定向免费医学生"
|
||||
assert p["key_features"]["service_years"] == 6
|
||||
|
||||
def test_get_program_not_found(self):
|
||||
assert self.loader.get_program("nonexistent") is None
|
||||
|
||||
def test_list_programs_for_hunan(self):
|
||||
programs = self.loader.list_programs_for_province("湖南")
|
||||
types = {p["program_type"] for p in programs}
|
||||
# 湖南应该有 rural_medical(applicable_provinces 含"湖南")
|
||||
# fire_rescue/railway_directed/judicial_directed 是"全国"
|
||||
assert "rural_medical" in types
|
||||
assert "fire_rescue" in types # 全国
|
||||
assert "railway_directed" in types # 全国
|
||||
|
||||
def test_find_matching_schools_for_hunan_578(self):
|
||||
"""湖南 578 分应该能匹配到铁路/消防/医疗等院校。"""
|
||||
results = self.loader.find_matching_schools("湖南", 578)
|
||||
assert len(results) > 0
|
||||
# 应包含铁路(湖南铁道职业技术学院 340 分)
|
||||
types = {r["program_type"] for r in results}
|
||||
assert "railway_directed" in types
|
||||
|
||||
def test_find_matching_schools_low_score(self):
|
||||
"""低分考生(250)应该匹配到铁路专科。"""
|
||||
results = self.loader.find_matching_schools("湖北", 250)
|
||||
# 武汉铁路职业技术学院 223 分
|
||||
railway = [r for r in results if r["program_type"] == "railway_directed"]
|
||||
assert len(railway) > 0
|
||||
assert any("武汉铁路" in r["school"] for r in railway)
|
||||
|
||||
def test_find_matching_schools_high_score_excludes_far(self):
|
||||
"""高分考生不应匹配到分数差距过大的院校。"""
|
||||
results = self.loader.find_matching_schools("湖南", 650)
|
||||
# 650 分不应匹配到 223 分的武汉铁路(差距 427 分,223*0.85=189.55)
|
||||
# 但仍然匹配(因为 650 >= 189.55),只是 gap 很大
|
||||
# 验证至少不报错
|
||||
assert isinstance(results, list)
|
||||
|
||||
def test_get_applicable_rules(self):
|
||||
rules = self.loader.get_applicable_rules("rural_medical")
|
||||
rule_ids = {r["rule_id"] for r in rules}
|
||||
assert "special.rural_medical.hukou_requirement" in rule_ids
|
||||
assert "special.rural_medical.service_commitment" in rule_ids
|
||||
assert "special.general.tuition_free" in rule_ids
|
||||
|
||||
def test_build_recommendation_for_review(self):
|
||||
"""审核场景推荐摘要。"""
|
||||
recs = self.loader.build_recommendation_for_review("湖南", 450)
|
||||
assert len(recs) > 0
|
||||
# 450 分应该能匹配到定向医疗(444/441分)
|
||||
types = {r["program_type"] for r in recs}
|
||||
assert "rural_medical" in types
|
||||
# 每条都有 match_score
|
||||
for r in recs:
|
||||
assert "match_score" in r
|
||||
assert 0 <= r["match_score"] <= 100
|
||||
|
||||
def test_build_recommendation_no_match(self):
|
||||
"""不存在的省份只返回全国性项目(fire/railway/judicial),不报错。"""
|
||||
recs = self.loader.build_recommendation_for_review("火星", 500)
|
||||
# 全国性项目仍可能返回,但不应报错
|
||||
assert isinstance(recs, list)
|
||||
|
||||
def test_rules_loaded(self):
|
||||
rules = self.loader.rules
|
||||
assert "rules" in rules
|
||||
assert len(rules["rules"]) >= 9
|
||||
@@ -50,6 +50,16 @@ def build_audit_prompt(
|
||||
## 考生基本信息
|
||||
{context}
|
||||
|
||||
## ⚠️ 特殊批次捡漏路径(必须考虑)
|
||||
在审核方案时,请特别关注考生是否考虑了以下 5 条低分捡漏、体制内兜底的升学路径。
|
||||
如果考生分数偏低(接近本科线或低于一本线),而方案中没有包含任何特殊批次路径,请在 key_findings 中明确提示:
|
||||
|
||||
1. **公费农科生**(提前批/本科批):学费全免+住宿全免+生活补贴,毕业直接事业编(乡镇农业农村局/农技站),服务5年。分数要求低(本科线附近),95%家长不知道。
|
||||
2. **定向基层医疗**(提前批):培养乡镇卫生院医生/全科医生,毕业直接进基层卫生院事业编。学费减免,服务6年。分数在本科线附近,农村户籍优先。
|
||||
3. **公费消防/应急管理**(提前批):中国消防救援学院等,正式行政编制,五险一金齐全。体测比警校宽松,允许矫正视力,比警校低50-120分。
|
||||
4. **铁路定向公费生**(专科提前批/本科批):各大铁路局定向培养,国企正式编制,包分配全国。专科200-350分、本科400-460分就能上岸。
|
||||
5. **司法系统定向/社区矫正**(提前批/本科批):基层司法所、社区矫正中心定向招录,正式编制。不用公安联考,不卡身高视力,比警校低80-130分。
|
||||
|
||||
## 现有方案说明
|
||||
{existing_plan or "用户未提供具体方案内容"}
|
||||
|
||||
@@ -60,6 +70,13 @@ def build_audit_prompt(
|
||||
"risk_summary": "一句话风险总结",
|
||||
"key_findings": ["风险点1", "风险点2", ...],
|
||||
"suggestions": ["建议1", "建议2", ...],
|
||||
"special_program_recommendations": [
|
||||
{{
|
||||
"program": "公费农科生|定向基层医疗|公费消防|铁路定向|司法定向",
|
||||
"reason": "为什么推荐这条路径",
|
||||
"match_score": 0-100
|
||||
}}
|
||||
],
|
||||
"cwb_suggestions": {{
|
||||
"rush": ["冲刺院校1 - 专业", ...],
|
||||
"stable": ["稳妥院校1 - 专业", ...],
|
||||
@@ -70,6 +87,7 @@ def build_audit_prompt(
|
||||
注意:
|
||||
- risk_level 基于踩线风险、扎堆程度和梯度合理性综合判断
|
||||
- key_findings 最多 5 条,每条不超过 50 字
|
||||
- special_program_recommendations 只在考生分数适合时推荐,否则返回空数组
|
||||
- cwb_suggestions 每档至少 2 个院校-专业组合
|
||||
- 如果信息不足,在 key_findings 里说明需要补充什么"""
|
||||
|
||||
@@ -137,7 +155,13 @@ def build_cwb_prompt(
|
||||
- 冲刺档目标分数约 {score + 20} 分段
|
||||
- 稳妥档围绕 {score} 分段
|
||||
- 保底档约 {score - 20} 分段
|
||||
- 院校名和专业名要真实存在"""
|
||||
- 院校名和专业名要真实存在
|
||||
- 如果考生分数偏低,保底档应包含以下特殊批次路径之一:
|
||||
- 公费农科生(提前批,事业编)
|
||||
- 定向基层医疗(提前批,事业编)
|
||||
- 消防定向(提前批,行政编)
|
||||
- 铁路定向(专科提前批/本科批,国企编)
|
||||
- 司法定向(提前批/本科批,政法编)"""
|
||||
|
||||
return system, user
|
||||
|
||||
|
||||
69
data/rules/special_programs_rules.json
Normal file
69
data/rules/special_programs_rules.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"version": "2026.06.27",
|
||||
"last_verified": "2025-06",
|
||||
"rules": [
|
||||
{
|
||||
"rule_id": "special.batch.early_admission",
|
||||
"description": "定向培养计划通常在提前批录取,考生须在提前批志愿填报期内填报",
|
||||
"severity": "warning",
|
||||
"applies_to": ["rural_medical", "public_agriculture", "fire_rescue", "railway_directed", "judicial_directed"],
|
||||
"check": "填报批次必须为提前批或专科提前批"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.rural_medical.hukou_requirement",
|
||||
"description": "农村订单定向免费医学生要求本人及父母具有农村户籍,且连续3年以上",
|
||||
"severity": "fatal",
|
||||
"applies_to": ["rural_medical"],
|
||||
"check": "考生户籍须为农村,连续3年以上"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.rural_medical.service_commitment",
|
||||
"description": "定向医学生毕业后须回户籍地基层卫生院服务6年",
|
||||
"severity": "warning",
|
||||
"applies_to": ["rural_medical"],
|
||||
"check": "需签署定向服务协议,服务期6年"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.public_agriculture.service_commitment",
|
||||
"description": "公费农科生毕业后须回户籍所在市县乡镇农业系统工作5年",
|
||||
"severity": "warning",
|
||||
"applies_to": ["public_agriculture"],
|
||||
"check": "需签署定向服务协议,服务期5年"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.fire_rescue.physical_check",
|
||||
"description": "消防定向允许矫正视力,体测标准比警校宽松",
|
||||
"severity": "info",
|
||||
"applies_to": ["fire_rescue"],
|
||||
"check": "视力允许矫正达标,不需裸眼4.8"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.railway_directed.score_threshold",
|
||||
"description": "铁路定向专科分数门槛极低(200-350分),本科400-460分",
|
||||
"severity": "info",
|
||||
"applies_to": ["railway_directed"],
|
||||
"check": "专科200+分可报,本科400+分可报"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.judicial_directed.no_police_exam",
|
||||
"description": "司法系统定向不需要参加公安联考",
|
||||
"severity": "info",
|
||||
"applies_to": ["judicial_directed"],
|
||||
"check": "定向招录,不需要公安联考"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.general.tuition_free",
|
||||
"description": "公费农科生/定向医学生通常学费全免+住宿费全免+生活补贴",
|
||||
"severity": "info",
|
||||
"applies_to": ["rural_medical", "public_agriculture"],
|
||||
"check": "学费减免政策以各省当年公布为准"
|
||||
},
|
||||
{
|
||||
"rule_id": "special.general.no_exam_for_employment",
|
||||
"description": "所有定向培养计划毕业即就业,不需要参加公务员/事业单位统考",
|
||||
"severity": "info",
|
||||
"applies_to": ["rural_medical", "public_agriculture", "fire_rescue", "railway_directed", "judicial_directed"],
|
||||
"check": "毕业直接入编/入职"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user