前三篇談為何要蓋、開源地端模型該怎麼挑、再到 Ollama 這個把「下載模型、跑推論」變成一行指令的好夥伴。地基有了,接下來就是把房子蓋起來,也就是真正寫程式,讓模型變成能做事的 Agent。
這篇起開始一個小系列,會先把 LangChain 用起來,再直接過渡到 LangGraph:
現在的 LangChain 已經不是早期那種「一堆 Chain 疊起來」的寫法了。核心概念很單純:用 create_agent 一次把三樣東西組起來:
組好之後呼叫 agent.invoke(...),LangChain 會自動處理「模型判斷要不要呼叫工具 → 執行工具 → 把結果丟回模型繼續推理」這整套流程,不用自己手動寫迴圈去接工具呼叫的結果。這也是它比起早期版本好用很多的地方:以前要自己組 Chain、自己處理 Agent 的決策迴圈,現在幾行程式碼就能有一個會用工具的 Agent。
官方 Quickstart 裡示範的是雲端 API(OpenAI、Gemini、Claude…),但文件裡其實也直接把 Ollama 列為支援的 provider,接法幾乎一樣,差別在三件事:
延續上一篇,ollama serve(或桌面版直接開著)要在背景待命,LangChain 是透過本機的 Ollama API 呼叫,不是打到雲端。
ChatOllama 物件指定模型比起用 "ollama:模型名" 這種字串寫法,更推薦直接建立 ChatOllama 物件,這樣可以順手把 temperature、num_ctx(context window 長度)等地端常會需要調整的參數一併設定好,做法可以參考最下方的「第一個範例」。
這邊先把套件裝起來:
pip install -U langchain langchain-ollama
地端跑 agent 最大的差異在這裡:工具呼叫(tool calling)的穩定度很吃模型本身能力,選一顆有明確標註支援 function calling 的模型會少踩很多雷。
from langchain.agents import create_agent
from langchain_ollama import ChatOllama
def get_weather(city: str) -> str:
"""查詢指定城市的天氣。"""
return f"{city} 現在總是晴天!"
model = ChatOllama(
model="qwen3:8b", # 換成你本機已經 pull 下來的模型
temperature=0.5,
)
agent = create_agent(
model=model,
tools=[get_weather],
system_prompt="你是一個樂於助人的助理。",
)
result = agent.invoke(
{"messages": [{"role": "user", "content": "台北現在天氣如何?"}]}
)
print(result["messages"][-1].content)
跑起來後,Agent 會判斷這句話需要查天氣、呼叫 get_weather("台北")、再把結果組回自然語言回答你。