EstebanBarac's picture
Update README: add achievement/track/sponsor tags, expand story section
9347602
|
Raw
History Blame Contribute Delete
10.5 kB
---
title: Sofía Educational Companion (Spanish)
colorFrom: blue
colorTo: pink
sdk: gradio
sdk_version: 6.18.0
python_version: '3.12'
app_file: app.py
pinned: false
license: mit
short_description: Local-first Spanish voice companion for kids
tags:
- gradio
- build-small-hackathon
- backyard ai
- backyard-ai
- off the grid
- off-the-grid
- well tuned
- well-tuned
- off brand
- off-brand
- sharing is caring
- sharing-is-caring
- field notes
- field-notes
- best use of modal
- best-use-of-modal
- modal
- zerogpu
- qwen2.5
- qlora
- conversational
- education
- spanish
- kids
- voice assistant
- voice-assistant
- text-to-speech
- speech-to-text
- track:backyard
- sponsor:modal
- achievement:offgrid
- achievement:welltuned
- achievement:offbrand
- achievement:sharing
- achievement:fieldnotes
models:
- build-small-hackathon/sofia-qwen2.5-7b
---
# Sofía — local-first educational companion for young kids
A voice companion for a ~3-year-old: warm conversation, curated stories and
songs with real audio, and learning activities (counting, colors, animals),
plus a parent panel. Built for the **Build Small Hackathon** (track
**Backyard AI**).
## The story behind Sofía
Here's why we built this, in our own words:
> My baby girl has always been curious about every single thing. From the
> moment she turned maybe 8 or 9 months, it was amusing how fast a learner she
> is. Except for walking (because it seems to be more fun rolling than using
> feet and legs), eating, speaking, imitating moves, jumping, potty training,
> sleeping — it was all "easy" for her. And imagine being working-from-home
> parents with a toddler in hyperspeed 24/7 :) — some days were like heaven,
> and other days felt like Ares was in my living room having the battle of his
> life. Not because of bad behavior, but because of the constant educational
> incentives she demanded.
>
> When she turned 2, she started asking these amazing questions about daily
> life — why is the sun like that? How are forks made? Are cats and dogs
> siblings? That's when I had this idea of making a companion for her: to chat
> about this kind of topic, feed her curiosity, and also help my wife
> complement our homeschool activities. This is basically a tool for parents
> devoted to their children's learning path — for the days when we're a bit
> off and don't have 100% of our creativity, but we don't let ourselves give
> less. This stayed as an idea until Build Small Hackaton appeared.
>
> My wife said: *"I would love maths if I had this when I was a child —
> learning could be so much fun."*
>
>The next step is to build 3D printed little "robot" with a Raspberry Pi and a little touch screen so its not on the phone.
>The long term idea is that she gets an agent/robot companion for life.
>We would really love to keep building Sofia, give some hearts and feedback please.
## Submission Snapshot
| | |
|---|---|
| **Live Space** | [build-small-hackathon/sofia-educational-companion](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion) |
| **Demo video** | [YouTube](https://www.youtube.com/watch?v=Zeesmd69dbs) |
| **Social post** | [X / Twitter](https://x.com/estebanbarac/status/2066658868566917173) |
| **Track** | Backyard AI — an educational companion for our ~3-year-old daughter |
| **Fine-tuned model** | [`build-small-hackathon/sofia-qwen2.5-7b`](https://huggingface.co/build-small-hackathon/sofia-qwen2.5-7b) — QLoRA on top of Qwen2.5-7B-Instruct |
| **Training** | QLoRA on **Modal** (A10G), see [`finetune/`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/tree/main/finetune) |
| **Open trace** | [`trace/`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/tree/main/trace) — 12 end-to-end turns of the real pipeline |
| **Field Notes** | [`FIELD_NOTES.md`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/blob/main/FIELD_NOTES.md) |
## TL;DR for judges
- **Backyard AI:** a real, specific problem — our ~3-year-old's nonstop stream
of "why?" questions and activities, and the days we (working-from-home parents) can't give
her 100% of our creativity. Sofía is a voice companion that chats, tells
curated stories/songs, and runs small learning activities (counting, colors,
animals) — **to complement, never replace, parent time**.
- **Off the Grid (local-first):** the fine-tuned `Qwen2.5-7B-Instruct` runs
**inside this Space** via `transformers` on dynamic ZeroGPU (`@spaces.GPU`).
No external inference APIs at any point.
- **Well-Tuned (fine-tuned):** [`build-small-hackathon/sofia-qwen2.5-7b`](https://huggingface.co/build-small-hackathon/sofia-qwen2.5-7b)
— a QLoRA fine-tune trained end-to-end on **Modal** (A10G, 72 steps, loss
2.51 → 0.14). It teaches **persona, style and safety**, never facts: those
always come from curated `content/`.
- **Off-Brand (custom UI):** fully custom, voice-first, kid-friendly frontend
(`frontend/`) served via `gr.Server` — push-to-talk, an animated character
with moods, inline story/song playback.
- **Sharing is Caring (open trace):** [`trace/`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/tree/main/trace) — 12 real end-to-end
turns (intent router → curated content → safety guard → fine-tuned LLM),
including a turn where the model **refuses to invent a story** and offers a
curated one instead.
- **Best Use of Modal:** the entire QLoRA fine-tune (dataset → training →
merge → publish) ran on Modal — see [`finetune/`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/tree/main/finetune).
- **Field Notes:** [`FIELD_NOTES.md`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/blob/main/FIELD_NOTES.md) — what we learned
pivoting from llama.cpp to ZeroGPU, why a small fine-tuned model beats a
bigger generic one for a 3-year-old, and the per-visitor ZeroGPU quota that
nearly looked like a bug but wasn't.
## Architecture idea (the most important part)
The LLM is **only the conversational glue**. Facts and content (stories,
songs, activities) come from `content/`, **curated by the parents** — the
model never invents them. This kills almost all hallucination, reduces the
risk of inappropriate content, and is the honest fit with the small model that
the judges reward.
```
frontend/ (custom kid-friendly UI, voice-first, gr.Server)
app.py (gradio.Server / FastAPI)
├─ llm/ fine-tuned (QLoRA) Qwen2.5-7B-Instruct, transformers + ZeroGPU (@spaces.GPU)
├─ content/ source of truth (curated): stories.json, songs.json, learning.json, activities.json
├─ voice/ faster-whisper (STT, push-to-talk) + Kokoro (TTS, CPU)
├─ safety/ blocked-topic filter (input and output)
└─ parental/ activity log + memory (sqlite)
```
## What Sofía does
- Warm conversation in Spanish, short sentences, one question per turn.
- Push-to-talk (no always-on listening yet) with an animated character that
changes mood (idle / listening / thinking / playing).
- **Stories** (10), curated, with pre-rendered audio and inline playback.
- **Songs** (6), curated, with inline playback.
- **Learning activities**: numbers, colors and animals (`content/learning.json`),
plus counting and recognition (`content/activities.json`).
- Sofía changes color on request.
- Memory of recent turns for conversational continuity.
- **Parent panel** (behind a gate): recent activity and structured session
memory.
## Merit mapping
| # | Merit | Status in Sofía |
|---|---|---|
| 1 | **Off the Grid** (local-first) | ✅ Fine-tuned `Qwen2.5-7B-Instruct` runs inside the Space via `transformers` + ZeroGPU (`zero-a10g`), no external APIs. |
| 2 | **Well-Tuned** (fine-tuned) | ✅ QLoRA published at [`build-small-hackathon/sofia-qwen2.5-7b`](https://huggingface.co/build-small-hackathon/sofia-qwen2.5-7b); `MODEL_ID` in `llm/engine.py` points there. Details: [`finetune/MODEL_CARD.md`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/blob/main/finetune/MODEL_CARD.md). |
| 3 | **Off-Brand** (custom UI) | ✅ Custom kid-friendly frontend (`frontend/`), voice-first, served by `gr.Server`. |
| 4 | **Llama Champion** (llama.cpp) |
| 5 | **Sharing is Caring** (open trace) | ✅ [`trace/`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/tree/main/trace) — 12 end-to-end turns of the real pipeline, with the exact prompt sent to the model at each step. |
| 6 | **Field Notes** | ✅ [`FIELD_NOTES.md`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/blob/main/FIELD_NOTES.md). |
**Bonus — Best Use of Modal:** the entire QLoRA fine-tune for merit 2
(dataset, training, merge, and publishing) ran end-to-end on Modal (A10G). See
[`finetune/`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/tree/main/finetune).
## Running locally
```bash
pip install -r requirements.txt
python app.py # http://localhost:7860
```
Note: locally `@spaces.GPU` is a no-op, and `.to("cuda")` needs a real GPU with
enough VRAM for Qwen2.5-7B in bf16 (~15GB). The Space (ZeroGPU) provides 48GB
per call; on smaller local GPUs, loading the model may fail or be very slow on
CPU.
### Running locally with Ollama (no large GPU)
```bash
ollama serve & # if not already running
ollama pull qwen2.5:7b # once
pip install ollama
LUMI_LLM_BACKEND=ollama python app.py
```
See `CLAUDE.md` for the full list of environment variables
(`LUMI_LLM_BACKEND`, `LUMI_OLLAMA_MODEL`, `LUMI_SHARE`).
## Model
[`build-small-hackathon/sofia-qwen2.5-7b`](https://huggingface.co/build-small-hackathon/sofia-qwen2.5-7b)
— a QLoRA fine-tune of `Qwen/Qwen2.5-7B-Instruct` (merged, full weights),
trained to always stay in the "Sofía" persona, present curated content
**verbatim** (no paraphrasing or inventing), and refuse/redirect unsafe
topics. Runs on the Space's dynamic GPU (ZeroGPU, ~48GB VRAM per call). Full
details: [`finetune/MODEL_CARD.md`](https://huggingface.co/spaces/build-small-hackathon/sofia-educational-companion/blob/main/finetune/MODEL_CARD.md).
## Honest notes
- STT for a 3-year-old is hard: we use push-to-talk and a limited vocabulary.
- Sofía complements, never replaces, parent time. The parent panel logs
activity.