Back to portfolio
My first ever coding project

Piblo the
Plutonian

A virtual alien chatbot designed to make space mission data feel personal rather than dry — built with persistent memory, generative storytelling, and a 10,000-record dataset retrieval system.

ModuleConversational Interfaces
TypeRule-Based + LLM Chatbot
StackPython, SmolLM-135M
The Brief

Space data is complex and numerical. Most people won't read through a dataset.

The brief was intentionally open: build a chatbot. For this project I created one in the form of a virtual alien called Piblo, designed to be both educational and entertaining. By embedding mission data within a friendly character, I hoped to make it easier to absorb than a spreadsheet ever could be.

Equally important to me was building something simply enjoyable to talk to — a chatbot that listens, remembers small details about you, and has genuine humour and personality. Using code rather than a static script meant the experience could be interactive and genuinely different for every person who used it.

Piblo remembers your name, reacts to your answers, generates a personalised story about your favourite planet using a small instruction-tuned LLM, retrieves real facts about space missions you ask about, and says goodbye in a way that references what you mentioned earlier.

Research on anthropomorphism in conversational interfaces suggests that human-like traits increase engagement and make information feel more approachable — which was the design principle behind every element of Piblo's personality.

Architecture

Three classes. One character.

Before writing any code I split the project into three classes, each responsible for one part of Piblo's behaviour. This separation made the memory, storytelling and retrieval systems each independently testable, while still combining into a single coherent character.

Core

PibloThePlutonian

The central component handling all communication with the user. Collects and stores user details — name, weather, favourite food — as attributes, then recalls them later in the conversation. The goodbye message references the user's name and food choice, creating a loop that makes the exchange feel personal rather than scripted.

Generative

StoryTellingBot

Runs SmolLM-135M-Instruct, a small instruction-tuned LLM chosen so it could run locally without a GPU or external API. Starting the prompt mid-sentence — as if the story had already begun — produced far more natural results than instructing the model to "tell a story about X." Temperature was set at 0.4 to keep output coherent while allowing creativity.

Retrieval

SpaceMissionFactBot

Handles retrieval from a 10,000-record dataset sourced from Kaggle. Country is detected by looping through every unique dataset value and checking whether it appears anywhere in the user's lowercased input — so it works even when mentioned naturally mid-sentence. Year is extracted via regex across 2000–2029.

Live Demo

Memory, storytelling and retrieval in one exchange.

The conversation shown is a real run of the system. Piblo opens by collecting the user's name, weather and favourite food — storing each as an attribute. It then generates a personalised story about their favourite planet using the LLM, retrieves a real mission from the dataset, and closes the conversation by referencing the food they mentioned at the start.

The memory system is simple but effective: each detail is stored as a class attribute and pulled back into dialogue at the right moment. The goodbye message is the clearest example — Piblo references the food the user mentioned at the very beginning, which consistently surprised people during testing.

The auto-scroll pauses on hover so you can read at your own pace.

Terminal — Piblo Session
Piblo: Greetings human! I am Piblo from the planet Pluto. What do you call yourself?
Me: Sam
Piblo: I've never met an earthling called Sam before, how meteor-tastic! What's the weather like here on earth? I can't sense it through my spacesuit.
Sam: cold
Piblo: Well, I bet it's not as bad as Pluto – it averages -230°! And what do you like to eat? I'm fascinated by what I've heard about earth cuisine.
Sam: burgers
Piblo: That sounds so alien to me! But I am curious to try it... one more question Sam, what's your favourite planet?
Sam: saturn
Piblo: Oh wow! My friend Moop was actually just orbiting there and told me about his travels.
Moop the alien once visited saturn. Moop, the alien, was a towering creature with iridescent skin and a long, spindly tail. She had eyes that shone like stars. As she explored the planet, Moop encountered giant, crystal-encrusted mountains that rose from the earth, their peaks shrouded in a thick, velvety mist.
Piblo: Ok, I feel like I have been waffling for too long! Why don't I answer a question for you now! I know a lot about earth space missions — give me a country and a year (between 2000 and 2025)!
Sam: tell me about a mission from usa 2010
Piblo: Oh yes USA, 2010! I remember that one! It was the Integrated Scalable Policy mission, which set off from Port Angelaview. It cost 12.55 billion, used Reusable Rocket technology and lasted 147 days.
Piblo: Alright Sam, I must shoot off back to Pluto! Next time I visit you must make me some burgers to try.
Engineering Decisions

What made it work — and what user testing revealed.

Decision 01

Country detection by dataset scanning, not exact match

Rather than requiring an exact typed country name, the retrieval system loops through every unique value in the dataset and checks whether it appears anywhere in the user's lowercased input. This means a query like "tell me about a mission from usa 2010" works naturally without the user needing to know the exact string format.

Decision 02

Starting the LLM prompt mid-story

Prompting SmolLM with "Moop the alien once visited saturn" rather than "tell a story about Saturn" gave the model a running start. Combined with a temperature of 0.4 and a regex filter to remove incomplete final sentences, this produced dramatically more natural, less generic output than instruction-only prompting.

User Testing 01

Personality landed clearly across all twenty participants

I tested with twenty participants, collecting both Likert-scale ratings and open-ended responses. The vast majority described Piblo as fun, friendly or entertaining — confirming the character layer worked. Almost all found it easy to navigate without assistance, suggesting the dialogue flow was intuitive enough to require no onboarding.

User Testing 02

Entertainment came through clearly — the educational angle less so

Testing also revealed that while participants engaged enthusiastically with Piblo as a character, fewer spontaneously described it as educational. This pointed to a clear design gap: the educational intent was embedded in what the system could do, but never stated. The fix is to frame it explicitly at the start of the conversation — introducing Piblo as both a character and a source of real space knowledge — and to expand the dataset retrieval beyond country and year so users can ask more open-ended questions.

Module Grade A