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