ทำความเข้าใจส่วนติดต่อการสนทนา
ส่วนติดต่อการสนทนาของ LLM ทำงานอย่างไร: บทบาท รอบการสนทนา และบริบทเซสชัน
ทำความเข้าใจส่วนติดต่อการสนทนา เป็นบทเรียน AI Prompt Engineering ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Prompt Engineering และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน
บทบาทสามประการ
การสนทนาทุกครั้งกับ LLM สร้างขึ้นจากสามบทบาท ได้แก่ ระบบ ผู้ใช้ และ ผู้ช่วย
บทบาท system กำหนดกฎและบุคลิกก่อนเริ่มการสนทนา บทบาท user คือคุณในฐานะผู้ส่งข้อความ ส่วนบทบาท assistant คือโมเดลที่ตอบกลับ
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
message = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
system='You are a helpful cooking assistant.',
messages=[
{'role': 'user', 'content': 'What is mise en place?'}
]
)
print(message.content[0].text)ข้อความระบบ
ข้อความระบบ คือคู่มือคำสั่งของโมเดล โดยทำงานก่อนช่วงการสนทนาแรกของผู้ใช้และยังคงทำงานตลอดทั้งเซสชัน
ใช้ข้อความนี้เพื่อกำหนดบุคลิก น้ำเสียง ข้อจำกัดของขอบเขตเนื้อหา หรือรูปแบบผลลัพธ์ โมเดลจะถือว่าข้อความนี้เป็นบริบทชี้นำตลอดการสนทนา
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
response = client.chat.completions.create(
model='gpt-4o',
messages=[
{
'role': 'system',
'content': 'You are a senior Python engineer. '
'Always include type hints and docstrings in your examples.'
},
{
'role': 'user',
'content': 'Show me a function that parses JSON safely.'
}
]
)
print(response.choices[0].message.content)ช่วงการสนทนาและลำดับการสนทนา
การสนทนาคือลำดับของช่วงการสนทนา แต่ละช่วงสลับกันไป โดยผู้ใช้พูด ผู้ช่วยตอบ แล้วผู้ใช้จึงพูดอีกครั้ง
โมเดลจะเห็นประวัติช่วงการสนทนาทั้งหมดในทุกคำขอ นั่นทำให้การสนทนาดูต่อเนื่อง แต่ในทางเทคนิคแล้วการเรียกใช้เอพีไอแต่ละครั้งไม่มีสถานะและได้รับบริบททั้งหมดใหม่ทุกครั้ง
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Each call sends the FULL conversation history
history = [
{'role': 'system', 'content': 'You are a geography tutor.'},
{'role': 'user', 'content': 'What is the capital of France?'},
{'role': 'assistant', 'content': 'The capital of France is Paris.'},
{'role': 'user', 'content': 'And its population?'} # follow-up turn
]
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
print(response.choices[0].message.content)บริบทเซสชัน
บริบทเซสชัน คือความทรงจำต่อเนื่องของการสนทนา ทุกข้อความจากผู้ใช้และผู้ช่วยจะสะสมอยู่ในอาร์เรย์ประวัติ
โมเดลไม่มีแหล่งจัดเก็บความจำแยกต่างหาก แต่จะให้เหตุผลจากสิ่งที่เห็นในหน้าต่างบริบทปัจจุบันเท่านั้น หากคุณเริ่มเซสชันใหม่ โมเดลจะไม่มีความทรงจำเกี่ยวกับเซสชันก่อนหน้า เว้นแต่คุณจะแทรกข้อมูลนั้นกลับเข้าไปใหม่
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Simulating 3-turn session context
conversation = [
{'role': 'user', 'content': 'My name is Alex.'},
{'role': 'assistant', 'content': 'Nice to meet you, Alex!'},
{'role': 'user', 'content': 'What is 5 times 7?'},
{'role': 'assistant', 'content': '5 times 7 is 35.'},
{'role': 'user', 'content': 'Can you repeat my name?'} # uses session context
]
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=conversation
)
print(response.content[0].text) # expects: Your name is Alex.โครงสร้างประวัติข้อความ
ประวัติข้อความเป็นเพียงรายการพจนานุกรม โดยแต่ละรายการมีคีย์ role และ content
คุณจัดการรายการนี้เองในโค้ด หลังจากผู้ช่วยตอบกลับแต่ละครั้ง คุณ append การตอบกลับนั้น จากนั้น append ข้อความถัดไปของผู้ใช้ แล้วส่งรายการทั้งหมดอีกครั้งในการเรียกใช้ครั้งถัดไป
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def chat(history, user_message):
history.append({'role': 'user', 'content': user_message})
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
reply = response.choices[0].message.content
history.append({'role': 'assistant', 'content': reply})
return reply, history
history = [{'role': 'system', 'content': 'You are a math tutor.'}]
reply, history = chat(history, 'What is a prime number?')
print(reply)
print('History length:', len(history))อธิบายขีดจำกัดโทเค็น
โมเดลทุกตัวมี หน้าต่างบริบท ซึ่งวัดเป็นโทเค็น โทเค็นหนึ่งโทเค็นมีขนาดประมาณ 4 อักขระ หรือ 0.75 คำในภาษาอังกฤษ
ทั้งข้อมูลเข้าของคุณ (ระบบ + ประวัติทั้งหมด) และผลลัพธ์ของโมเดลจะนับรวมในขีดจำกัดนี้ GPT-4o รองรับ 128k โทเค็น ส่วนโคลด โอปุส 4.5 รองรับ 200k โทเค็น เมื่อถึงขีดจำกัด จะต้องนำข้อความเก่าออกหรือสรุปข้อความเหล่านั้น
import tiktoken
# Count tokens before sending to avoid exceeding the limit
encoding = tiktoken.encoding_for_model('gpt-4o')
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': 'Explain quantum entanglement in simple terms.'}
]
total_tokens = 0
for msg in messages:
total_tokens += len(encoding.encode(msg['content']))
total_tokens += 4 # overhead per message
print(f'Estimated input tokens: {total_tokens}')
print(f'GPT-4o limit: 128,000 tokens')
print(f'Budget remaining: {128000 - total_tokens:,} tokens')จะเกิดอะไรขึ้นเมื่อถึงขีดจำกัดโทเค็น
เมื่อประวัติการสนทนาเติบโตเกินหน้าต่างบริบท คุณมีสามทางเลือก:
- ตัดทอน — ลบข้อความที่เก่าที่สุดออก
- สรุป — ขอให้โมเดลย่อรอบการสนทนาก่อนหน้าให้เป็นบทสรุปสั้น ๆ
- หน้าต่างเลื่อน — เก็บไว้เฉพาะข้อความ N รายการล่าสุด
การเลือกกลยุทธ์ที่ไม่เหมาะสมอาจทำให้โมเดลสูญเสียบริบทสำคัญและตอบกลับอย่างไม่สอดคล้องกัน
def trim_history(history, max_messages=10, keep_system=True):
'''Keep the system message and the last N non-system messages.'''
system_msgs = [m for m in history if m['role'] == 'system']
non_system = [m for m in history if m['role'] != 'system']
if len(non_system) > max_messages:
non_system = non_system[-max_messages:]
print(f'Trimmed to last {max_messages} messages.')
return system_msgs + non_system if keep_system else non_system
history = [{'role': 'system', 'content': 'You are a tutor.'}]
for i in range(15):
history.append({'role': 'user', 'content': f'Question {i}'})
history.append({'role': 'assistant', 'content': f'Answer {i}'})
trimmed = trim_history(history, max_messages=6)
print('Trimmed history length:', len(trimmed))บริบทแบบหลายรอบในการใช้งานจริง
มาดูการทำงานของบริบทกัน ในการสนทนาแบบหลายรอบ โมเดลจะใช้ข้อความก่อนหน้าทุกข้อความเพื่อตอบคำถามต่อเนื่องได้อย่างถูกต้อง
นี่เป็นเหตุผลที่คุณสามารถพูดว่า 'อธิบายเรื่องนั้นให้เข้าใจง่ายกว่านี้' โดยไม่ต้องพูดซ้ำว่า 'เรื่องนั้น' คืออะไร — โมเดลมองเห็นประวัติทั้งหมดและรู้ว่าคุณกำลังอ้างถึงอะไร
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a science teacher.'}]
# Turn 1
history.append({'role': 'user', 'content': 'What is photosynthesis?'})
r1 = client.chat.completions.create(model='gpt-4o', messages=history)
reply1 = r1.choices[0].message.content
history.append({'role': 'assistant', 'content': reply1})
# Turn 2 — refers to prior answer without repeating it
history.append({'role': 'user', 'content': 'Can you explain that using only 3 bullet points?'})
r2 = client.chat.completions.create(model='gpt-4o', messages=history)
print(r2.choices[0].message.content)เอพีไอไร้สถานะ ประสบการณ์ผู้ใช้แบบมีสถานะ
นี่คือข้อสังเกตสำคัญ: เอพีไอไม่มี สถานะ โดยสิ้นเชิง เซิร์ฟเวอร์จะไม่จดจำสิ่งใดระหว่างการเรียกใช้แต่ละครั้ง
ผลิตภัณฑ์สนทนาอย่าง ChatGPT สร้างภาพลวงตาว่ามีความจำด้วยการจัดเก็บประวัติการสนทนาไว้ในฐานข้อมูลของตนเอง แล้วแทรกประวัตินั้นกลับเข้าไปในการเรียกเอพีไอทุกครั้ง คุณสามารถสร้างกลไกแบบเดียวกันนี้ได้ด้วยตนเอง
# Illustration: two isolated API calls vs one with history
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# ❌ WITHOUT history — model has no memory
r1 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'My dog is named Biscuit.'}]
)
r2 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': "What's my dog's name?"}]
)
print('Without history:', r2.choices[0].message.content) # will not know
# ✅ WITH history injected
r3 = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'user', 'content': 'My dog is named Biscuit.'},
{'role': 'assistant', 'content': 'Got it, your dog is named Biscuit!'},
{'role': 'user', 'content': "What's my dog's name?"}
]
)
print('With history:', r3.choices[0].message.content)เคล็ดลับการใช้งานส่วนติดต่อการสนทนา
เพื่อใช้ส่วนติดต่อการสนทนาให้เกิดประโยชน์สูงสุด:
- ใส่คำสั่งที่ต้องคงอยู่ไว้ใน ข้อความระบบ แทนการใส่ซ้ำในทุกรอบของผู้ใช้
- ทำให้รอบการสนทนาก่อนหน้า กระชับ — ประวัติที่ยืดเยื้อใช้โทเค็นอย่างรวดเร็ว
- เริ่ม เซสชันใหม่ เมื่อเปลี่ยนหัวข้อ เพื่อหลีกเลี่ยงการปนเปื้อนของบริบท
- เมื่อกลับมาทำโครงการระยะยาว ให้แทรกเฉพาะ ส่วนย่อยที่เกี่ยวข้อง ของบริบทที่ผ่านมา
# Good practice: compact system message + focused history
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
system = (
'You are a concise Python code reviewer. '
'Reply with: 1) one-line verdict, 2) top 3 issues, 3) fixed snippet.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
system=system,
messages=[
{'role': 'user', 'content': 'def add(a,b): return a+b\nprint(add(1,2))'}
]
)
print(response.content[0].text)ทบทวน: ส่วนติดต่อการสนทนา
มาทบทวนแนวคิดสำคัญเกี่ยวกับการทำงานของส่วนติดต่อการสนทนากัน:
- สามบทบาท: ระบบกำหนดกฎ ผู้ใช้ส่งคำสั่ง และผู้ช่วยตอบกลับ
- ประวัติทั้งหมด จะถูกส่งไปกับการเรียกเอพีไอทุกครั้ง — เซิร์ฟเวอร์ไม่มีสถานะ
- ขีดจำกัดโทเค็น จำกัดบริบททั้งหมด ให้ตัดทอนหรือสรุปเมื่อใกล้ถึงขีดจำกัด
- บริบทของเซสชัน เป็นเพียงรายการที่คุณจัดการในโค้ดของคุณเอง
- เริ่มเซสชันใหม่เมื่อเปลี่ยนหัวข้อ เพื่อให้บริบทสะอาดอยู่เสมอ
# Summary: minimal chat loop skeleton
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
def ask(question):
history.append({'role': 'user', 'content': question})
res = client.chat.completions.create(model='gpt-4o', messages=history)
answer = res.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
return answer
print(ask('Hello! What can you help me with?'))ตรวจสอบความรู้
ทดสอบความเข้าใจของคุณเกี่ยวกับกลไกของส่วนติดต่อการสนทนา
ผู้ใช้เริ่มเซสชันใหม่เอี่ยมและถามปัญญาประดิษฐ์ว่า 'เมื่อวานเราคุยอะไรกัน' ปัญญาประดิษฐ์ไม่มีความจำเกี่ยวกับเซสชันของเมื่อวาน เพราะเหตุใด
สิ่งที่คุณได้เรียนรู้
ตอนนี้คุณเข้าใจพื้นฐานของการโต้ตอบกับปัญญาประดิษฐ์ผ่านการสนทนาทุกครั้งแล้ว:
- โครงสร้างบทบาท ระบบ/ผู้ใช้/ผู้ช่วย ที่กำหนดรูปแบบของการสนทนาทุกครั้ง
- วิธีส่ง ประวัติข้อความทั้งหมด ในการเรียกใช้ทุกครั้งเพื่อจำลองความจำ
- เหตุผลที่เอพีไอ ไม่มีสถานะ และวิธีที่ผลิตภัณฑ์สนทนาสร้างความจำต่อยอดจากเอพีไอ
- วิธีที่ ขีดจำกัดโทเค็น จำกัดบริบท และวิธีจัดการกับขีดจำกัดเหล่านั้น
แบบจำลองทางความคิดนี้จะช่วยให้คุณเขียนคำสั่งที่ดีขึ้นและสร้างแอปพลิเคชันอัจฉริยะที่ขับเคลื่อนด้วยปัญญาประดิษฐ์ได้
คำถามที่พบบ่อย
บทเรียน “ทำความเข้าใจส่วนติดต่อการสนทนา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ทำความเข้าใจส่วนติดต่อการสนทนา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Prompt Engineering ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ทำความเข้าใจส่วนติดต่อการสนทนา”
ส่วนติดต่อการสนทนาของ LLM ทำงานอย่างไร: บทบาท รอบการสนทนา และบริบทเซสชัน คุณปฏิบัติ AI Prompt Engineering ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Prompt Engineering หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Prompt Engineering บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ทำความเข้าใจส่วนติดต่อการสนทนา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Prompt Engineering นี้ได้ไหม
ได้ บทเรียน AI Prompt Engineering ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทำความเข้าใจส่วนติดต่อการสนทนา
- ประเภทคำขอที่ปัญญาประดิษฐ์รองรับ
- ปัญญาประดิษฐ์สร้างคำตอบอย่างไร
- สิ่งที่ปัญญาประดิษฐ์ทำไม่ได้