0Pricing
AI Engineering Academy · บทเรียน

การกำหนดเครื่องมือสำหรับ Agent

สร้างเครื่องมือแบบกำหนดเองด้วยตัวตกแต่ง @tool เขียนคำอธิบายที่ชัดเจนให้ LLM ใช้ตัดสินใจว่าจะเรียกใช้เครื่องมือแต่ละรายการเมื่อใด และเพิ่มการตรวจสอบอินพุตด้วย Pydantic

การกำหนดเครื่องมือสำหรับ Agent เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

เครื่องมือมอบพลังพิเศษให้เอเจนต์

เอเจนต์ที่ไม่มีเครื่องมือทำได้เพียงให้เหตุผลจากสิ่งที่รู้อยู่แล้ว ไม่สามารถค้นหาเว็บ สืบค้นฐานข้อมูล หรือส่งอีเมลได้ เครื่องมือ คือฟังก์ชัน Python ที่เพิ่มความสามารถให้เอเจนต์ โดยเปิดโอกาสให้ดำเนินการกับโลกจริงและดึงข้อมูลใหม่ การกำหนดเครื่องมืออย่างชัดเจนเป็นหนึ่งในขั้นตอนสำคัญที่สุดของการสร้างเอเจนต์ที่เชื่อถือได้

ตัวตกแต่ง @tool ใน LangChain

ตัวตกแต่ง @tool ของ LangChain จะแปลงฟังก์ชัน Python ใด ๆ ให้เป็นเครื่องมือที่เอเจนต์เรียกใช้ได้ ด็อกสตริงของฟังก์ชันจะกลายเป็นคำอธิบายเครื่องมือที่ LLM ใช้ตัดสินใจว่าจะเรียกใช้เมื่อใด คำอธิบายที่ชัดเจนและเฉพาะเจาะจงช่วยเพิ่มความแม่นยำในการเลือกเครื่องมือของเอเจนต์ได้อย่างมาก

from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    '''Get the current weather conditions for a given city.
    Use this tool when the user asks about weather in a specific location.
    Input should be just the city name, e.g. 'London' or 'New York'.
    '''
    # Real implementation would call a weather API
    return f'The weather in {city} is 18 degrees Celsius and partly cloudy.'

print(get_weather.name)         # 'get_weather'
print(get_weather.description)  # The docstring above

คำอธิบายชนิดข้อมูลและการสร้างสคีมา

LangChain จะสร้าง JSON Schema สำหรับเครื่องมือแต่ละรายการโดยอัตโนมัติจากคำอธิบายชนิดข้อมูลของ Python เอเจนต์จะได้รับสคีมานี้ในพรอมต์ระบบ จึงทราบว่าอาร์กิวเมนต์ใดจำเป็น ชนิดข้อมูลเป็นอะไร และมีข้อจำกัดใดบ้าง ควรใส่คำอธิบายชนิดข้อมูลที่แม่นยำให้ฟังก์ชันเครื่องมือเสมอ

from langchain_core.tools import tool

@tool
def calculate_compound_interest(
    principal: float,
    annual_rate: float,
    years: int
) -> float:
    '''Calculate compound interest earned over a number of years.
    Args:
        principal: Initial investment amount in dollars.
        annual_rate: Annual interest rate as a decimal (e.g. 0.05 for 5%).
        years: Number of years to compound.
    Returns:
        Final amount after compounding.
    '''
    return principal * (1 + annual_rate) ** years

# Inspect the auto-generated schema
print(calculate_compound_interest.args_schema.schema())

การตรวจสอบอินพุตด้วย Pydantic

สำหรับเครื่องมือที่มีอินพุตซับซ้อน ให้กำหนดโมเดล Pydantic เป็น args_schema วิธีนี้ช่วยให้ตรวจสอบข้อมูล แปลงชนิดข้อมูล และสร้างเอกสารระดับฟิลด์ที่อธิบายได้โดยอัตโนมัติ ซึ่ง LLM จะมองเห็นเมื่อตัดสินใจว่าจะเรียกใช้เครื่องมืออย่างไร

from langchain_core.tools import tool
from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    query: str = Field(description='The search query to look up.')
    num_results: int = Field(default=5, ge=1, le=20, description='Number of results to return (1-20).')

@tool(args_schema=SearchInput)
def web_search(query: str, num_results: int = 5) -> str:
    '''Search the web for current information on any topic.
    Use this for facts that may have changed after the model training cutoff.
    '''
    return f'Searching for "{query}", returning {num_results} results...'

การเขียนคำอธิบายเครื่องมือที่มีประสิทธิภาพ

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

  • ไม่ดี: 'เครื่องมือค้นหา'
  • ดี: 'ค้นหาข่าว ข้อเท็จจริง หรือข้อมูลปัจจุบันบนเว็บ ใช้เมื่อผู้ใช้ถามเกี่ยวกับเหตุการณ์ล่าสุดหรือข้อเท็จจริงที่ไม่มีอยู่ในข้อมูลการฝึก อินพุต: คำค้นหาที่กระชับ'

ชนิดข้อมูลที่เครื่องมือส่งคืน

เครื่องมือสามารถส่งคืนสตริง พจนานุกรม หรืออ็อบเจ็กต์ Pydantic ที่มีโครงสร้างได้ อย่างไรก็ตาม ท้ายที่สุดเอเจนต์จำเป็นต้องได้รับผลลัพธ์เป็นข้อความเพื่อใส่ไว้ในการสนทนา หากส่งคืนพจนานุกรม LangChain จะแปลงพจนานุกรมนั้นเป็นสตริง สำหรับข้อมูลซ้อนกันที่ซับซ้อน ควรจัดรูปแบบเป็นสรุปที่อ่านง่ายแทน JSON ดิบ เพื่อช่วยให้โมเดลให้เหตุผลกับข้อมูลได้

from langchain_core.tools import tool
import json

@tool
def get_stock_price(ticker: str) -> str:
    '''Look up the current stock price for a given ticker symbol.
    Input should be the stock ticker symbol in uppercase, e.g. AAPL or MSFT.
    '''
    # Stub — real implementation calls a financial API
    data = {'ticker': ticker, 'price': 182.50, 'currency': 'USD', 'change': '+1.2%'}
    return f'{ticker}: ${data["price"]} ({data["change"]})'

การจัดการข้อผิดพลาดของเครื่องมืออย่างเหมาะสม

เครื่องมืออาจทำงานล้มเหลว API อาจหยุดทำงาน เครือข่ายอาจหมดเวลา และผู้ใช้อาจส่งอินพุตที่ไม่ถูกต้อง แทนที่จะปล่อยให้ข้อยกเว้นทำให้วงจรเอเจนต์หยุดทำงาน ให้ครอบตรรกะของเครื่องมือด้วย try/except และส่งคืนสตริงข้อผิดพลาดที่อธิบายชัดเจน จากนั้นเอเจนต์จะให้เหตุผลกับความล้มเหลวและตัดสินใจว่าจะลองใหม่หรือใช้แนวทางอื่น

from langchain_core.tools import tool
import requests

@tool
def fetch_url(url: str) -> str:
    '''Fetch the text content of a web page given its URL.
    Use for accessing specific documents or web pages the user references.
    '''
    try:
        resp = requests.get(url, timeout=10)
        resp.raise_for_status()
        return resp.text[:2000]  # Return first 2000 chars
    except requests.Timeout:
        return 'Error: Request timed out after 10 seconds.'
    except requests.HTTPError as e:
        return f'Error: HTTP {e.response.status_code}'
    except Exception as e:
        return f'Error fetching URL: {str(e)}'

เครื่องมือแบบอะซิงโครนัส

เมื่อเอเจนต์ของคุณเรียกใช้เครื่องมือจำนวนมาก หรือเครื่องมือทำคำขอเครือข่ายที่ใช้เวลารอการรับส่งข้อมูล ให้กำหนดฟังก์ชันเครื่องมือแบบอะซิงโครนัสเพื่อไม่บล็อกลูปเหตุการณ์ ตัวเรียกใช้เอเจนต์ของ LangChain รองรับเครื่องมือแบบอะซิงโครนัสโดยตรง เพียงใช้ async def ในฟังก์ชันเครื่องมือ

from langchain_core.tools import tool
import httpx

@tool
async def async_fetch(url: str) -> str:
    '''Asynchronously fetch content from a URL.
    Preferred over fetch_url when making multiple concurrent requests.
    '''
    async with httpx.AsyncClient(timeout=10) as client:
        try:
            resp = await client.get(url)
            resp.raise_for_status()
            return resp.text[:2000]
        except Exception as e:
            return f'Error: {str(e)}'

การจัดระเบียบเครื่องมือเป็นชุดเครื่องมือ

เมื่อมีเครื่องมือที่เกี่ยวข้องกันจำนวนมาก ให้จัดกลุ่มเป็น ชุดเครื่องมือ ซึ่งเป็นคลาสที่ส่งคืนรายการเครื่องมือ ชุดเครื่องมือของ LangChain ใช้รูปแบบร่วมกัน ได้แก่ รับการกำหนดค่า เช่น คีย์ API ในตัวสร้าง และเปิดเผยเมธอด get_tools() วิธีนี้ทำให้การจัดการเครื่องมือเป็นระเบียบและนำกลับมาใช้ซ้ำได้กับเอเจนต์ต่าง ๆ

from langchain_core.tools import BaseTool
from typing import List

class WeatherToolkit:
    def __init__(self, api_key: str):
        self.api_key = api_key

    def get_tools(self) -> List[BaseTool]:
        return [
            get_weather,          # defined earlier with @tool
            get_weather_forecast,  # another tool
            get_weather_alert      # another tool
        ]

# Usage
toolkit = WeatherToolkit(api_key='your_weather_api_key')
tools = toolkit.get_tools()
print(f'Loaded {len(tools)} weather tools')

การจำกัดการเข้าถึงเครื่องมือตามบทบาทผู้ใช้

ผู้ใช้แต่ละคนไม่ควรเข้าถึงเครื่องมือได้ทุกอย่าง ผู้ใช้ที่มีสิทธิ์อ่านอย่างเดียวไม่ควรเรียกใช้เครื่องมือ send_email หรือ delete_record โปรดกำหนดการเข้าถึงเครื่องมือตามบทบาท โดยเลือกเครื่องมือที่จะส่งให้เอเจนต์ตามสิทธิ์ของผู้ใช้ที่ผ่านการยืนยันตัวตนแล้ว

def get_tools_for_user(user_role: str) -> list:
    read_tools = [web_search, get_weather, calculate_compound_interest]
    write_tools = [send_email, create_calendar_event, update_record]

    if user_role == 'admin':
        return read_tools + write_tools
    elif user_role == 'member':
        return read_tools
    else:
        return [web_search]  # Guest: only public search

แนวปฏิบัติที่ดีที่สุดในการจัดทำเอกสารเครื่องมือ

เครื่องมือที่มีเอกสารกำกับไว้อย่างดีช่วยลดข้อผิดพลาดของเอเจนต์ได้อย่างมาก โปรดปฏิบัติตามแนวทางต่อไปนี้: ใช้ ชื่อที่ขึ้นต้นด้วยคำกริยา (search_web ไม่ใช่ websearch) อธิบาย รูปแบบอินพุตที่คาดไว้ อย่างชัดเจน ระบุว่า เมื่อใดที่ NOT ควรใช้ เครื่องมือนี้เพื่อหลีกเลี่ยงผลบวกลวง และอธิบายว่าผลลัพธ์มีลักษณะอย่างไร เพื่อให้โมเดลแยกวิเคราะห์ได้อย่างถูกต้อง

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการกำหนดเครื่องมือสำหรับเอเจนต์ของ LangChain

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า ตัวตกแต่ง @tool จะเปลี่ยนฟังก์ชัน Python ให้เป็นเครื่องมือที่เอเจนต์เรียกใช้ได้ โดยใช้ข้อความเอกสารของฟังก์ชันเป็นคำอธิบาย สคีมา Pydantic จะเพิ่มอินพุตที่มีชนิดข้อมูลและผ่านการตรวจสอบความถูกต้อง และ เครื่องมือควรจัดการข้อผิดพลาดอย่างเหมาะสมด้วยการส่งคืนข้อความข้อผิดพลาดที่อธิบายชัดเจน ต่อไป เราจะประกอบเอเจนต์ ReAct แบบเต็มด้วย LangChain และติดตามขั้นตอนการให้เหตุผลของเอเจนต์

คำถามที่พบบ่อย

บทเรียน “การกำหนดเครื่องมือสำหรับ Agent” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนดเครื่องมือสำหรับ Agent” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดเครื่องมือสำหรับ Agent”

สร้างเครื่องมือแบบกำหนดเองด้วยตัวตกแต่ง @tool เขียนคำอธิบายที่ชัดเจนให้ LLM ใช้ตัดสินใจว่าจะเรียกใช้เครื่องมือแต่ละรายการเมื่อใด และเพิ่มการตรวจสอบอินพุตด้วย Pydantic คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนดเครื่องมือสำหรับ Agent” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม

ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เฟรมเวิร์ก ReAct: คิด ลงมือทำ สังเกต
  2. การกำหนดเครื่องมือสำหรับ Agent
  3. การสร้าง Agent แบบ ReAct ด้วย LangChain
  4. การจัดการข้อผิดพลาดและลูปของเอเจนต์
← กลับไปที่ AI Engineering Academy