กลับไปที่บล็อก

AI สำหรับผู้เริ่มต้นคู่มือ

ติดป้ายกำกับทุกเอกสารในพรอมต์เพื่อให้โมเดลไม่สับสน

วิธีตั้งชื่อและกำหนดบทบาทให้ข้อความที่วางมาแต่ละชิ้น พร้อมพรอมต์ก่อน/หลังและคำขอแชทคอมพลีชันที่ใช้งานได้ใน Python และ curl

โดย CheapTokens Teamเผยแพร่เมื่อ ใช้เวลาอ่าน 6 นาที

หน้าปก: พรอมต์ที่มีสองเอกสาร แต่ละฉบับห่อด้วยแท็กของตัวเองพร้อมชื่อแหล่งที่มา
ในหน้านี้
  1. เกิดอะไรขึ้นเมื่อคุณแค่วางข้อความลงไป
  2. ตั้งชื่อและกำหนดหน้าที่ให้ข้อความแต่ละชิ้น
  3. ส่งเป็นคำขอจริง
  4. ป้ายกำกับมีค่าใช้จ่ายเท่าไร
  5. นิสัยสำหรับข้อความกองโต

คุณวางข้อความสองชิ้นไว้ในข้อความเดียวและขอให้โมเดลเปรียบเทียบกัน หากคุณไม่ได้ระบุว่าอันไหนคืออะไร โมเดลก็ต้องเดา วิธีแก้ไม่ยาก: ตั้งชื่อและกำหนดหน้าที่ให้ข้อความแต่ละชิ้น แล้วห่อแต่ละชิ้นด้วยแท็กของตัวเอง คู่มือการเขียนพรอมต์ของ Anthropic (หน้าเว็บที่อัปเดตอยู่เสมอ ตรวจสอบเมื่อ 31 ตุลาคม 2026) แนะนำให้ติดแท็กเนื้อหาแต่ละประเภท เพื่อให้โมเดลไม่อ่านผิดว่าอะไรคือคำสั่ง อะไรคือข้อมูลพื้นหลัง และอะไรคืออินพุต ด้านล่างนี้คือพรอมต์ก่อน/หลัง และตัวอย่างคำขอแชทคอมพลีชันที่ใช้งานได้จริงซึ่งคุณส่งไปยัง CheapTokens API ได้

เกิดอะไรขึ้นเมื่อคุณแค่วางข้อความลงไป#

ลองกรณีที่ตรงไปตรงมาที่สุด ซัพพลายเออร์ส่งคำอธิบายสินค้าใหม่มา และคุณอยากรู้ว่าอะไรเปลี่ยนไปจากที่อยู่บนหน้าหน้าร้านของคุณ คุณวางทั้งสองชิ้นใต้คำถาม "อะไรเปลี่ยนไป?" แล้วกดส่ง สำหรับคุณลำดับชัดเจน แต่สำหรับโมเดลมันคือข้อความสองบล็อกที่ไม่มีอะไรคั่นกลาง และคำถามก็ไม่ได้บอกว่าอันไหนคือของเก่า โมเดลอาจเดาถูก แต่อาจเรียกข้อความใหม่ว่าของเก่าและให้รายการการเปลี่ยนแปลงที่ย้อนกลับทางในน้ำเสียงที่มั่นใจเต็มที่

กับดักเดียวกันนี้ซ่อนอยู่ในงานประจำวัน:

  • สัญญาสองฉบับ แล้วคุณถามว่าอีกฝ่ายแก้อะไร;
  • บันทึกการประชุมสามฉบับ แล้วคุณถามว่าการตัดสินใจใดขัดแย้งกัน;
  • ตัวอย่างสไตล์บวกกับร่าง: อันไหนควรเลียนแบบ อันไหนควรเขียนใหม่?
  • บันทึกข้อผิดพลาดที่วางรวมกับโค้ด และคำถามคือ "แก้สิ่งนี้"

ในทุกกรณี โมเดลต้องการสองอย่างต่อข้อความหนึ่งชิ้น: ชื่อ (มันคืออะไรและมาจากไหน) และ บทบาท (คุณต้องการให้ทำอะไรกับมัน)

ตั้งชื่อและกำหนดหน้าที่ให้ข้อความแต่ละชิ้น#

สามขั้นตอนเล็ก ๆ:

  1. ใส่ข้อความแต่ละชิ้นในแท็กของตัวเอง คู่มือของ Anthropic แนะนำให้ใช้ตัวห่อ <documents> โดยมี <document index="1"> หนึ่งตัวต่อข้อความหนึ่งชิ้น และข้างในมี <source> สำหรับชื่อและ <document_content> สำหรับตัวข้อความ
  2. บอกว่าอันไหนคืออะไรในคำสั่ง นอกแท็ก: "เอกสาร 1 คือข้อความเก่าจากร้านของเรา เอกสาร 2 คือข้อความใหม่จากซัพพลายเออร์"
  3. ถามคำถามด้วยถ้อยคำเดียวกัน "ระบุทุกข้อเท็จจริงที่เปลี่ยนไป ในรูปแบบ เก่า -> ใหม่" ตอนนี้มีเก่าและใหม่ให้ชี้แล้ว

นี่คือตัวอย่างขวดก่อนและหลัง:

เปรียบเทียบ

คำขอเดียวกัน ก่อนและหลัง

ก่อน

text
What changed?

Steel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe.

Steel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only.

หลัง

text
Document 1 is the OLD text from our shop. Document 2 is the NEW text from the supplier. List every fact that changed, one per line, as old -> new.

<documents>
<document index="1">
<source>old description (current shop page)</source>
<document_content>
Steel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe.
</document_content>
</document>
<document index="2">
<source>new description (from the supplier)</source>
<document_content>
Steel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only.
</document_content>
</document>
</documents>
พรอมต์ที่คำสั่งระบุชื่อเอกสารแต่ละฉบับ และข้อความแต่ละชิ้นอยู่ในแท็กของตัวเอง
คำสั่งบอกว่าเอกสารแต่ละฉบับคืออะไร แท็กช่วยแยกข้อความออกจากกัน

ป้ายกำกับใช้โทเค็นเพิ่มเล็กน้อยและขจัดความเดา คำแนะนำนี้ Anthropic เขียนสำหรับโมเดล Claude ของตน แต่ป้ายกำกับเป็นข้อความธรรมดา จึงไม่มีอะไรห้ามคุณส่งเลย์เอาต์เดียวกันไปยังโมเดลแชทอื่น

ส่งเป็นคำขอจริง#

นี่คือพรอมต์ "หลัง" ในรูปการเรียก API ที่อยู่คือ https://api.cheaptokens.dev/v1 API เข้ากันได้กับ OpenAI และโมเดลคือ deepseek-ai/DeepSeek-V4-Flash-0731 ใช้ id โมเดลจากเอกสาร CheapTokens เพราะชื่อแตกต่างกันระหว่างผู้ให้บริการ DeepSeek-V4-Flash มีหน้าต่างบริบท 380K และเอาต์พุตได้สูงสุด 32,768 โทเค็นต่อคำตอบ ซึ่งเหลือที่ให้ข้อความยาว ๆ ได้หลายชิ้น คีย์มาจากตัวแปรสภาพแวดล้อม ไม่ใช่จากโค้ดเด็ดขาด

คำขอเดียวกันในสองเครื่องมือ

Python

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

old = "Steel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe."
new = "Steel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only."

prompt = f"""Document 1 is the OLD text from our shop. Document 2 is the NEW text from the supplier. List every fact that changed, one per line, as old -> new.

<documents>
<document index="1">
<source>old description (current shop page)</source>
<document_content>
{old}
</document_content>
</document>
<document index="2">
<source>new description (from the supplier)</source>
<document_content>
{new}
</document_content>
</document>
</documents>"""

response = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": prompt}],
    max_tokens=300,
)
print(response.choices[0].message.content)
print(response.usage)

curl

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "max_tokens": 300,
    "messages": [{
      "role": "user",
      "content": "Document 1 is the OLD text from our shop. Document 2 is the NEW text from the supplier. List every fact that changed, one per line, as old -> new.\n\n<documents>\n<document index=\"1\">\n<source>old description (current shop page)</source>\n<document_content>\nSteel water bottle, 500 ml. Keeps drinks cold for 12 hours. Dishwasher safe.\n</document_content>\n</document>\n<document index=\"2\">\n<source>new description (from the supplier)</source>\n<document_content>\nSteel water bottle, 750 ml. Keeps drinks cold for 24 hours. Hand wash only.\n</document_content>\n</document>\n</documents>"
    }]
  }'

คำตอบเป็นข้อความธรรมดาใน choices[0].message.content และ usage ข้าง ๆ นับโทเค็น คำตอบที่ดีจะระบุการเปลี่ยนแปลงสามอย่าง: 500 ml -> 750 ml, 12 ชั่วโมง -> 24 ชั่วโมง, ปลอดภัยกับเครื่องล้างจาน -> ล้างมือเท่านั้น หากลูกศรวิ่งไปทางอื่น แสดงว่าโมเดลสับสนป้ายกำกับ ตรวจสอบว่าคำสั่งเรียกเอกสารด้วยชื่อเดียวกับที่แท็กใช้

ป้ายกำกับมีค่าใช้จ่ายเท่าไร#

แท็กคือข้อความ และข้อความถูกคิดเงิน สมมติว่าหัวหน้าทีมป้อนบันทึกการประชุมสามฉบับ ฉบับละประมาณ 2,000 โทเค็น และถามว่าการตัดสินใจใดขัดแย้งกัน บันทึกสามฉบับ: 3 × 2,000 = 6,000 โทเค็น บวกอีกประมาณ 150 โทเค็นสำหรับคำสั่งและแท็ก (เป็นการสมมติ) คำขอจึงมีอินพุต 6,150 โทเค็น พร้อมเอาต์พุตคำตอบ 300 โทเค็น บน DeepSeek-V4-Flash คำขอนี้ครั้งเดียวมีค่าใช้จ่าย $0.00012 และแท็กเองก็เป็นเศษเสี้ยวเล็กน้อยเทียบกับบันทึก นี่คือคำขอเดียวกันที่ส่ง 1,000 ครั้ง พร้อม OpenRouter เทียบเคียง:

โมเดล ต่อคำขอ 1,000 คำขอ OpenRouter, 1,000 คำขอ
GLM-5.3-Flash $0.00014 $0.135 $0.231
DeepSeek-V4-Flash $0.00012 $0.122 $0.473
MiniMax-M2.7 $0.00035 $0.353 $4.23

6,150 โทเค็นอินพุตและ 300 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน

โทเค็นทั้ง 6,150 พอดีกับหน้าต่าง 380K โดยเหลือที่ว่าง (หน้าต่างบริบทคืออะไร) เมื่อนับรวมทั้งอินพุตและเอาต์พุต คำขอออกมาถูกกว่า OpenRouter อินพุตและเอาต์พุตคิดในอัตราต่างกัน และ โทเค็นอินพุตกับเอาต์พุต อธิบายว่าทำไม ตัวเลขล่าสุดของทุกโมเดลอยู่ที่ หน้าราคา

นิสัยสำหรับข้อความกองโต#

เมื่อมีข้อความมากกว่าสองชิ้น ตัวเลขอย่างเดียวไม่พอ: แต่ละชิ้นต้องมีชื่อของตัวเอง ภาพด้านล่างแสดงเลย์เอาต์จากตัวอย่าง: คำสั่งพร้อมคำถามก่อน แล้วตามด้วยเอกสารแต่ละฉบับในแท็กของตัวเอง

โฟลว์: คำสั่งและคำถาม เอกสาร 1 (เก่า) เอกสาร 2 (ใหม่)
คำสั่งและคำถาม แล้วตามด้วยเอกสารที่ติดป้ายแต่ละฉบับ: เลย์เอาต์ของพรอมต์ตัวอย่าง
  • ตั้งชื่อตามเนื้อหา ไม่ใช่แค่ตัวเลข <source>contract v2, sent by the client</source> ดีกว่า document 2 เมื่อคำตอบอ้างกลับมาหาคุณ
  • เก็บคำสั่งไว้นอกแท็ก เพื่อไม่ให้บรรทัดในข้อความที่วางมาถูกเข้าใจว่าเป็นคำสั่ง
  • หนึ่งข้อความ หนึ่งแท็ก ไฟล์ยาวก็ยังเป็นแท็กเดียว สองไฟล์คือสองแท็ก
  • ใช้ชื่อเดิมในคำถาม: "การตัดสินใจใดใน monday-notes ขัดแย้งกับ wednesday-notes?"
  • กำหนดบทบาทให้ตัวอย่างด้วย "เอกสาร 1 คือตัวอย่างสไตล์: ลอกน้ำเสียง ไม่ใช่ข้อเท็จจริง เอกสาร 2 คือร่างที่ต้องเขียนใหม่"
ลองด้วยตัวเองลองดู: คุณมีบันทึกข้อผิดพลาดและโค้ดที่ทำให้เกิดในพรอมต์เดียว คุณจะเพิ่มอะไรให้แต่ละชิ้น?แสดงคำตอบ

ชื่อและหน้าที่ สำหรับบันทึก: <source>error log from the last run</source> บวก "นี่คืออาการ อย่าแก้ไข" สำหรับโค้ด: <source>app.py</source> บวก "นี่คือสิ่งที่ต้องแก้" แล้วขอให้แก้โดยเรียกตามชื่อเหล่านั้น

สำหรับพื้นฐานของส่วนที่เหลือในพรอมต์ (เป้าหมาย บริบท รูปแบบ) ดู วิธีเขียนพรอมต์ที่ดี