簡介
在上一課中,您學習了函數呼叫的如何工作原理。本文重點介紹代理在生產中所需的 實際建構工具: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)
總結
- 網路搜尋、程式碼執行、資料庫查詢——三個最重要的工具
- 安全第一:沙箱程式碼執行、唯讀資料庫、輸入驗證
- 生產代理需要錯誤處理+重試邏輯
- 工具可觀察性:記錄所有工具呼叫以進行調試
練習
- 使用 Tavily API 實作實際的 web_search 工具 2.建置更安全的沙箱執行程式碼(使用Docker)
- 建立一個可以呼叫任意端點的REST API工具
- 對工具實作速率限制(避免垃圾郵件 API 呼叫)