บทนำ: ทำไมต้องเรียนรู้ Tool Use

สวัสดีครับ ผมเป็นนักพัฒนาที่ใช้งาน AI API มาหลายปี ในบทความนี้ผมจะมาสอนเพื่อนๆ ที่ยังไม่เคยใช้ API เลย ให้สามารถใช้งาน Qwen3 Tool Use หรือที่เรียกว่า Function Call ได้อย่างคล่องแคล่ว

สิ่งที่ทำให้ AI ฉลาดขึ้นมากคือการที่มันสามารถเรียกใช้เครื่องมือต่างๆ ได้ เช่น ค้นหาข้อมูล คำนวณตัวเลข หรือดึงข้อมูลจากฐานข้อมูล แทนที่จะตอบสนองแค่ข้อความอย่างเดียว

HolySheep AI สมัครที่นี่ เป็นผู้ให้บริการ API ที่มีความเร็วสูงมาก โดยมีความหน่วงต่ำกว่า 50 มิลลิวินาที และราคาประหยัดมากกว่าผู้ให้บริการอื่นถึง 85% รองรับการชำระเงินผ่าน WeChat และ Alipay พร้อมให้เครดิตฟรีเมื่อลงทะเบียน

Tool Use คืออะไร อธิบายแบบเข้าใจง่าย

ลองนึกภาพว่า AI เปรียบเสมือนลูกจ้างของคุณ ถ้าคุณบอกว่า "หาอากาศวันพรุ่งนี้ที่กรุงเทพให้หน่อย" ลูกจ้างธรรมดาจะตอบว่า "ผมไม่รู้ครับ" แต่ถ้าลูกจ้างมีเครื่องมือติดตัว (Tool) เขาจะไปดูข้อมูลจริงๆ มาบอกคุณได้

Tool Use ก็เป็นสิ่งเดียวกัน มันทำให้ AI สามารถทำสิ่งที่ต้องใช้ข้อมูลจริงๆ ได้

ตัวอย่างการใช้งานจริง

การตั้งค่าเริ่มต้น: ติดตั้ง Python และไลบรารี

ก่อนจะเริ่ม เราต้องเตรียมเครื่องมือให้พร้อมก่อนครับ

ขั้นตอนที่ 1: ติดตั้ง Python

ไปที่เว็บไซต์ python.org แล้วดาวน์โหลด Python เวอร์ชันล่าสุดมาติดตั้ง ระหว่างติดตั้งอย่าลืมติ๊กถูกที่ "Add Python to PATH" ด้วยนะครับ

ขั้นตอนที่ 2: ติดตั้งไลบรารี

เปิด Command Prompt หรือ Terminal แล้วพิมพ์คำสั่งนี้

pip install openai requests

ขั้นตอนที่ 3: ขอ API Key

ไปที่ HolySheep AI สมัครสมาชิกแล้วไปที่หน้า Dashboard เพื่อสร้าง API Key จะได้รหัสประมาณ "hs-xxxxxxxxxxxx" มา

โค้ดพื้นฐาน: เริ่มต้นเรียกใช้ Qwen3

มาดูโค้ดพื้นฐานที่สุดก่อนครับ วิธีเรียกใช้ Qwen3 ผ่าน HolySheep API

import openai

ตั้งค่าการเชื่อมต่อกับ HolySheep API

client = openai.OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

ส่งข้อความไปถาม AI

response = client.chat.completions.create( model="Qwen3-8B", messages=[ {"role": "user", "content": "สวัสดีครับ AI"} ] )

แสดงคำตอบ

print(response.choices[0].message.content)

ราคาของ Qwen3-8B อยู่ที่ $0.42 ต่อล้าน token ซึ่งถูกมากเมื่อเทียบกับ GPT-4.1 ที่ $8 ต่อล้าน token

รู้จักกับ OpenAI Format และ Function Call

OpenAI Format คือมาตรฐานการสื่อสารกับ AI ที่เป็นที่นิยมมากที่สุด ทำให้โค้ดของเราสามารถใช้กับ AI หลายตัวได้โดยไม่ต้องเปลี่ยนโครงสร้าง

ส่วนประกอบสำคัญของ Function Call

ตัวอย่างการสร้าง Function Call: ระบบเช็คสภาพอากาศ

มาลงมือทำตัวอย่างจริงกันเลยครับ ผมจะสร้างระบบเช็คสภาพอากาศง่ายๆ

import openai
import json

ตั้งค่าการเชื่อมต่อ

client = openai.OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" )

กำหนดรายละเอียดของฟังก์ชันที่ให้ AI เรียกใช้ได้

weather_functions = [ { "type": "function", "function": { "name": "get_weather", "description": "ดึงข้อมูลสภาพอากาศของเมืองที่ต้องการ", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "ชื่อเมืองที่ต้องการทราบสภาพอากาศ เช่น กรุงเทพ เชียงใหม่" }, "country": { "type": "string", "description": "ชื่อประเทศ เช่น ไทย ญี่ปุ่น" } }, "required": ["city"] } } } ]

ส่งคำถามที่ต้องการให้ AI ตอบ

user_question = "พรุ่งนี้อากาศที่กรุงเทพเป็นอย่างไร?" response = client.chat.completions.create( model="Qwen3-8B", messages=[ {"role": "user", "content": user_question} ], tools=weather_functions )

ดูว่า AI ต้องการเรียกฟังก์ชันอะไร

assistant_message = response.choices[0].message print(f"AI ต้องการทำ: {assistant_message.content}") print(f"Tool Calls: {assistant_message.tool_calls}")

การประมวลผลผลลัพธ์และตอบกลับ

เมื่อ AI บอกว่าต้องการเรียกฟังก์ชัน เราต้องนำข้อมูลไปประมวลผลแล้วส่งกลับไปให้ AI ตอบ

# ฟังก์ชันจำลองการดึงข้อมูลอากาศ
def get_weather(city, country="ไทย"):
    # ในโค้ดจริงอาจเรียก API อากาศ เช่น OpenWeatherMap
    weather_data = {
        "กรุงเทพ": {"temp": 35, "condition": "แดดจัด", "humidity": 75},
        "เชียงใหม่": {"temp": 28, "condition": "มีเมฆ", "humidity": 65}
    }
    return weather_data.get(city, {"temp": 30, "condition": "ไม่ทราบ", "humidity": 50})

ตรวจสอบว่ามี tool_calls หรือไม่

if assistant_message.tool_calls: # ดึงข้อมูลการเรียกฟังก์ชัน tool_call = assistant_message.tool_calls[0] function_name = tool_call.function.name arguments = json.loads(tool_call.function.arguments) print(f"เรียกใช้ฟังก์ชัน: {function_name}") print(f"พารามิเตอร์: {arguments}") # เรียกใช้ฟังก์ชันจริง if function_name == "get_weather": result = get_weather(**arguments) # ส่งผลลัพธ์กลับไปให้ AI second_response = client.chat.completions.create( model="Qwen3-8B", messages=[ {"role": "user", "content": user_question}, assistant_message, { "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(result) } ], tools=weather_functions ) print(f"คำตอบสุดท้าย: {second_response.choices[0].message.content}") else: print(f"คำตอบปกติ: {assistant_message.content}")

การแปลงรูปแบบ (Format Conversion)

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

# ฟังก์ชันแปลง OpenAI Format เป็น Anthropic Format
def convert_openai_to_anthropic(messages, tools):
    anthropic_messages = []
    
    for msg in messages:
        if msg["role"] == "user":
            anthropic_messages.append({
                "role": "user",
                "content": msg["content"]
            })
        elif msg["role"] == "assistant":
            if msg.get("tool_calls"):
                # แปลง tool_calls เป็น content สำหรับ Anthropic
                content = []
                if msg["content"]:
                    content.append({"type": "text", "text": msg["content"]})
                for tool in msg["tool_calls"]:
                    content.append({
                        "type": "tool_use",
                        "id": tool["id"],
                        "name": tool["function"]["name"],
                        "input": json.loads(tool["function"]["arguments"])
                    })
                anthropic_messages.append({"role": "user", "content": content})
            else:
                anthropic_messages.append({
                    "role": "assistant",
                    "content": msg["content"]
                })
        elif msg["role"] == "tool":
            anthropic_messages.append({
                "role": "user