บทเรียนที่ได้หลังประมวลผล GPT ไป 500 ล้านโทเค็น
(kenkantzer.com)- Truss ได้ดำเนินงาน ฟีเจอร์ที่มี LLM เป็นศูนย์กลาง ในช่วง 6 เดือนที่ผ่านมา โดยประมวลผลมากกว่า 500 ล้านโทเค็นด้วยโมเดลของ OpenAI และสรุปข้อจำกัดที่พบจริงในงานสรุป วิเคราะห์ และสกัดข้อความสำหรับ B2B
- พรอมป์ไม่ได้เสถียรขึ้นเมื่อใส่คำสั่งละเอียดจำนวนมาก และในบางกรณีคำสั่งที่ สั้นและเจาะจงน้อยกว่า ให้ผลลัพธ์ดีกว่าสำหรับความรู้ทั่วไปที่ GPT รู้อยู่แล้ว
- แม้ไม่ใช้ Langchain, JSON mode, function calling หรือ assistants ก็สามารถดำเนินงานหลายฟีเจอร์ด้วย
chatAPI และฟังก์ชันสกัด JSON เพียงตัวเดียว โดยโค้ดหลักมีเพียง ฟังก์ชัน 40 บรรทัด พร้อมการจัดการข้อผิดพลาดและการตัดข้อความอัตโนมัติเล็กน้อย - GPT อ่อนในด้านการจัดการ สมมติฐานว่าง (null hypothesis) เช่น “ถ้าไม่มีให้คืนค่าว่าง” และการสร้างเอาต์พุตยาว ๆ แม้ GPT-4 จะมีหน้าต่างอินพุต 128k แต่เอาต์พุตยังอยู่ระดับประมาณ 4k
- RAG และ vector DB ไม่เหมาะนักกับงานสกัดข้อความที่มีขอบเขตจำกัดของ Truss การใส่บริบททั้งหมดเพื่อวิเคราะห์ สรุป และสกัดมีความน่าเชื่อถือสูง แต่ปัญหาจะรุนแรงขึ้นเมื่ออินพุตว่างหรือไม่มีข้อมูลที่เกี่ยวข้อง
ขอบเขตการใช้งานและสมมติฐาน
- ในช่วง 6 เดือนที่ผ่านมา Truss ได้เปิดตัว ฟีเจอร์ที่มี LLM เป็นศูนย์กลาง หลายรายการ และปริมาณการใช้งานประเมินว่าเกิน 500 ล้านโทเค็นเล็กน้อย
- โมเดลที่ใช้เป็นตระกูล OpenAI โดยปริมาณโทเค็นแบ่งเป็น GPT-4 85% และ GPT-3.5 15%
- ข้อมูลที่จัดการมีเฉพาะข้อความเท่านั้น ไม่รวมฟีเจอร์ที่ไม่ใช่ข้อความ เช่น
gpt-4-vision, Sora, Whisper - บริบทของผลิตภัณฑ์เป็น B2B และงานหลักคือ การสรุป·การวิเคราะห์·การสกัด
- 500 ล้านโทเค็นเทียบได้กับข้อความประมาณ 750,000 หน้า
พรอมป์อาจดีขึ้นเมื่อเจาะจงน้อยลง
- เมื่อใส่รายการและคำสั่งที่แม่นยำมากเกินไปเกี่ยวกับความรู้ทั่วไปที่ GPT รู้อยู่แล้ว ผลลัพธ์อาจแย่ลงได้
- Pipeline หนึ่งต้องจัดหมวดหมู่ว่าบล็อกข้อความเกี่ยวข้องกับรัฐใดใน 50 รัฐของสหรัฐฯ หรือรัฐบาลกลาง
- พรอมป์แรกใส่รายการ ID ของ 50 รัฐและ
federalในรูปแบบ JSON ลงในฟิลด์locality_idแล้วให้เลือก - วิธีนี้ทำงานได้ประมาณ มากกว่า 98% แต่มีความล้มเหลวมากพอที่จะต้องตรวจสอบเพิ่มเติม
- พรอมป์แรกใส่รายการ ID ของ 50 รัฐและ
- ฟิลด์อีกตัวคือ
nameแม้ไม่ได้ร้องขออย่างชัดเจน แต่ก็คืนชื่อเต็มของรัฐที่ถูกต้องได้อย่างเสถียร- ต่อมาจึงเปลี่ยนเป็นวิธีค้นหารัฐจากสตริงที่ปรากฏใน
nameและทำงานได้ดี
- ต่อมาจึงเปลี่ยนเป็นวิธีค้นหารัฐจากสตริงที่ปรากฏใน
- วิธีที่ดีกว่าคือ พรอมป์ที่ปล่อยให้ใช้สามัญสำนึก เช่น “คุณรู้จัก 50 รัฐอยู่แล้ว ให้คืนชื่อเต็มของรัฐนั้นหรือ Federal”
- มีข้อสังเกตเพิ่มเติมด้วย
- ความล้มเหลวเกิดบ่อยกว่าใน รัฐที่ขึ้นต้นด้วย M เช่น Maryland, Maine, Massachusetts, Michigan
- เมื่อให้เลือก ID จากรายการ JSON ที่อ่านง่ายโดยวางแต่ละรัฐแยกบรรทัด ทำให้สับสนน้อยกว่ารายการที่คั่นด้วยจุลภาคต่อกัน
API และ abstraction ถูกคงไว้อย่างเรียบง่าย
- ในกรณีนี้ Langchain ใกล้เคียงกับ การทำ abstraction ก่อนเวลาอันควร และแม้หลังจากใช้งานหลายล้านโทเค็นกับฟีเจอร์ production ที่หลากหลาย 3–4 รายการแล้ว ในไฟล์
openai_serviceก็ยังเหลือเพียงฟังก์ชัน 40 บรรทัดหนึ่งตัว - API ที่ใช้จริงมีแค่
chat- สกัด JSON เสมอ
- ไม่จำเป็นต้องใช้ JSON mode, function calling หรือ assistants
- ไม่ใช้ system prompt ด้วย
- เมื่อ
gpt-4-turboเปิดตัว ก็เปลี่ยนเพียงสตริงเดียวใน codebase
- ฟังก์ชันส่วนใหญ่รับผิดชอบการจัดการข้อผิดพลาด เช่น ข้อผิดพลาด 500 ของ OpenAI API หรือ socket ปิด
- ข้อผิดพลาดเหล่านี้ดีขึ้นแล้ว และมองว่าไม่น่าแปลกใจเมื่อคำนึงถึงโหลดของ OpenAI
- ข้อจำกัดความยาว context จัดการด้วยการตัดข้อความอัตโนมัติของตัวเอง
- หากความยาวสตริงมากกว่า
model_context_size * 3จะตัดออก - เมื่อมีเครื่องหมายจุดหรือตัวเลขจำนวนมาก อัตราส่วนโทเค็นอาจต่ำกว่า 1 โทเค็นต่อ 3 ตัวอักษรจนทำให้ล้มเหลวได้
- หากเกิด
context_length_exceededจะตัดใหม่ตามเกณฑ์model_context_size * 3 / 1.3แล้วลองอีกครั้ง
- หากความยาวสตริงมากกว่า
UX แบบสตรีมมิงประเมินค่าต่ำได้ยาก
- การใช้ streaming API เพื่อลด latency และแสดง ตัวอักษรที่ปรากฏด้วยความเร็วแปรผัน ให้ผู้ใช้เห็น ตอนแรกดูเหมือนเป็นลูกเล่น
- ผู้ใช้จริงตอบรับการแสดงผลแบบ “พิมพ์” ด้วยความเร็วแปรผันในเชิงบวกอย่างมาก
- ประสบการณ์นี้ให้ความรู้สึกเหมือนช่วงเวลาที่เมาส์และเคอร์เซอร์กลายเป็น UX สำคัญในโลก AI
ผลลัพธ์ว่างและเอาต์พุตยาวเป็นจุดอ่อน
- “ถ้าหาไม่พบให้คืนเอาต์พุตว่าง” ใกล้เคียงกับข้อความพรอมป์ที่ก่อข้อผิดพลาดมากที่สุด
- ความหมายไม่ได้ให้ไม่ต้องพิมพ์อะไรเลยจริง ๆ แต่ให้คืนตัวแทนค่าว่าง เช่น
{value: ""} - ปัญหาไม่ใช่ความล้มเหลวของข้อจำกัดเอาต์พุต แต่ใกล้เคียงกับความยากในการตัดสิน สมมติฐานว่าง เอง
- ความหมายไม่ได้ให้ไม่ต้องพิมพ์อะไรเลยจริง ๆ แต่ให้คืนตัวแทนค่าว่าง เช่น
- เมื่อควรคืนค่าว่าง GPT บางครั้งเลือก hallucinate และในทางกลับกัน บางครั้งก็มั่นใจน้อยลงจนคืนค่าว่างบ่อยเกินไป
- เมื่อมีบั๊กที่ทำให้บล็อกข้อความอาจว่างเปล่า hallucination เกิดขึ้นอย่างรุนแรง
- ตัวอย่างเช่น มีชื่อร้านเบเกอรีปลอมอย่าง Sunshine Bakery, Golden Grain Bakery, Bliss Bakery ปรากฏขึ้น
- วิธีแก้คือถ้าไม่มีข้อความ ก็ไม่ส่งพรอมป์ไปเลย
- GPT-4 อาจมี หน้าต่าง 128k โทเค็น สำหรับอินพุต แต่หน้าต่างเอาต์พุตยังอยู่ระดับประมาณ 4k
- คำว่า “context window” ทำให้สับสนระหว่างอินพุตกับเอาต์พุต
- เมื่อให้คืนรายการออบเจ็กต์ JSON แม้เป็นออบเจ็กต์ง่าย ๆ ก็ยากที่จะเกิน 10 รายการ
- หากขอ 15 รายการ ประเมินว่าสำเร็จเพียงประมาณ 15%
- แม้หยุดที่ระดับ 10 รายการ เอาต์พุตก็มีเพียงประมาณ 700–800 โทเค็นเท่านั้น
- แม้จะเลี่ยงข้อจำกัดเอาต์พุตได้ด้วยการขอทีละรายการและใส่ผลลัพธ์ก่อนหน้ากลับเข้าไป แต่จะกลายเป็นการเล่น เกมโทรศัพท์ กับ GPT และต้องจัดการเครื่องมืออย่าง Langchain
RAG และ vector DB ไม่เหมาะกับกรณีใช้งานนี้
- ในกรณีของ Truss นั้น vector DB และ RAG/embedding แทบไม่มีประโยชน์
- มองว่า vector DB และ RAG เหมาะกับการค้นหา และโดยเฉพาะการค้นหาแบบ ค้นหาจริง อย่าง Google หรือ Bing มากกว่า
- ปัญหาหลักคือเกณฑ์ความเกี่ยวข้อง
- ไม่มี cutoff ที่ชัดเจนสำหรับความเกี่ยวข้อง
- อาจมีวิธีอย่าง rerank ของ Cohere หรือ heuristic ของตัวเอง แต่ไม่เสถียร
- มีความเสี่ยงที่ผลการค้นหาจะปนเปื้อนด้วยผลลัพธ์ที่ไม่เกี่ยวข้อง หรือจับแบบอนุรักษนิยมเกินไปจนพลาดผลลัพธ์สำคัญ
- การเก็บเวกเตอร์ไว้ใน DB เฉพาะทางหรือ proprietary ที่แยกจากข้อมูลทั่วไปก็มีการสูญเสียมาก
- หากไม่ได้อยู่ในระดับ Google หรือ Bing ก็มองว่าการสูญเสียบริบทไม่คุ้มกับ trade-off
- ในการค้นหาภายในแอปธุรกิจ ผู้ใช้มักเป็นผู้เชี่ยวชาญในโดเมน
- มองว่าผู้ใช้ไม่ชอบ semantic search ที่คาดเดาความหมายซึ่งผู้ใช้ไม่ได้ป้อนเองแล้วนำมาคืนผล
- ในกรณีค้นหาส่วนใหญ่ การใช้ LLM เป็น completion prompt ทั่วไปเพื่อแปลงคำค้นของผู้ใช้เป็น faceted search, query ซับซ้อน หรือ SQL อาจดีกว่า
- วิธีนี้ไม่ใช่ RAG
Hallucination ลดลงมากเมื่อมีบริบทเพียงพอ
- กรณีใช้งานส่วนใหญ่ของ Truss อยู่ในรูปแบบ “ให้บล็อกข้อความ แล้วสกัดบางอย่างจากบล็อกนั้น”
- หากขอชื่อบริษัทที่กล่าวถึงในข้อความ GPT มักไม่คืนชื่อบริษัทแบบสุ่ม
- แต่เมื่อไม่มีบริษัทในข้อความ ปัญหาสมมติฐานว่างก็กลับมาอีกครั้ง
- ในโค้ด GPT ก็ไม่ค่อย hallucinate ในความหมายของการสร้างชื่อตัวแปรขึ้นมาเองหรือแทรก typo แบบสุ่มระหว่างเขียนบล็อกโค้ดที่ส่งให้ใหม่
- อย่างไรก็ตาม หากขอให้สร้างบางอย่าง อาจแต่งว่ามีฟังก์ชันใน standard library อยู่จริง
- มองว่านี่ก็ใกล้เคียงกับปัญหาที่ไม่สามารถพูดว่า “ไม่รู้” ได้
- ในงานที่ให้บริบททั้งหมดแล้วให้ วิเคราะห์·สรุป·สกัด ถือว่าน่าเชื่อถือมาก
- โครงสร้างใกล้เคียงกับว่า หากใส่ข้อมูลที่ดี ก็จะได้คำตอบ GPT token ที่ดี
การประเมินแนวโน้มในอนาคต
- มองว่าเพียง transformer ปัจจุบัน ข้อมูลอินเทอร์เน็ต และการเข้าถึง infrastructure ระดับหลายพันล้านดอลลาร์ ยังไม่พอไปถึง AGI
- GPT-4 ไม่ใช่การตลาด แต่เป็น เทคโนโลยีที่มีประโยชน์ 100% และยังอยู่ในช่วงคล้ายยุคต้นของอินเทอร์เน็ต
- ไม่ใช่เทคโนโลยีที่จะเลิกจ้างทุกคน
- มีผลอย่างมากในการลดกำแพงการเข้าสู่ ML/AI ที่ก่อนหน้านี้มีเพียง Google เท่านั้นที่เข้าถึงได้
- Claude, Gemini ฯลฯ ไม่ได้ทดสอบ A/B อย่างเข้มงวด
- เมื่อทดสอบในการเขียนโค้ดประจำวัน รู้สึกว่ายังไม่ใกล้ GPT-4 ในส่วนละเอียดอ่อนของการเดาเจตนาอย่างเป็นธรรมชาติ
- มองว่าไม่จำเป็นต้องติดตามกระแส LLM/AI ทั้งหมด
- เมื่อพิจารณาตาม The Bitter Lesson หากการเพิ่มประสิทธิภาพของโมเดลทั่วไปสำคัญกว่าการปรับปรุงเฉพาะทาง ก็เพียงต้องสนใจว่า GPT-5 จะเปิดตัวหรือไม่
- หากไม่นับสาขาแยกอย่าง Sora รุ่นย่อยระหว่างทางของ OpenAI ส่วนใหญ่ถือว่าใกล้เคียงกับสัญญาณรบกวน
- GPT-5 มีแนวโน้มเป็น การปรับปรุงแบบค่อยเป็นค่อยไป มากกว่าจะเปลี่ยนทุกอย่าง
- ตอนเปลี่ยนจาก GPT-3 ไป GPT-3.5 เคยคาดหวังการปรับปรุงแบบ superlinear ว่าหากเพิ่มความเข้มข้นการฝึก 2 เท่า ประสิทธิภาพจะดีขึ้น 2.2 เท่า
- ในความเป็นจริงดูเหมือนการปรับปรุงแบบ logarithmic และมองว่าเป็นสถานการณ์ที่ความเร็วโทเค็นกับต้นทุนต่อโทเค็นเพิ่มขึ้นแบบทวีคูณเพื่อให้ได้การปรับปรุงทีละน้อย
- GPT-4 อาจเป็นจุดเหมาะสมที่สุดสำหรับชุดงานในปัจจุบัน
- แม้ยินดีจ่ายแพงกว่า GPT-3.5 ถึง 20 เท่าเพื่อใช้ GPT-4 แต่ดูเหมือนจะไม่จ่ายต่อโทเค็นแพงขึ้น 20 เท่าเพื่อขยับจาก GPT-4 ไป GPT-5
- GPT-5 อาจทำลายสมมติฐานนี้ได้ หรืออาจเป็นเพียงระดับการเปลี่ยนจาก iPhone 4 ไป iPhone 5
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ทีมที่ผมดูแลประมวลผล 5 พันล้าน+ โทเค็น ต่อเดือนและยังเพิ่มขึ้นเรื่อย ๆ มีบทเรียนอยู่ไม่กี่ข้อ
อย่างแรกคือมีการทำ abstraction เร็วเกินไปมากเกินจำเป็น เครื่องมืออย่าง Langchain อาจมีประโยชน์ในสักวันหนึ่ง แต่สุดท้ายแล้วพรอมป์ตก็เป็นแค่การเรียก API และการจัดการการเรียก LLM ด้วยโค้ดมาตรฐานแบบเดียวกับ การเรียก API ที่ไม่เสถียร นั้นง่ายกว่าการปฏิบัติต่อมันเหมือนเป็นสิ่งพิเศษ
อย่างที่สอง ภาพหลอนเป็นปัญหาใหญ่จริง ๆ งานสรุปผลค่อนข้างแข็งแรงในการทดสอบ แต่การให้เหตุผลนั้นยากมาก และ โมเดลการกระทำ ที่รับอินพุตจากผู้ใช้แล้วให้ LLM ตัดสินใจว่าจะทำอะไรต่อ ยิ่งยากเป็นพิเศษทั้งในแง่การเข้าใจบริบทและการทำให้มันพูดว่า “ไม่แน่ใจ” ถึงอย่างนั้น แค่การทำสิ่งนี้ได้ก็นับว่าเปลี่ยนเกมแล้ว
อย่างที่สาม ผมเห็นด้วยกับฝั่งที่บอกว่า “เปลี่ยนเกม” มากกว่าผู้เขียนนิดหน่อย แต่ก็ไม่คิดว่าโลกจะถึงกาลอวสาน บางอาชีพจะได้รับผลกระทบหนัก และเราอาจมีช่วงหลายปีที่ลำบากจากบอตที่ปั่นกระแสสาธารณะบนแพลตฟอร์มต่าง ๆ โดยรวมแล้วมันดูเหมือน ตัวขยายความสามารถ มากกว่าจะเป็นนวัตกรรมพลิกโลกแบบอินเทอร์เน็ต
สำหรับผม มันคล้ายกับการเปลี่ยนแปลงของ DevOps ในยุค 2000 ตอนนี้ไม่จำเป็นต้องมีทีมเฉพาะทางขนาดใหญ่คอยช่วย deploy อีกแล้ว แค่จ้างผู้เชี่ยวชาญไม่กี่คน แล้วที่เหลือซื้อโซลูชันสำเร็จรูปมาใช้ เช่นเดียวกัน งานแมชชีนเลิร์นนิงบางอย่างตอนนี้นักพัฒนาเว็บอย่างผมก็ทำได้ง่ายขึ้น
แม้แต่พัฒนาการของ DevOps ก็มีการแลกเปลี่ยนเหมือนกัน ตัวอย่างเช่น ผลลัพธ์ตรง ๆ ของแนวคิด “ก็ใช้ AWS RDS ไปสิ” คือความสามารถหลักอย่างการดูแลฐานข้อมูลค่อย ๆ หายไป และค่าใช้จ่ายบิลคลาวด์ก็พุ่งสูง โดยเฉพาะสตาร์ตอัปที่ขนาดข้อมูลหรือความซับซ้อนด้านภูมิภาคไม่ได้มากนักก็ยังมีต้นทุนการดำเนินงานสูงขึ้น และผมคิดว่ากระแสนี้ยังนำไปสู่อุบัติเหตุอย่างเหตุล่มใหญ่ของ GitLab และเหตุคล้ายกันด้วย
คล้ายกับเวลาบอกให้ทายหัวก้อยแล้วตอบว่า “หัว” ก่อนตอบคุณอาจพูดถึงความไม่แน่นอนอย่าง Pr[หัว] = .5 ได้ แต่ในตัวคำทำนายจริงและผลการโยนเหรียญ ความไม่แน่นอนนั้นหายไป LLM ก็เช่นกัน ความไม่แน่นอนระหว่างคำนวณจะหายไปในการทำนายโทเค็นสุดท้าย ดังนั้น เว้นแต่ว่าการทำนายนั้นเองจะเป็นการแสดงความไม่แน่นอน มันแทบจะไม่ส่งเอาต์พุตว่า “ฉันไม่เข้าใจ” ออกมา อย่างไรก็ดี เหตุผลก็คือมันตั้งต้นจากการทำนายโดยไม่ได้เข้าใจอยู่แล้ว
โดยพื้นฐานแล้ว ผมคิดว่าเรากำลังใช้ GPT เป็นสิ่งเทียบเท่า PaaS/Heroku/Render ในโลกปฏิบัติการ AI
ผมสงสัยตรงที่บอกว่า “เราดึง JSON ตลอด ไม่จำเป็นต้องมีโหมด JSON” เพราะสำหรับผมมันทำงานได้ค่อนข้างดี
และประโยค “บทเรียนที่ 4: GPT อ่อนมากในการสร้างสมมติฐานศูนย์” ก็โดนใจมาก เมื่อวานผมยังทดสอบพรอมป์ตกฎการแก้ไขข้อความ โดยเขียนไว้ท้ายสุดว่า “ถ้าไม่มีกฎข้อไหนใช้กับข้อความนี้ ให้คืนข้อความต้นฉบับโดยไม่เปลี่ยนแปลง”
เดาว่า ChatGPT ตอบอะไรกับข้อความที่ไม่เข้ากฎเลย? มันตอบเป็นสตริงว่า “The original text without any changes” แบบตรงตัวเลย
ครั้งหนึ่งผมกำลังสร้างภาพผู้หญิงสามคนดื่มไวน์ในสวนสวยสำหรับใช้กับไพ่ทาโรต์ แล้วเติมคำว่า “lush vegetation” ไว้ท้ายพรอมป์ต ผลคือเพราะความกำกวมของคำว่า lush บรรยากาศที่ควรหรูหรากลับกลายเป็นแนวสาวมหาวิทยาลัยปาร์ตี้จมูกแดงแทน
ถ้าเขียนพรอมป์ตให้ดีขึ้น ก็ใช้โมเดลที่ถูกกว่าได้
การบอก LLM ว่า “ถ้าไม่เจออะไร อย่าส่งอะไรกลับมา” เป็นวิธีระดับ Level 0 ที่เปิดช่องให้มันหนีปัญหา ทางที่ดีกว่าคือให้ทางออกที่นุ่มนวลกว่า เช่น “ถ้าข้อมูลไม่พอสำหรับการยืนยันอย่างเด็ดขาด คุณอาจตั้งสมมติฐานได้หนึ่งข้อ แต่ต้องระบุให้ชัดว่ากำลังทำเช่นนั้น พร้อมอธิบายหลักฐานและฐานตรรกะของสมมติฐานนั้น” แล้วค่อยให้มันประเมินคำตอบของตัวเองในตอนท้าย
ถ้ายังไม่มีวิธีอัตโนมัติ คุณต้องทดสอบซ้ำ ๆ กับอินพุตหลายแบบเพื่อดูว่ามันตีความคำขออย่างไร ล้มเหลวตรงไหน แล้วค่อยอุดช่องโหว่เหล่านั้น คุณต้องถึงขั้นตรวจสอบด้วยซ้ำว่าโมเดลเข้าใจคำว่า nothing หมายถึงอะไรหรือไม่
ฉันสมัครใช้บริการท็อป 3 ในสาย LLM ครบทั้งหมด แล้วชอบโยนพรอมป์ต์เดียวกันใส่บ่อย ๆ ซึ่งผลคือเอนไปทาง GPT-4 อย่างชัดเจนมาก แม้จะน่าประหลาดใจเมื่อคิดว่า GPT-4 ออกมาได้ 1 ปีแล้วและระหว่างนั้นก็มีอัปเดตหลายครั้ง
อย่างน้อยในรูปแบบการใช้งานของฉัน อาการหลอนก็เกิดไม่บ่อยนัก ตรงกันข้าม Claude มักแต่ง API ที่ดูน่าเชื่อถือแต่ไม่มีอยู่จริงได้ค่อนข้างง่ายเวลาเขียนโค้ด ส่วน GPT-4 เวลามันรู้ว่าตัวเองถูกต้องจะดื้อกว่าและไม่ค่อยเออออตาม ความต่างแบบนี้แทบไม่สะท้อนในตัวชี้วัด ต้องลองใช้เองถึงจะเห็น
แม้ในงานเขียนโค้ด ฉันก็มักขอให้ช่วยอธิบายหัวข้อหรือโค้ดมากกว่าจะให้เขียนโค้ด และมันมีแนวโน้มจะให้คำตอบที่ละเอียดอ่อนกว่าอย่างมาก ถ้าให้ข้อความยาว ๆ แล้วคุยต่อ ฉันรู้สึกว่า Claude Opus เข้าใจเนื้อหาได้ลึกกว่า ขณะที่ GPT-4 มักหยุดอยู่ที่การสรุปข้อความที่ให้ไป ส่วน Claude ขยายความและให้เหตุผลต่อได้ดีกว่า
แต่ถ้าเป็นพรอมป์ต์ที่ประกอบมาดี Claude Opus มักมีแนวโน้มให้ผลลัพธ์ดีกว่า GPT-4 Claude ยืดหยุ่นกว่าและให้คำตอบที่ยาวกว่า ขณะที่ ChatGPT/GPT-4 มักฟังดูเป็นคำตอบสั้น ๆ แบบ “สำเร็จรูป” ในสไตล์ของตัวเองเสมอ
ในตัวอย่างโค้ดที่ขอไป โค้ดที่ GPT-4 สร้างมาหลายครั้งถึงขั้นคอมไพล์ไม่ผ่าน แต่กับ Claude แทบไม่เคยเจอแบบนั้น
ช่วงนี้ลิตมัสเทสต์ที่ใช้คือ “ช่วยบอกบาร์แปลก ๆ 10 แห่งในรัศมี 200 ไมล์จาก Austin” ซึ่งยากมากสำหรับทุกตัว GPT-4 ใกล้เคียงที่สุดพอสมควร แต่ Claude แต่งขึ้นล้วน ๆ ส่วน Gemini พังไม่เป็นท่า
GPT เจ๋งมากก็จริง แต่ฉันไม่เห็นด้วยอย่างแรงกับการตีความในสองย่อหน้าของบทความ
จะสรุปได้ว่าแนวทางที่ดีกว่าคือพูดประมาณว่า “GPT เธอรู้จักทั้ง 50 รัฐแน่ ๆ ดังนั้นให้คืนชื่อเต็มของรัฐที่เข้าข่าย หรือถ้าเป็นรัฐบาลสหรัฐก็ให้ตอบว่า Federal”
แต่การตีความว่าเมื่อพูดกำกวมขึ้นแล้วคุณภาพและการสรุปทั่วไปของ GPT ดีขึ้น นั่นเป็นสัญญาณแบบฉบับของการมอบหมาย/การคิดระดับสูง ฉันว่ามันเกินไป ภาษาธรรมชาติคือผลลัพธ์ที่ GPT มีความน่าจะเป็นสูงสุดอยู่แล้ว เพราะมันคล้ายกับข้อความที่ใช้ฝึก ในกรณีนี้นักพัฒนาแค่เอนเข้าหาสิ่งที่ GPT ทำได้ดี แทนที่จะให้มันทำงานมากขึ้น
มีงานง่าย ๆ มากมายที่ทำให้ GPT พลาดได้ งานอย่างการแทนที่ตัวอักษร การสะกดผิดโดยตั้งใจ เป็นงานที่ยากมากสำหรับ GPT เช่นเดียวกับการแมป ID โดยเฉพาะเมื่อเป็นการแมปที่ต่างจากที่มันเห็นตอนฝึกมาก ๆ เช่นรหัสประเทศสามตัวอักษรที่คล้ายกันแต่ไม่ใช่ ISO
สิ่งที่น่าสนใจคือการที่ GPT “เข้าใจ” การแมปได้ต่างหาก ฉันมองว่านั่นเป็นร่องรอยที่แท้จริงของ การจับคู่รูปแบบระดับสูง
ทิปเกี่ยวกับปัญหา
null: LLM ถูกสร้างมาให้พ่นโทเคนออกมา ไม่ได้ถูกสร้างมาเพื่อไม่พ่นโทเคนเพราะงั้นแทนที่จะบอกว่า “อย่าคืนอะไรเลย” ก็ให้บอกว่าเมื่อไม่มีผลลัพธ์ให้ “คืนค่าเริ่มต้นของ XYZ” แล้วค่อยค้นหาข้อความนั้นในผลลัพธ์ เหมือนค้นหาชื่อสถานะ เช่น XYZ
อีกอย่าง system prompt ก็มีประโยชน์มาก โดยพื้นฐานแล้วมันคือโอกาสที่จะให้ LLM สวมบทบาทเป็น X ถ้าเปิดให้ส่ง system prompt โดยตรงได้จะดีมาก แต่ถึงอย่างนั้นมีไว้ก็ยังดีกว่าไม่มี
ที่บอกว่า GPT คืนรายการออบเจ็กต์ JSON ให้ถูกต้องเกิน 10 รายการไม่ได้ นั่นเป็น ปัญหาที่พรอมป์ต์ ฉันเคยทำให้มันคืนได้อย่างเสถียรถึง 200 รายการในลำดับที่ถูกต้อง
เคล็ดลับคืออย่าใช้รายการเลยในเอาต์พุต แต่ใช้คีย์ JSON อย่าง
"item1": {...}แทน สำหรับอินพุตที่อาจมีเอาต์พุต 0~n รายการ ก็ยังใช้รายการเป็นค่าได้ถ้าให้ GPT-4 รายการของรายการที่มีอยู่พร้อมโครงสร้างที่กำหนดไว้ แล้วให้แปลงเป็น JSON แบบแปลงสคีมา มันทำได้ทั้งวันไม่มีปัญหา แต่ถ้าต้องใช้การให้เหตุผลไม่ว่าชนิดใดก็ตาม และต้องสร้างรายการขึ้นมาเองเป็นหลัก มันจะให้มาแค่บางส่วนที่จำกัดมาก
ฉันเจอปัญหาคล้ายกันใน LLM อื่น ๆ ด้วย เลยอยากรู้มากว่าคุณใช้วิธีเข้าหาอย่างไร
งานอย่าง “ดึงชื่อบริษัทจากบล็อกข้อความ” แบ่งเป็น สองขั้น ได้
ก่อนอื่นถามว่า “ในบล็อกข้อความนี้มีการกล่าวถึงบริษัทหรือไม่?” ถ้าไม่มีก็คือได้ผลลัพธ์แบบ null แล้ว ถ้ามี ค่อยถามต่อว่า “จงลิสต์ชื่อบริษัทในบล็อกข้อความนี้”
ฉันใช้โมเดล OpenAI ในแอปเขียนส่วนตัว และบทความนี้แม่นมาก มีสิ่งหนึ่งที่เรียนรู้ซึ่งเกี่ยวกับ Lesson 1 ที่ว่า “ยิ่งพรอมป์ต์น้อยยิ่งดี”
ตอนสร้างฟีเจอร์ค้นหาอัจฉริยะสำหรับโน้ต ฉันพยายามให้ ChatGPT คืนข้อมูล JSON ที่มีโครงสร้าง ตัวอย่างเช่น ถามว่า “ขอโน้ตทั้งหมดของฉันที่พูดถึง Haskell ภายใน 2 ปีที่ผ่านมาและถูกทำเครื่องหมายเป็นฉบับร่าง” แล้วปล่อยให้ ChatGPT ตัดสินใจเองว่าควรคืนอะไรบ้าง วิธีนี้ใช้ได้แค่บางครั้ง
แต่พอเอาข้อมูลใส่ฐานข้อมูล SQLite แล้วส่งสคีมาให้ ChatGPT จากนั้นให้มันเขียนคิวรีเพื่อคืนผลลัพธ์ที่ต้องการ กลับทำงานได้ดีกว่ามาก
response_format=json_objectหรือยังสำหรับการได้คำตอบแบบมีโครงสร้าง การเรียกใช้ฟังก์ชันเหมาะกว่า แต่ก็มีข้อจำกัดมากกว่าการรับ JSON ตรง ๆ
ตัวอย่างที่ว่าพอสั่งละเอียดเกินไปแล้วความแม่นยำลดลงนั้น จากความเข้าใจแบบหยาบ ๆ ของฉันเกี่ยวกับวิธีทำงานของระบบพวกนี้ มันก็พอฟังขึ้น
ถ้าใส่รายชื่อรัฐทั้งหมดลงไป เท่ากับไปกระตุ้นเวกเตอร์ของทุกรัฐในระดับหนึ่ง แต่ถ้าพูดแค่ว่า “state” แล้วมีชื่อรัฐที่ชัดเจนอยู่ในข้อความที่ส่งเข้าไป เวกเตอร์ที่เกี่ยวกับสิ่งที่กำลังค้นหาจะถูกกระตุ้นน้อยกว่า ดังนั้นตอนทำ softmax โอกาสที่รัฐที่ถูกต้องจะถูกเลือกก็สูงขึ้น
ในทำนองเดียวกัน การเปรียบเทียบ
/nกับลูกน้ำก็น่าจะเป็นเพราะ ความต่างของการทำโทเคนไนซ์