ChatML là định dạng văn bản chuẩn hóa dùng để đánh dấu các vai trò khác nhau trong cuộc hội thoại với mô hình ngôn ngữ lớn (LLM). Nó xác định rõ đâu là system prompt, đâu là tin nhắn của người dùng, đâu là câu trả lời của AI, giúp mô hình hiểu chính xác ngữ cảnh và vai trò của từng phần trong cuộc trò chuyện.
ChatML Là Gì?
ChatML (Chat Markup Language) là một cấu trúc văn bản được sử dụng để định dạng các tương tác giữa người dùng và AI trong các mô hình ngôn ngữ lớn. Nói đơn giản hơn, nó là cách bạn “đóng gói” thông điệp để mô hình hiểu được ai đang nói cái gì.
Nếu bạn từng dùng ChatGPT, bạn cũng thấy rằng mỗi thông điệp đều có vai trò (role) nhất định: system để thiết lập ngữ cảnh, user để đặt câu hỏi, và assistant để phản hồi. ChatML chính là cách text để biểu diễn các vai trò này, bằng các thẻ (tag) định dạng cụ thể.
Microsoft và một số nhà phát triển mô hình open-source sử dụng ChatML như cấu trúc chuẩn cho việc định dạng prompt. Nó đặc biệt phổ biến với các mô hình trong hệ sinh thái OpenAI và Azure OpenAI Service.
ChatML Hoạt Động Như Thế Nào?
ChatML sử dụng các thẻ <|im_start|> và <|im_end|> để phân tách các phần khác nhau trong cuộc hội thoại. Mỗi phần bắt đầu bằng thẻ mở, theo sau là tên vai trò, nội dung, và kết thúc bằng thẻ đóng.
Một ví dụ tiêu biểu:
<|im_start|>system
Bạn là một trợ lý AI hữu ích.<|im_end|>
<|im_start|>user
ChatML là gì?<|im_end|>
<|im_start|>assistant
ChatML là một định dạng văn bản...<|im_end|>Cấu trúc này thật đơn giản nhưng cực kỳ hiệu quả. Mô hình đọc từng phần, biết chính xác nội dung nào thuộc vai trò nào, từ đó phản hồi một cách phù hợp nhất.
Tại Sao ChatML Lại Quan Trọng?
Trước khi có ChatML, việc định dạng prompt khá lộn xộn. Mỗi mô hình dùng một cách khác nhau: có cái dùng [USER], có cái dùng Human:, có cái lại dùng dấu chấm dòng ngăn cách. Thiếu chuẩn chung, việc chuyển đổi giữa các mô hình mệt mỏi và dễ lỗi.
ChatML giải quyết vấn đề này bằng cách:
- Tiêu chuẩn hóa: Tất cả mô hình hỗ trợ ChatML đều hiểu cùng một định dạng, giảm lỗi chuyển đổi
- Rõ ràng vai trò: Không còn nhầm lẫn giữa system prompt và user input
- Bảo mật tốt hơn: Thẻ
<|im_end|>giúp ngăn chặn prompt injection, vì mô hình biết chính xác nơi đâu là kết thúc một thông điệp - Dễ parse: Code xử lý cuộc hội thoại chỉ cần tìm thẻ để tách nội dung
ChatML Khác Gì Với Các Định Dạng Khác?
Trong thế giới LLM, có nhiều định dạng hội thoại khác nhau. Mỗi hệ sinh thái có cách riêng:
ChatGPT API format: Dùng JSON với mảng messages, mỗi phần tử có role và content. Đây là định dạng API của OpenAI, phía sau đó là ChatML nhưng được bọc lại dưới dạng JSON để dễ sử dụng.
Llama chat format: Meta dùng [<role>] để đánh dấu các vai trò. Khác với ChatML ở cú pháp nhưng tương tự về mặt ý nghĩa.
Mistral format: Sử dụng [INST] và [/INST] để bọc nội dung người dùng, đơn giản hơn nhưng ít linh hoạt hơn.
ChatML nói riêng có ưu điểm là gần với định dạng mà OpenAI sử dụng, nên tương thích tốt với nhiều tool và framework trong hệ sinh thái.
Ví Dụ Thực Tế Về ChatML
Giả sử bạn xây dựng một chatbot trả lời câu hỏi về sản phẩm. Bạn muốn mô hình luôn tôn trọng, không bao giờ nói xấu, và trả lời bằng tiếng Việt. Đây là cách bạn dùng ChatML:
<|im_start|>system
Bạn là trợ lý chăm sóc khách hàng của công ty X.
Luôn lịch sự, trả lời bằng tiếng Việt, không hứa hẹn sai.
<|im_end|>
<|im_start|>user
Sản phẩm Y có bảo hành không?<|im_end|>Khi mô hình đọc được phần system trước, nó sẽ hiểu ngay bối cảnh mình đang trong vai trò nào. Sau đó khi đọc phần user, nó trả lời phù hợp với ngữ cảnh đã được thiết lập.
Một điều quan trọng: bạn có thể thêm nhiều lượt hội thoại vào trước đó, tạo thành context (ngữ cảnh) cho mô hình. Đây là cách để AI “nhớ” cuộc hội thoại trước đó.
Cài Đặt ChatML Trong Code
Khi code thực tế, bạn thường không viết tay từng thẻ. Mà thay vào đó, dùng API hoặc thư viện để xử lý. Ví dụ với Python và OpenAI API:
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Bạn là trợ lý AI."},
{"role": "user", "content": "ChatML là gì?"}
]
)Ở mặt sau, API chuyển đổi mảng messages này thành định dạng ChatML trước khi gửi vào mô hình. Bạn không cần lo lắng về định dạng text, chỉ cần gửi JSON là xong.
Nhưng nếu bạn chạy mô hình local (ví dụ với llama.cpp hay vLLM), bạn sẽ cần tự đóng gói nội dung thành ChatML trước khi feed vào mô hình. Đây là lúc hiểu rõ ChatML trở nên quan trọng.
Lợi Ích Của Việc Hiểu ChatML
Nếu bạn là developer, hiểu ChatML giúp bạn:
- Debug prompt hiệu quả hơn, biết chính xác mô hình nhận được gì
- Chuyển đổi giữa các mô hình dễ dàng hơn khi hiểu cấu trúc chung
- Tối ưu prompt tốt hơn, vì biết cách ngữ cảnh hoạt động
- Ngăn prompt injection bằng cách đảm bảo thẻ đóng đúng
Nếu bạn chỉ là người dùng cuối, bạn không cần tương tác trực tiếp với ChatML. Nhưng hiểu nó giúp bạn biết tại sao chatbot hỏi theo cách đó, và tại sao những prompt tương tự cho kết quả khác nhau.
Lời Kết
ChatML đơn giản chỉ là cách định dạng văn bản để phân biệt ai đang nói cái gì trong cuộc hội thoại với AI. Nó giống như việc đánh dấu “Người A:” và “Người B:” trong bản ghi chat, nhưng chuẩn hóa hơn và có thêm vai trò system.
Trong tương lai, khi AI Agent và multi-turn conversation trở nên phổ biến, việc có một định dạng chuẩn như ChatML sẽ còn quan trọng hơn. Nó không chỉ giúp mô hình hiểu chúng ta hơn, mà còn giúp các tool và framework làm việc với nhau trơn tru hơn.
Nếu bạn đang bắt đầu với LLM, đừng quan tâm quá về ChatML. API của các nhà cung cấp đã tự động xử lý. Nhưng khi bạn muốn đi sâu hơn vào prompt engineering hay chạy mô hình local, biết ChatML sẽ là lợi thế lớn.