| """ |
| test_online_workflow.py — 用真实 LLM API 跑完 9 个 Agent |
| """ |
| import sys, os, time |
|
|
| |
| ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| sys.path.insert(0, ROOT) |
| sys.path.insert(0, os.path.join(ROOT, "src")) |
|
|
| from langgraph_workflow import run_online_demo |
|
|
| SAMPLE_RESUME = """ |
| 张三 | 大模型应用算法工程师 |
| 电话:13800000000 | 邮箱:zhangsan@email.com |
| |
| 教育背景 |
| 2022.09 - 2026.06 XX大学 计算机科学与技术 本科 |
| |
| 实习经历 |
| 2025.06 - 2025.12 YY科技 算法实习生 |
| - 参与大模型微调项目,使用 LoRA 对 Qwen2.5-7B 进行 SFT |
| - 使用 RAG 技术构建企业知识库问答系统(FAISS + Sentence Transformers) |
| - 开发 Semantic Scholar 论文检索工具,支持 200+ 并发查询 |
| |
| 项目经历 |
| 2024.09 - 2025.06 Offer捕手 — 智能求职匹配系统 |
| - 构建基于 Sentence Transformers 的语义匹配引擎,NDCG@10=0.87 |
| - 设计多 Agent 决策流水线(9个 Agent 协作) |
| - 部署 HuggingFace Space 公网 Demo |
| |
| 技能 |
| Python, PyTorch, Transformers, LangChain, FAISS, Sentence Transformers |
| """ |
|
|
| print("=" * 60) |
| print("🚀 开始在线模式测试(真实 LLM API)") |
| print("=" * 60) |
|
|
| t0 = time.time() |
| try: |
| state = run_online_demo(SAMPLE_RESUME, goal="找大模型应用算法相关实习") |
| except Exception as e: |
| print(f"❌ 工作流执行失败: {e}") |
| import traceback; traceback.print_exc() |
| sys.exit(1) |
|
|
| elapsed = time.time() - t0 |
| print(f"\n✅ 工作流执行完毕,耗时 {elapsed:.1f}s") |
| print("=" * 60) |
|
|
| |
| print("\n📋 Agent 执行结果:\n") |
|
|
| |
| intent = state.intent |
| print(f"1️⃣ CareerIntent → 方向:{intent.direction} 阶段:{intent.stage} 城市:{intent.target_cities} 风险:{intent.risk_preference}") |
| if intent.reasoning: |
| print(f" 理由: {intent.reasoning[:80]}") |
|
|
| |
| print(f"\n2️⃣ JobScout → 找到 {len(state.jds)} 个岗位") |
| for i, jd in enumerate(state.jds[:3]): |
| print(f" [{i+1}] {jd.title} @ {jd.company} {jd.city}") |
|
|
| |
| print(f"\n3️⃣ JDAnalyst → 分析了 {len(state.jds)} 个 JD") |
| if state.jds and state.jds[0].hard_skills: |
| print(f" 样例技能: {state.jds[0].hard_skills[:5]}") |
|
|
| |
| ev = state.resume_evidence |
| print(f"\n4️⃣ ResumeEvidence → 技能证据:{len(ev.skill_evidence)} 缺口:{len(ev.gap_areas)}") |
| for sk in list(ev.skill_evidence.keys())[:3]: |
| evidence_list = ev.skill_evidence[sk] |
| evidence_str = evidence_list[0] if evidence_list else "" |
| print(f" ✅ {sk} (证据: {evidence_str[:50]}...)") |
| for gap in ev.gap_areas[:2]: |
| print(f" ⚠️ 缺口: {gap}") |
|
|
| |
| print(f"\n5️⃣ MatchReasoning → 匹配了 {len(state.match_results)} 个岗位") |
| for r in state.match_results[:3]: |
| print(f" [{r.title}] {r.company} 分数:{r.match_score:.1f} 动作:{r.apply_action}") |
| if r.evidence_based_reasoning: |
| print(f" 理由: {r.evidence_based_reasoning[:80]}...") |
|
|
| |
| cf = state.counterfactual |
| print(f"\n6️⃣ CounterfactualPlanning → {len(cf.top3_payoffs)} 个补强建议") |
| for p in cf.top3_payoffs: |
| print(f" 补强: {p.get('action','?')} 分数提升:+{p.get('match_gain','?')} 天数:{p.get('effort_days','?')} 原因:{p.get('why','')}") |
|
|
| |
| coach = state.coach |
| print(f"\n7️⃣ ResumeCoach → 可改写:{len(coach.can_rewrite)} 需先补:{len(coach.need_project_first)} 勿造假:{len(coach.dont_fabricate)}") |
| for item in coach.can_rewrite[:2]: |
| print(f" ✏️ 可改写: {item}") |
| for item in coach.need_project_first[:2]: |
| print(f" 🔧 需先补: {item}") |
|
|
| |
| interview = state.interview_prep |
| print(f"\n8️⃣ InterviewCoach → {len(interview.likely_questions)} 个问题 {len(interview.prep_plan_7day)}天计划") |
| for q in interview.likely_questions[:3]: |
| print(f" Q: {q}") |
| print(f" 复习重点: {interview.focus_areas[:3]}") |
|
|
| |
| strategy = state.strategy |
| print(f"\n9️⃣ StrategyPlanner → 稳投:{len(strategy.safe_jobs)} 冲刺:{len(strategy.stretch_jobs)} 跳过:{len(strategy.skip_jobs)}") |
| for s in strategy.safe_jobs[:2]: |
| print(f" ✅ 稳投: {s.title} @ {s.company}") |
| for s in strategy.stretch_jobs[:2]: |
| print(f" 🚀 冲刺: {s.title} @ {s.company}") |
|
|
| print("\n" + "=" * 60) |
| print("🎉 全部 9 个 Agent 执行成功!") |
| print("=" * 60) |
|
|
| |
| print("\n📋 Agent Trace:") |
| for line in state.agent_trace: |
| print(f" {line}") |
|
|