Chuyển đến nội dung chính

第 5 課:建立自訂工具 - Web 搜尋、程式碼執行、API 集成

創建複雜的工具:網頁抓取、Google 搜尋、Python 程式碼沙箱、資料庫查詢、REST API 呼叫程式。管理登錄工具、錯誤處理和重試邏輯。

🧠 人工智慧與機器學習 — 第 4 課 第 5 課:建立自訂工具 - 網頁搜索, 程式碼執行、API 集成

建構 AI 代理:從零到生產

第二部分:函數呼叫和工具使用

亞洲開發網

簡介

在上一課中,您學習了函數呼叫的如何工作原理。本文重點介紹代理在生產中所需的 實際建構工具:Web 搜尋、程式碼執行沙箱、資料庫查詢和 REST API 整合。


1. 網頁搜尋工具

1.1 使用 SerpAPI / Tavilly

import httpx

def web_search(query: str, num_results: int = 5) -> str:
    """Tìm kiếm web và trả về kết quả top."""
    response = httpx.get("https://api.tavily.com/search", params={
        "api_key": TAVILY_API_KEY,
        "query": query,
        "max_results": num_results,
    })
    results = response.json()["results"]
    return "\n".join([
        f"- [{r['title']}]({r['url']}): {r['content'][:200]}"
        for r in results
    ])

2. 程式碼執行沙箱

import subprocess
import tempfile

def execute_python(code: str, timeout: int = 10) -> str:
    """Chạy Python code trong sandbox."""
    with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
        f.write(code)
        f.flush()
        try:
            result = subprocess.run(
                ['python', f.name],
                capture_output=True, text=True, timeout=timeout,
                env={"PATH": "/usr/bin"}  # Restricted env
            )
            return result.stdout or result.stderr
        except subprocess.TimeoutExpired:
            return "Error: Code execution timed out"

3.資料庫查詢工具

import sqlite3

def query_database(sql: str) -> str:
    """Chạy SQL query (read-only) trên database."""
    if not sql.strip().upper().startswith("SELECT"):
        return "Error: Only SELECT queries allowed"
    
    conn = sqlite3.connect("app.db")
    try:
        cursor = conn.execute(sql)
        columns = [desc[0] for desc in cursor.description]
        rows = cursor.fetchall()
        return json.dumps({"columns": columns, "rows": rows[:50]})
    except Exception as e:
        return f"SQL Error: {e}"
    finally:
        conn.close()

4. 錯誤處理與重試邏輯

def safe_tool_execute(tool_func, args, max_retries=2):
    for attempt in range(max_retries + 1):
        try:
            result = tool_func(**args)
            return {"status": "success", "data": result}
        except Exception as e:
            if attempt == max_retries:
                return {"status": "error", "error": str(e)}
            time.sleep(1)

總結

  • 網路搜尋、程式碼執行、資料庫查詢——三個最重要的工具
  • 安全第一:沙箱程式碼執行、唯讀資料庫、輸入驗證
  • 生產代理需要錯誤處理+重試邏輯
  • 工具可觀察性:記錄所有工具呼叫以進行調試

練習

  1. 使用 Tavily API 實作實際的 web_search 工具 2.建置更安全的沙箱執行程式碼(使用Docker)
  2. 建立一個可以呼叫任意端點的REST API工具
  3. 對工具實作速率限制(避免垃圾郵件 API 呼叫)