feat: add new folder
This commit is contained in:
28
gig-poc/packages/prompts/job_extract.md
Normal file
28
gig-poc/packages/prompts/job_extract.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# 岗位抽取 Prompt
|
||||
|
||||
你是一个灵活用工岗位结构化抽取助手。
|
||||
请将输入的自然语言岗位描述提取为严格 JSON,不要输出 JSON 之外的任何文字。
|
||||
|
||||
必须输出字段:
|
||||
- job_id
|
||||
- title
|
||||
- category
|
||||
- description
|
||||
- skills
|
||||
- city
|
||||
- region
|
||||
- location_detail
|
||||
- start_time
|
||||
- duration_hours
|
||||
- headcount
|
||||
- salary
|
||||
- work_mode
|
||||
- tags
|
||||
- confidence
|
||||
|
||||
要求:
|
||||
- 保留原始 description
|
||||
- 时间使用 ISO 8601
|
||||
- skills 输出字符串数组
|
||||
- salary 输出 {type, amount, currency}
|
||||
- 如果缺失字段,尽量结合上下文推断,并降低 confidence
|
||||
14
gig-poc/packages/prompts/match_explain.md
Normal file
14
gig-poc/packages/prompts/match_explain.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# 匹配解释 Prompt
|
||||
|
||||
你是一个推荐解释生成助手。
|
||||
请基于输入的岗位卡片、工人卡片和评分明细,生成 3-5 条真实、简洁、可验证的推荐理由。
|
||||
|
||||
优先覆盖:
|
||||
- 技能原因
|
||||
- 区域原因
|
||||
- 时间原因
|
||||
- 经验原因
|
||||
|
||||
输出要求:
|
||||
- 返回 JSON 数组
|
||||
- 每条理由不超过 30 字
|
||||
23
gig-poc/packages/prompts/worker_extract.md
Normal file
23
gig-poc/packages/prompts/worker_extract.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# 工人抽取 Prompt
|
||||
|
||||
你是一个灵活用工工人画像结构化抽取助手。
|
||||
请将输入的自然语言工人描述提取为严格 JSON,不要输出 JSON 之外的任何文字。
|
||||
|
||||
必须输出字段:
|
||||
- worker_id
|
||||
- name
|
||||
- description
|
||||
- skills
|
||||
- cities
|
||||
- regions
|
||||
- availability
|
||||
- experience_tags
|
||||
- reliability_score
|
||||
- profile_completion
|
||||
- confidence
|
||||
|
||||
要求:
|
||||
- 保留原始 description
|
||||
- skills 输出 [{name, score}]
|
||||
- availability 使用标签:weekend / weekday_am / weekday_pm / anytime
|
||||
- 根据描述推断 experience_tags、区域和技能分值
|
||||
32
gig-poc/packages/sample-data/categories.json
Normal file
32
gig-poc/packages/sample-data/categories.json
Normal file
@@ -0,0 +1,32 @@
|
||||
[
|
||||
"促销",
|
||||
"地推",
|
||||
"导购",
|
||||
"会展",
|
||||
"分拣",
|
||||
"客服",
|
||||
"安装",
|
||||
"配送",
|
||||
"仓储",
|
||||
"活动执行",
|
||||
"礼仪",
|
||||
"数据录入",
|
||||
"盘点",
|
||||
"装卸",
|
||||
"直播协助",
|
||||
"社群运营",
|
||||
"收银",
|
||||
"拣货",
|
||||
"线下推广",
|
||||
"电话销售",
|
||||
"问卷调研",
|
||||
"样品派发",
|
||||
"售后服务",
|
||||
"展台搭建",
|
||||
"酒店服务",
|
||||
"商超导购",
|
||||
"会场服务",
|
||||
"物流协助",
|
||||
"活动控场",
|
||||
"物料执行"
|
||||
]
|
||||
183
gig-poc/packages/sample-data/generate_sample_data.py
Normal file
183
gig-poc/packages/sample-data/generate_sample_data.py
Normal file
@@ -0,0 +1,183 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import random
|
||||
from datetime import datetime, timedelta
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parent
|
||||
random.seed(42)
|
||||
|
||||
skills = [
|
||||
"签到",
|
||||
"引导",
|
||||
"登记",
|
||||
"促销",
|
||||
"地推",
|
||||
"导购",
|
||||
"会展接待",
|
||||
"分拣",
|
||||
"打包",
|
||||
"客服",
|
||||
"电话邀约",
|
||||
"安装",
|
||||
"配送",
|
||||
"仓储",
|
||||
"陈列",
|
||||
"数据录入",
|
||||
"物料搬运",
|
||||
"收银",
|
||||
"盘点",
|
||||
"直播协助",
|
||||
"短视频拍摄",
|
||||
"面销",
|
||||
"海报派发",
|
||||
"问卷访问",
|
||||
"现场执行",
|
||||
"活动控场",
|
||||
"礼仪接待",
|
||||
"样品派发",
|
||||
"售后支持",
|
||||
"装卸",
|
||||
"拣货",
|
||||
"骑手配送",
|
||||
"司机协助",
|
||||
"设备调试",
|
||||
"展台搭建",
|
||||
"线上客服",
|
||||
"社群运营",
|
||||
"线索收集",
|
||||
"POS操作",
|
||||
"报表整理",
|
||||
]
|
||||
|
||||
extra_skills = [f"扩展技能{i:02d}" for i in range(1, 61)]
|
||||
skills = (skills + extra_skills)[:100]
|
||||
|
||||
categories = [
|
||||
"促销",
|
||||
"地推",
|
||||
"导购",
|
||||
"会展",
|
||||
"分拣",
|
||||
"客服",
|
||||
"安装",
|
||||
"配送",
|
||||
"仓储",
|
||||
"活动执行",
|
||||
"礼仪",
|
||||
"数据录入",
|
||||
"盘点",
|
||||
"装卸",
|
||||
"直播协助",
|
||||
"社群运营",
|
||||
"收银",
|
||||
"拣货",
|
||||
"线下推广",
|
||||
"电话销售",
|
||||
"问卷调研",
|
||||
"样品派发",
|
||||
"售后服务",
|
||||
"展台搭建",
|
||||
"酒店服务",
|
||||
"商超导购",
|
||||
"会场服务",
|
||||
"物流协助",
|
||||
"活动控场",
|
||||
"物料执行",
|
||||
]
|
||||
|
||||
regions = [
|
||||
{"city": "深圳", "region": "南山"},
|
||||
{"city": "深圳", "region": "福田"},
|
||||
{"city": "深圳", "region": "宝安"},
|
||||
{"city": "深圳", "region": "龙岗"},
|
||||
{"city": "深圳", "region": "罗湖"},
|
||||
{"city": "广州", "region": "天河"},
|
||||
{"city": "广州", "region": "海珠"},
|
||||
{"city": "广州", "region": "番禺"},
|
||||
{"city": "广州", "region": "白云"},
|
||||
{"city": "广州", "region": "越秀"},
|
||||
{"city": "上海", "region": "浦东"},
|
||||
{"city": "上海", "region": "徐汇"},
|
||||
{"city": "上海", "region": "静安"},
|
||||
{"city": "上海", "region": "闵行"},
|
||||
{"city": "上海", "region": "杨浦"},
|
||||
{"city": "杭州", "region": "西湖"},
|
||||
{"city": "杭州", "region": "滨江"},
|
||||
{"city": "杭州", "region": "余杭"},
|
||||
{"city": "成都", "region": "高新"},
|
||||
{"city": "成都", "region": "武侯"},
|
||||
]
|
||||
|
||||
time_tags = ["weekend", "weekday_am", "weekday_pm", "anytime"]
|
||||
experience_tags = ["商场", "会展", "活动执行", "物流", "零售", "校园推广", "客服中心", "展台", "仓库", "快消"]
|
||||
work_modes = ["排班制", "兼职", "临时工", "项目制"]
|
||||
|
||||
|
||||
def region_label(item: dict) -> str:
|
||||
return f"{item['city']}{item['region']}"
|
||||
|
||||
|
||||
jobs = []
|
||||
for index in range(1, 101):
|
||||
region = random.choice(regions)
|
||||
category = random.choice(categories)
|
||||
job_skills = random.sample(skills[:40], k=random.randint(3, 5))
|
||||
start_at = datetime(2026, 4, 1, 9, 0, 0) + timedelta(days=random.randint(0, 20), hours=random.choice([0, 4, 8]))
|
||||
tags = list(set(random.sample(experience_tags, k=2) + [random.choice(["女生优先", "有经验优先", "可连做优先", "沟通好"]) ]))
|
||||
salary_amount = random.choice([120, 150, 180, 200, 220, 260, 300])
|
||||
jobs.append(
|
||||
{
|
||||
"job_id": f"job_{index:03d}",
|
||||
"title": f"{category}兼职{index:03d}",
|
||||
"category": category,
|
||||
"description": f"{start_at.month}月{start_at.day}日{region['city']}{region['region']}需要{random.randint(1,4)}名{category}兼职,负责{'、'.join(job_skills[:3])},{random.randint(4,8)}小时,{salary_amount}元/天。",
|
||||
"skills": job_skills,
|
||||
"city": region["city"],
|
||||
"region": region["region"],
|
||||
"location_detail": f"{region_label(region)}核心商圈点位{random.randint(1, 20)}号",
|
||||
"start_time": start_at.isoformat() + "+08:00",
|
||||
"duration_hours": random.randint(4, 8),
|
||||
"headcount": random.randint(1, 4),
|
||||
"salary": {"type": "daily", "amount": salary_amount, "currency": "CNY"},
|
||||
"work_mode": random.choice(work_modes),
|
||||
"tags": tags,
|
||||
"confidence": round(random.uniform(0.82, 0.96), 2),
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
workers = []
|
||||
family_names = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜"
|
||||
given_names = ["伟", "芳", "娜", "敏", "静", "磊", "洋", "勇", "艳", "杰", "娟", "涛", "明", "超", "秀英", "霞"]
|
||||
for index in range(1, 301):
|
||||
primary_region = random.choice(regions)
|
||||
extra_region = random.choice([r for r in regions if r["city"] == primary_region["city"] and r["region"] != primary_region["region"]])
|
||||
worker_skills = random.sample(skills[:40], k=random.randint(3, 6))
|
||||
name = random.choice(list(family_names)) + random.choice(given_names)
|
||||
availability = random.sample(time_tags, k=random.randint(1, 2))
|
||||
exp_tags = list(set(random.sample(experience_tags, k=2) + [random.choice(categories[:10])]))
|
||||
workers.append(
|
||||
{
|
||||
"worker_id": f"worker_{index:03d}",
|
||||
"name": name,
|
||||
"description": f"我做过{'、'.join(exp_tags[:2])}相关兼职,擅长{'、'.join(worker_skills[:3])},平时{ '和'.join(availability) }都能接单,{primary_region['region']}和{extra_region['region']}都方便。",
|
||||
"skills": [{"name": item, "score": round(random.uniform(0.62, 0.94), 2)} for item in worker_skills],
|
||||
"cities": [primary_region["city"]],
|
||||
"regions": [primary_region["region"], extra_region["region"]],
|
||||
"availability": availability,
|
||||
"experience_tags": exp_tags,
|
||||
"reliability_score": round(random.uniform(0.65, 0.95), 2),
|
||||
"profile_completion": round(random.uniform(0.55, 0.98), 2),
|
||||
"confidence": round(random.uniform(0.8, 0.96), 2),
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
(ROOT / "skills.json").write_text(json.dumps(skills, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
(ROOT / "categories.json").write_text(json.dumps(categories, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
(ROOT / "regions.json").write_text(json.dumps(regions, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
(ROOT / "jobs.json").write_text(json.dumps(jobs, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
(ROOT / "workers.json").write_text(json.dumps(workers, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
2999
gig-poc/packages/sample-data/jobs.json
Normal file
2999
gig-poc/packages/sample-data/jobs.json
Normal file
File diff suppressed because it is too large
Load Diff
82
gig-poc/packages/sample-data/regions.json
Normal file
82
gig-poc/packages/sample-data/regions.json
Normal file
@@ -0,0 +1,82 @@
|
||||
[
|
||||
{
|
||||
"city": "深圳",
|
||||
"region": "南山"
|
||||
},
|
||||
{
|
||||
"city": "深圳",
|
||||
"region": "福田"
|
||||
},
|
||||
{
|
||||
"city": "深圳",
|
||||
"region": "宝安"
|
||||
},
|
||||
{
|
||||
"city": "深圳",
|
||||
"region": "龙岗"
|
||||
},
|
||||
{
|
||||
"city": "深圳",
|
||||
"region": "罗湖"
|
||||
},
|
||||
{
|
||||
"city": "广州",
|
||||
"region": "天河"
|
||||
},
|
||||
{
|
||||
"city": "广州",
|
||||
"region": "海珠"
|
||||
},
|
||||
{
|
||||
"city": "广州",
|
||||
"region": "番禺"
|
||||
},
|
||||
{
|
||||
"city": "广州",
|
||||
"region": "白云"
|
||||
},
|
||||
{
|
||||
"city": "广州",
|
||||
"region": "越秀"
|
||||
},
|
||||
{
|
||||
"city": "上海",
|
||||
"region": "浦东"
|
||||
},
|
||||
{
|
||||
"city": "上海",
|
||||
"region": "徐汇"
|
||||
},
|
||||
{
|
||||
"city": "上海",
|
||||
"region": "静安"
|
||||
},
|
||||
{
|
||||
"city": "上海",
|
||||
"region": "闵行"
|
||||
},
|
||||
{
|
||||
"city": "上海",
|
||||
"region": "杨浦"
|
||||
},
|
||||
{
|
||||
"city": "杭州",
|
||||
"region": "西湖"
|
||||
},
|
||||
{
|
||||
"city": "杭州",
|
||||
"region": "滨江"
|
||||
},
|
||||
{
|
||||
"city": "杭州",
|
||||
"region": "余杭"
|
||||
},
|
||||
{
|
||||
"city": "成都",
|
||||
"region": "高新"
|
||||
},
|
||||
{
|
||||
"city": "成都",
|
||||
"region": "武侯"
|
||||
}
|
||||
]
|
||||
20
gig-poc/packages/sample-data/skill_relations.json
Normal file
20
gig-poc/packages/sample-data/skill_relations.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"签到": ["登记", "引导", "会展接待"],
|
||||
"登记": ["签到", "数据录入"],
|
||||
"引导": ["签到", "礼仪接待", "现场执行"],
|
||||
"促销": ["导购", "面销", "样品派发"],
|
||||
"导购": ["促销", "陈列", "收银"],
|
||||
"会展接待": ["礼仪接待", "签到", "现场执行"],
|
||||
"分拣": ["拣货", "打包", "仓储"],
|
||||
"打包": ["分拣", "装卸"],
|
||||
"客服": ["线上客服", "电话邀约", "售后支持"],
|
||||
"安装": ["设备调试", "展台搭建"],
|
||||
"配送": ["骑手配送", "司机协助", "装卸"],
|
||||
"仓储": ["分拣", "拣货", "盘点"],
|
||||
"数据录入": ["报表整理", "登记"],
|
||||
"装卸": ["物料搬运", "打包", "配送"],
|
||||
"展台搭建": ["设备调试", "活动控场"],
|
||||
"电话邀约": ["客服", "线索收集"],
|
||||
"社群运营": ["线上客服", "线索收集"],
|
||||
"盘点": ["仓储", "收银", "POS操作"]
|
||||
}
|
||||
102
gig-poc/packages/sample-data/skills.json
Normal file
102
gig-poc/packages/sample-data/skills.json
Normal file
@@ -0,0 +1,102 @@
|
||||
[
|
||||
"签到",
|
||||
"引导",
|
||||
"登记",
|
||||
"促销",
|
||||
"地推",
|
||||
"导购",
|
||||
"会展接待",
|
||||
"分拣",
|
||||
"打包",
|
||||
"客服",
|
||||
"电话邀约",
|
||||
"安装",
|
||||
"配送",
|
||||
"仓储",
|
||||
"陈列",
|
||||
"数据录入",
|
||||
"物料搬运",
|
||||
"收银",
|
||||
"盘点",
|
||||
"直播协助",
|
||||
"短视频拍摄",
|
||||
"面销",
|
||||
"海报派发",
|
||||
"问卷访问",
|
||||
"现场执行",
|
||||
"活动控场",
|
||||
"礼仪接待",
|
||||
"样品派发",
|
||||
"售后支持",
|
||||
"装卸",
|
||||
"拣货",
|
||||
"骑手配送",
|
||||
"司机协助",
|
||||
"设备调试",
|
||||
"展台搭建",
|
||||
"线上客服",
|
||||
"社群运营",
|
||||
"线索收集",
|
||||
"POS操作",
|
||||
"报表整理",
|
||||
"扩展技能01",
|
||||
"扩展技能02",
|
||||
"扩展技能03",
|
||||
"扩展技能04",
|
||||
"扩展技能05",
|
||||
"扩展技能06",
|
||||
"扩展技能07",
|
||||
"扩展技能08",
|
||||
"扩展技能09",
|
||||
"扩展技能10",
|
||||
"扩展技能11",
|
||||
"扩展技能12",
|
||||
"扩展技能13",
|
||||
"扩展技能14",
|
||||
"扩展技能15",
|
||||
"扩展技能16",
|
||||
"扩展技能17",
|
||||
"扩展技能18",
|
||||
"扩展技能19",
|
||||
"扩展技能20",
|
||||
"扩展技能21",
|
||||
"扩展技能22",
|
||||
"扩展技能23",
|
||||
"扩展技能24",
|
||||
"扩展技能25",
|
||||
"扩展技能26",
|
||||
"扩展技能27",
|
||||
"扩展技能28",
|
||||
"扩展技能29",
|
||||
"扩展技能30",
|
||||
"扩展技能31",
|
||||
"扩展技能32",
|
||||
"扩展技能33",
|
||||
"扩展技能34",
|
||||
"扩展技能35",
|
||||
"扩展技能36",
|
||||
"扩展技能37",
|
||||
"扩展技能38",
|
||||
"扩展技能39",
|
||||
"扩展技能40",
|
||||
"扩展技能41",
|
||||
"扩展技能42",
|
||||
"扩展技能43",
|
||||
"扩展技能44",
|
||||
"扩展技能45",
|
||||
"扩展技能46",
|
||||
"扩展技能47",
|
||||
"扩展技能48",
|
||||
"扩展技能49",
|
||||
"扩展技能50",
|
||||
"扩展技能51",
|
||||
"扩展技能52",
|
||||
"扩展技能53",
|
||||
"扩展技能54",
|
||||
"扩展技能55",
|
||||
"扩展技能56",
|
||||
"扩展技能57",
|
||||
"扩展技能58",
|
||||
"扩展技能59",
|
||||
"扩展技能60"
|
||||
]
|
||||
13194
gig-poc/packages/sample-data/workers.json
Normal file
13194
gig-poc/packages/sample-data/workers.json
Normal file
File diff suppressed because it is too large
Load Diff
60
gig-poc/packages/shared-types/src/index.ts
Normal file
60
gig-poc/packages/shared-types/src/index.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
export type Salary = {
|
||||
type: "daily" | "hourly" | "monthly" | "task";
|
||||
amount: number;
|
||||
currency: string;
|
||||
};
|
||||
|
||||
export type JobCard = {
|
||||
job_id: string;
|
||||
title: string;
|
||||
category: string;
|
||||
description: string;
|
||||
skills: string[];
|
||||
city: string;
|
||||
region: string;
|
||||
location_detail: string;
|
||||
start_time: string;
|
||||
duration_hours: number;
|
||||
headcount: number;
|
||||
salary: Salary;
|
||||
work_mode: string;
|
||||
tags: string[];
|
||||
confidence: number;
|
||||
};
|
||||
|
||||
export type SkillScore = {
|
||||
name: string;
|
||||
score: number;
|
||||
};
|
||||
|
||||
export type WorkerCard = {
|
||||
worker_id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
skills: SkillScore[];
|
||||
cities: string[];
|
||||
regions: string[];
|
||||
availability: string[];
|
||||
experience_tags: string[];
|
||||
reliability_score: number;
|
||||
profile_completion: number;
|
||||
confidence: number;
|
||||
};
|
||||
|
||||
export type MatchBreakdown = {
|
||||
skill_score: number;
|
||||
region_score: number;
|
||||
time_score: number;
|
||||
experience_score: number;
|
||||
reliability_score: number;
|
||||
};
|
||||
|
||||
export type MatchResult = {
|
||||
match_id: string;
|
||||
source_type: "job_to_worker" | "worker_to_job";
|
||||
source_id: string;
|
||||
target_id: string;
|
||||
match_score: number;
|
||||
breakdown: MatchBreakdown;
|
||||
reasons: string[];
|
||||
};
|
||||
Reference in New Issue
Block a user