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_amountconfirm_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

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

Quantized
(49)
this model