AI cho người mớiHướng dẫn
Kiểm tra prompt của bạn trên 20 trường hợp: chấm điểm khớp chính xác bằng Python
Xây dựng bộ kiểm tra 20 trường hợp, chấm điểm một prompt bằng khớp chính xác với một script Python ngắn, và xem liệu thay đổi prompt có thực sự giúp ích không.

Trên trang này
Prompt của bạn đã chạy đúng trên hai tin nhắn bạn thử. Điều đó có nghĩa là nó hoạt động? Chưa đâu. Hãy chạy nó trên 20 tin nhắn thực tế với đáp án đã biết, đếm xem nó đúng bao nhiêu, và đọc những cái nó làm sai. Một đoạn script Python ngắn sẽ làm việc đếm, và khi bạn thay đổi prompt, chính script đó cho bạn biết thay đổi có giúp ích không thay vì để bạn cảm tính.
Tài liệu của Anthropic về định nghĩa tiêu chí thành công và xây dựng đánh giá (kiểm tra ngày 7 tháng 11 năm 2026) diễn đạt theo cách của họ: hãy làm cho các bài kiểm tra cụ thể cho tác vụ của bạn, bao gồm các trường hợp khó xử, và ưu tiên nhiều câu hỏi được chấm tự động hơn là một vài câu chấm tay. Dưới đây là phiên bản nhỏ nhất của điều đó mà bạn có thể chạy ngay hôm nay.

Xây dựng bộ kiểm tra: 20 tin nhắn và đáp án bạn mong đợi#
Giả sử bạn phân loại tin nhắn khách hàng thành ba nhóm: tích cực, tiêu cực hoặc hỗn hợp. Mở một tệp có tên cases.csv và ghi ra 20 tin nhắn bạn thực sự có thể nhận được, mỗi tin nhắn kèm nhãn mà bạn sẽ gán cho nó. Hãy viết nhãn trước khi bạn chạy bất cứ thứ gì. Nếu bạn sao chép câu trả lời của mô hình làm "đúng", bài kiểm tra chỉ có thể đồng ý với mô hình.
text,label
"Arrived a day early and works perfectly. Thank you!",positive
"The charger stopped working after two days.",negative
"Great screen, but the battery barely lasts until lunch.",mixed
"Support answered in five minutes and fixed it.",positive
"I waited three weeks and nobody replied.",negative
"Oh great, another update that deletes my settings.",negative
"Nice design. Pity about the price.",mixed
"Exactly what I ordered.",positive
"The box was crushed, but the headphones inside are fine and sound great.",mixed
"Refund took 10 days. Never again.",negative
"Love it!!",positive
"Cheaply made, but honestly it does the job for the price.",mixed
"Worst purchase of the year.",negative
"Five stars. Would buy again.",positive
"Fast delivery, wrong colour.",mixed
"It's fine. Not amazing, not terrible.",mixed
"Zero issues in six months of daily use.",positive
"The app crashes every time I open the camera.",negative
"Thanks for nothing.",negative
"Setup was a pain, but once it ran, it's been rock solid.",mixedHãy xem sự phân bố: 6 tích cực, 7 tiêu cực, 7 hỗn hợp. Những câu mỉa mai ("Oh great, another update…", "Thanks for nothing.") và câu ranh giới ("It's fine. Not amazing, not terrible.") được đưa vào có chủ đích. Một bộ chỉ gồm các tin nhắn rõ ràng sẽ đạt 100% và không dạy bạn điều gì. Hãy lấy các tin nhắn thực tế từ hộp thư, phiếu hỗ trợ hoặc bản xuất trò chuyện của chính bạn; các trường hợp ranh giới chính là những cái bạn đã biết là khó chịu.
Tại sao là 20? Đây là kích thước khởi đầu, không phải con số từ tài liệu (ví dụ của họ dùng 1.000 tweet). Hai mươi đủ nhỏ để viết tay trong nửa giờ và đủ lớn để một câu trả lời may mắn không quyết định điểm số.
Script: gửi từng trường hợp, so sánh, in ra các trường hợp sai#
Kế hoạch có bốn bước, và mã theo đúng từng dòng.
Sắp xếp thứ tự
Đặt vòng lặp đánh giá theo thứ tự
Kéo các mục hoặc dùng mũi tên
- Tải 20 trường hợp từ CSV
- Gửi từng tin nhắn đến mô hình với prompt của bạn
- So sánh câu trả lời với nhãn của bạn
- In độ chính xác và các trường hợp thất bại
Vòng lặp chỉ hoạt động khi nhãn tồn tại trước lần gọi mô hình đầu tiên, và các thất bại xuất hiện cuối cùng vì đó là những gì bạn đọc và hành động.
Cài SDK bằng pip install openai và giữ khóa trong biến môi trường có tên CHEAPTOKENS_. Bất kỳ API tương thích OpenAI nào cũng hoạt động tương tự; ở đây script trỏ đến CheapTokens và GLM-5.3-Flash (chi tiết thiết lập có trong tài liệu).
import csv
import os
from openai import OpenAI
client = OpenAI(
base_url='https://api.cheaptokens.dev/v1',
api_key=os.environ['CHEAPTOKENS_API_KEY'],
)
MODEL = 'zai-org/GLM-5.3-Flash'
PROMPT = (
'Classify the customer message as positive, negative or mixed. '
'Answer with one word only.'
)
def ask(text):
r = client.chat.completions.create(
model=MODEL,
temperature=0,
max_tokens=100,
messages=[
{'role': 'system', 'content': PROMPT},
{'role': 'user', 'content': text},
],
)
return r.choices[0].message.content or ''
with open('cases.csv', newline='', encoding='utf-8') as f:
cases = list(csv.DictReader(f))
correct, failed = 0, []
for case in cases:
got = ask(case['text'])
ok = got.strip().strip('.').lower() == case['label']
correct += ok
if not ok:
failed.append((case['text'], case['label'], got.strip()))
print(f'Accuracy: {correct}/{len(cases)} = {correct / len(cases):.0%}')
for text, want, got in failed:
print(f'- {text!r}: expected {want}, got {got!r}')Ba chi tiết đáng để xem lại.
temperature=0giữ câu trả lời ổn định nhất có thể, để thay đổi về điểm số đến từ prompt của bạn chứ không phải từ may mắn.max_tokens=100là quá nhiều so với một nhãn một từ. Nếu câu trả lời trả về trống hoặc bị cắt, hãy kiểm trafinish_reason; hướng dẫn về finish_reason "length" chỉ ra cần tăng gì.- Dòng chấm điểm là công thức của tài liệu,
strip().lower()so với đáp án đúng, cộng thêm một điều: nó cũng bỏ dấu chấm cuối câu, vì "Negative." và "negative" là cùng một câu trả lời đối với bạn.
Bạn thấy gì khi nó chạy? Một dòng độ chính xác, sau đó mỗi trường hợp sai một dòng. Giả sử lần chạy đầu in ra thế này:
Accuracy: 14/20 = 70%
- 'Oh great, another update that deletes my settings.': expected negative, got 'positive'
- "It's fine. Not amazing, not terrible.": expected mixed, got 'positive'
…(Các con số ở đây là giả định để cho thấy hình dạng đầu ra; của bạn sẽ khác.) Mỉa mai và cách diễn đạt ranh giới là loại tin nhắn mà một prompt ngắn có xu hướng bỏ sót. Điểm mấu chốt là bạn không còn đoán nữa: bạn có một danh sách.
Thay đổi một thứ, chạy lại#
Giờ là phần hữu ích. Đọc các trường hợp sai, chọn một nguyên nhân, thay đổi prompt ở một chỗ và chạy lại. Mỗi lần một thay đổi, nếu không bạn sẽ không biết chỉnh sửa nào làm thay đổi điểm số.
So sánh
Prompt v1 → v2: thêm một quy tắc và hai ví dụ
v1
Classify the customer message as positive, negative or mixed.
Answer with one word only.v2
Classify the customer message as positive, negative or mixed.
Sarcasm counts as negative. Praise plus a complaint is mixed.
Answer with one word only.
Message: Lovely colour, but it arrived with a scratch.
Answer: mixed
Message: Sure, thanks a lot. Now my order is lost.
Answer: negativeHai ví dụ là bịa ra, và đó là có chủ đích. Không bao giờ đưa một tin nhắn từ cases.csv vào prompt làm ví dụ: mô hình sẽ được chấm trên một câu trả lời bạn đã đưa cho nó, và điểm số sẽ bị thổi phồng. Đây là kỹ thuật few-shot; bộ kiểm tra là thứ cho bạn biết liệu nó có đáng giá. Nếu prompt v1 của bạn vẫn còn mơ hồ, cách viết một prompt tốt là nơi để bắt đầu trước khi bạn đo lường.
Dán v2 vào PROMPT (dấu ba ngoặc kép hoạt động cho nhiều dòng) và chạy lại script. Giả sử nó in ra Accuracy: 17/. Thêm ba trường hợp đúng, vậy v2 có vẻ tốt hơn. Tin được bao nhiêu? Mỗi trường hợp đáng 5 điểm trong bộ 20 trường hợp, vậy 70% → 85% là ba tin nhắn. Đó là một gợi ý tốt, không phải bằng chứng. Nếu điểm giảm, bạn đã học được điều gì đó cũng quý giá và tránh được việc tung ra một prompt tệ hơn.
Cùng bộ, mô hình khác: nó có giữ được điểm không?#
Cùng một tệp trả lời câu hỏi thứ hai: bạn có đang trả tiền cho mô hình mạnh hơn mức tác vụ này cần không? Thay đổi một dòng và chạy lại:
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'Nếu độ chính xác trên 20 trường hợp của bạn khớp, bạn có câu trả lời cho tác vụ này, từ dữ liệu của chính bạn chứ không phải từ bảng xếp hạng. Nếu nó giảm, hãy xem những tin nhắn nào bị hỏng trước khi quyết định bất cứ điều gì.
Tất cả những thứ này tốn bao nhiêu? Giả sử khoảng 150 token đầu vào mỗi trường hợp (hướng dẫn cộng tin nhắn) và khoảng 5 token đầu ra cho một nhãn một từ. Đó là 3.000 đầu vào và 100 đầu ra token mỗi lần chạy 20 trường hợp, tức là $0.000064 trên GLM-5.3-Flash. Mười lần chạy lại bộ này là 200 yêu cầu; bảng dưới đây cho thấy khối lượng công việc đó cho mọi mô hình, với OpenRouter bên cạnh. Ở khối lượng này, tính cả đầu vào và đầu ra, mọi mô hình trong bảng đều có giá thấp hơn giá tham chiếu của OpenRouter.
| Mô hình | Đầu vào $/1M | Đầu ra $/1M | Mỗi yêu cầu | 200 yêu cầu | OpenRouter, 200 yêu cầu |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.0000032 | $0.00064 | $0.0011 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.0000028 | $0.00055 | $0.0022 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0000083 | $0.0017 | $0.0198 |
150 token đầu vào và 5 token đầu ra mỗi yêu cầu. Giá trên 1 triệu token là giá hiện hành và thay đổi cùng với biểu phí của chúng tôi; cột OpenRouter hiển thị giá tham chiếu cho cùng khối lượng công việc.
Hai trong số đó được dùng trong bài viết này: GLM-5.3-Flash có ngữ cảnh 390K và tối đa 8.192 token đầu ra mỗi câu trả lời; DeepSeek-V4-Flash có ngữ cảnh 380K và tối đa 32.768 token đầu ra, một mức giá bất kể giờ nào trong ngày, và cùng số dư như mọi mô hình khác. Giá hiện tại có trên trang giá, danh sách đầy đủ có trong mô hình.
Nơi khớp chính xác ngừng hoạt động#
Khớp chính xác hoạt động vì câu trả lời đúng là một từ từ danh sách cố định. Với đầu ra mở như tóm tắt, viết lại hoặc giải thích, không có một chuỗi duy nhất để so sánh. Tài liệu mô tả một cách khác, chấm điểm bằng mô hình, và khuyến nghị dùng một mô hình khác làm người chấm so với mô hình đã viết câu trả lời. Dù sao hãy bắt đầu với khớp chính xác: ở đâu bạn có thể buộc một câu trả lời ngắn, cố định, đó là bài kiểm tra rẻ nhất và rõ ràng nhất bạn có thể chạy. Quy tắc ngón tay cái của tài liệu là nhiều câu hỏi được chấm tự động hơn thì tốt hơn ít câu chấm tay.
Một thói quen nữa: khi v2 ngừng cải thiện, đừng tiếp tục mài giũa trên cùng 20 tin nhắn. Thêm 5–10 tin nhắn mới, lý tưởng là các trường hợp sai thực tế từ production, và chạy lại.
Kiểm tra nhanh
v2 đạt 17/20 và v1 đạt 15/20 trên cùng các trường hợp. Kết luận an toàn nhất là gì?
Hiện đáp án
Trả lời: v2 có vẻ tốt hơn, nhưng hai trường hợp trên 20 là khoảng cách nhỏ: thêm trường hợp mới và chạy lại
Mỗi trường hợp là 5 điểm, vậy khoảng cách hai trường hợp là tín hiệu để xem xét kỹ hơn, không phải phán quyết. Các trường hợp mới mà v2 chưa từng thấy là bước kiểm tra tiếp theo.



