คนส่วนใหญ่สามารถเขียน prompt ให้ LLM ได้ แต่การสร้างผลิตภัณฑ์ที่รองรับทราฟฟิกจริงได้นั้นเป็นคนละเรื่องกันโดยสิ้นเชิง หากคุณต้องการก้าวจากการพิมพ์ในหน้าต่างแชทไปสู่การส่งมอบ AI ในระดับโปรดักชัน คุณจำเป็นต้องเข้าใจว่า stack ต่างๆ ทำงานร่วมกันอย่างไร มันไม่ใช่เวทมนตร์ แต่มันคือกระบวนการ (pipeline) ของปัญหาทางวิศวกรรมที่แยกจากกัน และแต่ละเลเยอร์ก็มีรูปแบบความล้มเหลว (failure modes) เป็นของตัวเอง
ให้ผมพาคุณไปดูว่าระบบ AI สมัยใหม่ทำงานอย่างไร ตั้งแต่วินาทีที่คุณพิมพ์คำหนึ่งคำ ไปจนถึงวินาทีที่ agent ทำงานเสร็จสิ้น
รากฐาน: โมเดลคิดอย่างไร
โดยพื้นฐานแล้ว Large Language Model ทำสิ่งเดียวเท่านั้น นั่นคือการทำนาย token ถัดไป Token นั้นอาจเป็นคำถัดไป ส่วนหนึ่งของคำ หรือแม้แต่สัญลักษณ์ ส่วนที่เหลือทั้งหมด—ไม่ว่าจะเป็นบทกวี โค้ด หรือการใช้เหตุผล—ล้วนเป็นพฤติกรรมที่เกิดขึ้นเอง (emergent behavior) จากการทำภารกิจเพียงอย่างเดียวนี้ในสเกลที่ใหญ่ขึ้น
เส้นทางจาก prompt ของคุณไปจนถึงการตอบกลับของโมเดลมีลักษณะดังนี้
Tokenization คือขั้นตอนแรก ข้อความดิบๆ นั้นไม่มีความหมายสำหรับ neural network ดังนั้นโมเดลจึงต้องแบ่งคำของคุณออกเป็นส่วนๆ และจับคู่แต่ละส่วนเข้ากับตัวเลข คำว่า "tokenization" อาจกลายเป็น token แยกกันสามส่วน วลี "New York" อาจเป็นหนึ่งหรือสอง token ขึ้นอยู่กับคลังคำศัพท์ (vocabulary) ตัวเลขเหล่านี้ไม่ใช่ค่าที่สุ่มขึ้นมา แต่มาจากพจนานุกรมที่ตายตัวซึ่งโมเดลได้เรียนรู้ระหว่างการฝึกฝน
เมื่อคำกลายเป็นตัวเลขแล้ว พวกมันจำเป็นต้องมีความหมาย Embeddings จะเปลี่ยนตัวเลขเหล่านั้นให้เป็นเวกเตอร์ (vectors)—ซึ่งเป็นรายการยาวๆ ของค่าทศนิยม (floating-point values) ที่วางแนวคิดที่คล้ายกันไว้ใกล้กันในพื้นที่ทางคณิตศาสตร์ "King" และ "Queen" จะอยู่ใกล้กัน "Paris" และ "Berlin" จะเกาะกลุ่มกัน แต่อยู่ในย่านที่ต่างจาก "Python" หรือ "JavaScript"
แต่เวกเตอร์เพียงอย่างเดียวจะทำให้ลำดับหายไป Positional encoding จะบอกโมเดลว่าแต่ละ token อยู่ตรงไหนในประโยค หากไม่มีสิ่งนี้ "The dog bit the man" และ "The man bit the dog" จะดูเหมือนกันทุกประการ
ต่อมาคือ attention mechanism นี่คือจุดที่โมเดลจะมองดู token ทั้งหมดในอินพุตและตัดสินใจว่า token ไหนสำคัญต่อการทำนาย token ถัดไป เมื่อคุณถามว่า "บริษัทก่อตั้งเมื่อไหร่ และใครเป็นผู้นำในตอนนี้?" โมเดลจำเป็นต้องเชื่อมโยง "founded" เข้ากับวันที่ และ "leads" เข้ากับชื่อ CEO การทำ attention จะสร้างการเชื่อมต่อเหล่านั้นขึ้นมา
การทำงานเหล่านี้จะซ้อนทับกันเป็น layers—ซึ่งมักจะมีเป็นสิบๆ เลเยอร์—โดยเลเยอร์แรกๆ จะจัดการเรื่องไวยากรณ์ (syntax) และเลเยอร์หลังๆ จะสร้างการใช้เหตุผลเชิงนามธรรม (abstract reasoning) ในช่วงกลางๆ feed-forward networks จะทำหน้าที่เก็บความสัมพันธ์เชิงข้อเท็จจริง นี่คือจุดที่โมเดลเก็บความรู้ที่ว่า Paris เป็นเมืองหลวงของฝรั่งเศส หรือ API เฉพาะเจาะจงตัวหนึ่งต้องการ JSON payload มันไม่ใช่ฐานข้อมูลเสียทีเดียว แต่เป็นโครงข่ายของน้ำหนัก (weights) ที่ถูกบีบอัดไว้เพื่อกระตุ้นรูปแบบต่างๆ
สุดท้าย decoding จะแปลงการแทนค่าด้วยเวกเตอร์ภายในกลับมาเป็น token ที่มนุษย์อ่านออก โมเดลไม่ได้ "รู้" ว่ามันกำลังเขียนภาษาอังกฤษ แต่มันเพียงแค่จัดลำดับ token ถัดไปที่เป็นไปได้หลายพันแบบ และเลือกแบบที่มีความน่าจะเป็นสูงสุดซ้ำแล้วซ้ำเล่า จนกว่าจะถึงเงื่อนไขการหยุด (stop condition)
เลเยอร์ RAG: การมอบความจำให้โมเดล
Base model นั้นถูกแช่แข็งไว้ในเวลา น้ำหนัก (weights) ของมันบันทึกข้อมูลอินเทอร์เน็ตไว้จนถึงวันที่กำหนด และมันไม่สามารถเข้าถึงเอกสารส่วนตัวของคุณได้ เว้นแต่คุณจะป้อนมันเข้าไป นั่นทำให้มันใช้งานไม่ได้สำหรับงานทางธุรกิจส่วนใหญ่ Retrieval-Augmented Generation หรือ RAG แก้ปัญหานี้โดยการมอบห้องสมุดภายนอกให้โมเดลสามารถเข้ามาค้นคว้าก่อนที่จะตอบคำถาม
การตั้งค่าในเชิงแนวคิดนั้นตรงไปตรงมา แต่ในทางปฏิบัติมีความจุกจิก ขั้นแรก คุณนำเอกสารของคุณมาทำ chunking คุณจะไม่โยนไฟล์ PDF ร้อยหน้าเข้าไปในหน้าต่าง prompt แต่คุณจะแบ่งมันออกเป็นย่อหน้า ส่วน หรือบล็อกเชิงความหมาย (semantic blocks) ที่เล็กพอจะอยู่ในขีดจำกัดบริบท (context limit) ของโมเดลได้ ในขณะที่ยังคงรักษาความหมายเอาไว้
แต่ละ chunk จะผ่าน embedding model และกลายเป็นเวกเตอร์ เช่นเดียวกับ token ภายใน LLM เวกเตอร์เหล่านี้จะอาศัยอยู่ใน vector database ซึ่งเป็นที่เก็บข้อมูลเฉพาะทางที่ออกแบบมาเพื่อการค้นหาความคล้ายคลึง (similarity search) มากกว่าการค้นหาแบบตรงตัว (exact lookups) เมื่อผู้ใช้ถามคำถาม คุณจะทำ embedding ให้กับคำถามนั้นและถามฐานข้อมูลว่า: "มี chunk ไหนที่มีความหมายใกล้เคียงกับเวกเตอร์นี้ที่สุด?"
การค้นหาด้วยเวกเตอร์เพียงอย่างเดียวมักจะพลาดการจับคู่ที่แม่นยำ ระบบโปรดักชันที่ดีจะใช้ hybrid search ซึ่งผสมผสานการจับคู่ด้วยคำสำคัญ (keyword matching) เข้ากับความคล้ายคลึงเชิงความหมาย (semantic similarity) หากมีคนถามหา "SLA-99 compliance" คุณต้องการเอกสารที่มีข้อความนั้นอยู่จริงๆ ไม่ใช่แค่เอกสารที่ให้ความรู้สึกคล้ายกัน
หลังจากการดึงข้อมูล (retrieval) ขั้นตอน re-ranking จะช่วยกรองสัญญาณรบกวน (noise) การค้นหาในตอนแรกอาจคืนค่ามายี่สิบ chunk แต่มีเพียงสามหรือสี่อันแรกเท่านั้นที่ช่วยได้จริง ตัว re-ranker จะให้คะแนนความเกี่ยวข้องและตัดส่วนที่เหลือทิ้งก่อนที่จะส่งไปยัง LLM ซึ่งช่วยประหยัด token และลดการเกิดอาการหลอน (hallucinations)
เลเยอร์ Agent: การลงมือทำ
RAG ช่วยให้โมเดลอ่านได้ ส่วน Agent ช่วยให้มันลงมือทำได้
โดยพื้นฐานแล้ว Agent คือ LLM ที่ทำงานอยู่ภายในลูป มันจะสังเกต ใช้เหตุผล ลงมือทำ และจากนั้นก็กลับไปสังเกตใหม่อีกครั้ง หากคุณสั่งให้ Agent จองเที่ยวบิน มันจะไม่เพียงแค่บรรยายว่าขั้นตอนการจองเป็นอย่างไร แต่มันจะแบ่งงานออกเป็นขั้นตอน เรียกใช้ฟังก์ชันที่ถูกต้อง อ่านผลลัพธ์ที่ตอบกลับมา และปรับเปลี่ยนการทำงาน
ลูปนี้มีลักษณะดังนี้ Observe: agent จะอ่านสถานะปัจจุบัน—คำขอของคุณ, ผลลัพธ์จากการเรียกใช้เครื่องมือครั้งก่อนหน้า, หรือข้อผิดพลาดใดๆ Reason: LLM จะตัดสินใจว่าจะทำอะไรต่อไป ซึ่งมักจะทำโดยการสร้างแผนงานที่มีโครงสร้างหรือเลือกจากตัวเลือกที่กำหนดไว้ล่วงหน้า Act: มันจะเรียกใช้เครื่องมือ
เครื่องมือคือสิ่งที่ทำให้ Agent สามารถปฏิสัมพันธ์กับโลกแห่งความเป็นจริงได้ เครื่องมือเหล่านี้ถูกกำหนดด้วย JSON schemas ที่บอกโมเดลอย่างชัดเจนว่า API ต้องการพารามิเตอร์อะไรบ้าง LLM จะไม่ส่ง HTTP requests แบบสุ่มๆ แต่มันจะกรอกข้อมูลลงใน schema เช่น "Call the weather API with city: London and units: metric" หากเครื่องมือส่งค่าอุณหภูมิกลับมา Agent จะป้อน
