TransferFunctionGemma
한국어 자연어 이체 명령을 구조화된 function call로 변환하는 경량 모델입니다.
Model Description
TransferFunctionGemma는 google/functiongemma-270m-it를 한국어 금융 이체 도메인에 맞게 full fine-tuning한 모델입니다. 자연어 이체 명령을 분석하여 4종류의 function call JSON으로 변환합니다.
ONNX INT8 양자화를 통해 약 418MB로 경량화되었으며, Transformers.js + WebGPU를 통해 브라우저에서 직접 추론할 수 있습니다. 서버 통신 없이 100% 클라이언트 사이드에서 동작합니다.
Supported Functions
| Function | 설명 | 필수 인자 |
|---|---|---|
execute_transfer |
수취인에게 금액을 이체합니다 | recipient, amount |
query_history |
이체 내역을 조회합니다 | (없음) |
summarize_history |
이체 내역을 요약합니다 | period |
confirm_transfer |
대기 중인 이체를 확인/취소/수정합니다 | action |
Intended Use
Primary Use Cases
- 브라우저 기반 이체 데모: URL 접속만으로 자연어 이체 기능을 체험
- 포트폴리오 데모: 기술 면접관/채용 담당자에게 온디바이스 AI 역량 시연
- 온디바이스 AI 레퍼런스: FunctionGemma fine-tuning + 브라우저 배포 파이프라인 참고
Out-of-Scope Use
- 실제 금융 거래에 사용하면 안 됩니다 (이 모델은 데모 전용입니다)
- 이체 외의 금융 업무(대출, 투자, 보험 등)에는 학습되지 않았습니다
- 영어 등 한국어 외 언어 입력은 지원하지 않습니다
Training Data
Seed Data
각 카테고리별 510개, 총 약 5080개의 시드 데이터를 수작업으로 작성했습니다.
| 카테고리 | 목표 샘플 수 | 설명 |
|---|---|---|
| transfer_simple | 150 | 기본 이체 ("엄마한테 5만원 보내줘") |
| transfer_complex | 100 | 메모 포함, 복합 요청 |
| confirm_cancel_modify | 80 | 확인/취소/수정 멀티턴 |
| clarify | 80 | 정보 부족 시 자연어 되물음 |
| query_history | 80 | 내역 조회 (기간/수취인 필터) |
| summarize | 60 | 기간별 이체 요약 |
| alias_diversity | 100 | 별명 변형 (엄마/어머니/맘) |
| amount_parsing | 100 | 한국어 금액 (오만원/5만/삼백만) |
| rejection | 50 | 이체 외 요청 거절 |
| edge_cases | 50 | 오타, 비문, 혼합 요청 |
Data Augmentation
시드 데이터를 Claude API로 증강하여 500~1,000개 학습 샘플을 생성했습니다. 증강 시 다음을 변형합니다:
- 말투: 존댓말/반말/줄임말
- 오타 및 비문
- 금액 표현 방식: 순한글, 숫자+한자, 혼합, 아라비아 숫자
- 별명 변형
Data Format
FunctionGemma chat template을 준수합니다:
{
"messages": [
{
"role": "developer",
"content": "You are a model that can do function calling with the following functions",
"tool_definitions": [...]
},
{
"role": "user",
"content": "엄마한테 오만원 보내"
},
{
"role": "assistant",
"content": "",
"function_calls": [
{"name": "execute_transfer", "arguments": {"recipient": "엄마", "amount": 50000}}
]
}
]
}
Validation
모든 데이터는 자동 검증을 거칩니다:
- JSON schema 유효성 검사
- function name이 정의된 4개 중 하나인지 확인
- amount가 양의 정수인지 확인
- 한국어 금액 -> 숫자 변환 정확성 spot check
Training Procedure
Base Model
- 모델: google/functiongemma-270m-it
- 학습 방식: Full fine-tuning (모델이 경량이므로 LoRA 없이 전체 파라미터 학습)
Hyperparameters
| 파라미터 | 값 |
|---|---|
| Epochs | 5 |
| Batch Size (per device) | 8 |
| Learning Rate | 5e-5 |
| LR Scheduler | cosine |
| Warmup Ratio | 0.1 |
| Weight Decay | 0.01 |
| Max Sequence Length | 2048 |
| Precision | bfloat16 |
| Eval Strategy | epoch |
| Save Strategy | epoch |
| Metric for Best Model | eval_loss |
Training Environment
- 하드웨어: WSL (RAM 128GB / RTX 3070)
- 소프트웨어: HuggingFace Transformers + TRL (SFTTrainer)
Quantization
# Fine-tuned 모델 -> ONNX 변환 + INT8 양자화
python ml/scripts/convert_onnx.py
- ONNX 변환: optimum (
optimum.exporters.onnx) - INT8 동적 양자화: onnxruntime (
quantize_dynamic,QuantType.QInt8) - 최종 모델 크기: 418MB (ONNX INT8)
- 참고: INT4는 onnxruntime과 Gemma weight layout 비호환으로 INT8 사용
Evaluation Results
Base Model vs Fine-tuned Model 비교
시드 데이터 50개 기준 (학습 데이터에 포함되지 않은 원본 시드)
| 메트릭 | Base (functiongemma-270m-it) | Fine-tuned | 개선율 |
|---|---|---|---|
| Intent Accuracy | 0.0% | 88.9% | +88.9%p |
| JSON Validity | 10.0% | 100.0% | +90.0%p |
| Amount Parsing | 0.0% | 100.0% | +100.0%p |
| Argument F1 (macro) | 0.0% | 57.5% | +57.5%p |
| Rejection Accuracy | 100.0% | 100.0% | +0.0%p |
Argument F1 세부
| 필드 | F1 |
|---|---|
| recipient | 83.8% |
| amount | 86.1% |
| memo | 75.0% |
| period | 100.0% |
| action | 0.0% |
| new_amount | 0.0% |
action/new_amount는confirm_transfer함수 전용 인자로, 시드 데이터 내 해당 예제 부족이 원인입니다.
Limitations
- 도메인 제한: 이체 관련 명령만 처리 가능합니다. 그 외 금융 업무(대출, 투자 등)나 일반 대화에는 적합하지 않습니다.
- 언어 제한: 한국어 입력만 지원합니다.
- 브라우저 제한: WebGPU 지원 브라우저(Chrome 113+, Edge 113+)에서만 정상 동작합니다.
- 데모 전용: Mock Banking Engine으로 시뮬레이션만 수행하며, 실제 금융 거래를 수행하지 않습니다.
- 학습 데이터 편향: 시드 데이터와 Claude API 증강 기반이므로, 실제 사용자 발화 패턴과 차이가 있을 수 있습니다.
- 복합 명령 제한: "엄마한테 5만원, 아빠한테 3만원 보내줘" 같은 복합 이체 명령은 지원하지 않습니다.
How to Use
With Transformers.js (Browser)
import { pipeline } from '@xenova/transformers';
// 모델 로드 (WebGPU 자동 감지)
const generator = await pipeline(
'text-generation',
'your-username/transfer-function-gemma-onnx-int4',
{ device: 'webgpu' }
);
// 추론
const messages = [
{
role: 'system',
content: 'You are a model that can do function calling with the following functions: [execute_transfer, query_history, summarize_history, confirm_transfer]'
},
{
role: 'user',
content: '엄마한테 5만원 보내줘'
}
];
const output = await generator(messages, {
max_new_tokens: 256,
temperature: 0.1,
});
console.log(output);
// => {"name": "execute_transfer", "arguments": {"recipient": "엄마", "amount": 50000}}
With Python (HuggingFace Transformers)
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"your-username/transfer-function-gemma",
torch_dtype="bfloat16",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(
"your-username/transfer-function-gemma"
)
messages = [
{"role": "user", "content": "엄마한테 5만원 보내줘"}
]
inputs = tokenizer.apply_chat_template(
messages,
return_tensors="pt",
add_generation_prompt=True
).to(model.device)
outputs = model.generate(inputs, max_new_tokens=256, temperature=0.1)
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(result)
Citation
@misc{transfer-function-gemma-2026,
title={TransferFunctionGemma: On-Device Korean Banking Function Calling},
author={Kimin Ryu},
year={2026},
url={https://github.com/your-username/TransferFunctionGemma}
}
Acknowledgments
- Google Gemma -- Base model
- HuggingFace Transformers -- Training framework
- Transformers.js -- Browser inference
- Anthropic Claude -- Data augmentation
- Downloads last month
- 6
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support
Model tree for zeriworkspace/transfer-function-gemma
Base model
google/functiongemma-270m-it