2 คะแนน โดย GN⁺ 2024-12-09 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

Structured Outputs

6 ธันวาคม 2024

ขณะนี้ Ollama รองรับ structured outputs ที่สามารถจำกัดผลลัพธ์ของโมเดลให้อยู่ในรูปแบบเฉพาะที่กำหนดด้วย JSON schema ได้แล้ว โดยไลบรารี Ollama สำหรับ Python และ JavaScript ก็ได้รับการอัปเดตให้รองรับ structured outputs เช่นกัน

  • กรณีการใช้งานของ structured outputs:
    • พาร์สข้อมูลจากเอกสาร
    • ดึงข้อมูลจากรูปภาพ
    • ทำให้การตอบกลับของ language model ทั้งหมดมีโครงสร้าง
    • ให้ความน่าเชื่อถือและความสม่ำเสมอสูงกว่า JSON mode

เริ่มต้นใช้งาน

  • ดาวน์โหลด Ollama เวอร์ชันล่าสุด
  • อัปเกรดไลบรารี Ollama สำหรับ Python หรือ JavaScript เป็นเวอร์ชันล่าสุด
cURL
  • สามารถส่ง structured output ให้โมเดลได้ด้วยพารามิเตอร์ format
ผลลัพธ์
  • ระบบจะส่งคืนคำตอบในรูปแบบที่กำหนดไว้ด้วย JSON schema ของคำขอ
Python
  • ใช้ไลบรารี Ollama สำหรับ Python เพื่อส่ง schema เป็นอ็อบเจ็กต์ JSON ผ่านพารามิเตอร์ format
  • แนะนำให้ใช้ Pydantic ในการซีเรียลไลซ์ schema
ผลลัพธ์
  • name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
  • ใช้ไลบรารี Ollama สำหรับ JavaScript เพื่อส่ง schema เป็นอ็อบเจ็กต์ JSON ผ่านพารามิเตอร์ format
  • แนะนำให้ใช้ Zod ในการซีเรียลไลซ์ schema
ผลลัพธ์
  • { name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }

ตัวอย่าง

การดึงข้อมูล

  • กำหนด schema ที่แสดงข้อมูล เพื่อดึงข้อมูลแบบมีโครงสร้างจากข้อความ
  • โมเดลจะดึงข้อมูลและส่งคืนข้อมูลเป็น JSON ตาม schema ที่กำหนดไว้
ตัวอย่างผลลัพธ์
  • pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]

คำอธิบายภาพ

  • structured outputs สามารถใช้ร่วมกับ vision model ได้
  • ใช้ llama3.2-vision เพื่ออธิบายภาพและส่งคืน structured output
ตัวอย่างผลลัพธ์
  • summary='A palm tree on a sandy beach with blue water and sky.'
  • objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]
  • scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
ความเข้ากันได้กับ OpenAI
  • ใช้งานร่วมกับ structured outputs ได้ผ่านไคลเอนต์ OpenAI

เคล็ดลับ

  • หากต้องการใช้ structured outputs อย่างน่าเชื่อถือ:
    • ใช้ Pydantic (Python) หรือ Zod (JavaScript) เพื่อกำหนด response schema
    • เพิ่ม "ส่งคืนเป็น JSON" ในพรอมป์ต์เพื่อให้โมเดลเข้าใจคำขอ
    • ตั้งค่า temperature เป็น 0 เพื่อให้ผลลัพธ์มีความเป็น deterministic มากขึ้น

ขั้นตอนถัดไป

  • การเปิดเผย logits เพื่อการสร้างแบบควบคุม
  • ปรับปรุงประสิทธิภาพและความแม่นยำของ structured outputs
  • การเร่งความเร็วด้วย GPU สำหรับ sampling
  • รองรับรูปแบบเพิ่มเติมนอกเหนือจาก JSON schema

1 ความคิดเห็น

 
GN⁺ 2024-12-09
ความคิดเห็นใน Hacker News
  • สามารถตั้งข้อจำกัดของเอาต์พุตที่เข้มงวดมากขึ้นได้ผ่านความสามารถ gbnf ของ llama.cpp

  • มีประโยชน์เมื่อต้องการจัดโครงสร้างพรอมป์ปกติและแปลงเป็นข้อมูล csv เพราะช่วยตัดข้อความที่ไม่จำเป็นออกได้

  • เมื่อใช้ gemma2:2b แล้วป้อนข้อความเข้าไป ก็สามารถได้ผลลัพธ์ในรูปแบบ JSON ที่มีโครงสร้าง

    • อินพุตตัวอย่าง: "You have spent 190 at Fresh Mart. Current balance: 5098"
    • เอาต์พุตตัวอย่าง: {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • มีความเห็นที่สงสัยว่าข้อจำกัดส่งผลต่อคุณภาพเอาต์พุตของ LLM อย่างไร

    • ในบางกรณี การพาร์สเป็น Markdown หรือข้อความธรรมดาอาจให้คุณภาพที่ดีกว่า
  • มีคำถามว่าสามารถใช้กับโมเดลที่รองรับได้หรือไม่

    • บนฮาร์ดแวร์ส่วนตัว สามารถรันได้เสถียรแค่โมเดลขนาด 1b-3b เท่านั้น
  • มีความสงสัยว่า llama.cpp และ ollama ใช้ความสามารถด้าน structured output ของ llama หรือว่าถูกทำขึ้นด้วยวิธีอื่น

    • ในหน้าของ Meta Llama มีการระบุว่าโมเดลรองรับ structured output มาแต่เดิม
  • มีคำถามว่าเมื่อเทียบกับ outlines แล้วมีมูลค่าเพิ่มอะไรบ้าง

  • เหตุผลที่ยังใช้ oobabooga ต่อไป เป็นเพราะรองรับ exlv2 ทำให้อนุมานได้มีประสิทธิภาพมากกว่าบนเครื่องที่ใช้ 3090 คู่

  • อยากให้ยกตัวอย่าง curl ขึ้นมาก่อน

    • ชอบ Pydantic แต่การเขียนสคีมาด้วยตัวเองทำให้ย้ายโปรโตไทป์ไป Go ได้ง่ายกว่า
  • มีคำถามเกี่ยวกับวิธีที่ดีที่สุดในการป้อนอินพุตแบบมีโครงสร้างให้ LLM

    • ตัวอย่าง: ป้อน 100 ประโยคเพื่อจัดหมวดหมู่แต่ละประโยคด้วยวิธีที่ต่างกัน
    • การได้ข้อมูลแบบมีโครงสร้างนั้นง่าย แต่การใช้เลขบรรทัดเป็นคำนำหน้าดูไม่ค่อยเป็นธรรมชาติ