การกำหนดโครงสร้างฟังก์ชันสำหรับ API
เขียนคำจำกัดความ JSON Schema สำหรับฟังก์ชันของคุณ ส่งคำจำกัดความเหล่านั้นในพารามิเตอร์ tools และทำความเข้าใจว่าโมเดลตัดสินใจเรียกใช้ฟังก์ชันเหล่านั้นเมื่อใดและอย่างไร
การกำหนดโครงสร้างฟังก์ชันสำหรับ API เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
Function Calling คืออะไร
การเรียกใช้ฟังก์ชัน ของ OpenAI (ปัจจุบันเรียกว่า การเรียกใช้เครื่องมือ) ช่วยให้คุณอธิบายฟังก์ชัน Python ให้โมเดลทราบในรูปแบบ JSON Schema ที่มีโครงสร้าง เมื่อโมเดลพิจารณาว่าควรเรียกใช้ฟังก์ชัน แทนที่จะสร้างข้อความอิสระ โมเดลจะส่งคืนออบเจ็กต์ JSON ที่มีโครงสร้าง ซึ่งประกอบด้วยชื่อฟังก์ชันและอาร์กิวเมนต์ จากนั้นโค้ดของคุณจะดำเนินการตามข้อมูลดังกล่าวได้อย่างน่าเชื่อถือ
โครงสร้างพารามิเตอร์ tools
ส่งคำจำกัดความฟังก์ชันของคุณไปยัง API ในพารามิเตอร์ tools ในรูปแบบรายการออบเจ็กต์ แต่ละออบเจ็กต์มี type เป็น 'function' และมีคีย์ function ซึ่งบรรจุชื่อ คำอธิบาย และ JSON Schema ที่กำหนดพารามิเตอร์
from openai import OpenAI
client = OpenAI()
tools = [
{
'type': 'function',
'function': {
'name': 'get_current_weather',
'description': 'Get the current weather in a given location.',
'parameters': {
'type': 'object',
'properties': {
'location': {
'type': 'string',
'description': 'City and country, e.g. London, UK'
},
'unit': {
'type': 'string',
'enum': ['celsius', 'fahrenheit'],
'description': 'Temperature unit to use.'
}
},
'required': ['location']
}
}
}
]JSON Schema สำหรับพารามิเตอร์
ฟิลด์ parameters ปฏิบัติตามข้อกำหนด JSON Schema ใช้ type เพื่อระบุ string, number, integer, boolean, array หรือ object ใช้ description สำหรับแต่ละคุณสมบัติเพื่อบอกโมเดลว่าฟิลด์นั้นหมายถึงอะไร ระบุฟิลด์ที่จำเป็นในอาร์เรย์ required — ฟิลด์ที่ไม่บังคับสามารถละเว้นจาก required ได้
# A more complex schema with multiple types
create_event_tool = {
'type': 'function',
'function': {
'name': 'create_calendar_event',
'description': 'Create a new calendar event. Use when the user wants to schedule a meeting or appointment.',
'parameters': {
'type': 'object',
'properties': {
'title': {'type': 'string', 'description': 'Event title.'},
'start_time': {'type': 'string', 'description': 'ISO 8601 datetime, e.g. 2024-03-15T14:00:00.'},
'duration_minutes': {'type': 'integer', 'description': 'Duration in minutes.', 'minimum': 5},
'attendees': {
'type': 'array',
'items': {'type': 'string'},
'description': 'List of email addresses of attendees.'
},
'location': {'type': 'string', 'description': 'Physical or virtual meeting location.'}
},
'required': ['title', 'start_time', 'duration_minutes']
}
}
}การเรียกใช้ API ด้วย tools
ส่งรายการ tools ไปยัง chat.completions.create โดยตรง โมเดลอาจตอบกลับด้วยข้อความปกติ (หากสามารถตอบได้โดยไม่ใช้ฟังก์ชัน) หรืออาจตอบกลับด้วยออบเจ็กต์ tool_calls ที่สั่งให้คุณดำเนินการฟังก์ชัน โปรดตรวจสอบ finish_reason เสมอเพื่อทราบว่ากำลังอยู่ในกรณีใด
response = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'user', 'content': 'What is the weather in Tokyo?'}
],
tools=tools
)
print('Finish reason:', response.choices[0].finish_reason)
# 'tool_calls' means the model wants to call a function
# 'stop' means the model gave a regular text response
choice = response.choices[0].message
if response.choices[0].finish_reason == 'tool_calls':
print('Model wants to call:', choice.tool_calls[0].function.name)การควบคุมการเลือกเครื่องมือด้วย tool_choice
พารามิเตอร์ tool_choice ควบคุมว่าโมเดลต้องเรียกใช้ฟังก์ชันหรือสามารถเลือกได้อย่างอิสระ การตั้งค่าเป็น 'auto' จะให้โมเดลตัดสินใจ การตั้งค่าเป็น 'required' จะบังคับให้เรียกใช้เครื่องมือ การตั้งค่าเป็นชื่อฟังก์ชันเฉพาะจะบังคับให้เรียกใช้ฟังก์ชันนั้นเท่านั้น ซึ่งมีประโยชน์สำหรับงานแยกข้อมูลที่ต้องการเอาต์พุตแบบมีโครงสร้างเสมอ
# Force the model to always call extract_contact
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Hi, I am John Smith, john@example.com, +1-555-0100.'}],
tools=[extract_contact_tool],
tool_choice={'type': 'function', 'function': {'name': 'extract_contact'}}
)
# With tool_choice forced, finish_reason will always be 'tool_calls'ฟิลด์ Enum สำหรับตัวเลือกที่จำกัด
ใช้ฟิลด์ enum ใน JSON Schema เมื่อพารามิเตอร์ควรถูกจำกัดให้รับค่าได้จากชุดค่าที่กำหนดไว้ตายตัว วิธีนี้ช่วยเพิ่มความน่าเชื่อถือได้อย่างมาก — โมเดลมีโอกาสสร้างตัวเลือกที่ไม่ถูกต้องน้อยลงมากเมื่อมองเห็นค่าที่อนุญาตทั้งหมดในสคีมาอย่างชัดเจน
classify_sentiment_tool = {
'type': 'function',
'function': {
'name': 'classify_sentiment',
'description': 'Classify the sentiment of a customer review.',
'parameters': {
'type': 'object',
'properties': {
'sentiment': {
'type': 'string',
'enum': ['positive', 'negative', 'neutral', 'mixed'],
'description': 'The sentiment classification.'
},
'confidence': {
'type': 'number',
'minimum': 0.0,
'maximum': 1.0,
'description': 'Model confidence from 0 to 1.'
}
},
'required': ['sentiment', 'confidence']
}
}
}สคีมาของออบเจ็กต์ซ้อนกัน
JSON Schema รองรับออบเจ็กต์ซ้อนกัน ใช้ 'type': 'object' พร้อมกับ properties ของออบเจ็กต์นั้นเองเพื่อกำหนดโครงสร้างข้อมูลแบบลำดับชั้นที่ซับซ้อน วิธีนี้เหมาะอย่างยิ่งสำหรับการดึงข้อมูลที่มีโครงสร้างจากข้อความที่ไม่มีโครงสร้าง เช่น อีเมลหรือเอกสาร
extract_order_tool = {
'type': 'function',
'function': {
'name': 'extract_order',
'description': 'Extract order details from a customer email.',
'parameters': {
'type': 'object',
'properties': {
'customer': {
'type': 'object',
'properties': {
'name': {'type': 'string'},
'email': {'type': 'string', 'format': 'email'}
},
'required': ['name']
},
'items': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'product_id': {'type': 'string'},
'quantity': {'type': 'integer', 'minimum': 1}
},
'required': ['product_id', 'quantity']
}
}
},
'required': ['customer', 'items']
}
}
}การสร้างสคีมาจากโมเดล Pydantic
การเขียน JSON Schema ด้วยตนเองเป็นงานที่น่าเบื่อและเกิดข้อผิดพลาดได้ง่าย แทนที่จะทำเช่นนั้น ให้กำหนดโครงสร้างข้อมูลเป็น โมเดล Pydantic แล้วใช้ .schema() เพื่อสร้าง JSON Schema โดยอัตโนมัติ วิธีนี้ยังทำให้คุณตรวจสอบความถูกต้องในระดับ Python ได้เมื่อถอดรหัสคำตอบของโมเดล
from pydantic import BaseModel, Field
from typing import Optional, List
class ContactInfo(BaseModel):
name: str = Field(description='Full name of the person.')
email: Optional[str] = Field(None, description='Email address.')
phone: Optional[str] = Field(None, description='Phone number in E.164 format.')
company: Optional[str] = Field(None, description='Company or organization.')
# Auto-generate the JSON Schema
schema = ContactInfo.schema()
# Build the tool definition
extract_contact_tool = {
'type': 'function',
'function': {
'name': 'extract_contact',
'description': 'Extract contact information from text.',
'parameters': schema
}
}การเขียนคำอธิบายฟังก์ชันที่มีประสิทธิภาพ
คำอธิบายฟังก์ชันเป็นสัญญาณสำคัญที่โมเดลใช้ตัดสินใจว่าจะเรียกเครื่องมือเมื่อใด คำอธิบายที่ดีจะระบุกรณีการใช้งานอย่างเฉพาะเจาะจง กล่าวถึงเวลาที่ควรและไม่ควรเรียกฟังก์ชัน และอธิบายว่าผลลัพธ์จะเป็นอย่างไร คำอธิบายที่คลุมเครือทำให้โมเดลเรียกฟังก์ชันผิดหรือพลาดโอกาสในการเรียกฟังก์ชันที่ถูกต้อง
- คลุมเครือ: 'รับข้อมูลสภาพอากาศ'
- ดี: 'รับสภาพอากาศปัจจุบันของเมืองที่ระบุ ใช้เมื่อผู้ใช้ถามอย่างชัดเจนเกี่ยวกับสภาพอากาศในสถานที่ที่ระบุชื่อ ผลลัพธ์ประกอบด้วยอุณหภูมิ สภาพอากาศ และความชื้น'
โหมดเข้มงวดเพื่อให้สอดคล้องกับสคีมาอย่างแน่นอน
โหมดเข้มงวดของ OpenAI สำหรับผลลัพธ์ที่มีโครงสร้าง รับประกันว่าโมเดลจะสร้าง JSON ที่ตรงกับสคีมาของคุณทุกประการ — ไม่มีฟิลด์เกินมาและไม่มีฟิลด์ที่จำเป็นขาดหาย เปิดใช้โดยตั้งค่า 'strict': true ในคำจำกัดความของฟังก์ชัน หมายเหตุ: โหมดเข้มงวดจำเป็นต้องมี additionalProperties: false ในออบเจ็กต์สคีมาทั้งหมด
strict_tool = {
'type': 'function',
'function': {
'name': 'classify_ticket',
'description': 'Classify a support ticket into category and priority.',
'strict': True, # Enable strict schema adherence
'parameters': {
'type': 'object',
'additionalProperties': False, # Required for strict mode
'properties': {
'category': {
'type': 'string',
'enum': ['billing', 'technical', 'account', 'other']
},
'priority': {
'type': 'string',
'enum': ['low', 'medium', 'high', 'urgent']
}
},
'required': ['category', 'priority']
}
}
}การทดสอบสคีมาฟังก์ชันของคุณ
ก่อนนำไปใช้งานจริง ให้ทดสอบสคีมาของแต่ละฟังก์ชันด้วยอินพุตที่หลากหลาย ได้แก่ กรณีปกติ กรณีขอบ และอินพุตที่ออกแบบมาเพื่อทดสอบจุดอ่อน ตรวจสอบว่าโมเดลเรียกฟังก์ชันที่ถูกต้อง สร้างชนิดอาร์กิวเมนต์ที่ถูกต้อง จัดการฟิลด์เสริมได้อย่างถูกต้อง และปฏิบัติตามข้อจำกัดของ enum ใช้ OpenAI Playground เพื่อปรับปรุงอย่างรวดเร็วก่อนเขียนโค้ดสำหรับใช้งานจริง
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการกำหนดสคีมาฟังก์ชันสำหรับ OpenAI API
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า สคีมาฟังก์ชันใช้ JSON Schema เพื่อกำหนดชนิด คำอธิบาย และข้อจำกัดของพารามิเตอร์ tool_choice ควบคุมว่าโมเดลต้องเรียกฟังก์ชันหรือเลือกได้อย่างอิสระ และ โมเดล Pydantic สามารถสร้าง JSON Schema โดยอัตโนมัติ เพื่อลดการเขียนสคีมาด้วยตนเอง บทถัดไป เราจะเรียนรู้การประมวลผลการเรียกเครื่องมือในแอปพลิเคชันของคุณด้วยการตรวจจับ เรียกใช้งาน และส่งผลลัพธ์กลับ
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การกำหนดโครงสร้างฟังก์ชันสำหรับ API” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกำหนดโครงสร้างฟังก์ชันสำหรับ API” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดโครงสร้างฟังก์ชันสำหรับ API”
เขียนคำจำกัดความ JSON Schema สำหรับฟังก์ชันของคุณ ส่งคำจำกัดความเหล่านั้นในพารามิเตอร์ tools และทำความเข้าใจว่าโมเดลตัดสินใจเรียกใช้ฟังก์ชันเหล่านั้นเมื่อใดและอย่างไร คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การกำหนดโครงสร้างฟังก์ชันสำหรับ API” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม
ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดโครงสร้างฟังก์ชันสำหรับ API
- การประมวลผลการเรียกใช้เครื่องมือในแอปพลิเคชัน
- การเรียกใช้ฟังก์ชันแบบขนาน
- การสร้างส่วนติดต่อฐานข้อมูลด้วยภาษาธรรมชาติ