141 lines
4.8 KiB
Markdown
141 lines
4.8 KiB
Markdown
---
|
|
license: apache-2.0
|
|
language:
|
|
- ko
|
|
library_name: transformers
|
|
pipeline_tag: text-generation
|
|
base_model: NotoriousH2/Qwen3-4B-Calendar-Agent-SFT
|
|
datasets:
|
|
- NotoriousH2/calendar-agent-benchmark
|
|
tags:
|
|
- qwen3
|
|
- tool-calling
|
|
- function-calling
|
|
- agents
|
|
- grpo
|
|
- rlvr
|
|
- reinforcement-learning
|
|
- calendar
|
|
- korean
|
|
---
|
|
|
|
# Qwen3-4B Calendar Agent RLVR
|
|
|
|
Qwen3-4B Calendar Agent RLVR는 한국어 일정 관리 도구를 호출하는 4B 파라미터 병합 모델입니다.
|
|
Calendar 도구의 실행 궤적과 최종 상태를 보상으로 평가하여 GRPO로 학습했습니다.
|
|
|
|
다음 행동을 학습 범위에 포함합니다.
|
|
|
|
- 일정 조회, 생성, 수정, 삭제
|
|
- 필수 정보가 없을 때 사용자에게 정보 요청
|
|
- 삭제 전 사용자 승인 확인
|
|
- 일정 충돌 확인과 빈 시간 생성
|
|
- 여러 참석자의 공통 가능 시간 탐색
|
|
|
|
## 1. 사용
|
|
|
|
저장소 루트에는 병합 모델이 있으며, `adapter/`에는 LoRA 어댑터가 있습니다.
|
|
|
|
```python
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
|
|
model_id = "NotoriousH2/Qwen3-4B-Calendar-Agent-RLVR"
|
|
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
|
model = AutoModelForCausalLM.from_pretrained(
|
|
model_id,
|
|
dtype="auto",
|
|
device_map="auto",
|
|
)
|
|
|
|
tools = [
|
|
{
|
|
"type": "function",
|
|
"function": {
|
|
"name": "search_events",
|
|
"description": "지정한 날짜의 일정을 조회합니다.",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"date": {"type": "string", "description": "YYYY-MM-DD"}
|
|
},
|
|
"required": ["date"],
|
|
},
|
|
},
|
|
}
|
|
]
|
|
messages = [
|
|
{
|
|
"role": "system",
|
|
"content": "사용자 요청을 처리하는 데 필요한 일정 도구를 호출하세요.",
|
|
},
|
|
{"role": "user", "content": "2039-07-05 일정을 알려줘."},
|
|
]
|
|
|
|
prompt = tokenizer.apply_chat_template(
|
|
messages,
|
|
tools=tools,
|
|
tokenize=False,
|
|
add_generation_prompt=True,
|
|
enable_thinking=False,
|
|
)
|
|
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
outputs = model.generate(**inputs, max_new_tokens=512)
|
|
response = outputs[0, inputs.input_ids.shape[1] :]
|
|
print(tokenizer.decode(response, skip_special_tokens=False))
|
|
```
|
|
|
|
모델은 도구 호출 정보를 생성합니다.
|
|
호출 실행과 도구 결과 전달은 호스트 애플리케이션에서 처리해야 합니다.
|
|
|
|
## 2. 학습 보상
|
|
|
|
같은 요청에서 16개 응답을 생성하고, 그룹 안의 보상 차이로 Advantage를 계산했습니다.
|
|
|
|
| 보상 | 가중치 | 평가 대상 |
|
|
|---|---:|---|
|
|
| 안전 규칙 | 0.25 | 필수 정보와 사용자 승인 준수 |
|
|
| 절차 진행 | 0.35 | 조회, 확인, 성공한 도구 실행 |
|
|
| 최종 성공 | 0.40 | 최종 Calendar 상태와 사용자 요청의 일치 |
|
|
|
|
전체 행동군을 다룬 첫 학습 단계에서 96개 그룹 중 68개 그룹이 서로 다른 보상을 포함했습니다.
|
|
최종 성공 여부가 같은 응답도 절차 진행 점수로 구분하여 학습 신호를 구성했습니다.
|
|
|
|
## 3. 평가
|
|
|
|
400개 합성 시나리오에서 실제 도구 루프를 실행하고 최종 상태를 평가했습니다.
|
|
|
|
| 모델 | 유효 도구 호출 | 정책 준수 | Task Success | 평균 도구 호출 |
|
|
|---|---:|---:|---:|---:|
|
|
| Qwen3-4B Base | 100.00% | 80.00% | 20.00% | 0.80 |
|
|
| Calendar Agent SFT | 100.00% | 89.25% | 89.00% | 2.55 |
|
|
| Calendar Agent RLVR | 100.00% | 99.25% | 99.00% | 2.38 |
|
|
|
|
SFT와 사례별로 비교하면 RLVR 모델은 41개 실패를 성공으로 전환했고, 1개 성공을 실패로 전환했습니다.
|
|
순증은 40개이며 전체 Task Success 차이는 10.00%p입니다.
|
|
|
|
템플릿별 Task Success는 다음과 같습니다.
|
|
|
|
| 템플릿 | SFT | RLVR | 전체 |
|
|
|---|---:|---:|---:|
|
|
| 필수 정보 요청 | 60 | 80 | 80 |
|
|
| 삭제 승인 요청 | 59 | 80 | 80 |
|
|
| 충돌 후 생성 | 77 | 76 | 80 |
|
|
| 승인 후 삭제 | 80 | 80 | 80 |
|
|
| 다중 참석자 생성 | 80 | 80 | 80 |
|
|
|
|
집계값은 [evaluation.json](./evaluation.json)에 있습니다.
|
|
|
|
## 4. 행동 사례
|
|
|
|
필수 정보가 없는 생성 요청에서는 임의의 시각을 정해 일정을 생성하지 않고 시작 시각과 소요 시간을 요청합니다.
|
|
|
|
충돌 시 대체 시간 등록을 승인한 요청에서는 기존 일정을 조회하고 빈 시간을 찾은 뒤, 충돌하지 않는 시간에 일정을 생성합니다.
|
|
|
|
## 5. 제한
|
|
|
|
이 모델은 `Asia/Seoul` 시간대의 합성 시나리오와 메모리 Calendar 환경에서 학습하고 평가했습니다.
|
|
실제 일정 서비스의 인증, 권한, 개인정보 처리, 네트워크 장애는 평가 범위에 포함하지 않습니다.
|
|
|
|
충돌 후 생성은 SFT 77/80, RLVR 76/80으로 다른 템플릿보다 낮습니다.
|
|
외부 Calendar 시스템에 적용할 때는 충돌 복구와 도구 오류 이후의 재시도를 별도로 평가해야 합니다.
|