tool_choice any และ forced tool สำหรับงาน extraction
แนวคิด
นอกจากออกแบบ schema แล้ว การควบคุมว่าโมเดลจะเรียก tool หรือไม่ก็สำคัญพอกันในงาน extraction เอกสารระบุตัวเลือก tool_choice สี่แบบ คือ auto ที่ให้โมเดลตัดสินเองว่าจะเรียก tool หรือตอบเป็นข้อความ, any ที่บังคับว่าต้องเรียก tool อย่างน้อยหนึ่งตัวแต่เลือกได้ว่าตัวไหน, forced tool แบบ {"type": "tool", "name": "..."} ที่บังคับให้เรียก tool ที่ระบุชื่อ และ none ที่ห้ามเรียก tool
สองแบบที่เกี่ยวกับ extraction โดยตรงคือ any และ forced tool ต่างกันที่ "ระดับการบังคับ" any บอกว่าต้องเรียก tool สักตัว ส่วน forced บอกเจาะจงว่าต้องเรียกตัวไหน
ทำไมสำคัญ
ใช้ tool_choice any เมื่อมี extraction schema หลายตัวและยังไม่รู้ว่าเอกสารเป็นประเภทไหน สมมติคุณมี tool แยกสำหรับดึงข้อมูลจากใบแจ้งหนี้ ใบเสร็จ และสัญญา พอเจอเอกสารที่ไม่รู้ชนิด การตั้ง any รับประกันว่าโมเดลจะเลือกเรียก extraction tool สักตัวแทนที่จะตอบกลับเป็นข้อความสนทนา แล้วปล่อยให้โมเดลใช้วิจารณญาณเลือก schema ที่ตรงกับเอกสารมากที่สุด นี่คือประโยชน์หลักของ any คือการันตีว่าได้ structured output ออกมา ไม่ใช่ prose
ใช้ forced tool เมื่อต้องการให้ extraction ตัวใดตัวหนึ่งทำงานก่อนเป็นขั้นแรก เช่น บังคับเรียก extract_metadata ก่อน แล้วค่อยประมวลผลขั้น enrichment ในเทิร์นถัดไป การบังคับ tool เจาะจงมีประโยชน์เมื่อลำดับสำคัญ คุณอยากได้ metadata พื้นฐานก่อนที่จะให้โมเดลไปทำงานที่ซับซ้อนกว่า จากนั้นค่อยดำเนินขั้นต่อไปในเทิร์นถัด ๆ ไป
การเลือกระหว่างสองแบบขึ้นกับว่าคุณรู้ปลายทางแค่ไหน ถ้ารู้ว่าต้องเรียกอะไรก่อนแน่ ๆ ใช้ forced ถ้ารู้แค่ว่าต้องได้ structured output แต่ให้โมเดลเลือก schema เอง ใช้ any ส่วน auto เหมาะกับงานสนทนาทั่วไปที่บางครั้งไม่ต้องเรียก tool และ none เหมาะเมื่ออยากให้ตอบเป็นข้อความล้วนชั่วคราว สำหรับ pipeline extraction ที่ต้องได้ข้อมูลมีโครงสร้างทุกครั้ง auto มักหลวมเกินไป เพราะเปิดช่องให้โมเดลตอบเป็น prose ได้ any จึงเป็นค่าเริ่มต้นที่ปลอดภัยกว่าเมื่อผลลัพธ์ต้องถูกเครื่องอ่านต่อ
ตัวอย่าง
# เอกสารไม่รู้ชนิด → any บังคับให้เลือก extraction tool สักตัว
tool_choice = {"type": "any"}
tools = [extract_invoice, extract_receipt, extract_contract]
# โมเดลต้องเรียกตัวใดตัวหนึ่ง ไม่ตอบเป็น prose
# ต้องได้ metadata ก่อน → forced tool เจาะจง
tool_choice = {"type": "tool", "name": "extract_metadata"}
# บังคับเรียก extract_metadata ก่อน แล้วทำ enrichment ในเทิร์นถัดไป
เช็คความเข้าใจ
เมื่อมี extraction schema หลายตัวและไม่รู้ว่าเอกสารเป็นประเภทใด ควรตั้ง tool_choice แบบใด และได้ประโยชน์อะไร
tool_choice any ต่างจาก forced tool อย่างไร และเมื่อไรใช้ forced