XKCD FunctionGemma

A fine-tuned version of 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
Training time: ~8 minutes on T4 GPU

Usage

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

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

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for gnumanth/xkcd-functiongemma

Adapter
(8)
this model

Dataset used to train gnumanth/xkcd-functiongemma