Hành trình xây dựng trợ lý AI cá nhân: Phần 2 - Tối ưu hóa và chia nhỏ nhiệm vụ
Trong phần tiếp theo của hành trình xây dựng trợ lý AI Fernão, tôi đã thay đổi kiến trúc lấy lịch từ ICS sang API Google Calendar để tăng tốc độ xử lý đáng kể. Bài viết cũng giới thiệu module "Task Breaker" mới có khả năng phân chia các nhiệm vụ lớn phức tạp thành các bước hành động nhỏ gọn, dễ quản lý và tự động đồng bộ vào Microsoft To-Do.

Có lẽ bạn còn nhớ phần đầu tiên trong hành trình xây dựng Fernão – trợ lý AI cá nhân của tôi. Đã đến lúc tiếp tục câu chuyện và đi sâu vào phần thứ hai!
Trong bài viết này, tôi sẽ hướng dẫn bạn qua những cải tiến mới nhất cho Fernão, bao gồm việc tinh chỉnh các tính năng hiện có và thêm các khả năng mới cho agent. Hãy bắt đầu với những gì đã thay đổi.
Tối ưu hóa việc lấy dữ liệu lịch với Google Calendar API
Bạn còn nhớ hàm dùng để lấy lịch qua ICS (định dạng lịch phổ thông) và trích xuất các nhiệm vụ trong lịch không?
Hàm đó thực sự lộn xộn và phản ánh một quyết định kiến trúc tồi. Các lịch ICS không hỗ trợ lọc trực tiếp, nghĩa là mọi yêu cầu đều yêu cầu kéo tất cả các sự kiện từ lịch và sau đó mới lọc. Thực tế cho thấy, Fernão đang tải xuống toàn bộ lịch trình của tôi chỉ để lấy ra vài cuộc họp liên quan.
Điều này giống như việc mang cả một thư viện về nhà chỉ để tìm một câu duy nhất trong một cuốn sách.
Càng cố gắng tối ưu hóa hàm, tôi càng thấy bế tắc, bởi vì tôi cần một giải pháp hệ thống mới. Tôi cần thay đổi cách hệ thống lấy lịch và tôi sẽ KHÔNG bao giờ thoát khỏi điểm nghẽn này nếu cứ dùng ICS.
Vì vậy, tôi đã tìm hiểu sâu hơn và phát hiện ra rằng Google cung cấp quyền truy cập lịch thông qua một API hỗ trợ lọc trực tiếp. Giờ đây, Fernão chỉ truy xuất những sự kiện mà nó thực sự cần. Điều này đã cải thiện việc tạo lịch trình, thời gian xử lý giảm từ gần năm phút xuống chỉ khoảng hai mươi giây.
Tối ưu hóa Google Calendar API
Với đường dẫn dữ liệu (pipeline) mới này, tôi cũng đã tái cấu trúc logic xung quanh. Toàn bộ hàm giờ đây sạch sẽ và nhanh hơn nhiều. Đây là cách chúng ta lấy sự kiện lịch qua API:
def get_events_for_date(target_date=None, use_api=True):
"""
Fetches events for a specific date from Google Calendar.
Tries API first (if use_api=True), falls back to ICS if API fails.
Args:
target_date: datetime.date object for the target day. If None, uses today.
use_api: If True, try Google Calendar API first. If False, use ICS only.
Returns:
List of event dictionaries.
"""
if use_api and GCAL_API_AVAILABLE:
print("[GCal] Attempting to use Google Calendar API...")
try:
events = get_events_for_date_api(target_date)
if events is not None:
print(f"[GCal] Successfully fetched {len(events)} events via API")
return events
else:
print("[GCal] API returned None. Falling back to ICS...")
except Exception as e:
print(f"[GCal] API failed with error: {e}")
print("[GCal] Falling back to ICS...")
# Fallback to ICS
print("[GCal] Using ICS feed method...")
return get_events_for_date_ics(target_date)
Đồng bộ nhiệm vụ và tư duy về "Hệ điều hành cá nhân"
Ngoài những cải tiến ở back-end, tôi cũng đã thêm các tính năng mới cho trợ lý.
Trong chế độ xem lịch trình (Schedule view), giờ đây tôi có thể đánh dấu các nhiệm vụ là đã hoàn thành. Điểm thú vị là khi tôi làm điều đó, chúng sẽ tự động được đồng bộ với ứng dụng Microsoft To-Do.
Thật tuyệt vời!
Điều này khiến tôi suy nghĩ rằng, theo thời gian, nhiều người trong chúng ta sẽ tự xây dựng những "hệ điều hành cá nhân" (personal operating systems) của riêng mình, lắp ghép các quy trình công việc từ các công cụ ưa thích, tích hợp những gì chúng ta cần và thay thế các thành phần bất cứ khi nào có tùy chọn tốt hơn xuất hiện. Nếu các tính năng trở nên dễ dàng sao chép, lòng trung thành đối với các nền tảng cụ thể sẽ suy giảm.
Điều này cũng đặt ra một câu hỏi thú vị: Liệu các công ty có cuối cùng sẽ cố gắng khóa chặt hệ thống của họ bằng cách hạn chế API và các tích hợp bên ngoài không? Có thể. Nhưng việc tự cô lập mình khó có thể thành công trong dài hạn. Nếu người dùng không thể kết nối công cụ vào quy trình làm việc của riêng họ, họ sẽ đơn giản là chuyển sang nơi khác (... và liệu đây có phải là hành vi chỉ dành cho người dùng chuyên nghiệp không?).
Với khả năng mới này trong Schedule Maker, tôi đã tiếp tục triển khai một tính năng khác cho Fernão theo đề xuất của một độc giả.
Giới thiệu: Task Breaker (Module chia nhỏ nhiệm vụ)
Vai trò mới của Fernão là phá vỡ các nhiệm vụ – Ảnh của Tác giả – Tạo bởi Gemini
Task Breaker tuân theo quy trình làm việc đơn giản:
- Bắt đầu với một nhiệm vụ lớn, chung chung trong Microsoft To Do.
- Thêm ngữ cảnh về cách nhiệm vụ nên được chia nhỏ.
- Fernão phân giải nhiệm vụ và xây dựng một kế hoạch.
- Các nhiệm vụ kết quả được lưu lại vào To Do với ngày đến hạn, sau đó xuất hiện trong trợ lý hàng ngày.
Giao diện Task Breaker
Hãy xem một ví dụ thực tế. Một trong những nhiệm vụ lớn nằm trong danh sách To Do của tôi là "Tài liệu Dự án tại DareData." Đây không phải là một nhiệm vụ vận hành nhỏ, mà là một dự án mang tính cấu trúc.
Mục tiêu là củng cố và chính thức hóa kiến thức nội bộ của công ty trên Notion, đảm bảo các câu hỏi chính về doanh nghiệp được trả lời rõ ràng trong Knowledge Hub của chúng tôi. Điều đó có nghĩa là xem xét mọi bộ phận, xác định các khoảng trống, tạo hoặc tinh chỉnh các trang, cấu trúc thông tin đúng cách và giao quyền sở hữu rõ ràng cho từng phần.
Thực tế, việc này yêu cầu kiểm toán, viết văn và các quyết định quản trị. Đó không phải là điều bạn có thể "chỉ cần làm" trong một lần ngồi và tôi muốn hoàn thành việc này trong ba tuần. Thực tế, tôi có thể dành từ 30 phút đến một tiếng mỗi ngày.
Đây chính là loại nhiệm vụ hưởng lợi từ việc phân giải, vì vậy tôi sẽ sử dụng một số thông tin ngữ cảnh trong Task Breaker và chuyển nhiệm vụ khổng lồ này thành một kế hoạch hành động:
"Tôi đang xây dựng Knowledge Hub của chúng tôi trên Notion. Đây là cấu trúc hiện tại của Notion và các Bộ phận... Tôi sẽ cần xem qua Mọi bộ phận... Đảm bảo mọi trang đều có một Người chịu trách nhiệm... Tôi có khoảng 30 phút đến 1 tiếng để làm việc mỗi ngày và muốn hoàn thành dự án này vào ngày 7 tháng 3 năm 2026."
Sau khi nhấn "breakdown" (phân rã), Fernão sẽ bắt đầu "rèn" nhiệm vụ:
Fernão đang xử lý nhiệm vụ
Tuyệt vời x2!
Kết quả phân rã nhiệm vụ
Chúng ta giờ đây có thể xem xét các nhiệm vụ và kế hoạch được tạo ra, sau đó gửi chúng đến Microsoft To-Do của tôi. Tôi cũng cần chỉ định danh sách nào trong Microsoft To-Do mà chúng sẽ được gán vào.
Trong khi kiểm thử tính năng này, tôi nhận ra mình muốn điều chỉnh hai điều.
Thứ nhất, Fernão được thiết kế là một nhà biên niên sử thời trung cổ, không phải một chiến binh giả tưởng, vì vậy tôi sẽ thay đổi thiết kế "rèn" nhiệm vụ. Trang phục của anh ấy nên mang cảm giác thời trung cổ hơn.
Thứ hai, trên một khía cạnh thực tế hơn, tôi cần một nút "Submit All" (Gửi tất cả). Việc gửi nhiệm vụ từng cái một rất tốn thời gian, đặc biệt là khi chia nhỏ các dự án lớn.
Sau khi thực hiện những thay đổi này, hãy chia nhỏ một nhiệm vụ khác:
Fernão giờ đây đang rèn trong một chiếc áo choàng thời trung cổ chuẩn chỉnh. Và giờ chúng ta cũng có thể sử dụng nút "Submit All" tiện lợi:
Việc xây dựng tính năng mới này cho Fernão thực sự rất hài lòng. Nếu bạn có ý tưởng về các tính năng bổ sung, tôi rất mong nhận được đề xuất!
Dưới đây là prompt hiện tại tôi đang sử dụng để phân chia nhiệm vụ:
name: task_breakdown
description: Break down a task into 20-minute actionable subtasks
max_tokens: 4096
variables:
- task_name
- task_context
- current_date
template: |
You are a productivity expert helping break down complex tasks into manageable 20-minute chunks.
**CURRENT DATE:** {current_date}
**TASK TO BREAK DOWN:**
{task_name}
**CONTEXT PROVIDED BY USER:**
{task_context}
**YOUR JOB:**
Break this task into specific, actionable subtasks that can each be completed in approximately 20 minutes.
**RULES:**
1. Each subtask should be concrete and actionable (starts with a verb)
2. Each subtask should take ~20 minutes (can be 15-25 min, but aim for 20)
3. Subtasks should follow a logical order
4. Be specific - avoid vague tasks like “work on X”
5. If the task is already small enough, you can create 1-3 subtasks
6. If it’s large, create > 5 subtasks
7. Consider the context provided - use it to make subtasks relevant and specific
8. **SCHEDULING:** Based on the user’s context (e.g., “every other day”, “weekends only”), suggest a specific Due Date for each task starting from the Current Date.
**OUTPUT FORMAT:**
Return ONLY a markdown list of subtasks in this format:
- {task_name} - [Subtask description] (20 min) [Due: YYYY-MM-DD]
...
Do NOT include any other text or explanations. Just the list.
Song song với đó, tôi đã đang làm việc trên một số module mới:
- Một Dividend Analyzer để dự báo thu nhập từ cổ phiếu và ETF của tôi.
- Một Writing Assistant để tạo kế hoạch biên tập cho các bài viết của mình.
- Một module Discounts để kiểm tra các khuyến mãi liên quan khi tôi đang lập kế hoạch mua sắm.
- Một Guitar Organizer để cấu trúc và lên lịch các buổi tập bất cứ khi nào tôi cầm guitar.
Hãy theo dõi các module tiếp theo và hy vọng điều này truyền cảm hứng cho các dự án cá nhân của bạn!
Bài viết liên quan

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026

Công nghệ
Spotify thắng kiện 322 triệu USD từ nhóm pirate Anna's Archive nhưng đối mặt với bài toán thu hồi
16 tháng 4, 2026
