@elevo-ai/create-plugin 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,946 @@
1
+ ---
2
+ description: 对比多位候选人的综合能力和匹配度,提供AI驱动的深度分析
3
+ argument-hint: workspace_id, candidate_ids, job_id (可选), candidate_data (可选), job_data (可选)
4
+ allowed-tools: mcp__elevo-platform__read_object_instance, mcp__elevo-platform__list_object_instances
5
+ category: recruitment
6
+ ---
7
+
8
+ # 候选人对比命令
9
+
10
+ ## 功能说明
11
+
12
+ 对比 2-3 位候选人的技术能力、软技能、薪资期望和综合匹配度,提供结构化的对比分析和招聘建议。支持多轮对话,用户可以追问细节或请求更深入的分析。
13
+
14
+ **输出格式**:严格的 Markdown 表格 + 分析文本,便于前端解析和渲染
15
+
16
+ ## 命令参数
17
+
18
+ ### 必填参数
19
+
20
+ - **workspace_id** (string): Workspace ID
21
+ - **candidate_ids** (string): 候选人 ID 列表,逗号分隔(如 `"cand-1,cand-2"` 或 `"cand-1,cand-2,cand-3"`)
22
+
23
+ ### 可选参数
24
+
25
+ - **job_id** (string): 职位 ID(如缺失,从第一个候选人的 job_id 推断)
26
+
27
+ ### 性能优化参数(前端可选传入,避免重复查询)
28
+
29
+ 前端可直接传入完整实例数据,命令将优先使用这些数据,避免重复 MCP 查询:
30
+
31
+ - **candidate_data** (array): 候选人实例数组 JSON
32
+ - **job_data** (object): 职位实例 JSON
33
+
34
+ **格式示例:**
35
+ ```json
36
+ {
37
+ "candidate_data": [
38
+ {
39
+ "id": "cand-123",
40
+ "name": "张三",
41
+ "resume_content": "...",
42
+ "candidate_highlight": { "work_years": "5年", ... },
43
+ "expected_salary": 350000,
44
+ "current_salary": 280000,
45
+ "job_id": "job-456"
46
+ },
47
+ {
48
+ "id": "cand-124",
49
+ "name": "李四",
50
+ ...
51
+ }
52
+ ],
53
+ "job_data": {
54
+ "id": "job-456",
55
+ "title": "高级后端开发",
56
+ "skill_requirements": "...",
57
+ "salary_range": "30-50万"
58
+ }
59
+ }
60
+ ```
61
+
62
+ ## 执行流程
63
+
64
+ **📝 关于代码示例:** 本文档中的 JavaScript 代码仅为**伪代码示例**,用于说明逻辑流程。实际执行时,Claude AI 会理解这些逻辑并调用相应的 MCP 工具(如 `mcp__elevo-platform__read_object_instance`),无需真实的 JavaScript 运行环境。
65
+
66
+ ### 第 1 步:验证输入参数
67
+
68
+ #### 1.1 验证候选人数量
69
+
70
+ ```javascript
71
+ const candidateIds = candidate_ids.split(',').map(id => id.trim());
72
+
73
+ if (candidateIds.length < 2 || candidateIds.length > 3) {
74
+ return "❌ 候选人数量必须为 2-3 人,当前提供了 " + candidateIds.length + " 人";
75
+ }
76
+ ```
77
+
78
+ #### 1.2 验证参数完整性
79
+
80
+ **情况 1:前端传入了 candidate_data**
81
+ - 直接使用,跳到步骤 1.3
82
+
83
+ **情况 2:只提供了 candidate_ids**
84
+ - 需要查询候选人数据(步骤 2)
85
+
86
+ 如果 `candidate_ids` 为空或格式错误,返回错误:
87
+ ```
88
+ ❌ 缺少候选人 ID 列表,请提供 candidate_ids 参数(格式:cand-1,cand-2)
89
+ ```
90
+
91
+ #### 1.3 提取职位 ID(如未提供)
92
+
93
+ **优先级:**
94
+ 1. 参数 `job_id`(如果提供)
95
+ 2. `candidate_data[0].job_id`(如果提供了候选人数据)
96
+ 3. 查询第一个候选人的 `job_id` 字段
97
+
98
+ **注意**:前端通过职位候选人列表发起对比时,所有候选人已保证来自同一职位,无需额外验证。
99
+
100
+ ### 第 2 步:获取候选人数据
101
+
102
+ #### 2.1 优先使用传入的 candidate_data
103
+
104
+ 如果 `candidate_data` 参数存在且数组长度与 `candidate_ids` 匹配,直接使用:
105
+ - 跳到步骤 2.3
106
+
107
+ #### 2.2 查询候选人实例
108
+
109
+ 对每个候选人 ID 执行查询:
110
+
111
+ ```javascript
112
+ for (const candidateId of candidateIds) {
113
+ const candidate = await mcp__elevo-platform__read_object_instance({
114
+ workspace_id: workspace_id,
115
+ object_type: "candidate",
116
+ instance_id: candidateId
117
+ });
118
+
119
+ if (!candidate) {
120
+ return `❌ 候选人 ${candidateId} 不存在`;
121
+ }
122
+
123
+ candidates.push(candidate);
124
+ }
125
+ ```
126
+
127
+ **提取必要字段:**
128
+ - `id` - 候选人 ID
129
+ - `name` - 姓名
130
+ - `job_id` - 职位 ID
131
+ - `resume_content` - 简历内容(用于技术评估)
132
+ - `candidate_highlight` - 候选人亮点(如有)
133
+ - `work_years` - 工作年限
134
+ - `education` - 学历背景
135
+ - `company_background` - 公司背景
136
+ - `special_skills` - 特殊技能
137
+ - `expected_salary` - 期望薪资
138
+ - `current_salary` - 当前薪资
139
+ - `classification` - 筛选分类(初筛/待安排/面试中/已淘汰/已录用)
140
+ - `screening_score` - 筛选评分(如有)
141
+ - `screening_notes` - 筛选备注(如有)
142
+
143
+ #### 2.3 验证数据完整性
144
+
145
+ 确保所有候选人数据包含关键字段:
146
+ - 如果缺少 `name` 或 `resume_content`,返回警告但继续执行
147
+ - 如果缺少 `job_id` 且未提供 `job_id` 参数,返回错误
148
+
149
+ ### 第 3 步:获取职位数据
150
+
151
+ #### 3.1 优先使用传入的 job_data
152
+
153
+ 如果 `job_data` 参数存在,直接使用:
154
+ - 跳到步骤 4
155
+
156
+ #### 3.2 查询职位实例
157
+
158
+ 使用步骤 1.3 确定的 `job_id`:
159
+
160
+ ```javascript
161
+ const job = await mcp__elevo-platform__read_object_instance({
162
+ workspace_id: workspace_id,
163
+ object_type: "job",
164
+ instance_id: job_id
165
+ });
166
+
167
+ if (!job) {
168
+ return `❌ 职位 ${job_id} 不存在`;
169
+ }
170
+ ```
171
+
172
+ **提取必要字段:**
173
+ - `id` - 职位 ID
174
+ - `title` - 职位名称
175
+ - `skill_requirements` - 技能要求(必需,用于匹配度评估)
176
+ - `salary_range` - 薪资范围
177
+ - `job_scope` - 工作范围/职责
178
+ - `level` - 职级(如 P6、P7)
179
+ - `department` - 部门
180
+
181
+ ### 第 4 步:执行对比分析(核心逻辑)
182
+
183
+ **分析维度:**
184
+
185
+ **重要:使用动态维度配置!**
186
+
187
+ 对比分析的维度**必须来自** `job.screening_weights` 配置(而非硬编码)。每个职位可配置 2-8 个自定义维度。
188
+
189
+ **screening_weights 格式:**
190
+ ```json
191
+ [
192
+ {"name": "技术能力", "weight": 40},
193
+ {"name": "工作经验", "weight": 30},
194
+ {"name": "教育背景", "weight": 20},
195
+ {"name": "薪资匹配度", "weight": 10}
196
+ ]
197
+ ```
198
+
199
+ **评分流程:**
200
+
201
+ 1. **读取 job.screening_weights** - 获取维度列表和权重
202
+ 2. **对每个维度评分** - 基于简历内容和职位要求,给每个候选人在该维度打分(1-5分)
203
+ 3. **计算综合匹配度** - 使用配置的权重进行加权平均
204
+
205
+ #### 4.1 动态维度评分
206
+
207
+ 对于每个配置的维度,评估候选人表现:
208
+
209
+ **常见维度评分指南:**
210
+
211
+ **技术能力(如果配置):**
212
+ - 基于简历内容(`resume_content`)和职位要求(`skill_requirements`),评估:
213
+ - **核心技术栈匹配度**(如:Java、Python、React 等)
214
+ - **项目经验相关性**(是否有类似业务经验)
215
+ - **技术深度**(是否有深度优化、架构设计经验)
216
+
217
+ **工作经验(如果配置):**
218
+ - 基于候选人亮点(`candidate_highlight`)和简历内容,评估:
219
+ - **工作年限**(是否符合职位要求的经验范围)
220
+ - **公司背景**(是否来自知名公司或相关行业)
221
+ - **职业轨迹**(是否有持续成长的轨迹)
222
+
223
+ **教育背景(如果配置):**
224
+ - 基于 `candidate_highlight.education` 和简历内容,评估:
225
+ - **学历层次**(本科/硕士/博士)
226
+ - **院校层次**(985/211/普通本科)
227
+ - **专业相关性**(计算机相关/理工科/其他)
228
+
229
+ **薪资匹配度(如果配置):**
230
+ - 基于候选人薪资数据和职位薪资范围,计算:
231
+ - **期望薪资** (`expected_salary`)
232
+ - **涨幅预期** = (`expected_salary` - `current_salary`) / `current_salary` × 100%
233
+ - **职位薪资范围** (`salary_range`)
234
+ - **性价比评估**(期望薪资是否在合理范围内)
235
+
236
+ **其他自定义维度:**
237
+ - 根据维度名称灵活评估,从简历内容中提取相关证据
238
+ - 评分标准:1-5 分(1=不符合,5=完全符合)
239
+
240
+ #### 4.2 综合匹配度评估
241
+
242
+ 基于配置的维度和权重,计算综合评分:
243
+
244
+ ```javascript
245
+ // 权重总和为 100,转换为小数
246
+ const weights = job.screening_weights.map(w => ({
247
+ name: w.name,
248
+ weight: w.weight / 100 // 40 → 0.4
249
+ }));
250
+
251
+ // 加权平均
252
+ 综合匹配度 = Σ (维度得分 × 维度权重)
253
+ ```
254
+
255
+ **示例计算:**
256
+ ```
257
+ 假设配置:
258
+ [
259
+ {"name": "技术能力", "weight": 40}, // 0.4
260
+ {"name": "工作经验", "weight": 30}, // 0.3
261
+ {"name": "教育背景", "weight": 20}, // 0.2
262
+ {"name": "薪资匹配度", "weight": 10} // 0.1
263
+ ]
264
+
265
+ 候选人A得分:
266
+ 技术能力 4.5 × 0.4 = 1.8
267
+ 工作经验 4.0 × 0.3 = 1.2
268
+ 教育背景 3.0 × 0.2 = 0.6
269
+ 薪资匹配度 4.0 × 0.1 = 0.4
270
+ ------------------------------
271
+ 综合匹配度 = 4.0
272
+ ```
273
+
274
+ **匹配度等级:**
275
+ - 4.5-5.0:⭐️⭐️⭐️⭐️⭐️ 强烈推荐
276
+ - 4.0-4.4:⭐️⭐️⭐️⭐️ 推荐
277
+ - 3.5-3.9:⭐️⭐️⭐️ 可考虑
278
+ - 3.0-3.4:⭐️⭐️ 需谨慎
279
+ - <3.0:⭐️ 不推荐
280
+
281
+ **重要:招聘建议原则**
282
+ - 推荐建议必须基于候选人的实际情况进行分析,不要机械套用评分等级
283
+ - 避免千篇一律的"强烈推荐"或"不推荐",应该结合具体优势、风险和业务需求给出中肯建议
284
+ - 例如:即使综合评分达到 4.5 分,如果存在关键技能缺失或薪资严重超预算,也应该提示风险
285
+ - 例如:即使综合评分只有 3.5 分,如果候选人在某个关键维度特别突出且符合特定需求,也可以考虑推荐
286
+
287
+ ### 第 5 步:生成结构化输出
288
+
289
+ **重要:输出必须严格遵循以下 Markdown 格式,便于前端解析!**
290
+
291
+ **输出长度限制:**
292
+ - **初始对比分析**应保持简洁,只输出:
293
+ 1. 📋 候选人概览表格(必须)
294
+ 2. 📈 关键指标对比表格(必须)
295
+ 3. 💡 候选人亮点与风险(必须,每人2-3个亮点+1-2个风险)
296
+ 4. 简短的对比总结(100-150字,突出核心差异和关键建议)
297
+ 5. 追问建议(3-5个问题示例)
298
+ - **避免在初始输出中包含冗长的详细分析**(如第5.5节和5.6节的完整内容)
299
+ - 详细分析仅在用户追问特定问题时提供(参见第6步:支持多轮对话)
300
+
301
+ #### 5.1 候选人概览表格
302
+
303
+ ```markdown
304
+ ## 📋 候选人概览
305
+
306
+ | 维度 | 候选人A姓名 | 候选人B姓名 | 候选人C姓名(如有)|
307
+ |------|------------|------------|-------------------|
308
+ | 🆔 ID | cand-123 | cand-124 | cand-125 |
309
+ | 🎓 学历背景 | 本科·软件工程·广东外语外贸大学 | 硕士·计算机科学·北京大学 | 本科·通信工程·西安电子科技大学 |
310
+ | 💼 工作年限 | 5年 | 3年 | 7年 |
311
+ | 🏢 公司背景 | 腾讯、字节跳动 | 阿里巴巴 | 华为、小米 |
312
+ | 💰 当前薪资 | 28万 | 22万 | 35万 |
313
+ | 🎯 期望薪资 | 35万 | 28万 | 42万 |
314
+ | 📈 涨幅预期 | 25% | 27% | 20% |
315
+ ```
316
+
317
+ **格式要求:**
318
+ - 表格必须使用标准 Markdown 格式(`|` 分隔)
319
+ - 第一列是维度名称(固定顺序)
320
+ - 后续列是候选人数据(按 candidate_ids 顺序)
321
+ - Emoji 使用一致(🆔🎓💼🏢💰🎯📈)
322
+ - 数字格式化:薪资加"万"后缀,涨幅加"%"后缀
323
+ - **学历背景必须包含完整学校名称**,格式:"学历·专业·学校全称"(如:"本科·软件工程·广东外语外贸大学")
324
+ - **重要:表格单元格内容必须是纯文本,禁止包含任何 markdown 或 HTML 特殊字符**
325
+ - ❌ 禁止:`<br>`、`<div>`、`**粗体**`、`*斜体*`、`[链接]()`
326
+ - ✅ 正确:使用全角空格或顿号分隔多行内容,例如:"本科·计算机科学 西安石油大学"
327
+ - ✅ 正确:使用简短描述,避免换行,例如:"本科·计算机"
328
+
329
+ #### 5.2 关键指标对比表格
330
+
331
+ **重要:表格行数和维度名称必须与 `job.screening_weights` 配置一致!**
332
+
333
+ ```markdown
334
+ ## 📈 关键指标对比
335
+
336
+ | 评估维度 | 候选人A姓名 | 候选人B姓名 | 候选人C姓名(如有)|
337
+ |----------|------------|------------|-------------------|
338
+ | {维度1名称} | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️⭐️ (4.5) |
339
+ | {维度2名称} | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️ (3.5) | ⭐️⭐️⭐️⭐️⭐️ (5.0) |
340
+ | {维度3名称} | ⭐️⭐️⭐️ (3.0) | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️ (3.5) |
341
+ | ... | ... | ... | ... |
342
+ | 🎯 综合匹配度 | ⭐️⭐️⭐️⭐️ (4.3) | ⭐️⭐️⭐️⭐️ (4.1) | ⭐️⭐️⭐️⭐️ (4.0) |
343
+ ```
344
+
345
+ **示例(4个维度):**
346
+ ```markdown
347
+ ## 📈 关键指标对比
348
+
349
+ | 评估维度 | 候选人A姓名 | 候选人B姓名 | 候选人C姓名(如有)|
350
+ |----------|------------|------------|-------------------|
351
+ | 技术能力 | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️⭐️ (4.5) |
352
+ | 工作经验 | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️ (3.5) | ⭐️⭐️⭐️⭐️⭐️ (5.0) |
353
+ | 教育背景 | ⭐️⭐️⭐️ (3.0) | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️ (3.5) |
354
+ | 薪资匹配度 | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️ (3.0) |
355
+ | 🎯 综合匹配度 | ⭐️⭐️⭐️⭐️ (4.3) | ⭐️⭐️⭐️⭐️ (4.1) | ⭐️⭐️⭐️⭐️ (4.0) |
356
+ ```
357
+
358
+ **示例(6个维度):**
359
+ ```markdown
360
+ ## 📈 关键指标对比
361
+
362
+ | 评估维度 | 候选人A姓名 | 候选人B姓名 | 候选人C姓名(如有)|
363
+ |----------|------------|------------|-------------------|
364
+ | 技术能力 | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️⭐️ (4.5) |
365
+ | 工作经验 | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️ (3.5) | ⭐️⭐️⭐️⭐️⭐️ (5.0) |
366
+ | 教育背景 | ⭐️⭐️⭐️ (3.0) | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️ (3.5) |
367
+ | 薪资匹配度 | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️ (3.0) |
368
+ | 团队协作 | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️ (3.5) |
369
+ | 创新能力 | ⭐️⭐️⭐️⭐️⭐️ (5.0) | ⭐️⭐️⭐️ (3.0) | ⭐️⭐️⭐️⭐️ (4.0) |
370
+ | 🎯 综合匹配度 | ⭐️⭐️⭐️⭐️ (4.3) | ⭐️⭐️⭐️⭐️ (4.0) | ⭐️⭐️⭐️⭐️ (4.1) |
371
+ ```
372
+
373
+ **格式要求:**
374
+ - 表格行数 = 维度数量 + 1(综合匹配度)
375
+ - 维度名称必须与 `job.screening_weights` 配置完全一致
376
+ - **维度名称禁止使用 Emoji 图标**(如 🔧 💼 🎓 等),必须使用纯文本维度名
377
+ - 综合匹配度固定使用 🎯 图标(这是唯一允许的 Emoji)
378
+ - 评分使用星级(⭐️)+ 数字分数(括号内)
379
+ - 星级数量根据评分四舍五入(4.3 → 4颗星)
380
+ - 分数保留一位小数
381
+ - **重要:表格单元格内容必须是纯文本,禁止包含 markdown 或 HTML 特殊字符**
382
+
383
+ #### 5.3 候选人卡片信息(初始输出必须)
384
+
385
+ **重要:独立评估 vs 横向对比的区分**
386
+ - **核心亮点和潜在风险**:必须基于候选人自身的**客观独立评估**,不受排名影响。即使候选人排名靠后,只要客观上有优势就必须写出来。
387
+ - **推荐总结**:可以包含**横向对比**,如"相比其他候选人技术栈匹配度最高"、"三位候选人中经验最丰富"等相对评价。
388
+
389
+ **为每个候选人提供核心亮点、潜在风险和推荐总结,用于前端卡片展示:**
390
+
391
+ ```markdown
392
+ ## 💡 候选人亮点与风险
393
+
394
+ ### 候选人A姓名
395
+
396
+ **核心亮点:**
397
+ - [亮点1:具体的技术优势或项目经验]
398
+ - [亮点2:相对其他候选人的明显优势]
399
+
400
+ **潜在风险:**
401
+ - [风险1:具体的不足或风险点]
402
+
403
+ **推荐总结:**
404
+ [一句话总结(50-80字),包含:核心优势、主要风险、是否推荐及理由]
405
+ 示例:"技术栈完美匹配,有真实30,000+ QPS高并发经验,ACM-CCPC银奖,可立即上手"
406
+ 示例:"分布式系统能力强,但需技术栈转型(Go→Java),需3-6个月适应期"
407
+
408
+ ### 候选人B姓名
409
+
410
+ **核心亮点:**
411
+ - [如果没有明显亮点,写:暂无突出亮点]
412
+
413
+ **潜在风险:**
414
+ - [风险1:具体的不足或风险点]
415
+
416
+ **推荐总结:**
417
+ [一句话总结,必须包含优势和风险的平衡分析]
418
+
419
+ ### 候选人C姓名(如有)
420
+
421
+ [同样格式]
422
+ ```
423
+
424
+ **核心亮点要求(非常重要):**
425
+ - **客观独立评估原则**:亮点必须基于候选人自身的客观能力和经历,**不受排名影响**
426
+ - **每个候选人都要独立评估**:即使排名靠后,只要客观上有优势就必须写出来,不能因为排名低就写"暂无突出亮点"
427
+ - **具体性原则**:给出具体的技能、项目、公司名称、数据或成就,避免空泛描述
428
+ - **数量限制**:2-3个亮点(如果确实有),最多不超过3个
429
+ - **真实性原则**:只写客观存在的亮点,**禁止编造亮点**
430
+ - **"暂无突出亮点"的使用场景**:仅当候选人确实没有任何技术优势、项目经验、公司背景等客观亮点时才使用(极少数情况)
431
+ - **示例:**
432
+ - ✅ 好的亮点:"有3年微服务架构经验,负责过日活百万级系统"(客观描述,不依赖排名)
433
+ - ✅ 好的亮点:"来自字节跳动,参与过抖音推荐系统优化,QPS达10万+"(具体数据)
434
+ - ✅ 好的亮点:"ACM-ICPC区域赛金奖,算法能力扎实"(客观成就)
435
+ - ❌ 差的亮点:"熟悉Java开发"(太空泛,几乎所有Java开发都符合)
436
+ - ❌ 差的亮点:"工作态度好"(主观且无法验证)
437
+ - ❌ 错误用法:"暂无突出亮点"(仅因为排名靠后,实际上候选人有3年大厂经验)
438
+
439
+ **潜在风险要求:**
440
+ - **客观独立评估原则**:风险必须基于候选人自身情况的客观评估,**不受排名影响**
441
+ - **每个候选人都要独立评估**:即使排名靠前,只要客观上存在风险就必须指出
442
+ - **具体性原则**:指出具体的不足或风险,不要使用模糊表述
443
+ - **真实性原则**:基于简历和职位要求的真实分析,**禁止主观臆测**
444
+ - **数量限制**:1-2个主要风险,最多不超过2个
445
+ - **示例:**
446
+ - ✅ 好的风险:"期望薪资42万超出职位预算上限35万"(客观事实)
447
+ - ✅ 好的风险:"缺少职位要求的Go语言经验,主要技术栈为Java"(具体技能缺口)
448
+ - ✅ 好的风险:"工作年限仅1年,职位要求3年以上"(客观差距)
449
+ - ❌ 差的风险:"可能不够努力"(主观臆测)
450
+ - ❌ 差的风险:"稳定性存疑"(无具体依据)
451
+
452
+ **推荐总结要求(新增,非常重要):**
453
+ - **长度限制**:50-80字,一句话
454
+ - **必须包含**:核心优势 + 主要风险/不足 + 推荐结论
455
+ - **可以包含横向对比**:这部分可以引入与其他候选人的对比话术,如"相比其他候选人"、"技术栈匹配度最高"等
456
+ - **平衡性原则**:不能只写优势或只写风险,要综合评估
457
+ - **具体性原则**:给出具体的技术、经验、数字等,避免空泛
458
+ - **示例:**
459
+ - ✅ 好的总结:"技术栈完美匹配,有真实30,000+ QPS高并发经验,ACM-CCPC银奖,三位候选人中技术能力最强,强烈推荐"(包含横向对比)
460
+ - ✅ 好的总结:"有3年大厂经验,但主要技术栈为Go语言,与职位要求的Java不匹配,需3-6个月转型期"(客观分析,不含对比)
461
+ - ✅ 好的总结:"虽然工作年限较短,但来自阿里巴巴且薪资性价比高,适合预算有限的团队"(包含横向对比)
462
+ - ❌ 差的总结:"候选人很优秀,推荐录用"(太空泛,没有具体信息)
463
+ - ❌ 差的总结:"有一定经验,可以考虑"(没有说明优势和风险)
464
+
465
+ #### 5.4 简短的对比总结(初始输出必须)
466
+
467
+ **在初始对比分析中,必须提供一个简短的总结(100-150字),替代详细分析:**
468
+
469
+ ```markdown
470
+ ## 📝 对比总结
471
+
472
+ [100-150字的简洁总结,包括:]
473
+ - 三位候选人的核心差异(1-2句话)
474
+ - 各自最突出的优势(简要)
475
+ - 主要风险点(简要)
476
+ - 总体推荐倾向(基于实际情况,避免机械套用评级)
477
+
478
+ 💬 **如需了解更多?** 您可以继续提问:
479
+ - "能否详细对比候选人A和B的技术能力?"
480
+ - "候选人C的薪资能否谈到XX万以内?"
481
+ - "能否详细分析候选人B的优势和不足?"
482
+ ```
483
+
484
+ **示例:**
485
+ ```markdown
486
+ ## 📝 对比总结
487
+
488
+ 从综合评分看,候选人A(4.3分)在技术能力和性价比上表现突出,项目经验与职位高度匹配;候选人B(4.1分)学历背景优秀且薪资期望合理,但工作年限偏短;候选人C(4.0分)经验最丰富,但期望薪资较高。建议优先考虑候选人A,如看重学历可选候选人B,如需资深经验可考虑候选人C但需薪资谈判。
489
+
490
+ 💬 **如需了解更多?** 您可以继续提问:
491
+ - "能否详细对比候选人A和B的技术能力?"
492
+ - "候选人C的薪资能否谈到40万以内?"
493
+ - "能否详细分析候选人B的优势和不足?"
494
+ ```
495
+
496
+ ---
497
+
498
+ #### 5.5 详细分析文本(仅在多轮对话追问时提供)
499
+
500
+ **注意:以下详细分析内容不应在初始对比中输出,仅在用户追问时提供!**
501
+
502
+ 当用户追问如"能否详细分析候选人X的优势和不足?"时,可以提供如下格式的详细分析:
503
+
504
+ ```markdown
505
+ ## 🔍 详细分析
506
+
507
+ ### 候选人A姓名 - 综合评分 4.3/5.0
508
+
509
+ **核心优势:**
510
+ - 技术能力突出,在XX领域有深入经验
511
+ - 项目经验与职位高度匹配
512
+ - 薪资期望合理,性价比高
513
+
514
+ **潜在风险:**
515
+ - 学历背景相对较弱
516
+ - 可能需要额外关注XX方面的能力
517
+
518
+ **招聘建议:** [根据实际情况给出中肯建议,避免机械使用"强烈推荐"或"不推荐"]
519
+
520
+ ---
521
+
522
+ [候选人C 同样格式]
523
+ ```
524
+
525
+ **内容要求:**
526
+ - 每个候选人包含:核心优势(2-4点)、潜在风险(1-3点)、招聘建议(基于实际情况)
527
+ - 招聘建议必须结合候选人的具体情况,不要千篇一律地使用"强烈推荐"或"不推荐"
528
+ - 使用简洁的列表格式
529
+ - 避免空泛的描述,给出具体的技能/项目/公司名称
530
+ - 候选人之间用 `---` 分隔
531
+
532
+ ---
533
+
534
+ #### 5.6 综合推荐(仅在多轮对话追问时提供)
535
+
536
+ **注意:以下综合推荐内容不应在初始对比中输出,仅在用户追问时提供!**
537
+
538
+ 当用户追问如"你推荐哪个候选人?"或"能否给出综合推荐?"时,可以提供如下格式:
539
+
540
+ ```markdown
541
+ ## 🏆 综合推荐
542
+
543
+ **推荐排序:**
544
+ 1. **候选人A姓名** (4.3分) - 技术能力和性价比最优,强烈推荐优先录用
545
+ 2. **候选人B姓名** (4.1分) - 综合素质好,可作为备选
546
+ 3. **候选人C姓名** (4.0分) - 薪资偏高,建议谨慎考虑
547
+
548
+ **关键决策因素:**
549
+ - 如果预算充足,优先选择候选人A(技术能力最强)
550
+ - 如果看重学历背景,候选人B更合适
551
+ - 如果需要资深经验,候选人C是最佳选择
552
+
553
+ **下一步建议:**
554
+ 1. 与候选人A深入沟通薪资和入职时间
555
+ 2. 安排候选人B和候选人A的对比面试
556
+ 3. 对候选人C进行薪资谈判,争取降低期望薪资
557
+
558
+ ---
559
+
560
+ 💬 **有任何疑问?** 您可以继续提问,例如:
561
+ - "能否详细对比候选人A和B的技术能力?"
562
+ - "候选人C的薪资能否谈到40万以内?"
563
+ - "如果只能录用一个人,你推荐谁?"
564
+ ```
565
+
566
+ **内容要求:**
567
+ - 推荐排序必须按综合匹配度从高到低
568
+ - 推荐理由应基于候选人的实际情况,不要机械套用"强烈推荐优先录用"等固定用语
569
+ - 关键决策因素列举 2-3 个场景
570
+ - 下一步建议给出 3-5 个可执行的行动项
571
+ - 结尾提示用户可以继续提问(支持多轮对话)
572
+
573
+ ### 第 6 步:支持多轮对话
574
+
575
+ 用户可能继续提问,常见问题类型:
576
+
577
+ #### 6.1 深入对比特定维度
578
+
579
+ 用户:*"能否详细对比候选人A和B的技术栈?"*
580
+
581
+ 回复示例:
582
+ ```markdown
583
+ ## 🔧 候选人A vs 候选人B - 技术栈详细对比
584
+
585
+ ### 后端技术
586
+ - **候选人A**: Java (精通)、Spring Boot、MySQL、Redis、Kafka
587
+ - **候选人B**: Go (精通)、Python、PostgreSQL、RabbitMQ
588
+
589
+ **对比分析**:
590
+ - 职位要求使用 Java 技术栈,候选人A完全匹配
591
+ - 候选人B虽然 Go 技术强,但需要时间适应 Java 生态
592
+
593
+ ### 前端技术
594
+ - **候选人A**: React、Vue(基础)
595
+ - **候选人B**: React、TypeScript(精通)
596
+
597
+ **对比分析**:
598
+ - 候选人B的前端能力更强,适合全栈职位
599
+ - 候选人A主要做后端,前端经验较弱
600
+
601
+ ### 架构能力
602
+ - **候选人A**: 负责过百万级用户系统架构设计
603
+ - **候选人B**: 参与过微服务改造项目
604
+
605
+ **对比分析**:
606
+ - 候选人A的架构经验更丰富
607
+ - 候选人B的微服务实践更贴近我们的技术方向
608
+
609
+ **综合建议**: 如果职位偏重后端架构,选择候选人A;如果需要全栈能力,选择候选人B。
610
+ ```
611
+
612
+ #### 6.2 单一候选人深度分析
613
+
614
+ 用户:*"能否详细分析候选人B的优势和不足?"*
615
+
616
+ 回复示例:
617
+ ```markdown
618
+ ## 🔍 候选人B深度分析
619
+
620
+ ### 📊 综合评分:4.1/5.0
621
+
622
+ **评分构成:**
623
+ - 技术能力:4.0 (权重 40%) → 1.6
624
+ - 工作经验:3.5 (权重 30%) → 1.05
625
+ - 教育背景:5.0 (权重 15%) → 0.75
626
+ - 薪资性价比:5.0 (权重 15%) → 0.75
627
+ - **总分**:4.15 → 4.1
628
+
629
+ ---
630
+
631
+ ### ✅ 核心优势
632
+
633
+ #### 1. 教育背景优秀
634
+ - 硕士学历·软件工程(985院校)
635
+ - 学术背景扎实,理论基础好
636
+ - 适合需要研发深度的岗位
637
+
638
+ #### 2. 薪资性价比高
639
+ - 当前薪资:22万
640
+ - 期望薪资:28万(涨幅 27%,合理范围)
641
+ - 低于职位薪资范围中位数(30-35万)
642
+
643
+ #### 3. 来自大厂背景
644
+ - 阿里巴巴 3年工作经验
645
+ - 接受过系统化的技术培训
646
+ - 代码规范和工程能力强
647
+
648
+ ---
649
+
650
+ ### ⚠️ 潜在不足
651
+
652
+ #### 1. 工作年限偏短
653
+ - 仅 3年经验,职位要求 5年+
654
+ - 可能缺少复杂系统架构经验
655
+ - 需要更多时间积累项目经验
656
+
657
+ #### 2. 技术深度有限
658
+ - 主要做业务开发,缺少底层优化经验
659
+ - 没有独立负责过大型项目
660
+ - 技术广度可以,但深度不够
661
+
662
+ #### 3. 项目经验相关性一般
663
+ - 主要做电商业务,与我们的XX业务有差异
664
+ - 需要一定时间熟悉业务领域
665
+
666
+ ---
667
+
668
+ ### 🎯 适用场景
669
+
670
+ **最适合:**
671
+ - 职位偏重业务开发(非底层架构)
672
+ - 团队需要高学历人才提升整体素质
673
+ - 预算有限,需要性价比高的候选人
674
+
675
+ **不太适合:**
676
+ - 需要资深架构师
677
+ - 需要立即上手复杂系统
678
+ - 对特定领域经验有硬性要求
679
+
680
+ ---
681
+
682
+ ### 💡 录用建议
683
+
684
+ **如果录用候选人B:**
685
+
686
+ 1. **入职培训计划**
687
+ - 前 1 个月:熟悉业务和代码库
688
+ - 前 3 个月:导师带教,从简单任务开始
689
+ - 前 6 个月:逐步承担核心模块开发
690
+
691
+ 2. **薪资策略**
692
+ - 入职薪资:28万(符合期望)
693
+ - 试用期通过后:调整到 30万(激励成长)
694
+ - 1年后表现优秀:调整到 32-35万(留住人才)
695
+
696
+ 3. **团队配置**
697
+ - 安排一位资深导师
698
+ - 与经验丰富的同事搭档
699
+ - 定期 Review 代码和技术成长
700
+
701
+ **风险缓解措施:**
702
+ - 延长试用期到 4-6 个月(观察适应情况)
703
+ - 设置明确的考核指标(如:独立完成 X 个功能)
704
+ - 提供技术培训预算(如:参加技术大会、购买课程)
705
+
706
+ ---
707
+
708
+ **综合结论:** 候选人B是一个潜力股,适合作为"培养型"人才引进。如果团队有成熟的培养体系,且预算有限,可以优先考虑。但如果需要即战力,建议选择候选人A。
709
+ ```
710
+
711
+ ---
712
+
713
+ ### 第 7 步:错误处理
714
+
715
+ | 错误场景 | 错误信息 |
716
+ |---------|---------|
717
+ | 候选人数量不符 | `❌ 候选人数量必须为 2-3 人,当前提供了 {count} 人` |
718
+ | 缺少候选人 ID | `❌ 缺少候选人 ID 列表,请提供 candidate_ids 参数(格式:cand-1,cand-2)` |
719
+ | 候选人不存在 | `❌ 候选人 {candidate_id} 不存在,请检查 ID 是否正确` |
720
+ | 职位不存在 | `❌ 职位 {job_id} 不存在,请检查 ID 是否正确` |
721
+ | 数据缺失 | `⚠️ 候选人 {name} 缺少简历内容,对比分析可能不完整` |
722
+ | 职位 ID 缺失 | `❌ 无法确定职位 ID,请提供 job_id 参数或确保候选人数据包含 job_id 字段` |
723
+
724
+ ## 输出格式规范总结
725
+
726
+ **前端解析依赖的关键格式:**
727
+
728
+ 1. **表格格式**:严格使用 Markdown 表格(`|` 分隔)
729
+ 2. **章节标记**:使用固定的 `##` 标题
730
+ - `## 📋 候选人概览`
731
+ - `## 📈 关键指标对比`(**表格行数和维度名称必须与 job.screening_weights 配置一致**)
732
+ - `## 💡 候选人亮点与风险`(初始输出必须)
733
+ - `## 📝 对比总结`(初始输出必须,100-150字)
734
+ - `## 🔍 详细分析`(仅在追问时提供)
735
+ - `## 🏆 综合推荐`(仅在追问时提供)
736
+ 3. **候选人顺序**:严格按照 `candidate_ids` 参数顺序
737
+ 4. **评分格式**:星级 + 括号数字(如 `⭐️⭐️⭐️⭐️ (4.0)`)
738
+ 5. **分隔符**:候选人之间使用 `---`
739
+ 6. **学历格式**:必须包含完整学校名称(如:"本科·软件工程·广东外语外贸大学")
740
+ 7. **亮点和风险要求**:
741
+ - **核心亮点和潜在风险**:必须基于候选人自身的客观独立评估,不受排名影响
742
+ - **推荐总结**:可以包含横向对比话术
743
+ - 如果候选人确实没有任何优势,才写"暂无突出亮点",禁止因排名靠后而忽略客观优势
744
+ 8. **输出长度**:初始对比只输出表格+亮点风险+100-150字总结,详细分析仅在追问时提供
745
+ 9. **动态维度**:关键指标对比表格的维度行数和名称必须来自 `job.screening_weights` 配置,支持 2-8 个动态维度
746
+
747
+ **禁止的格式:**
748
+ - ❌ 不要使用 HTML 表格
749
+ - ❌ 不要改变表格列的顺序
750
+ - ❌ 不要省略章节标题的 Emoji
751
+ - ❌ 不要使用非标准的 Markdown 语法
752
+ - ❌ 不要在初始输出中包含冗长的详细分析
753
+ - ❌ 不要为平庸候选人编造虚假亮点
754
+
755
+ ## 使用示例
756
+
757
+ ### 示例 1:基本使用(2个候选人)
758
+
759
+ ```
760
+ /hr-recruitment:compare-candidates --workspace-id 55170d90-5ee1-4e8b-a919-cd1e56c8c6b0 --candidate-ids cand-abc123,cand-def456
761
+
762
+ 参数:
763
+ - workspace_id: 55170d90-5ee1-4e8b-a919-cd1e56c8c6b0
764
+ - candidate_ids: cand-abc123,cand-def456
765
+ ```
766
+
767
+ **说明**:最简单的使用方式,命令会自动查询候选人和职位数据
768
+
769
+ ### 示例 2:3个候选人对比
770
+
771
+ ```
772
+ /hr-recruitment:compare-candidates --workspace-id 55170d90-5ee1-4e8b-a919-cd1e56c8c6b0 --candidate-ids cand-abc123,cand-def456,cand-ghi789
773
+
774
+ 参数:
775
+ - workspace_id: 55170d90-5ee1-4e8b-a919-cd1e56c8c6b0
776
+ - candidate_ids: cand-abc123,cand-def456,cand-ghi789
777
+ ```
778
+
779
+ **说明**:支持最多 3 个候选人对比
780
+
781
+ ### 示例 3:前端优化(传入完整数据)
782
+
783
+ ```
784
+ /hr-recruitment:compare-candidates --workspace-id 55170d90-5ee1-4e8b-a919-cd1e56c8c6b0 --candidate-ids cand-abc123,cand-def456 --candidate-data [{"id":"cand-abc123","name":"张三",...},{"id":"cand-def456","name":"李四",...}] --job-data {"id":"job-456","title":"高级后端开发",...}
785
+
786
+ **前端已查询的上下文数据(请优先使用,避免重复查询):**
787
+
788
+ **candidates:**
789
+ ```json
790
+ [
791
+ {
792
+ "id": "cand-abc123",
793
+ "name": "张三",
794
+ "job_id": "job-456",
795
+ "resume_content": "...",
796
+ "candidate_highlight": {
797
+ "work_years": "5年",
798
+ "education": "本科·计算机",
799
+ "company_background": "腾讯、字节跳动"
800
+ },
801
+ "expected_salary": 350000,
802
+ "current_salary": 280000
803
+ },
804
+ {
805
+ "id": "cand-def456",
806
+ "name": "李四",
807
+ ...
808
+ }
809
+ ]
810
+ ```
811
+
812
+ **job:**
813
+ ```json
814
+ {
815
+ "id": "job-456",
816
+ "title": "高级后端开发",
817
+ "skill_requirements": "...",
818
+ "salary_range": "30-50万"
819
+ }
820
+ ```
821
+
822
+ **重要提示:** 以上数据已由前端提供,无需再调用 MCP 工具查询。
823
+ ```
824
+
825
+ **说明**:前端已经加载了完整数据,直接传入可避免重复 MCP 查询,显著提升性能
826
+
827
+ ### 示例 4:多轮对话
828
+
829
+ **第一轮:** 执行初始对比
830
+
831
+ ```
832
+ /hr-recruitment:compare-candidates --workspace-id ... --candidate-ids cand-1,cand-2
833
+ ```
834
+
835
+ **第二轮:** 用户追问
836
+
837
+ ```
838
+ 用户:能否详细对比候选人A和B的技术栈?
839
+ ```
840
+
841
+ **说明**:命令支持多轮对话,可以深入分析特定维度
842
+
843
+ ## 最佳实践
844
+
845
+ ### 1. 前端集成建议
846
+
847
+ **推荐做法:**
848
+ - 前端在候选人列表页已经加载了候选人和职位数据
849
+ - 点击"对比候选人"按钮时,直接传入 `candidate_data` 和 `job_data`
850
+ - 避免命令重复查询,提升用户体验
851
+
852
+ **数据传递示例:**
853
+ ```typescript
854
+ const compareCandidates = async (selectedIds: string[]) => {
855
+ const candidateData = selectedIds.map(id =>
856
+ candidates.find(c => c.id === id)
857
+ );
858
+
859
+ const command = '/hr-recruitment:compare-candidates';
860
+ const args = {
861
+ workspace_id: workspaceId,
862
+ candidate_ids: selectedIds.join(','),
863
+ candidate_data: candidateData, // 已加载的数据
864
+ job_data: currentJob // 当前职位数据
865
+ };
866
+
867
+ await copilotApi.compareCandidatesStream(workspaceId, args, callbacks);
868
+ };
869
+ ```
870
+
871
+ ### 2. 多轮对话建议
872
+
873
+ **常见追问场景:**
874
+ - 深入对比特定维度(技术栈、工作经验、薪资)
875
+ - 单一候选人深度分析
876
+ - 薪资谈判策略
877
+ - 录用建议和风险评估
878
+
879
+ **用户引导:**
880
+ 在输出结尾提示用户可以继续提问,例如:
881
+ ```markdown
882
+ 💬 **有任何疑问?** 您可以继续提问,例如:
883
+ - "能否详细对比候选人A和B的技术能力?"
884
+ - "候选人C的薪资能否谈到40万以内?"
885
+ - "如果只能录用一个人,你推荐谁?"
886
+ ```
887
+
888
+ ### 3. 性能优化
889
+
890
+ **查询优化:**
891
+ - 优先使用前端传入的数据(`candidate_data`、`job_data`)
892
+ - 避免重复查询相同的候选人或职位数据
893
+ - 如需查询,使用批量查询(如有支持)
894
+
895
+ **响应优化:**
896
+ - 初始分析控制在 30-60 秒内完成
897
+ - 多轮对话响应控制在 10-20 秒内
898
+ - 避免过度详细的分析(除非用户明确要求)
899
+
900
+ ## 技术说明
901
+
902
+ ### 为什么使用严格的 Markdown 表格格式?
903
+
904
+ **优点:**
905
+ 1. **易于解析**:前端使用简单的字符串分割即可提取数据
906
+ 2. **可读性高**:人类可读,便于调试和验证
907
+ 3. **兼容性好**:Markdown 是通用格式,前端渲染库支持好
908
+ 4. **灵活性强**:可以包含 Emoji、星级等视觉元素
909
+
910
+ **权衡:**
911
+ - 需要严格控制输出格式(不能随意改变表格结构)
912
+ - 前端解析需要处理边界情况(如:候选人姓名包含 `|` 字符)
913
+
914
+ ### 为什么支持多轮对话?
915
+
916
+ **设计理由:**
917
+ 1. **深度分析需求**:招聘决策复杂,需要多维度分析
918
+ 2. **用户体验**:一次性展示所有信息会过载,按需提供更友好
919
+ 3. **灵活性**:用户可以根据实际情况追问细节
920
+
921
+ ## 相关命令和技能
922
+
923
+ - **parse-resume** - 解析简历内容(对比分析的基础数据)
924
+ - **generate-offer** - 生成薪资方案(对比后的下一步)
925
+ - **schedule-interview** - 安排面试(候选人筛选后的操作)
926
+
927
+ ## 依赖
928
+
929
+ - **MCP 工具**:`mcp__elevo-platform__read_object_instance`, `mcp__elevo-platform__list_object_instances`
930
+ - **数据对象**:`candidate`, `job`
931
+ - **Elevo Platform MCP**:用于查询候选人和职位数据
932
+
933
+ ---
934
+
935
+ **最后更新**:2026-02-03
936
+ **版本**:0.3.1
937
+ **更新内容**:
938
+ - **移除薪资谈判建议**(第 6.2 节),保持命令职责单一
939
+ - 添加引导信息,推荐使用 `generate-offer` 命令处理薪资谈判
940
+ - 添加代码示例说明,明确 JavaScript 代码仅为伪代码示例
941
+ - **重大修改:核心亮点和潜在风险必须基于客观独立评估**,不受排名影响(v0.3.0)
942
+ - 明确区分:亮点/风险是独立评估,推荐总结可以包含横向对比(v0.3.0)
943
+ - "暂无突出亮点"仅在候选人确实没有任何优势时使用,不能因为排名靠后就忽略客观优势(v0.3.0)
944
+ - 增加教育背景必须包含完整学校名称的要求(v0.2.0)
945
+ - 增加招聘建议必须基于实际情况的原则,避免机械套用评级(v0.2.0)
946
+ - 限制初始输出长度:只输出表格+亮点风险+100-150字总结,详细分析仅在追问时提供(v0.2.0)