Structured Outputs ด้วย Ollama
(ollama.com)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 ความคิดเห็น
ความคิดเห็นใน Hacker News
สามารถตั้งข้อจำกัดของเอาต์พุตที่เข้มงวดมากขึ้นได้ผ่านความสามารถ gbnf ของ llama.cpp
มีประโยชน์เมื่อต้องการจัดโครงสร้างพรอมป์ปกติและแปลงเป็นข้อมูล csv เพราะช่วยตัดข้อความที่ไม่จำเป็นออกได้
เมื่อใช้ gemma2:2b แล้วป้อนข้อความเข้าไป ก็สามารถได้ผลลัพธ์ในรูปแบบ JSON ที่มีโครงสร้าง
{"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}มีความเห็นที่สงสัยว่าข้อจำกัดส่งผลต่อคุณภาพเอาต์พุตของ LLM อย่างไร
มีคำถามว่าสามารถใช้กับโมเดลที่รองรับได้หรือไม่
มีความสงสัยว่า llama.cpp และ ollama ใช้ความสามารถด้าน structured output ของ llama หรือว่าถูกทำขึ้นด้วยวิธีอื่น
มีคำถามว่าเมื่อเทียบกับ
outlinesแล้วมีมูลค่าเพิ่มอะไรบ้างเหตุผลที่ยังใช้ oobabooga ต่อไป เป็นเพราะรองรับ exlv2 ทำให้อนุมานได้มีประสิทธิภาพมากกว่าบนเครื่องที่ใช้ 3090 คู่
อยากให้ยกตัวอย่าง curl ขึ้นมาก่อน
มีคำถามเกี่ยวกับวิธีที่ดีที่สุดในการป้อนอินพุตแบบมีโครงสร้างให้ LLM