File size: 3,579 Bytes
980c77d
7498e73
 
 
980c77d
c0e8201
7498e73
 
 
c0e8201
7498e73
 
 
 
 
 
980c77d
 
7498e73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
980c77d
 
 
7498e73
 
 
 
 
 
980c77d
7498e73
980c77d
7498e73
 
 
980c77d
7498e73
980c77d
7498e73
980c77d
7498e73
980c77d
7498e73
 
 
1
2
3
4
5
6
7
8
9
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
---
language:
- en
license: apache-2.0
library_name: transformers
tags:
- function-calling
- xkcd
- gemma
- unsloth
- peft
- lora
base_model: google/functiongemma-270m-it
datasets:
- olivierdehaene/xkcd
pipeline_tag: text-generation
---

# XKCD FunctionGemma

A fine-tuned version of [google/functiongemma-270m-it](https://huggingface.co/google/functiongemma-270m-it) for XKCD comic search function calling.

## Model Description

This model was fine-tuned to generate structured function calls for searching XKCD comics. Given a natural language query about comics, it outputs a properly formatted tool call that can be parsed and executed.

**Base model:** `google/functiongemma-270m-it`  
**Fine-tuning method:** LoRA via Unsloth (1.4% trainable parameters)  
**Training data:** 2,630 examples from [olivierdehaene/xkcd](https://huggingface.co/datasets/olivierdehaene/xkcd)  
**Training time:** ~8 minutes on T4 GPU

## Usage

```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import json
import re

# Load model
model = AutoModelForCausalLM.from_pretrained(
    "gnumanth/xkcd-functiongemma",
    device_map="auto",
    torch_dtype="auto"
)
tokenizer = AutoTokenizer.from_pretrained("gnumanth/xkcd-functiongemma")

# Define tools
TOOLS = [{
    "type": "function",
    "function": {
        "name": "search_xkcd",
        "description": "Search XKCD comics by topic",
        "parameters": {
            "type": "object",
            "properties": {"query": {"type": "string"}},
            "required": ["query"]
        }
    }
}]

# Generate function call
messages = [{"role": "user", "content": "Find xkcd about programming"}]
text = tokenizer.apply_chat_template(messages, tools=TOOLS, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=128, do_sample=False)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)

print(response)
# Output: <start_function_call>call:search_xkcd{"query": "programming"}<end_function_call>
```

## Parsing Function Calls

```python
def parse_function_call(output: str) -> dict | None:
    """Extract function name and arguments from model output."""
    match = re.search(r'call:(\w+)\s*\{(.+)\}', output, re.DOTALL)
    if not match:
        return None
    
    func_name = match.group(1)
    args_raw = match.group(2).strip()
    
    # Handle double braces from training format
    args_raw = re.sub(r'^\s*\{', '', args_raw)
    if args_raw.endswith('}'):
        args_raw = args_raw[:-1]
    
    try:
        return {"function": func_name, "arguments": json.loads('{' + args_raw + '}')}
    except json.JSONDecodeError:
        return None

# Usage
call = parse_function_call(response)
# {'function': 'search_xkcd', 'arguments': {'query': 'programming'}}
```

## Training Details

- **Epochs:** 1
- **Batch size:** 2 (with 4 gradient accumulation steps)
- **Learning rate:** 2e-4
- **LoRA rank:** 16
- **Target modules:** q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
- **Final loss:** 0.281

## Limitations

- Only trained for XKCD search queries
- May produce double braces in output (handled by parser above)
- Small model (270M params) - limited reasoning capability

## License

Apache 2.0 (same as base model)

## Links

- [Training notebook](https://github.com/hemanth/notebooks/blob/main/notebooks/functiongemma_xkcd_finetune.ipynb)
- [Base model](https://huggingface.co/google/functiongemma-270m-it)
- [XKCD dataset](https://huggingface.co/datasets/olivierdehaene/xkcd)