搭建免費(fèi)的Ollama AI Agent
基本概念
我們先溫習(xí)一些AI Agent有關(guān)的基本概念和有關(guān)工具與框架的介紹:
- AI Agent:AI Agent 是一個(gè)具備“目標(biāo)驅(qū)動(dòng) + 感知 + 決策 + 行動(dòng)”閉環(huán)的軟件系統(tǒng),通常以 LLM 作為核心推理引擎。形式化一點(diǎn)可以寫成:Agent = Policy(LLM) + Memory + Tools + Execution Loop。
- Policy:通常由 LLM 實(shí)現(xiàn)(prompt + weights)。輸入為當(dāng)前 state(上下文 + memory),輸出為下一步 action(tool call / text / plan)。
- AI Tools:AI Tools 是 Agent 可調(diào)用的外部函數(shù)(function calling abstraction),用于擴(kuò)展模型能力邊界。
- LangChain:LangChain 是一個(gè)用于構(gòu)建 LLM 應(yīng)用(尤其是 Agent / RAG)的 orchestration 框架。
- Ollama:Ollama 是一個(gè)本地運(yùn)行大語(yǔ)言模型的 runtime + model management system。
為什么使用Ollama
為什么要使用Ollama?最主要的原因當(dāng)然是為了節(jié)省銀子。如果你心疼直接調(diào)用外部的大語(yǔ)言模型帶來(lái)的巨額花費(fèi),那么Ollama一定會(huì)成為你的最愛(ài)。在本地安裝后,你就擁有了豐富的選擇在本地安裝不同的模型,免費(fèi)進(jìn)行各種學(xué)習(xí)和實(shí)驗(yàn)。當(dāng)你覺(jué)得你已經(jīng)有了一個(gè)非常成熟的應(yīng)用后,再利用外部模型進(jìn)行實(shí)際數(shù)據(jù)收集不失為一個(gè)聰明的選擇。第二個(gè)好處是方便。相比于要計(jì)算和控制使用外部模型的token的花費(fèi),Ollama省掉了這些操心。雖然功能弱了一些,可是因?yàn)樯厦娴膬蓚€(gè)好處,Ollama依然應(yīng)該成為工具庫(kù)中不可缺少的一員。
安裝和Coding
我們利用Ollama和LangChain嘗試一個(gè)最基本的AI Agent。
首先安裝Ollama。請(qǐng)直接訪問(wèn)Ollama的官網(wǎng),選擇你的平臺(tái)進(jìn)行安裝。非常方便和直接。安裝之后,請(qǐng)?jiān)L問(wèn)一下Ollama支持的模型庫(kù)。你可以看到非常多種選擇。我們今天使用qwen3.5,所以請(qǐng)使用下面的命令安裝這個(gè)model:

ollama pull qwen3.5
第二步,使用langchain和ollama的python library編寫一個(gè)簡(jiǎn)單的AI Agent。首先使用下面的命令創(chuàng)建一個(gè)python virtual environment。這樣我們后面的操作都在這個(gè)virtual environment里進(jìn)行,避免和其它python編程時(shí)可能發(fā)生的互相影響。
python -m venv venv .\venv\Scripts\activate
然后在你的source目錄下創(chuàng)建一個(gè)requirements.txt文件,定義我們依賴的python library。在requirements.txt里定義下面兩個(gè)需要的python library。
ollama langchain langchain-ollama
然后運(yùn)行下面的命令進(jìn)行python library的安裝:
pip -r requirements.txt
現(xiàn)在我們改寫langchain官網(wǎng)上提供的一個(gè)簡(jiǎn)單的AI Agent的例子。langchain官網(wǎng)使用的是ChatGPT,這里我們稍加改變,使用我們本地安裝的Ollama qwen3.5的模型:
from langchain_ollama import ChatOllama
from langchain.agents import create_agent
def get_weather(city: str) -> str:
"""Get weather for a given city."""
return f"It's always sunny in {city}!"
llm = ChatOllama(
model="qwen3.5"
)
agent = create_agent(
model=llm,
tools=[get_weather],
system_prompt="You are a helpful assistant",
)
response = agent.invoke(
{"messages": [{
"role": "user",
"content": "what is the weather in sf?"
}]}
)
print(response)這里對(duì)這個(gè)代碼稍加解釋。get_weather()是一個(gè)提供給AI Agent使用的tool。作為規(guī)定,我們必須在該method內(nèi)的第一行加上對(duì)該tool的描述,以是LLM Model可以更好的理解該tool的用途。然后我們利用本地安裝的Ollama qwen3.5定義了一個(gè)llm模型。然后我們定義了一個(gè)agent,并且定義了該agent使用的模型,tools,和它的系統(tǒng)提示詞。最后我們調(diào)用該agent,回答sf的天氣如何。
測(cè)試
如果你運(yùn)行這個(gè)python腳本,你會(huì)看到:
(venv) PS C:\Users\houzh\source\python\langchain> python ollama_test.py
{'messages': [HumanMessage(content='what is the weather in sf?', additional_kwargs={}, response_metadata={}, id='9d6f02e5-aada-450f-87b0-5ceb3f012390'), AIMessage(content='', additional_kwargs={}, response_metadata={'model': 'qwen3.5', 'created_at': '2026-04-13T15:25:55.9821411Z', 'done': True, 'done_reason': 'stop', 'total_duration': 17232548600, 'load_duration': 13073848800, 'prompt_eval_count': 281, 'prompt_eval_duration': 519827100, 'eval_count': 84, 'eval_duration': 3479336000, 'logprobs': None, 'model_name': 'qwen3.5', 'model_provider': 'ollama'}, id='lc_run--019d8772-c405-7790-8366-0a4d18fc0ecb-0', tool_calls=[{'name': 'get_weather', 'args': {'city': 'sf'}, 'id': 'dae4d82d-71ff-4972-96a5-4188bf00c739', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 281, 'output_tokens': 84, 'total_tokens': 365}), ToolMessage(content="It's always sunny in sf!", name='get_weather', id='f207771a-e2bf-4640-ac8b-ad5e22cf9d1f', tool_call_id='dae4d82d-71ff-4972-96a5-4188bf00c739'), AIMessage(content="It's always sunny in San Francisco!", additional_kwargs={}, response_metadata={'model': 'qwen3.5', 'created_at': '2026-04-13T15:25:57.0989276Z', 'done': True, 'done_reason': 'stop', 'total_duration': 1068090400, 'load_duration': 393427700, 'prompt_eval_count': 331, 'prompt_eval_duration': 246942000, 'eval_count': 11, 'eval_duration': 409399100, 'logprobs': None, 'model_name': 'qwen3.5', 'model_provider': 'ollama'}, id='lc_run--019d8773-07bd-7131-b778-aa963bc27d8d-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 331, 'output_tokens': 11, 'total_tokens': 342})]}如果我們仔細(xì)看一下這個(gè)response,我們會(huì)發(fā)現(xiàn)里面有很多有用信息。比如這一次運(yùn)行消耗了多少token,模型的一些推理細(xì)節(jié)。更為具體的,我們這里得到是一個(gè)langchain的一次“多輪 + 工具調(diào)用”的完整運(yùn)行結(jié)果對(duì)象。其格式如下:
{
"messages": [ ... ]
}“messages”是一個(gè)按照時(shí)間順序排序的消息流。比如:
HumanMessage → AIMessage (tool_calls) → ToolMessage → AIMessage (final answer)
這里記錄了user,agent(AIMessage),和tool之間的交互。第一個(gè)消息由user發(fā)起,然后agent調(diào)用了tools,然后tool回應(yīng)了消息,最后agent給出了最后的answer。
作為終端用戶,我們感興趣的是這一個(gè)attribute:AIMessage(content="It's always sunny in San Francisco!"。我們看到model成功找到了注冊(cè)的tool,并且進(jìn)行了某些推理將sf識(shí)別為San Franciscol。我們可以用下面的代碼打印出最后的agent的answer:
print("ai response: {}".format(response["messages"][-1].content))請(qǐng)注意,這里tool的調(diào)用和對(duì)于回答內(nèi)容的組織是基于模型的推理,而不是按照某個(gè)簡(jiǎn)單的規(guī)則。我們可以再加上另一個(gè)tool,對(duì)地方進(jìn)行描述。并且改寫我們的問(wèn)題,來(lái)測(cè)試一下模型如何決定調(diào)用tool。代碼如下:
from langchain_ollama import ChatOllama
from langchain.agents import create_agent
def get_weather(city: str) -> str:
"""Get weather for a given city."""
return f"It's always sunny in {city}!"
def get_location(city: str) -> str:
"""Get location description for a given city."""
return f"{city} is a very beautiful place."
llm = ChatOllama(
model="qwen3.5"
)
agent = create_agent(
model=llm,
tools=[get_weather, get_location],
system_prompt="You are a helpful assistant",
)
response = agent.invoke(
{"messages": [{
"role": "user",
"content": "Please provide me detail information about sf?"
}]}
)
print(response)運(yùn)行這個(gè)代碼,你會(huì)得到輸出:"Here is the information I found for San Francisco:\n\n* **Weather:** It's always sunny in San Francisco.\n* **Location:** San Francisco is a very beautiful place."。我們看到模型這個(gè)時(shí)候調(diào)用了兩個(gè)tools,來(lái)為我們盡可能多的提供sf的信息。我們還可以進(jìn)行更多問(wèn)題的測(cè)試,比如我們問(wèn)對(duì)sf的描述,模型就會(huì)只調(diào)用對(duì)地區(qū)提供描述的tool而忽略掉提供天氣的tool。
小結(jié)
在這篇文章里我們介紹了Ollama的安裝和使用。并且通過(guò)langchain調(diào)用Ollama初步實(shí)驗(yàn)了怎樣用Ollama和langchain實(shí)現(xiàn)一個(gè)簡(jiǎn)單的AI Agent。
到此這篇關(guān)于搭建免費(fèi)的Ollama AI Agent的文章就介紹到這了,更多相關(guān)搭建免費(fèi)Ollama AI Agent內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

Python + Ollama 本地跑大模型:零成本搭建你的私有 AI 助手
文章介紹Ollama本地AI助手的安裝方法,從環(huán)境準(zhǔn)備、快速上手到實(shí)戰(zhàn)項(xiàng)目,并探討了其核心優(yōu)勢(shì),包括零成本、零數(shù)據(jù)風(fēng)險(xiǎn)、零門檻和零妥協(xié),通過(guò)使用Ollama,用戶可以在本地運(yùn)行大2026-04-09
Docker部署Ollama搭建本地AI開發(fā)環(huán)境
本文介紹如何通過(guò)Docker+Ollama搭建本地AI開發(fā)環(huán)境,解決云端API調(diào)用成本高、延遲大的問(wèn)題,幫助開發(fā)者快速實(shí)現(xiàn)本地AI應(yīng)用開發(fā),無(wú)需擔(dān)心API調(diào)用限制和費(fèi)用問(wèn)題,感興趣的可2026-03-30



