AI สำหรับผู้เริ่มต้นคู่มือ
ทดสอบพรอมต์ของคุณกับ 20 เคส: การให้คะแนนแบบ exact match ใน Python
สร้างชุดทดสอบ 20 เคส ให้คะแนนพรอมต์ด้วย exact match ด้วยสคริปต์ Python สั้น ๆ และดูว่าการเปลี่ยนพรอมต์ช่วยได้จริงหรือไม่

ในหน้านี้
พรอมต์ของคุณทำงานได้กับข้อความสองข้อความที่คุณลอง นั่นหมายความว่ามันใช้ได้หรือยัง? ยังครับ รันมันกับข้อความจริง 20 ข้อความที่มีคำตอบที่รู้อยู่แล้ว นับว่าตอบถูกกี่ข้อ แล้วอ่านข้อที่มันพลาด สคริปต์ Python สั้น ๆ ตัวหนึ่งทำหน้าที่นับ และเมื่อคุณเปลี่ยนพรอมต์ สคริปต์เดิมจะบอกคุณว่าการเปลี่ยนแปลงนั้นช่วยได้จริงหรือไม่ แทนที่จะปล่อยให้เป็นเรื่องของความรู้สึก
เอกสารของ Anthropic เรื่อง defining success criteria and building evaluations (ตรวจสอบเมื่อ 7 พฤศจิกายน 2026) พูดไว้ด้วยคำของตัวเองว่า: ทำให้การทดสอบเจาะจงกับงานของคุณ รวมกรณีที่ awkward ไว้ด้วย และเลือกใช้คำถามที่ให้คะแนนอัตโนมัติจำนวนมากกว่าคำถามที่ให้คะแนนด้วยมือเพียงไม่กี่ข้อ ด้านล่างคือเวอร์ชันที่เล็กที่สุดของแนวทางนั้นที่คุณรันได้วันนี้

สร้างชุดทดสอบ: 20 ข้อความและคำตอบที่คุณคาดหวัง#
สมมติว่าคุณจัดข้อความจากลูกค้าออกเป็นสามกอง: positive, negative หรือ mixed เปิดไฟล์ชื่อ cases.csv แล้วเขียนข้อความ 20 ข้อความที่คุณมีโอกาสได้รับจริง แต่ละข้อความพร้อมป้ายกำกับที่ คุณ จะให้ เขียนป้ายกำกับก่อนที่คุณจะรันอะไรทั้งสิ้น ถ้าคุณลอกคำตอบของโมเดลมาเป็น "คำตอบที่ถูก" การทดสอบก็ได้แต่เห็นด้วยกับโมเดลเท่านั้น
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.",mixedดูการกระจาย: positive 6, negative 7, mixed 7 ประโยคประชด ("Oh great, another update…", "Thanks for nothing.") และประโยคก้ำกึ่ง ("It's fine. Not amazing, not terrible.") ถูกใส่ไว้โดยตั้งใจ ชุดที่ประกอบด้วยข้อความชัดเจนเท่านั้นจะได้ 100% และไม่สอนอะไรคุณเลย เอาข้อความจริงจากกล่องจดหมาย ตั๋ว หรือไฟล์ export แชทของคุณเอง ส่วน edge case คือสิ่งที่คุณรู้อยู่แล้วว่าปวดหัว
ทำไมต้อง 20? มันคือขนาดเริ่มต้น ไม่ใช่ตัวเลขจากเอกสาร (ตัวอย่างของพวกเขาใช้ทวีต 1,000 รายการ) ยี่สิบเล็กพอที่จะเขียนด้วยมือในครึ่งชั่วโมง และใหญ่พอที่คำตอบโชคดีเพียงข้อเดียวจะไม่ตัดสินคะแนน
สคริปต์: ส่งแต่ละเคส เปรียบเทียบ แล้วพิมพ์รายการที่พลาด#
แผนมีสี่ขั้นตอน และโค้ดทำตามทีละบรรทัด
เรียงลำดับ
เรียงลำดับลูป eval
ลากรายการหรือใช้ลูกศร
- โหลด 20 เคสจาก CSV
- ส่งแต่ละข้อความไปยังโมเดลพร้อมพรอมต์ของคุณ
- เปรียบเทียบคำตอบกับป้ายกำกับของคุณ
- พิมพ์ความแม่นยำและเคสที่ล้มเหลว
ลูปจะทำงานได้ก็ต่อเมื่อป้ายกำกับมีอยู่ก่อนการเรียกโมเดลครั้งแรก และความล้มเหลวอยู่ท้ายสุดเพราะนั่นคือสิ่งที่คุณอ่านและลงมือทำ
ติดตั้ง SDK ด้วย pip install openai และเก็บคีย์ไว้ใน environment variable ชื่อ CHEAPTOKENS_ API ที่เข้ากันได้กับ OpenAI ใด ๆ ก็ทำงานแบบเดียวกัน ที่นี่สคริปต์ชี้ไปที่ CheapTokens และ GLM-5.3-Flash (รายละเอียดการตั้งค่าอยู่ใน docs)
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}')มีสามจุดที่ควรดูให้ดีอีกครั้ง
temperature=0ทำให้คำตอบคงที่ที่สุดเท่าที่เป็นไปได้ เพื่อให้การเปลี่ยนแปลงของคะแนนมาจากพรอมต์ของคุณ ไม่ใช่จากลูกเต๋าmax_tokens=100มากเกินพอสำหรับป้ายกำกับคำเดียว ถ้าคำตอบกลับมาว่างเปล่าหรือถูกตัด ให้ตรวจfinish_reason; คู่มือ finish_reason "length" แสดงว่าควรเพิ่มอะไร- บรรทัดให้คะแนน คือสูตรจากเอกสาร
strip().lower()เปรียบเทียบกับคำตอบที่ถูก บวกเพิ่มอีกอย่าง: มันตัดจุดเต็มท้ายประโยคออกด้วย เพราะ "Negative." กับ "negative" คือคำตอบเดียวกันสำหรับคุณ
เกิดอะไรขึ้นเมื่อรัน? บรรทัดความแม่นยำหนึ่งบรรทัด ตามด้วยหนึ่งบรรทัดต่อการพลาดแต่ละครั้ง สมมติว่าการรันครั้งแรกพิมพ์แบบนี้:
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'
…(ตัวเลขตรงนี้เป็นสมมติฐานเพื่อแสดงรูปร่างของผลลัพธ์ ของคุณจะต่างออกไป) การประชดและถ้อยคำก้ำกึ่งคือข้อความประเภทที่พรอมต์สั้น ๆ มักพลาด ประเด็นคือคุณไม่ต้องเดาอีกต่อไป: คุณมีรายการ
เปลี่ยนหนึ่งอย่าง รันอีกครั้ง#
ตอนนี้คือส่วนที่มีประโยชน์ อ่านรายการที่พลาด เลือกสาเหตุหนึ่ง เปลี่ยนพรอมต์ในจุดเดียว แล้วรันใหม่ ทีละการเปลี่ยนแปลง ไม่อย่างนั้นคุณจะไม่รู้ว่าการแก้ไขใดขยับคะแนน
เปรียบเทียบ
พรอมต์ v1 → v2: เพิ่มกฎและตัวอย่างสองข้อ
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: negativeตัวอย่างทั้งสองข้อเป็นตัวอย่างที่แต่งขึ้น และนั่นคือเจตนา ห้ามนำข้อความจาก cases.csv ใส่ในพรอมต์เป็นตัวอย่างเด็ดขาด: โมเดลจะถูกให้คะแนนจากคำตอบที่คุณยื่นให้มัน และคะแนนจะสูงเกินจริง นี่คือ เทคนิค few-shot; ชุดทดสอบคือสิ่งที่บอกคุณว่ามันคุ้มหรือไม่ ถ้าพรอมต์ v1 ของคุณยังคลุมเครือ วิธีเขียนพรอมต์ที่ดี คือจุดเริ่มต้นก่อนที่คุณจะวัดผล
วาง v2 ลงใน PROMPT (เครื่องหมายคำพูดสามตัวใช้ได้กับหลายบรรทัด) แล้วรันสคริปต์อีกครั้ง สมมติว่ามันพิมพ์ Accuracy: 17/ มีอีกสามเคสที่ถูก v2 จึงดูดีขึ้น จะเชื่อถือได้แค่ไหน? แต่ละเคสมีค่า 5 คะแนนในชุด 20 เคส ดังนั้น 70% → 85% คือสามข้อความ นั่นเป็นสัญญาณที่ดี ไม่ใช่ข้อพิสูจน์ ถ้าคะแนนลดลง คุณก็ได้เรียนรู้อะไรที่มีค่าไม่แพ้กัน และรอดพ้นจากการปล่อยพรอมต์ที่แย่กว่าออกไป
ชุดเดิม โมเดลอื่น: คะแนนยังคงอยู่ไหม?#
ไฟล์เดิมตอบคำถามที่สอง: คุณจ่ายแพงเกินความจำเป็นของงานนี้หรือเปล่า? เปลี่ยนหนึ่งบรรทัดแล้วรันใหม่:
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'ถ้าความแม่นยำบน 20 เคสของคุณตรงกัน คุณก็ได้คำตอบสำหรับงานนี้จากข้อมูลของคุณเอง ไม่ใช่จาก leaderboard ถ้ามันลดลง ให้ดูว่าข้อความใดพังก่อนจะตัดสินใจอะไร
ทั้งหมดนี้มีค่าใช้จ่ายเท่าไร? สมมติว่าประมาณ 150 input tokens ต่อเคส (คำสั่งบวกข้อความ) และประมาณ 5 output tokens สำหรับป้ายกำกับคำเดียว นั่นคือ 3,000 input และ 100 output tokens ต่อการรัน 20 เคส ซึ่งคิดเป็น $0.000064 บน GLM-5.3-Flash การรันชุดเดิมสิบครั้งคือ 200 คำขอ ตารางด้านล่างแสดงภาระงานนั้นสำหรับทุกโมเดล โดยมี OpenRouter อยู่ข้าง ๆ ที่ภาระงานนี้ เมื่อนับ input และ output รวมกัน ทุกโมเดลในตารางมีค่าใช้จ่ายต่ำกว่าราคาอ้างอิงของ OpenRouter
| โมเดล | Input $/1M | Output $/1M | ต่อคำขอ | 200 คำขอ | OpenRouter, 200 คำขอ |
|---|---|---|---|---|---|
| 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 โทเค็นอินพุตและ 5 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน
สองตัวถูกใช้ในบทความนี้: GLM-5.3-Flash มี context 390K และ output สูงสุด 8,192 tokens ต่อคำตอบ; DeepSeek-V4-Flash มี context 380K และ output สูงสุด 32,768 tokens ราคาเดียวทุกชั่วโมงของวัน และยอดคงเหลือเหมือนกับโมเดลอื่นทุกตัว ราคาปัจจุบันอยู่ที่ หน้าค่าบริการ รายการเต็มอยู่ใน models
จุดที่ exact match ใช้ไม่ได้#
Exact match ใช้ได้เพราะคำตอบที่ถูกคือคำเดียวจากรายการที่กำหนดไว้ สำหรับผลลัพธ์แบบเปิดกว้าง เช่น สรุป การเขียนใหม่ หรือคำอธิบาย ไม่มีสตริงเดียวให้เปรียบเทียบ เอกสารอธิบายอีกเส้นทางหนึ่ง คือการให้คะแนนโดยโมเดล และแนะนำให้ใช้โมเดลอื่นเป็นผู้ให้คะแนนแทนโมเดลที่เขียนคำตอบ แต่เริ่มด้วย exact match ก่อนเสมอ: ที่ใดที่คุณบังคับให้คำตอบสั้นและคงที่ได้ มันคือการทดสอบที่ถูกที่สุดและชัดเจนที่สุดที่คุณรันได้ กฎง่าย ๆ ของเอกสารคือ คำถามที่ให้คะแนนอัตโนมัติจำนวนมากกว่าชนะคำถามที่ให้คะแนนด้วยมือจำนวนน้อยกว่า
อีกนิสัยหนึ่ง: เมื่อ v2 ไม่ดีขึ้นแล้ว อย่าขัดเกลากับ 20 ข้อความเดิมต่อไป เพิ่มใหม่ 5–10 ข้อความ โดยเฉพาะข้อที่พลาดจริงจาก production แล้วรันอีกครั้ง
เช็กด่วน
v2 ได้ 17/20 และ v1 ได้ 15/20 บนเคสเดียวกัน ข้อสรุปที่ปลอดภัยที่สุดคืออะไร?
แสดงคำตอบ
คำตอบ: v2 ดูดีกว่า แต่สองเคสจาก 20 เป็นช่องว่างที่เล็ก: เพิ่มเคสใหม่แล้วรันใหม่
แต่ละเคสคือ 5 คะแนน ช่องว่างสองเคสจึงเป็นสัญญาณให้ดูใกล้ ๆ ไม่ใช่คำตัดสิน เคสใหม่ที่ v2 ไม่เคยเห็นคือการตรวจครั้งถัดไป



