本 Skill 必须遵循以下原子性执行原则:
本技能将简历文件(PDF/Word/WPS/图片)或飞书文档链接解析为结构化数据,并自动同步到飞书多维表格。支持手动上传、飞书文档链接和定时目录监控三种模式。
执行前需确认以下配置(从环境变量或用户提供):
# 飞书 API 配置
FEISHU_APP_ID: "cli_xxxxx" # 飞书应用 App ID
FEISHU_APP_SECRET: "xxxxx" # 飞书应用 App Secret
FEISHU_APP_TOKEN: "bascxxxxx" # 目标多维表格 app_token
FEISHU_TABLE_ID: "tblxxxxx" # 目标数据表 table_id
FEISHU_WEBHOOK_URL: "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx" # 机器人 Webhook
# 监控模式配置(可选)
WATCH_DIRECTORY: "/path/to/resume/folder" # 监控目录路径
STATE_FILE: ".resume_sync_state.json" # 状态文件路径
CRON_SCHEDULE: "0 10 * * 1" # Cron 表达式(每周一10:00)
| # | 字段名 | 字段类型 | 缺失处理 | 解析规则 |
|---|---|---|---|---|
| --- | -------- | ---------- | ---------- | ---------- |
| 1 | 姓名 | 文本 | 留空 | 提取文档开头的人名 |
| 2 | 手机号 | 文本 | 留空 | 匹配 11 位手机号格式 |
| 3 | 邮箱 | 文本 | 留空 | 匹配邮箱格式 |
| 4 | 性别 | 单选 | 留空 | 男/女/未知 |
| 5 | 年龄 | 数字 | 智能推理 | 见「年龄推理规则」 |
| 6 | 最高学历 | 单选 | 留空 | 博士/硕士/本科/大专/高中/其他 |
| 7 | 毕业院校 | 文本 | 留空 | 自动标注 (985)/(211),见「院校名单」 |
| 8 | 专业 | 文本 | 留空 | - |
| 9 | 工作年限 | 数字 | 留空 | 从最早工作经历计算至今 |
| 10 | 当前公司 | 文本 | 留空 | 仅取最近一份工作 |
| 11 | 当前职位 | 文本 | 留空 | 仅取最近一份工作 |
| 12 | 过往公司 | 文本 | 留空 | 历史公司用 / 分隔,如 腾讯/阿里/百度 |
| 13 | 期望薪资 | 文本 | 留空 | 保留原始表述,如 30-40K |
| 14 | 期望城市 | 文本 | 留空 | - |
| 15 | 技能标签 | 多选 | 留空 | 提取技术栈、工具、语言等 |
| 16 | 项目经历 | 长文本 | 留空 | 保留关键项目描述 |
| 17 | 备注 | 长文本 | 留空 | 包含自我评价内容 |
| 18 | 总体画像 | 长文本 | 必填 | AI 生成,见「画像模板」 |
| 19 | 文件来源 | 文本 | 自动填充 | 原始文件名 |
当简历未明确标注年龄或出生日期时,按以下优先级推理:
当前年份 - (入学年份 + 入学时年龄)示例:
- 简历显示「2015年9月入学北京大学本科」
- 推算:出生年 = 2015 - 18 = 1997
- 当前 2026 年,年龄 = 2026 - 1997 = 29 岁
匹配 universities.json 名单,在院校名后追加标注:
清华大学 (985)上海财经大学 (211)/ 连接,填入「过往公司」示例:
工作经历:
- 2022-至今:字节跳动,产品经理
- 2019-2022:腾讯,产品运营
- 2017-2019:百度,产品助理
输出:
- 当前公司:字节跳动
- 当前职位:产品经理
- 过往公司:腾讯/百度
必须按以下模板生成,未知项标注「待核实」:
这是一位在【A行业】有【N年】经验的【B职能】专家,擅长【C技能】,曾取得【D类量化成果】。
其职业路径显示出【E特征】,目前可能因【F动机】而看机会。
可能适合【G方向】的岗位,但需要核实【H问题】。
变量说明:
| 变量 | 说明 | 推理来源 |
|---|---|---|
| ------ | ------ | ---------- |
| A行业 | 主要从业行业 | 工作经历中的公司/行业 |
| N年 | 工作年限 | 字段9 |
| B职能 | 核心职能定位 | 职位名称归纳 |
| C技能 | 核心技能(3-5个) | 技能标签 + 项目经历 |
| D成果 | 量化成就 | 项目经历中的数据 |
| E特征 | 职业发展特点 | 跳槽频率/晋升轨迹/行业跨度 |
| F动机 | 求职动机推测 | 期望薪资/城市变化/空窗期 |
| G方向 | 适合的岗位方向 | 综合分析 |
| H问题 | 需核实的疑点 | 空窗期/频繁跳槽/技能匹配度 |
示例输出:
这是一位在【互联网】有【6年】经验的【产品经理】专家,擅长【用户增长、数据分析、B端产品设计】,
曾取得【DAU提升200%、转化率优化35%】。其职业路径显示出【稳步晋升、专注ToB领域】,
目前可能因【寻求更大平台/薪资提升】而看机会。可能适合【产品总监/高级产品经理】的岗位,
但需要核实【近期离职原因、团队管理经验深度】。
用户上传文件/飞书文档链接 → 文件预处理 → 大模型解析 → 飞书写入 → 输出报告
当用户输入飞书文档链接时,按以下流程处理:
用户输入飞书链接 → 链接解析 → 获取文档内容 → 文本预处理 → 大模型解析 → 飞书写入 → 输出报告
飞书文档链接识别规则:
https://.feishu.cn/document/...、https://open.feishu.cn/document/...飞书文档内容获取:
# 伪代码示意
def fetch_feishu_document(doc_url: str) -> str:
# 1. 从链接中提取文档 token
import re
match = re.search(r'/document/([a-zA-Z0-9-]+)', doc_url)
doc_token = match.group(1)
# 2. 获取文档内容
token = get_tenant_access_token(APP_ID, APP_SECRET)
# 获取文档基本信息
url = f"https://open.feishu.cn/open-apis/doc/v1/documents/{doc_token}"
response = request("GET", url, headers={"Authorization": f"Bearer {token}"})
# 获取文档块内容
blocks_url = f"https://open.feishu.cn/open-apis/doc/v1/documents/{doc_token}/blocks"
blocks_response = request("GET", blocks_url, headers={"Authorization": f"Bearer {token}"})
# 3. 递归提取所有文本块
text_content = extract_text_from_blocks(blocks_response.json()["data"]["items"])
return text_content
def extract_text_from_blocks(blocks: list) -> str:
"""递归提取文档块中的文本内容"""
text_parts = []
for block in blocks:
block_type = block.get("block_type")
if block_type == "text":
# 纯文本块
text = block.get("text", {}).get("content", "")
text_parts.append(text)
elif block_type == "paragraph":
# 段落块
elements = block.get("paragraph", {}).get("elements", [])
for elem in elements:
if elem.get("type") == "text":
text_parts.append(elem.get("text", {}).get("content", ""))
elif elem.get("type") == "mention":
# @提及
text_parts.append(elem.get("mention", {}).get("name", ""))
elif block_type == "table":
# 表格块
table_cells = block.get("table", {}).get("cells", [])
for row in table_cells:
for cell in row:
text_parts.append(cell.get("text", {}).get("content", ""))
elif block_type == "code":
# 代码块
text_parts.append(block.get("code", {}).get("content", ""))
# 递归处理子块
if "children" in block:
text_parts.append(extract_text_from_blocks(block["children"]))
return "\n".join(text_parts)
飞书文档内容预处理:
def preprocess_feishu_content(raw_text: str, doc_blocks: list) -> str:
"""预处理飞书文档内容"""
# 1. 基础清理
text = raw_text
text = re.sub(r'\n{3,}', '\n\n', text) # 多个换行压缩为两个
text = text.strip()
# 2. 检查是否需要 OCR(图片块)
has_images = any(block.get("block_type") == "image" for block in doc_blocks)
if has_images:
# 下载图片并进行 OCR
ocr_text = ""
for block in doc_blocks:
if block.get("block_type") == "image":
image_token = block.get("image", {}).get("token")
if image_token:
image_content = download_feishu_image(image_token)
ocr_text += "\n" + ocr_image(image_content)
text += "\n[图片内容]\n" + ocr_text
# 3. 处理表格(转换为易读格式)
text = convert_tables_to_text(text, doc_blocks)
return text
Cron触发(每周一10:00) → 扫描目录 → 增量检测 → 处理新增/修改文件 → 更新状态 → 飞书通知
| 文件类型 | 处理方式 |
|---|---|
| ---------- | ---------- |
| 使用 pdfplumber/PyPDF2 提取文本 | |
| Word (.docx) | 使用 python-docx 解析,支持表格 |
| WPS (.wps/.et) | 转换为兼容格式后解析 |
| 图片 | 使用 OCR(Tesseract/云服务)识别 |
| 飞书文档链接 | 调用飞书 API 获取文档内容和块结构 |
将预处理文本传入大模型,按字段定义提取信息。
Prompt 结构:
请从以下简历文本中提取结构化信息,严格按 JSON 格式输出。
【简历文本】
{resume_text}
【输出格式】
{
"姓名": "",
"手机号": "",
"邮箱": "",
"性别": "",
"年龄": null,
"最高学历": "",
"毕业院校": "",
"专业": "",
"工作年限": null,
"当前公司": "",
"当前职位": "",
"过往公司": "",
"期望薪资": "",
"期望城市": "",
"技能标签": [],
"项目经历": "",
"备注": "",
"总体画像": ""
}
【解析规则】
1. 年龄:若未明确标注,根据最早学历入学年份+18推算
2. 毕业院校:若属于985院校添加"(985)",若仅211添加"(211)"
3. 过往公司:除最近一份外的所有公司,用"/"分隔
4. 总体画像:必须按模板生成完整分析
5. 缺失字段:留空或填null,不要编造
# 伪代码示意
def write_to_feishu(record: dict, is_update: bool = False):
token = get_tenant_access_token(APP_ID, APP_SECRET)
if is_update and existing_record_id:
# 更新已有记录
url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE_ID}/records/{record_id}"
method = "PUT"
else:
# 新增记录
url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE_ID}/records"
method = "POST"
response = request(method, url, headers={"Authorization": f"Bearer {token}"}, json={"fields": record})
return response
{
"last_scan": "2026-02-17T10:00:00",
"processed_files": {
"张三_产品经理.pdf": {
"mtime": "2026-02-15T14:30:00",
"status": "success",
"feishu_record_id": "recXXXXXX"
}
}
}
报告格式:
## 简历同步报告 | {datetime}
### 执行统计
| 状态 | 数量 |
|------|------|
| ✅ 成功 | {success_count} |
| ⏭️ 跳过 | {skip_count} |
| ❌ 失败 | {fail_count} |
### 处理详情
{detail_list}
### 失败原因
{failure_reasons}
飞书机器人通知:
{
"msg_type": "interactive",
"card": {
"header": {
"title": {"tag": "plain_text", "content": "📋 简历同步报告"},
"template": "blue"
},
"elements": [
{
"tag": "div",
"text": {"tag": "lark_md", "content": "✅ 成功:{success}\n⏭️ 跳过:{skip}\n❌ 失败:{fail}"}
},
{
"tag": "action",
"actions": [{"tag": "button", "text": {"tag": "plain_text", "content": "查看表格"}, "url": "{table_url}", "type": "primary"}]
}
]
}
}
遇到错误?
│
├─ 文件格式不支持
│ └─ 记录: [SKIP] {filename}: 格式不支持
│ └─ 动作: 继续下一个文件
│
├─ OCR 识别失败/识别率过低
│ └─ 记录: [SKIP] {filename}: OCR识别失败
│ └─ 动作: 继续下一个文件
│
├─ 单个字段解析失败
│ └─ 记录: [WARN] {filename}: {field}字段解析失败
│ └─ 动作: 该字段留空,继续其他字段
│
├─ 飞书 Token 过期
│ └─ 动作: 自动刷新 Token,重试一次
│ └─ 若仍失败: 记录 [FAIL],继续下一个
│
├─ 飞书 API 写入失败
│ └─ 记录: [FAIL] {filename}: API错误 - {error_msg}
│ └─ 动作: 继续下一个文件
│
└─ 监控目录不存在
└─ 记录: [ERROR] 监控目录不存在: {path}
└─ 动作: 发送飞书告警,终止本次扫描
用户输入:
请解析这份简历并同步到飞书表格
[上传文件: 张三_产品经理.pdf]
正确执行(无中断):
正在处理简历文件...
✅ 解析完成,已同步至飞书多维表格
| 字段 | 值 |
|------|-----|
| 姓名 | 张三 |
| 手机号 | 138xxxx8888 |
| 邮箱 | zhangsan@email.com |
| 性别 | 男 |
| 年龄 | 29 |
| 最高学历 | 本科 |
| 毕业院校 | 北京大学 (985) |
| 专业 | 计算机科学 |
| 工作年限 | 6 |
| 当前公司 | 字节跳动 |
| 当前职位 | 高级产品经理 |
| 过往公司 | 腾讯/百度 |
| 期望薪资 | 40-50K |
| 期望城市 | 北京 |
| 技能标签 | 用户增长, 数据分析, B端产品 |
| 项目经历 | 负责XX项目,DAU提升200%... |
| 备注 | 自我评价:6年互联网产品经验... |
| 总体画像 | 这是一位在【互联网】有【6年】经验的【产品经理】专家... |
| 文件来源 | 张三_产品经理.pdf |
📋 执行报告:成功 1 份 | 跳过 0 份 | 失败 0 份
用户输入:
请解析这份飞书文档中的简历并同步到飞书表格
https://.feishu.cn/document/DAqd8Wrnh5NMks3k
正确执行(无中断):
正在获取飞书文档内容...
正在解析简历信息...
✅ 解析完成,已同步至飞书多维表格
| 字段 | 值 |
|------|-----|
| 姓名 | 李四 |
| 手机号 | 139xxxx9999 |
| 邮箱 | li4@example.com |
| 性别 | 女 |
| 年龄 | 28 |
| 最高学历 | 硕士 |
| 毕业院校 | 复旦大学 (985) |
| 专业 | 工商管理 |
| 工作年限 | 5 |
| 当前公司 | 拼多多 |
| 当前职位 | 运营经理 |
| 过往公司 | 京东/阿里 |
| 期望薪资 | 35-45K |
| 期望城市 | 上海 |
| 技能标签 | 用户运营, 数据分析, 电商运营 |
| 项目经历 | 负责XX项目,GMV提升150%... |
| 备注 | 自我评价:5年电商运营经验... |
| 总体画像 | 这是一位在【电商】有【5年】经验的【运营经理】专家... |
| 文件来源 | 飞书文档 (DAqd8Wrnh5NMks3k) |
📋 执行报告:成功 1 份 | 跳过 0 份 | 失败 0 份
禁止行为 1:询问确认
❌ 错误示范:
"我已经解析了简历的基本信息,是否需要我继续生成总体画像?"
"文件较大,是否分批处理?"
"检测到手机号字段为空,是否需要您补充?"
禁止行为 2:请求额外信息
❌ 错误示范:
"请提供飞书表格的链接"(应使用预配置)
"简历中没有年龄信息,请问候选人多大?"(应自动推理或留空)
"这份简历有多段工作经历,您希望如何处理?"(应按预设规则处理)
禁止行为 3:部分执行后停止
❌ 错误示范:
"已完成 10 份简历的解析,剩余 90 份是否继续?"
"第 5 份简历解析失败,是否跳过继续?"(应自动跳过)
用户输入:
批量处理这些简历
[上传 50 个文件]
正确执行(无中断,直接输出最终报告):
正在批量处理 50 份简历...
━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 简历同步报告 | 2026-02-17 10:30
━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 成功:47 份
⏭️ 跳过:2 份
❌ 失败:1 份
【跳过详情】
• 模糊照片.jpg - OCR识别率过低
• 损坏文件.pdf - 文件无法读取
【失败详情】
• 李四_设计师.docx - 飞书API限流,建议稍后重试
🔗 查看飞书表格:[点击打开]
0 10 1(每周一 10:00)state_file 获取已处理文件列表watch_directory 下的所有简历文件state_file本技能支持 Linux、Windows、macOS 三大主流操作系统。以下是各系统的环境配置说明。
Mac 用户推荐使用 Homebrew 进行包管理,安装步骤如下:
第一步:安装 Homebrew(若已安装可跳过)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
第二步:安装 Python 依赖库
# 安装 Python(若系统已自带可跳过)
brew install python@3.11
# 安装核心依赖
pip install pdfplumber python-docx pytesseract requests watchdog openpyxl
第三步:安装 Tesseract OCR(图片识别必需)
# 安装 Tesseract 及中文语言包
brew install tesseract
brew install tesseract-lang
# 验证安装
tesseract --version
安装完成后,需在 Python 代码中指定 Tesseract 路径:
import pytesseract
# Apple Silicon Mac (M1/M2/M3)
pytesseract.pytesseract.tesseract_cmd = '/opt/homebrew/bin/tesseract'
# Intel Mac
# pytesseract.pytesseract.tesseract_cmd = '/usr/local/bin/tesseract'
第四步:安装 LibreOffice(WPS 文件转换可选)
若需要处理 WPS 格式文件,推荐安装 LibreOffice:
brew install --cask libreoffice
转换命令示例:
soffice --headless --convert-to docx "input.wps" --outdir "output/"
第五步:安装浏览器驱动(猎聘网站抓取可选)
若使用浏览器自动化功能抓取招聘网站简历,需要安装 Chrome 和 ChromeDriver:
# 安装 Chrome
brew install --cask google-chrome
# 安装 ChromeDriver(版本需与 Chrome 匹配)
brew install chromedriver
或者使用 Playwright(推荐):
pip install playwright
playwright install chromium
第一步:安装 Python
从官网下载 Python 3.11+:https://www.python.org/downloads/
安装时勾选「Add Python to PATH」选项。
第二步:安装依赖库
pip install pdfplumber python-docx pytesseract requests watchdog openpyxl
第三步:安装 Tesseract OCR
下载 Windows 版本的 Tesseract:https://github.com/UB-Mannheim/tesseract/wiki
安装后配置环境变量,或在代码中指定路径:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
第四步:安装 LibreOffice(可选)
下载 LibreOffice:https://www.libreoffice.org/download/download/
第一步:安装系统依赖
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y python3-pip tesseract-ocr tesseract-ocr-chi-sim libreoffice
# CentOS/RHEL
sudo yum install -y python3-pip tesseract libreoffice
第二步:安装 Python 依赖
pip3 install pdfplumber python-docx pytesseract requests watchdog openpyxl
安装完成后,可通过以下命令验证环境:
# 验证 Python 依赖
python -c "import pdfplumber, docx, pytesseract, requests; print('✅ 依赖库验证通过')"
# 验证 Tesseract
tesseract --version
# 验证 LibreOffice(可选)
soffice --version
| 问题 | 解决方案 |
|---|---|
| ------ | ---------- |
| Tesseract 找不到 | 检查安装路径是否正确添加到系统 PATH |
| 中文识别率低 | 确保安装了 tesseract-lang 中文语言包 |
| WPS 文件解析失败 | 安装 LibreOffice 并确保转换命令可执行 |
| 浏览器驱动版本不匹配 | 使用 Playwright 自动管理驱动版本 |
| 版本 | 日期 | 变更 |
|---|---|---|
| ------ | ------ | ------ |
| 1.1.0 | 2026-03-09 | 新增飞书文档链接输入支持 |
| 1.0.0 | 2026-02-17 | 初始版本:支持手动上传 + 定时监控 |
共 4 个版本