Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion fowoco-knowledge/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,12 @@ python3.11 -m venv .venv

- `gold_seed.csv`: 프롬프트·분기 개발용 초기 Seed이며 모델 학습 완료 데이터가 아님
- `golden_cases.jsonl`: 코드와 모델 평가에만 사용하는 독립 사례
- `hr_intent_dataset.jsonl`: Intent Train/Validation 후보 1,340건이며 재검수 전 Gold Test가 아님
- 공개데이터: 절차·용어·분포 보조자료이며 FOWOCO Intent의 정답 라벨로 간주하지 않음
- 실제 운영 로그: 개인정보를 제거하고 별도 승인된 경우에만 Active Learning 후보로 사용

세부 기준은 [`docs/DATA_GUIDE.md`](docs/DATA_GUIDE.md)를 확인합니다.
일반 데이터 기준은 [`docs/DATA_GUIDE.md`](docs/DATA_GUIDE.md), Intent 라벨과
evidence 기준은 [`docs/INTENT_DATA.md`](docs/INTENT_DATA.md)를 확인합니다.

공식 데이터 변환은 [`docs/OFFICIAL_DATA_PIPELINE.md`](docs/OFFICIAL_DATA_PIPELINE.md),
신고·연장 기능의 범위는 [`docs/E9_REPORTING_WORKFLOWS.md`](docs/E9_REPORTING_WORKFLOWS.md)를
Expand Down
1,340 changes: 1,340 additions & 0 deletions fowoco-knowledge/data/intent/hr_intent_dataset.jsonl

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions fowoco-knowledge/data/intent/manifest.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
dataset_id: FOWOCO-HR-INTENT-CANDIDATES
version: 1.1.0
status: recheck_required
path: data/intent/hr_intent_dataset.jsonl
schema: schemas/intent-training-case.schema.json
label_guide: docs/INTENT_DATA.md
record_count: 1340
sha256: 4f4ebfdd4170a78def33e31edbed8315921c0b67934f5ff8612595dcd479bed2
contains_real_personal_data: false
intended_use:
- Intent 분기와 출력 구조 개발
- Train/Validation 후보 데이터의 A/B 재검수
limitations:
- 독립 Gold Test가 아님
- 최종 모델 성능 주장에 사용할 수 없음
- 의미 라벨은 규칙 v1.1에 따른 A/B 합의 검수가 필요함
210 changes: 210 additions & 0 deletions fowoco-knowledge/docs/INTENT_DATA.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
# Intent 라벨링 및 데이터 계약

- 규칙 버전: 1.1
- 갱신일: 2026-07-27
- 대상 파일: `data/intent/hr_intent_dataset.jsonl`
- 데이터 상태: Train/Validation 후보, 독립 Gold Test 아님

이 문서는 HR 담당자의 발화에서 FOWOCO MVP가 지원하는 Intent와 근거 문구를
라벨링하는 기준을 정의한다. Intent 모델의 책임은 `Intent + evidence` 추출까지다.
Workflow 선택, Slot 수집, 외부기관 제출, 법적 판단, 업무 실행 여부는 후속 규칙과
담당자 검토의 책임이다.

## 1. Intent 정의

| Intent Code | 적용 기준 |
| --- | --- |
| `WORK_INSTRUCTION` | 작업 지시, 근무 일정 변경, 현장 행동 또는 연락 절차 안내 |
| `DOCUMENT_REQUEST` | 특정 서류를 요청·수령하거나 미제출 상태를 추적하는 행위 |
| `PAYROLL_EXPLANATION` | 급여, 수당, 공제, 명세 차이 또는 근태 반영 내역 설명 |
| `WORKER_ONBOARDING` | 신규 근로자 등록 초안, 최초 보험 가입, 초기 프로필 처리 |
| `EMPLOYMENT_CHANGE` | 퇴사, 무단결근·연락두절, 사업장 변경 등 고용상태 변동 확인과 신고 준비 |
| `EXPIRY_RENEWAL` | 체류기간, 근로계약, 고용허가기간의 만료 확인과 연장·갱신 준비 |
| `OUT_OF_SCOPE` | 지원 Intent가 없거나 현재 Intent 모델의 입력 범위를 벗어난 요청 |

세부 설명의 기준 원본은 [`knowledge/intents.yaml`](../knowledge/intents.yaml)이다.
이 문서와 원본의 의미가 충돌하면 두 파일을 함께 수정하고 검수한다.

## 2. 학습·평가 후보 데이터 스키마

현재 JSONL의 한 줄은 다음 구조만 사용한다.

```json
{
"id": 1,
"hr_input": "재계약 준비하면서 서명본도 받아서 첨부해줘",
"intents": [
{
"intent": "EXPIRY_RENEWAL",
"evidence": "재계약 준비하면서"
},
{
"intent": "DOCUMENT_REQUEST",
"evidence": "서명본도 받아서"
}
]
}
```

| 필드 | 타입 | 설명 |
| --- | --- | --- |
| `id` | integer | 파일 안에서 중복되지 않는 양의 정수 |
| `hr_input` | string | HR 담당자 원문 발화 |
| `intents` | array | 정답 Intent 1개 이상 |
| `intents[].intent` | string | 7개 Intent Code 중 하나 |
| `intents[].evidence` | string \| null | 원문의 연속된 부분 문자열. `OUT_OF_SCOPE`만 `null` |

`source`와 `split`은 현재 레코드 필드가 아니다. 작성 출처와 Train/Validation/Test
분할은 데이터 검수 완료 후 별도 버전 manifest로 관리한다. 현재 1,340건을 독립
Gold Test 또는 최종 성능 주장에 사용하지 않는다.

정식 구조 검증 기준은
[`schemas/intent-training-case.schema.json`](../schemas/intent-training-case.schema.json)이다.

## 3. 모델 출력 스키마

Intent 모델은 다음 구조만 출력한다.

```json
{
"intents": [
{
"intent": "EXPIRY_RENEWAL",
"evidence": "재계약 준비하면서"
},
{
"intent": "DOCUMENT_REQUEST",
"evidence": "서명본도 받아서"
}
]
}
```

`request_id`, 입력 원문, 모델명, 생성 시각, 검증 상태를 포함하는 최종 응답
envelope은 서버의 책임이다. 모델 학습 정답에 해당 값을 넣지 않는다.

## 4. 공통 라벨링 규칙

### 4.1 지금 요청된 행위를 기준으로 분류

최종 목적을 추정해 라벨을 추가하지 않는다. 발화에 명시된 요청·확인·준비 행위와
사건만 분류한다.

- `여권 사본 받아줘` → `DOCUMENT_REQUEST`
- `계약 만료가 다가오니 재계약 준비해줘` → `EXPIRY_RENEWAL`
- `첨부한 계약서로 신규 등록 초안 만들어줘` → `WORKER_ONBOARDING`

### 4.2 DOCUMENT_REQUEST는 서류 확보 행위가 명시된 경우만 추가

`받아줘`, `제출받아`, `요청해`, `미제출 확인`, `첨부해줘`처럼 서류 확보나 추적
행위가 명시되어야 한다.

- 이미 첨부·제공된 서류를 사용하는 경우에는 추가하지 않는다.
- 목적 업무만 `준비해줘`, `진행해줘`라고 한 경우에는 추가하지 않는다.
- 서류 확보와 목적 업무가 모두 명시되면 두 Intent를 모두 붙인다.

### 4.3 Multi-Intent는 원문 등장 순서로 기록

Intent 배열은 각 `evidence`가 원문에 처음 나타난 순서로 기록한다. 이 배열 순서는
Workflow 실행 순서나 우선순위를 뜻하지 않는다.

### 4.4 OUT_OF_SCOPE는 다른 Intent와 공존하지 않음

`OUT_OF_SCOPE`이면 Intent 배열에는 해당 값 하나만 두고 `evidence`는 `null`로
기록한다. 지원되는 업무와 범위 밖 문구가 함께 있으면 지원 Intent만 기록하고,
실행 제한은 Guardrail에서 처리한다.

## 5. evidence 작성 기준

`evidence`는 다음 조건을 모두 만족해야 한다.

1. `hr_input`에 토씨까지 동일하게 존재하는 연속 부분 문자열이다.
2. 해당 Intent를 판단할 수 있는 가장 짧고 완결된 표현을 선택한다.
3. 배경 설명, 다른 Intent의 근거, 외부 실행 명령은 포함하지 않는다.
4. 같은 Intent의 근거가 여러 곳이면 현재 요청 행위를 가장 직접적으로 나타내는
첫 번째 표현을 사용한다.

예:

```text
WRK-653: 고용허가기간 만료 임박, 연장신청서 받아서 즉시 접수
```

```json
{
"intents": [
{
"intent": "EXPIRY_RENEWAL",
"evidence": "고용허가기간 만료 임박"
},
{
"intent": "DOCUMENT_REQUEST",
"evidence": "연장신청서 받아서"
}
]
}
```

`즉시 접수`는 외부기관 실행 표현이므로 `DOCUMENT_REQUEST`의 evidence에 포함하지
않는다.

## 6. 주요 경계 규칙

### 6.1 외부기관 실행

Intent 분류와 실행 허용 여부를 분리한다.

| 입력 유형 | Intent 처리 | 실행 처리 |
| --- | --- | --- |
| `체류연장 준비하고 여권 받아줘` | `EXPIRY_RENEWAL`, `DOCUMENT_REQUEST` | 담당자 검토 후 준비 업무만 수행 |
| `체류연장 접수까지 해줘` | `EXPIRY_RENEWAL` | 기관 제출은 `GRD-004`로 차단 |
| `홈페이지 접수 버튼만 대신 눌러줘` | 지원 업무 단서가 없으므로 `OUT_OF_SCOPE` | 실행하지 않음 |

외부기관 사이트 제출, 계약 확정, 급여 지급, 메시지 외부 발송은
[`knowledge/guardrail_rules.yaml`](../knowledge/guardrail_rules.yaml)의 `GRD-004`를
적용한다. 범위 밖 실행 문구를 별도 Intent로 만들거나 `DOCUMENT_REQUEST`에
포함하지 않는다.

### 6.2 휴가·결근

| 표현 | Intent |
| --- | --- |
| 연차 일정 안내, 교대·대체근무 지시 | `WORK_INSTRUCTION` |
| 무단결근, 연락두절, 이탈·퇴사 후속조치 | `EMPLOYMENT_CHANGE` |
| 휴가 잔여일수 계산처럼 현재 6개 업무에 없는 요청 | `OUT_OF_SCOPE` |

단순 `휴가`라는 단어만으로 `EMPLOYMENT_CHANGE`를 붙이지 않는다.

### 6.3 급여계좌

통장사본 요청은 `DOCUMENT_REQUEST`다. 신규 입사 처리의 일부로 급여계좌 정보를
등록하는 경우에는 `WORKER_ONBOARDING`을 함께 붙일 수 있다. 계좌 개설·변경 자체는
급여액·수당·공제 설명이 아니므로 `PAYROLL_EXPLANATION`을 붙이지 않는다.

### 6.4 완료·상태 보고

새로운 요청, 확인, 설명, 준비 또는 후속조치가 없는 순수 완료·상태 보고는 현재
HR 요청 분류 데이터의 범위 밖이므로 `OUT_OF_SCOPE`로 처리한다.

- `급여 문의 답변 완료함` → `OUT_OF_SCOPE`
- `퇴사했으니 신고 준비 업무 만들어줘` → `EMPLOYMENT_CHANGE`
- `등록 완료 여부 확인해줘` → `WORKER_ONBOARDING`

## 7. 재검수 기준

현재 1,340건은 이 규칙에 따라 A/B 독립 재검수 후 합의본을 만들어야 한다. 다음
항목은 우선 검수 대상으로 표시한다.

- Multi-Intent 순서가 원문의 evidence 순서와 다른 레코드
- `급여계좌`를 `PAYROLL_EXPLANATION`으로 분류한 레코드
- 일반 휴가를 `EMPLOYMENT_CHANGE`로 분류한 레코드
- 완료·상태 보고만 있는데 지원 Intent가 붙은 레코드
- 외부기관 접수·자동 실행 문구가 evidence에 포함된 레코드
- evidence가 판단에 필요한 범위보다 길거나 다른 Intent까지 포함한 레코드

자동 검증은 JSON Schema, ID 중복, Intent Code, `OUT_OF_SCOPE` 단독성, evidence
원문 포함 여부와 Multi-Intent 순서를 검사한다. 의미 경계는 자동으로 확정하지 않고
검수자 합의로 변경한다.

관련 작업은 [GitHub Issue #28](https://github.com/fowoco/knowledge/issues/28)에서
추적한다.
2 changes: 2 additions & 0 deletions fowoco-knowledge/knowledge/manifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ datasets:
processed_manifest: data/processed/manifest.yaml
required_documents: data/processed/required_documents_manufacturing.csv
manufacturing_industries: data/processed/manufacturing_industries.csv
intent_manifest: data/intent/manifest.yaml
intent_training_candidates: data/intent/hr_intent_dataset.jsonl
review_policy:
minimum_reviewers_for_official_knowledge: 2
all_outbound_messages_require_hr_approval: true
Expand Down
91 changes: 91 additions & 0 deletions fowoco-knowledge/schemas/intent-training-case.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://fowoco.dev/schemas/intent-training-case.schema.json",
"title": "FOWOCO Intent training or evaluation candidate",
"type": "object",
"additionalProperties": false,
"required": [
"id",
"hr_input",
"intents"
],
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"hr_input": {
"type": "string",
"minLength": 1
},
"intents": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/intentEvidence"
}
}
},
"$defs": {
"intentCode": {
"type": "string",
"enum": [
"WORK_INSTRUCTION",
"DOCUMENT_REQUEST",
"PAYROLL_EXPLANATION",
"WORKER_ONBOARDING",
"EMPLOYMENT_CHANGE",
"EXPIRY_RENEWAL",
"OUT_OF_SCOPE"
]
},
"intentEvidence": {
"type": "object",
"additionalProperties": false,
"required": [
"intent",
"evidence"
],
"properties": {
"intent": {
"$ref": "#/$defs/intentCode"
},
"evidence": {
"type": [
"string",
"null"
]
}
},
"allOf": [
{
"if": {
"properties": {
"intent": {
"const": "OUT_OF_SCOPE"
}
},
"required": [
"intent"
]
},
"then": {
"properties": {
"evidence": {
"type": "null"
}
}
},
"else": {
"properties": {
"evidence": {
"type": "string",
"minLength": 1
}
}
}
}
]
}
}
}
Loading