Vì sao AI tính sai ngày Tết 2030, và mình viết skill để sửa thế nào
Mình hỏi Claude một câu tưởng dễ: "Mùng 1 Tết Nguyên Đán năm 2030 ở Việt Nam là ngày dương lịch nào?". Không cho dùng công cụ tra cứu, chỉ dùng những gì model đã biết.
Haiku, Sonnet và Opus đều trả lời 03/02/2030. Opus còn tự nhận chắc 90%.
Đáp án đúng là 02/02/2030. Ngày 03/02 là Tết của Trung Quốc.
Lịch âm phụ thuộc vào múi giờ
Lịch âm Việt Nam và Trung Quốc dùng chung một cách tính. Mỗi tháng bắt đầu vào ngày có điểm sóc, tức lúc Mặt Trăng nằm giữa Trái Đất và Mặt Trời. Tháng 11 âm lịch luôn là tháng chứa ngày đông chí. Năm nào có 13 tháng thì tháng đầu tiên không chứa trung khí là tháng nhuận.
Điểm sóc là một khoảnh khắc, còn nó rơi vào "ngày nào" thì tùy bạn đứng ở múi giờ nào. Lịch Việt Nam hiện tính theo giờ Hà Nội (UTC+7), lịch Trung Quốc tính theo giờ Bắc Kinh (UTC+8).
Khi điểm sóc rơi vào khoảng 23h đến nửa đêm giờ Hà Nội, ở Bắc Kinh đã là ngày hôm sau, nên tháng đó Việt Nam bắt đầu sớm hơn Trung Quốc một ngày. Đầu năm 2030 đúng là như vậy:
| Giờ Hà Nội | Giờ Bắc Kinh | |
|---|---|---|
| Điểm sóc tháng Giêng | 23h09 ngày 02/02 | 0h09 ngày 03/02 |
| Mùng 1 Tết | 02/02/2030 | 03/02/2030 |
Năm 2007 cũng thế: điểm sóc lúc 23h15 giờ Hà Nội, Việt Nam ăn Tết ngày 17/2, Trung Quốc ngày 18/2.
Mình viết thêm một đoạn script so hai lịch từng ngày từ 2000 đến 2050. Có 480 ngày âm lịch lệch nhau, nằm trong 18 năm: 2006–2009, 2018–2021, 2030–2032, 2034, 2037–2041 và 2049. Tất cả đều do tháng bắt đầu lệch một ngày.
Xa hơn thì còn có năm lệch hẳn một tháng. Năm 1985, lịch Việt Nam có tháng 2 nhuận, còn lịch Trung Quốc đã nhuận tháng 10 từ năm trước, nên Việt Nam ăn Tết ngày 21/1 còn Trung Quốc ngày 20/2. Ngay trong nước cũng từng có hai cái Tết: Tết Mậu Thân 1968, miền Bắc đã tính lịch theo UTC+7 nên giao thừa đêm 28 rạng sáng 29/1, còn miền Nam vẫn dùng lịch theo UTC+8 nên giao thừa muộn hơn một ngày.
Mình đoán AI trả lời theo lịch Trung Quốc vì lịch âm trên mạng phần lớn là của Trung Quốc, kể cả các thư viện lịch hay được dùng. Ngày thường thì không sao vì hai lịch trùng nhau. Nhưng đến đúng những ngày lệch, AI sai mà vẫn chắc như lúc đúng.
Mình hỏi thử 3 model
Ngày 7 và 8/11/2026, mình hỏi Claude Haiku, Sonnet và Opus, mỗi câu một lần, không cho dùng công cụ:
| Câu hỏi | Đáp án đúng | Haiku | Sonnet | Opus |
|---|---|---|---|---|
| Mùng 1 Tết 2030 ở Việt Nam | 02/02/2030 | 03/02 (sai) | 03/02 (sai) | 03/02 (sai) |
| Rằm tháng Giêng 2028 | 09/02/2028 | 11/02 (sai) | đúng | đúng |
| 4 câu đổi ngày, can chi, tháng nhuận | 4/4 | 4/4 | 4/4 |
Câu Rằm tháng Giêng 2028, Haiku trả lời sai mà vẫn tự chấm chắc 60%. Hỏi mỗi câu một lần thì chưa phải benchmark. Có điều Opus là bản mạnh nhất mà vẫn sai, và chỉ đọc câu trả lời thì không biết được là nó sai.
Agent Skills là gì
Agent Skills là một chuẩn mở để dạy agent làm một việc cụ thể. Mỗi skill là một thư mục có file SKILL.md, kèm script nếu cần:
skills/lich-am/
SKILL.md
scripts/lich_am.py
Đầu file SKILL.md có hai trường name và description. Lúc đầu agent chỉ đọc description. Khi câu hỏi của người dùng khớp (hỏi về âm lịch, ngày Tết, can chi...) thì nó mới đọc phần còn lại, nên cài nhiều skill cũng không tốn context.
Phần thân của skill lịch âm khá ngắn, ý chính nằm ở đoạn đầu:
Không bao giờ tự nhẩm ngày âm lịch: lịch âm phụ thuộc thời điểm trăng mới theo múi giờ
Việt Nam (+7) và có tháng nhuận, nên đoán rất dễ sai. Luôn chạy script:
Nên agent sẽ chạy lệnh này chứ không trả lời theo trí nhớ nữa:
$ python scripts/lich_am.py duong-sang-am 2030-02-02
duong_lich: 2030-02-02
thu: Thứ Bảy
am_lich: 01/01/2030
ngay_am: 1
thang_am: 1
nam_am: 2030
thang_nhuan: False
can_chi_ngay: Mậu Thìn
can_chi_thang: Mậu Dần
can_chi_nam: Canh Tuất
le: ['Tết Nguyên Đán (mùng 1)']
Skill chạy được với Claude Code, Codex, Cursor, Gemini CLI, OpenCode và các agent theo chuẩn này.
Script tính lịch
Script dùng thuật toán của Hồ Ngọc Đức, dựa trên công thức thiên văn trong sách Astronomical Algorithms của Jean Meeus. Các bước chính:
- Tính thời điểm điểm sóc thứ k, rồi đổi ra ngày theo múi giờ.
- Tìm tháng 11 âm lịch, tức tháng chứa ngày đông chí.
- Nếu giữa hai tháng 11 liên tiếp có 13 tháng, tìm tháng đầu tiên không chứa trung khí và đánh dấu nó là tháng nhuận.
Chỗ phụ thuộc múi giờ chỉ nằm ở một hằng số:
TZ = 7.0
def new_moon_day(k: int) -> int:
return int(new_moon(k) + 0.5 + TZ / 24)
Đổi TZ thành 8.0 là ra lịch Trung Quốc. Script chỉ dùng thư viện chuẩn của Python và chạy offline.
Test thế nào
Thuật toán thiên văn khó kiểm bằng mắt, nên mình kiểm từ nhiều phía:
- Đổi qua đổi lại từng ngày từ 2020 đến 2032. Dương sang âm rồi âm sang dương phải ra đúng ngày ban đầu.
- So với ngày Tết các năm đã biết, có cả 2007 và 2030.
- Tính lại Tết 2007 và 2030 với
TZ = 8, kết quả phải ra đúng ngày của Trung Quốc. Test này để chắc script thật sự đang tính theo giờ Việt Nam chứ không phải tình cờ khớp.
@pytest.mark.parametrize("year, china", [(2007, date(2007, 2, 18)), (2030, date(2030, 2, 3))])
def test_china_timezone_gives_a_different_tet(monkeypatch, year, china):
monkeypatch.setattr(lich_am, "TZ", 8.0)
assert lich_am.lunar_to_solar(1, 1, year) == china
CI chạy bộ test trên Windows, macOS và Linux.
Skill thứ hai: văn bản hành chính
Repo còn một skill soạn văn bản hành chính theo Nghị định 30/2020/NĐ-CP. Mình nhờ cả ba model soạn một công văn rồi chấm theo 10 tiêu chí thể thức: Haiku được 8/10, Sonnet 9/10, Opus 10/10. Haiku đặt Quốc hiệu sai chỗ, in nghiêng phần trích yếu và tự đặt ký hiệu "CV". Có skill thì Haiku cũng đạt 10/10.
Cài đặt
npx skills add Khanh1916/viet-skill --all -g
Lệnh này cần Node.js 22.20 trở lên. Không dùng Node thì tải repo về rồi chép các thư mục trong skills/ vào thư mục skill của agent, với Claude Code là ~/.claude/skills/.
Sắp tới
Mình định làm tiếp:
- Xuất ngày giỗ, rằm, mùng 1 ra file
.icsđể đưa vào Google Calendar hay lịch điện thoại. - Thêm lịch nghỉ Tết và nghỉ lễ chính thức của từng năm.
- Cho skill văn bản hành chính xuất thẳng file Word.
Bạn thấy AI trả lời sai chuyện gì khác về Việt Nam thì mở issue trên GitHub, kèm câu hỏi và câu trả lời của nó. Mình sẽ hỏi lại trên vài model, sai thật thì làm skill.
All rights reserved