| import pathlib |
|
|
| fp = pathlib.Path(r"D:\Pycharm_workplace\Offer 捕手:基于 LLM Agent 的学生岗位匹配与简历优化系统\app.py") |
| content = fp.read_text(encoding="utf-8") |
|
|
| old_start = ' # ---- 技术选型说明(底部折叠)----' |
| old_end = ' st.markdown("""\n**当前系统没有盲目微调' |
|
|
| idx_start = content.find(old_start) |
| idx_end = content.find(old_end) |
|
|
| if idx_start == -1: |
| print(f"❌ 未找到 old_start,尝试查找相似内容") |
| for marker in ["技术选型说明", "底部折叠", "为什么这样做"]: |
| i = content.find(marker) |
| if i >= 0: |
| print(f" 找到 '{marker}' 位置:{i}") |
| print(f" 上下文:{repr(content[max(0,i-50):i+100])}") |
| exit(1) |
|
|
| if idx_end == -1: |
| print(f"❌ 未找到 old_end") |
| exit(1) |
|
|
| |
| rest_idx = content.find("\n st.", idx_end) |
| if rest_idx == -1: |
| rest_idx = len(content) |
|
|
| old_block = content[idx_start:rest_idx] |
| print(f"✅ 找到旧块,长度:{len(old_block)} 字符") |
| print(f"旧块开头:{repr(old_block[:100])}") |
|
|
| new_block = ''' # ---- 技术选型说明(底部折叠,算法视角)---- |
| with st.expander("📖 技术选型说明(算法视角)", expanded=False): |
| st.markdown(""" |
| **项目定位:基于多 Agent 协作的大模型应用算法系统**(不是商业 HR 工具)。 |
| |
| --- |
| |
| ### 一、多 Agent 如何分工 |
| |
| | Agent | 职责 | LLM 是否参与 | |
| |---|---|---| |
| | Profile Builder | 简历 → 结构化画像 | 可选(理解非结构化文本) | |
| | JD Intelligence | JD → 结构化岗位画像 | 可选(归一化技能表述) | |
| | Opportunity Scout | 关键词/TF-IDF 召回候选池 | 否(保证稳定可解释) | |
| | Application Ranker | 多维度加权公式计算排序 | 否(**排序必须可解释**) | |
| | Gap Diagnosis | 规则检测能力缺口 | 可选(生成可读解释) | |
| | Resume Conversion | 规则约束的简历改写 | 可选(语言优化) | |
| | Strategy Planner | 规则策略 + 自然语言总结 | 可选(总结生成) | |
| |
| **核心设计:LLM 是"可选增强层",非依赖项。无 API Key 时所有 Agent 仍可完整运行。** |
| |
| --- |
| |
| ### 二、为什么排序/决策用可解释公式,而不是黑盒 LLM 打分? |
| |
| 1. **可解释性约束**:面试官/用户需要知道"为什么推荐这个岗位",黑盒 LLM 打分无法回答 |
| 2. **权重可调试**:`ApplyPriority = 0.40×Match + 0.30×Pass - 0.15×Risk + 0.15×Growth`,每个权重都有业务含义 |
| 3. **稳定性**:LLM API 可能抖动,排序公式稳定可复现 |
| 4. **数据效率**:公式不需要标注数据,LLM 微调才需要 |
| |
| --- |
| |
| ### 三、为什么当前不做微调? |
| |
| | 原因 | 说明 | |
| |---|---| |
| | 没有真实标注数据 | 需要"简历 → JD → 初筛结果"的大规模标注,当前没有 | |
| | 没有 HR 评价偏好数据 | PassScore 的核心是"这位 HR 会筛掉哪些简历",需要企业级数据 | |
| | 样本量不足 | 当前 30-80 条岗位数据远不够做可靠微调 | |
| | 硬做容易变成伪实验 | 数据不足时微调,结果不可复现、不可解释 | |
| |
| **正确做法(算法演进路径):** |
| 1. 当前:LLM structured output + 可解释公式 + 小型岗位库验证 |
| 2. 后续若有真实投递反馈:训练 **PassScore 预测模型**(XGBoost/LightGBM 或微调分类器) |
| 3. 后续若有 HR 反馈:做 **简历改写偏好优化**(RLHF 方向) |
| |
| --- |
| |
| ### 四、与已有项目 `llm_for_rec_agent` 的区分 |
| |
| | 项目 | 证明的能力 | |
| |---|---| |
| | `llm_for_rec_agent` | RAG、检索、SFT/DPO、幻觉评估(**技术深度**) | |
| | `Offer 捕手` | 多 Agent 协作、可解释排序、决策闭环(**算法落地能力**) | |
| |
| **一句话区分**:前者证明你会做 RAG/Agent 技术系统;后者证明你能把 Agent 技术做成可解释的决策算法系统。 |
| |
| --- |
| |
| ### 五、未来演进方向 |
| |
| ``` |
| 当前(Demo 验证,算法框架搭建) |
| → 接入校招官网 JD(扩大岗位库,提升召回覆盖率) |
| → 接入学生投递反馈(优化 ApplyPriority 权重,数据驱动) |
| → 训练 PassScore 预测模型(XGBoost/LightGBM 或微调分类器) |
| → 简历改写偏好优化(获得 HR 反馈后做 RLHF 方向) |
| ``` |
| |
| **商业闭环是落地价值补充,不是主线。** 主叙事仍然是"基于多 Agent 协作的大模型应用算法系统"。 |
| """) |
| |
| ''' |
|
|
| new_content = content[:idx_start] + new_block + content[rest_idx:] |
| fp.write_text(new_content, encoding="utf-8") |
| print(f"✅ 替换完成!旧块长度:{len(old_block)},新块长度:{len(new_block)}") |
| print(f"文件总行数:{len(new_content.splitlines())}") |
|
|