昨天 (Day 5),我們透過 RAG 讓 LLM 不再只憑記憶或幻覺,而是能「開書考」,從文件或網路找到依據,再生成答案。
但即使如此,RAG 仍有明顯的侷限:
這些問題光靠「搜尋」仍然不夠,因為它們需要 呼叫外部工具或 API,才能獲得答案或完成任務。
換句話說:昨天我們讓模型「找到依據」,但它還不能真的動手。今天要跨出的,就是讓它具備 行動力。
而這正是 Tool Use(工具使用) 的核心價值:
讓 LLM 從「語言回答者」進化成「行動代理人」。
所謂「工具使用」,就是讓 LLM 在對話過程中,能夠調用外部函式、API 或程式,並將結果再帶回來繼續推理或回應。
它的典型流程是:
換句話說:LLM 負責決定何時用工具,工具負責精準執行。
本篇先把 Tool Use 的地基打好——清楚的工具合約、流程骨架與簡單案例。至於「邊思考邊行動」的完整節奏(常見做法之一是 ReAct),我們之後會再回來細看。
LLM 雖然很強大,但它的知識與能力都被限制在訓練資料裡。要處理即時資訊或實際動作,就必須借助 工具(Tools)。這種模式常被稱為 Tool Use Pattern 或 Function Calling:
圖:Tool Use 的四步驟設計流程——從任務識別、呼叫工具、接收結果,到整合回覆。
這四個步驟就是 Tool Use Pattern 的核心骨架,幾乎所有框架(LangChain、OpenAI Function Calling、MCP)都脫離不了這個模式。
以下用「查今天維也納的天氣」當例子。
步驟說明
get_weather
工具。
圖:最小可行的 Tool Use 範例——LLM 呼叫天氣 API,查詢並回覆維也納的即時天氣。
範例程式
import google.generativeai as genai
# 1. 假設外部工具(API)
def get_weather(city: str):
weather_data = {
"Vienna": "雷陣雨,氣溫 22°C",
"Taipei": "多雲,氣溫 30°C",
}
return weather_data.get(city, "查無資料")
# 2. 初始化 LLM
genai.configure(api_key="你的_API_KEY")
llm = genai.GenerativeModel("gemini-2.0-flash")
# 3. 使用者查詢
query = "請告訴我今天維也納的天氣"
# 4. 模擬 LLM 判斷需要呼叫工具
if "維也納" in query and "天氣" in query:
result = get_weather("Vienna")
answer = f"今天維也納的天氣是:{result}。"
else:
answer = llm.generate_content(query).text
print(answer)
輸出結果
圖:Demo 1 的輸出結果——模型呼叫天氣工具後,回覆維也納的即時天氣。
如果沒有工具,LLM 可能會「憑記憶亂猜」天氣狀況,甚至答非所問。但透過 Tool Use,模型能直接查詢 API,把即時正確的資料帶回來,再生成自然語言回覆。這展示了「讓模型能動手」的第一步價值。
把 RAG(背景知識) 與 Tool Use(即時資訊) 結合,就能讓模型既有「知識深度」又有「行動能力」。
步驟說明
圖:RAG + Tool Use 結合案例——LLM 同時檢索背景知識與查詢即時天氣,再整合為行動建議。
範例程式
from sentence_transformers import SentenceTransformer
import faiss
import google.generativeai as genai
# 1. 初始化編碼模型
encoder = SentenceTransformer("BAAI/bge-base-zh-v1.5")
# 2. 建立文件庫(旅行知識庫)
docs = [
"美泉宮(Schönbrunn Palace)有 1,441 個房間、花園、動物園,通常需要花上一整天參觀。",
"美景宮(Belvedere Palace)以藝術收藏聞名,通常半天足夠。",
]
# 3. 建立向量索引
embeddings = encoder.encode(docs)
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(embeddings)
# 4. 定義工具(假想天氣 API)
def get_weather(city: str):
weather_data = {
"Vienna": "雷陣雨,氣溫 22°C",
"Taipei": "多雲,氣溫 30°C",
}
return weather_data.get(city, "查無資料")
# 5. 使用者問題
query = "美泉宮值得排一天參觀嗎?如果明天下雨要怎麼安排?"
# 6. RAG:檢索知識
q_emb = encoder.encode([query])
D, I = index.search(q_emb, k=1)
retrieved = docs[I[0][0]]
# 7. Tool Use:查天氣
weather = get_weather("Vienna")
# 8. 呼叫 LLM 整合
genai.configure(api_key="你的_API_KEY")
llm = genai.GenerativeModel("gemini-2.0-flash")
prompt = f"""
根據以下資訊回答問題:
[知識庫資料]
{retrieved}
[天氣資訊]
{weather}
問題:{query}
請用中文簡潔回答。
"""
response = llm.generate_content(prompt)
print("搜尋結果:", retrieved)
print("天氣結果:", weather)
print("LLM 回答:", response.text)
輸出結果
圖:Demo 2 的輸出結果——RAG 提供背景知識,Tool Use 提供即時天氣,LLM 整合後給出行動建議。
這個範例展現了 RAG 與 Tool Use 的互補:
如果少了其中任何一個,回答都會不完整:只靠 RAG,模型無法知道天氣;只靠 Tool Use,它又不知道美泉宮的背景價值。
圖:維也納藝術史博物館(Kunsthistorisches Museum)。穹頂壁畫與大廳雕塑展現的不只是藝術之美,更是「知識化為行動」的象徵:如同 LLM 若只會回答,便止步於欣賞;透過 Tool Use,則能真正「動手」,在現實世界中留下痕跡。(攝影:作者自攝)