Table of Contents
- What My Old Task Separator Looks Like
- Disadvantages of the Old App
- What To Do Assistant Should Look Like
- Finetuning the Model
- Sum Up
What My Old Task Separator Looks Like
I previously built an app called the "Task Separator," which I discussed in another post. Here's how it worked:
- I used a Telegram bot to receive voice inputs like "remind me to play badminton."
- The Whisper model converted the speech to text.
- The app then created tasks in Microsoft To Do, adding attributes like importance, reminder time, and due date.
- Task generation was powered by ChatGPT 4o Mini.
For example:
Input: "I want to go shopping at 8 o'clock and call my parents tomorrow"
Output: ["Go shopping at 8 o'clock", "Call my parents tomorrow"]
That's why I called it the "Task Separator"—it splits a single input into multiple tasks.
Disadvantages of the Old App
While the concept was solid, the app had several practical drawbacks:
- Inconvenience: I had to open Telegram to use the voice feature, unlike "Hey Google," "Hi Bixby," or "Hi Siri," which work directly from the lock screen.
- Language Issues: Whisper struggled with Vietnamese speech-to-text conversion.
- Memory Lapses: When using voice mode, I often forgot tasks mid-sentence, leading to clumsy inputs with "uhm" or "oh." For example:
Input: "I want to go shopping at 8 o'clock, uhm, I'm sorry, at 9 o'clock."
Output: ["Go shopping at 9 o'clock."]
- Lack of Personalization: ChatGPT couldn’t generate tasks with attributes tailored to my preferences (e.g., importance, due date, reminder time).
- Limited Task Management: The app couldn’t read my "My Day" tasks in Microsoft To Do, prioritize them, assign time blocks, or assess importance.
- Generic Subtasks: It couldn’t generate personalized subtasks based on my habits. For instance, when I said, "Pack my package to go to Gia Lai," I wanted:
- My hat
- My skincare box
- My shoes
But it generated generic subtasks like:
- 📦 Get a sturdy box (right size for your items)
- đź“ś Prepare cushioning materials (bubble wrap, foam, paper)
- 🎀 Get sealing supplies (packing tape, rope, zip ties)
- 🏷 Prepare labels & markers (to write addresses & handling instructions)
- Reminder Updates: If a task was due today but had an outdated reminder, the app couldn’t adjust it dynamically based on importance or timing.
What To Do Assistant Should Look Like
I’m planning a more powerful version of the app, tentatively called "To Do Assistant," to act as a true personal assistant. Here’s what I envision:
- Personalized Task Generation: Fine-tune a model using my 1000+ Microsoft To Do tasks to create tasks tailored to me.
- Efficient Model: Use a small, CPU-friendly model (e.g., LLaMA 1B with GGUF conversion) for fast performance.
- Advanced Attributes: Generate tasks with importance, reminder time, due date, task order, and time blocks.
- Smart Subtasks: Create subtasks based on my past tasks, designed to help me complete them effectively (e.g., "mouse trap" tasks—specific, actionable steps).
- Dynamic Reminders: Automatically update reminder times based on due dates and task importance.
Finetuning the Model
The Model
- Choice: I’ll use Meta’s LLaMA 3.2 1B—a small, fast model ideal for simple text generation with JSON output.
- Finetuning: I already have a script for fine-tuning LLaMA models, so this should be straightforward.
- Optimization: Convert it to GGUF using LLaMA.cpp for quick inference (under 1 minute) on a CPU, avoiding GPU dependency.
The Data
My Microsoft To Do tasks provide a rich dataset. Key fields include:
-
'importance'
: 'normal' or 'high' -
'title'
: Task name -
'dueDateTime'
: Due date and time (tasks due today move to "My Day") -
'reminderDateTime'
: Reminder date and time -
'checklistItems'
: Subtask list -
'displayName'
: Subtask name
Example task 1:
{'@odata.etag': 'W/"wyYSbsYOaUCZPsQATrx1BgAF65hKYA=="',
'importance': 'high',
'isReminderOn': True,
'status': 'notStarted',
'title': 'Lấy đồ giặt',
'createdDateTime': '2025-02-24T06:04:01.7672011Z',
'lastModifiedDateTime': '2025-02-24T06:04:01.8412826Z',
'hasAttachments': False,
'categories': [],
'id': 'AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAEYAAAORlXbjKGFLSJiBLf4_KVkjBwDDJhJuxg5pQJk_xABOvHUGAAACARIAAADDJhJuxg5pQJk_xABOvHUGAAXrRkVZAAAA',
'body': {'content': '\r\n', 'contentType': 'text'},
'reminderDateTime': {'dateTime': '2025-02-24T13:30:00.0000000',
'timeZone': 'UTC'}}
Example task 2:
{'@odata.etag': 'W/"wyYSbsYOaUCZPsQATrx1BgAF7/WDuQ=="',
'importance': 'normal',
'isReminderOn': True,
'status': 'notStarted',
'title': 'Táşp cách phòng thủ boxing',
'createdDateTime': '2025-03-01T11:33:46.8008426Z',
'lastModifiedDateTime': '2025-03-02T06:49:30.8839298Z',
'hasAttachments': False,
'categories': [],
'id': 'AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAEYAAAORlXbjKGFLSJiBLf4_KVkjBwDDJhJuxg5pQJk_xABOvHUGAAACARIAAADDJhJuxg5pQJk_xABOvHUGAAXvowPnAAAA',
'body': {'content': '', 'contentType': 'text'},
'dueDateTime': {'dateTime': '2025-03-01T17:00:00.0000000', 'timeZone': 'UTC'},
'reminderDateTime': {'dateTime': '2025-03-02T11:00:00.0000000',
'timeZone': 'UTC'},
'checklistItems@odata.context': "https://graph.microsoft.com/v1.0/$metadata#users('chibao24.12.1999%40gmail.com')/todo/lists('AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAC4AAAORlXbjKGFLSJiBLf4_KVkjAQDDJhJuxg5pQJk_xABOvHUGAAACARIAAAA%3D')/tasks('AQMkADAwATMwMAItMTg4AGMtZmRiNC0wMAItMDAKAEYAAAORlXbjKGFLSJiBLf4_KVkjBwDDJhJuxg5pQJk_xABOvHUGAAACARIAAADDJhJuxg5pQJk_xABOvHUGAAXvowPnAAAA')/checklistItems",
'checklistItems': [{'displayName': 'Có bao nhiêu cách phòng thủ',
'createdDateTime': '2025-03-01T11:34:11.8487799Z',
'isChecked': False,
'id': 'ead45dd7-83f0-4181-80de-ff1c96119c2e'},
{'displayName': 'Coi tiktok',
'createdDateTime': '2025-03-01T11:34:18.0141856Z',
'isChecked': False,
'id': '1f7d9471-25a2-4af4-9232-03f1e3d5297b'},
{'displayName': 'Check youtube',
'createdDateTime': '2025-03-01T11:34:24.0323591Z',
'isChecked': False,
'id': '92fbe045-5aed-49c1-9821-9af6274326b6'}]}
The Flow
Here’s how I envision the fine-tuned model processing inputs, with outputs as JSON lists containing task details and priorities:
- Splitting Multiple Tasks: When I provide a long input (e.g., a "My Day" task title) combining multiple tasks, the model splits them into separate entries with attributes. This data can be pulled directly from Microsoft To Do.
Input: "go shopping at 9 o'clock, go to school"
Output: [
{
"importance": "normal",
"title": "Go shopping",
"dueDateTime": "2025-03-02T09:00:00.0000000",
"reminderDateTime": "2025-03-02T08:30:00.0000000",
"checklistItems": [],
},
{
"importance": "high",
"title": "Go to school",
"dueDateTime": "2025-03-02T08:00:00.0000000",
"reminderDateTime": "2025-03-02T07:30:00.0000000",
"checklistItems": [],
}
]
Here, "Go to school" gets (higher priority) due to an earlier time, while "Go shopping" should be done later
- Handling Clumsy Speech: For verbose or corrected inputs (e.g., from Whisper’s speech-to-text), the model extracts tasks, adjusts errors, and adds attributes with an order. Since I lack this data, I’ll generate 30% of the fine-tuning dataset using ChatGPT based on my existing tasks.
Input: "I want to go shopping at 8 o'clock, uhm, I'm sorry, at 9 o'clock and go to school at 7 AM"
Output: [
{
"importance": "normal",
"title": "Go shopping",
"dueDateTime": "2025-03-02T09:00:00.0000000",
"reminderDateTime": "2025-03-02T08:30:00.0000000",
"checklistItems": [],
},
{
"importance": "high",
"title": "Go to school",
"dueDateTime": "2025-03-02T07:00:00.0000000",
"reminderDateTime": "2025-03-02T06:30:00.0000000",
"checklistItems": [],
}
]
The model corrects "8 o'clock" to "9 o'clock" and prioritizes "Go to school" (order: 1
) due to its earlier time.
- Single Task Processing: For a simple input with one task, the model generates a single JSON entry with attributes and assigns it the top priority by default.
Input: "I want to go shopping at 9 o'clock"
Output: [
{
"importance": "normal",
"title": "Go shopping",
"dueDateTime": "2025-03-02T09:00:00.0000000",
"reminderDateTime": "2025-03-02T08:30:00.0000000",
"checklistItems": [],
}
]
The order
attribute ensures tasks are prioritized logically (e.g., based on time or importance), starting with 1 for the first task to complete, then 2, 3, and so on.
Sum Up
This plan outlines the evolution of my Task Separator into the To Do Assistant. By addressing the old app’s shortcomings and leveraging fine-tuning with my Microsoft To Do data, I aim to create a personalized, efficient assistant. Next steps: start fine-tuning the model and building the new app. Let’s see how it goes!
Top comments (1)
Love the idea of turning your Task Separator into a full-blown To Do Assistant! The personalized subtasks sound like a game-changer—can’t wait to hear how it turns out!