offer-catcher-agent-v2 / replace_tech_block.py
hungryb's picture
v2: agent report + filtered corpus + evidence contract
54b5b64 verified
Raw
History Blame Contribute Delete
4.73 kB
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)
# 找到旧块的结束位置(下一个 st. 或文件末尾)
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())}")