การกำหนดเครื่องมือสำหรับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เฟรมเวิร์ก ReAct: คิด ลงมือทำ สังเกต
- การกำหนดเครื่องมือสำหรับ Agent
- การสร้าง Agent แบบ ReAct ด้วย LangChain
- การจัดการข้อผิดพลาดและลูปของเอเจนต์