使用说明
🎓 汉城大学外国人入学第一次文件自动验证系统
AX Frontier Challenge参赛作品
如果员工将志愿者文件PDF连同文件夹一起上传 AI阅读、验证、4种语言的指导邮件 自动创建。 提供Streamlit演示屏幕和MCP服务器。
Python 3.10+ FastMCP Claude Vision Streamlit 63 tests passing
🏆 AX前沿挑战 鼓励奖 获奖作品
提交征集活动时运营的实时演示(Streamlit Cloud)获奖后结束。 下面 快速查看在本地运行时,可以使用相同的屏幕。
快速查看
如果您想绕过代码查看演示屏幕:
git clone <repo-url> hansung-admission && cd hansung-admission
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # 그리고 .env 안에 ANTHROPIC_API_KEY 채워넣기
streamlit run demo/streamlit_app.py
→在浏览器中 http://localhost:8501 打开。
📌 一目了然
| 项目 | 内容 |
|---|---|
| 目标录取 2026年度汉城大学纯外国人学部新、编入学 | |
| 用户 | 入学处职员(应聘者本人X) |
| 输入 | 志愿者PDF文件夹(护照、TOPIK、余额证明、外国人登记证、证件照片、入学申请书等最多8种) |
| 输出 | 综合判定(PASS/REVIEW/FAIL)+单证验证+奖学金+4种语言指南邮件 |
| 界面 ①本地Streamlit演示②Claude Desktop③Claude Code | |
| AI用处 | 使用Claude Vision提取PDF信息+生成指南。资格判定是决定性规则 |
1.为什么制作
1.1外国人入学材料为何困难
吸引留学生成为大学生存战略的现在,入学处业务量暴增,但文件验证方式与10年前相同。
- 教育部“Study Korea 300K”-到2027年为止的外国留学生目标为30万名
- 汉城大学外国人招募-每年2次,每个赛季累计讨论
- 每位志愿者提交的文件 19种,各国的格式、语言各不相同
员工每次手动检查:
🧾 确认项目(可自动验证的8种)
- 学生、父母国籍-如果有一人是韩国国籍,将被取消资格
- 护照 -到期日是否在入学日(2026-09-30)之后,6个月内到期警告
- 外国人登记证(ARC) -到期日·滞留资格(D-2、D-4等)
- 出入境事实证明书 -以国内居民为对象,包括查询时间(生日至报名日期)
- 各学科 主题 条件+证书批次、考试日、到期日
- 余额证明书 -2千万韩元以上/发放3个月内/到期日入学日以后
- 证件照 -3.5×4.5厘米,3个月内拍摄
- 入学志愿书、誓约书、同意书 -是否签名、填写
- ★ 验证文件之间的名称交叉 -自动检测不同名义的文件
员工需要判断的领域:
- 学历认证真伪(APOSTIU、领事、CHISI)、家庭关系、艺体组合等11种
1.2该项目的解决方案
[지원자 PDF 폴더]
↓
[AI 추출 — Claude Vision] ← 자동 분류 + 정보 추출
↓
[규칙 검증 — 결정적 룰셋] ← 모집요강 JSON 기준
↓
[종합 판정 + 4개 언어 안내 메일]
- AI只读PDF,资格判定是决定性代码→相同的输入→相同的答案
- 更新招募大纲时只更换JSON,工具代码保持不变
- 隐私:未使用面部照片,未使用名称掩蔽,未使用AI学习(ZDR)
2.制作了什么
2.1两种使用方式
| 方式 | 目标 | 屏幕 |
|---|---|---|
| Streamlit演示Web应用程序 | 招生处工作人员实际使用的屏幕 | 上传文件夹→显示提取信息→验证→结果 |
| MCP服务器 | 在Claude Desktop/Code中用自然语言呼叫 | “越南阮蒂昂,请研究软件融合新人” |
2.2自动验证的8种文件
文档验证项目 |---|---|---| | 1 | 🛂 护照 |到期日≥入学日,6个月内到期警告| | 2 | 🪪 外国人登记证(ARC) |到期日,滞留资格码| | 3 | ✈️ 出入境事实证明书 |查询时间包括(生日至报名日期) | 4 | 📜 TOPIK成绩证明书 |各学科最低等级,2年有效期| | 5 | 💰 余额证明书 2000万韩元以上,发放3个月以内 | 6 | 📷 证件照 3.5×4.5厘米,3个月内拍摄 | 7 | 📝 入学志愿书、同意书、誓约书 |是否签名、填写| | 8 | 🎓 韩国语课程结业证 |发放机构·进修学期数(奖学金加算)|
★ 名称交叉验证 -对提取的所有文件的名称进行比较,检测出不同名称的文件(例如TOPIK是本人,韩语课程结业证书是他人→警告)
3.体系结构
┌────────────────────────┐ ┌────────────────────────┐
│ Streamlit 데모 화면 │ │ Claude Desktop / Code │
│ (입학처 직원용 UI) │ │ (자연어 질의) │
└───────────┬────────────┘ └───────────┬────────────┘
│ │ stdio (MCP)
│ 직접 import │
↓ ↓
┌──────────────────────────────────────────────────────────┐
│ admission/ (핵심 패키지) │
│ ├─ extractors.py · Claude Vision PDF → 구조화 데이터 │
│ ├─ rules.py · 결정적 검증 룰 (순수 함수) │
│ ├─ intake.py · 추출+검증 파이프라인 │
│ └─ email.py · 다국어 안내 메일 (한·영·중·베) │
└────────────────────────┬─────────────────────────────────┘
↓
┌──────────────────────────────────────────────────────────┐
│ data/*.json — 모집요강에서 추출한 룰셋 (출처 페이지 명시) │
└──────────────────────────────────────────────────────────┘
3.1文件夹结构
mcp/
├── server.py ← MCP 진입점, FastMCP 도구 17개
│
├── admission/ ← 핵심 패키지
│ ├── data.py · data/*.json lru_cache 로더
│ ├── rules.py · 결정 로직 (순수 함수)
│ ├── extractors.py · PDF → 구조화 데이터 (Claude Vision, 8종)
│ ├── intake.py · extract / validate / process 3단계
│ └── email.py · 다국어 안내 메일 생성기
│
├── demo/ ← Streamlit 데모
│ ├── streamlit_app.py · 3단계 UI (정보 입력 → 검증 → 결과)
│ ├── mcp_adapter.py · Claude API + MCP tool_use 어댑터
│ └── __init__.py
│
├── data/ ← 모집요강 룰셋 (JSON 6종)
│ ├── departments.json · 학과·TOPIK 요건
│ ├── scholarship.json · 장학금 매트릭스
│ ├── documents.json · 19종 서류 정의
│ ├── schedule.json · 1·2차 일정·TOPIK 컷오프
│ ├── legalization.json · 학력 인증 방식
│ └── contact.json · 입학처 연락처
│
├── templates/ ← 다국어 메일 (4언어 × 2시나리오 = 8개)
├── samples/ ← 합성 PDF + 가상 지원자 3명
├── tests/ ← pytest 63개 케이스
├── scripts/ ← 합성 PDF 생성기
├── docs/ ← 모집요강 원본·공모전 자료
└── .streamlit/config.toml ← 한성대 블루 테마
3.2设计原则
分级文件角色
|---|---|---|
| 📦 数据 | data/*.json |招募大纲1:1映射, _meta.source在中指定页面来源|
| 🔍 提取 | admission/extractors.py | Claude Vision为PDF→JSON|
| ⚙️ 验证 | admission/rules.py |决定性函数,可测试单位|
| 🔌 MCP适配器 | server.py 自然语言调用函数
| 🖥️ 演示UI | demo/streamlit_app.py |员工演示屏幕|
4.17个MCP工具
4.1资格·材料验证(9种)
| 工具 | 用途 |
|---|---|
check_nationality_eligibility |
国籍资格(学生+父母) |
check_topik_requirement |
各学科TOPIK最低等级 |
validate_topik_score |
TOPIK等级·有效期 |
validate_finances |
余额、发放日期、到期日期 |
validate_passport |
护照到期日 |
validate_arc |
外国人登记证到期日·滞留资格 |
validate_entry_exit |
出入境事实证明期限 |
validate_photo |
证件照规格·拍摄日期 |
validate_application_bundle |
签署入学申请书、同意书、誓约书 |
4.2交叉验证(1种)
| 工具 | 用途 |
|---|---|
check_name_consistency |
多个文件的名称是否相同 |
4.3信息·计算(4种)
| 工具 | 用途 |
|---|---|
list_required_documents |
应聘者情况需要材料 |
get_legalization_method |
各国学历认证方式 |
calculate_scholarship |
第一学期奖学金比例 |
next_deadline |
以今天为准,下一个日历+D-day |
4.4综合自动化(1种)
| 工具 | 用途 |
|---|---|
process_application_folder |
PDF文件夹→自动分类、提取、验证综合报告 |
4.5通知邮件(2种)
| 工具 | 用途 |
|---|---|
generate_guide_email |
1封邮件(1种语言) |
generate_guide_email_multilang |
同时使用4种语言(ko·en·zh·vi) |
邮件方案: supplement (请求补充)· received (接收完毕)
5.演示方案(3个示例)
您可以通过三个示例文件夹演示不同的判定类型。
|文件夹|申请人|国籍·学科判定|演示点|
|---|---|---|---|---|
| 왕메이링_중국_글로벌K비즈니스 王美玲中国·全球K商务 通过 |正常流程,所有文件通过|
| 응웬티흐엉_베트남_SW융합 越南·SW融合 审查 ★韩语课程结业证以他人名义→姓名交叉验证检测|
| 마리아산토스_필리핀_영상엔터테인먼트 马里亚·桑托斯菲律宾影像娱乐公司 审查 |余额1500万韩元<2000万韩元→财政未达标探测
6.安装
6.1环境准备(仅前一次)
cd ~/Desktop/프로젝트파일/mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
6.2 Anthropic API密钥设置
.env.example的 .env复制到并输入API密钥:
cp .env.example .env
# .env 파일을 열어 ANTHROPIC_API_KEY 채워넣기
.env:
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxxxxxxxx
ANTHROPIC_MODEL=claude-sonnet-4-6
⚠️
.env是.gitignore注册在中,千万不要提交。
7.执行方法(4种选择)
📌 所有的方法 第6节安装必须先完成。 每次运行
source .venv/bin/activate从激活虚拟环境开始。
7.1在本地运行Streamlit演示(★最快)
入学处职员实际使用的画面。文件夹上传→AI自动提取→验证结果+4种语言邮件。
source .venv/bin/activate
streamlit run demo/streamlit_app.py
浏览器将自动 http://localhost:8501以打开。打不开的话直接连接。
使用流程:
- Step1-输入信息
- 从左侧下拉菜单中选择示例文件夹或直接拖放PDF
- 上传后AI读取文件,提取的信息显示在屏幕上(20-40秒)
- 自动填写姓名、国籍、出生日期、学科、录取、音轨(有入学申请书PDF时)
- 直接选择次数→ 开始自动验证
- Step2-继续验证
- 使用提取的数据验证规则+生成四种语言的邮件(即时)
- Step 3-结果
- 综合判定卡(PASS/REVIEW/FAIL)
- 左侧:按文件验证结果+名称交叉验证
- 右侧:韩、英、中、贝指南邮件(切换到标签)
7.2将MCP服务器连接到Claude Desktop
想用自然语言要求验证的时候。
~/Library/Application Support/Claude/claude_desktop_config.json 添加到(MacOS):
{
"mcpServers": {
"hansung-admission": {
"command": "/Users/raewon/Desktop/프로젝트파일/mcp/.venv/bin/python",
"args": ["/Users/raewon/Desktop/프로젝트파일/mcp/server.py"]
}
}
}
Claude Desktop重启→左下角🔧 单击图标→ hansung-admission 显示后连接成功。
使用示例:
“请检查samples/applicants/王美玲_中国_全球K商务文件夹。中国国籍,全球K商务新人,韩语曲目。”
→克劳德 process_application_folder 调用工具进行自动验证。
7.3在Claude Code中使用
在项目根目录中 .mcp.json 创建:
{
"mcpServers": {
"hansung-admission": {
"command": "./.venv/bin/python",
"args": ["./server.py"]
}
}
}
在相应目录中 claude 运行时自动识别。
7.4直接从Python调用(用于开发)
from admission import intake
result = intake.process_application_folder(
folder_path="samples/applicants/왕메이링_중국_글로벌K비즈니스",
applicant_name="왕메이링",
nationality="China",
mother_nationality="China",
father_nationality="China",
department_key="global_k_business",
track="korean",
)
print(result["overall"]) # 'pass' | 'review' | 'fail'
print(result["overall_flags"])
8.测试
source .venv/bin/activate
pytest tests/ -v
# → 63 passed in 0.32s
仅包括规则和邮件单元测试(无API调用)。Vision提取集成测试因成本原因单独编写脚本:
python scripts/verify_topik_extraction.py
python scripts/verify_financial_extraction.py
# … 등
9.生成合成PDF样本
当示例PDF损坏或想要创建新案例时:
cd scripts
python generate_topik_samples.py # TOPIK 4종
python generate_financial_samples.py # 잔고증명 4종
python generate_korean_course_samples.py # 한국어과정 수료증 4종
python generate_a_category_samples.py # 응웬티흐엉 A카테고리 5종
python generate_demo_applicant.py # 왕메이링 풀세트
python generate_demo_applicant_3.py # 마리아 산토스 풀세트
所有合成PDF都带有“SAMPLE/样本”水印,以防止伪造误用。
10.隐私政策
该系统涉及护照、余额证明等超敏感信息,从一开始就保守设计。
| 原则 | 适用 |
|---|---|
| 👁 未提取脸部 | 在Vision提示符下忽略照片区域,仅文本 |
| 🔒 名称、编号掩蔽 | 仅以提取后立即掩蔽的形式显示(응웬티***) |
| 🧠 AI美学学习Anthropic API未使用I/O学习。正式实施时申请零数据保留(ZDR) | |
| 🧪 只开发合成数据 | samples/ 全部为SAMPLE水印。实际志愿者PDF .gitignore |
| 📝 禁止日志PII | 未保存API响应原文,调试时仅字段名 |
附录-快速整理MCP
第一次接触MCP的人的一页摘要。
MCP是什么? 连接AI模型和外部工具、数据的开放式标准协议。Anthropic将于2024年公开。可以看作是给AI戴上“手和眼睛”的USB规格。
组件
Host ←→ MCP Client ←→ MCP Server
配置角色示例 |---|---|---| | Host|运行AI的应用程序| Claude Desktop、Claude Code、Cursor、Zed| | MCP Client | Host内置通信模块|自动,无需手动处理| | MCP Server |工具·数据提供| ←本项目 |
最简单的示例
from fastmcp import FastMCP
mcp = FastMCP("My Server")
@mcp.tool()
def greet(name: str) -> str:
"""이름을 받아서 인사합니다"""
return f"안녕하세요, {name}님!"
mcp.run()
本项目 server.py是本示例中的17个工具扩展插件。
🎓 汉城大学外国人入学第一次文件自动验证系统 AX前沿挑战·Fall 2026标准·Built with FastMCP+Claude Vision+Streamlit