近年来,大型语言模型(LLM)技术取得了飞速发展,为我们带来了前所未有的智能应用。本文将引导你使用 Python 语言和 Ollama 工具,从零开始构建一个简单的 AI Agent,并将其与本地 LLM 集成,实现自然语言交互和工具调用。通过本文,你将了解到如何利用本地 LLM 的能力,打造一个完全离线、可定制的 AI 助手。
1. 本地 LLM 驱动的 AI Agent 的优势
传统的 AI Agent 通常依赖于云端的 LLM 服务,这存在一定的局限性,例如需要稳定的网络连接、数据隐私风险以及潜在的成本问题。而基于本地 LLM 的 AI Agent 则可以有效解决这些问题。
- 隐私保护: 所有数据和模型都存储在本地,避免了敏感数据泄露的风险。
- 离线可用: 即使没有网络连接,AI Agent 仍然可以正常工作。
- 成本控制: 无需支付云端服务的费用,降低了使用成本。
- 定制化: 可以根据自己的需求选择和定制 LLM 模型,以满足特定的应用场景。
2. 核心工具:Ollama 的安装与使用
Ollama 是一个强大的工具,它允许你在本地轻松运行 LLM 模型。Ollama 简化了 LLM 的部署和管理,让你无需复杂的配置即可快速上手。
安装 Ollama:
根据 Ollama 官方网站(https://ollama.com/)的指引,下载并安装适合你操作系统的版本。安装完成后,在终端中运行 ollama --version
命令,验证是否安装成功。
拉取并运行 LLM 模型:
Ollama 提供了丰富的 LLM 模型选择。为了使我们的 AI Agent 具备工具调用能力,建议选择支持该功能的模型。例如,我们可以使用 qwen2.5:14b
模型。在终端中运行以下命令:
ollama pull qwen2.5:14b
该命令会将 qwen2.5:14b
模型下载到本地。下载完成后,可以使用以下命令运行该模型:
ollama run qwen2.5:14b
现在,你就可以与本地运行的 LLM 模型进行交互了。例如,你可以输入 “现在几点了?” 来测试模型的理解能力。 尽管模型可能无法直接给出准确的答案,但我们可以通过集成工具来弥补这一不足。
3. Python 环境搭建与 Langchain 库的集成
接下来,我们需要搭建 Python 环境,并安装必要的库,包括 ollama
、langchain
和 langchain_community
。
创建 Python 虚拟环境:
为了隔离项目依赖,建议创建一个 Python 虚拟环境。可以使用 venv
或 conda
等工具创建虚拟环境。
安装所需库:
激活虚拟环境后,在终端中运行以下命令:
pip install ollama
pip install langchain
pip install langchain_community
这些库将为我们提供与 Ollama 集成、构建 AI Agent 和定义工具的能力。
4. 使用 Langchain 构建 AI Agent
Langchain 是一个强大的框架,它简化了 LLM 应用的开发过程。我们可以使用 Langchain 定义 AI Agent 的行为、集成工具和管理对话流程。
定义工具 (Tools):
首先,我们需要定义 AI Agent 可以使用的工具。工具是 AI Agent 与外部世界交互的桥梁。例如,我们可以定义一个 local_time_tool
工具,用于获取本地时间。
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def call_mcp_tool(tool_name, tool_args=None):
server_params = StdioServerParameters(
command="python",
args=["mcp-server.py"]
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool(tool_name, tool_args or {})
return result.content[0].text
def local_time_tool(_: str = "") -> str:
return asyncio.run(call_mcp_tool("local_time"))
def reversed_echo_tool(input_text: str) -> str:
return asyncio.run(call_mcp_tool("reversed_echo", {"message": input_text}))
这里假设你已经有一个 mcp-server.py
文件,它定义了 local_time
和 reversed_echo
这两个工具。 mcp-server.py
可以参考原文中前一篇或者前两篇文章。
创建 Tool 列表:
将定义的工具添加到工具列表中,以便 AI Agent 可以使用它们。
from langchain.agents import Tool
tools = [
Tool(
name="LocalTimeTool",
func=local_time_tool,
description="Returns the local time"
),
Tool(
name="ReversedEchoTool",
func=reversed_echo_tool,
description="Echoes the given message in reverse"
)
]
description
字段非常重要,它告诉 AI Agent 每个工具的作用,帮助它选择合适的工具来解决问题。
初始化 LLM 和 Agent:
使用 Ollama
类初始化 LLM,并使用 initialize_agent
函数创建 AI Agent。
from langchain.llms import Ollama
from langchain.agents import initialize_agent, AgentType
llm = Ollama(model="qwen2.5:14b")
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
AgentType.ZERO_SHOT_REACT_DESCRIPTION
指定了 AI Agent 的类型。这种类型的 Agent 会根据工具的描述和当前的任务,选择合适的工具来执行。verbose=True
可以打印 Agent 的执行过程,方便调试。
5. 创建交互界面
为了方便与 AI Agent 交互,我们可以创建一个简单的终端界面。
if __name__ == "__main__":
while True:
prompt = input("Enter your prompt: ")
if prompt.lower() in ["exit", "quit", "q"]:
break
print(agent.run(prompt))
这段代码会循环等待用户输入,并将用户输入作为 prompt 传递给 AI Agent。AI Agent 会根据 prompt 选择合适的工具来执行,并将结果返回给用户。
6. 运行 AI Agent
将以上代码保存为 ai-agent.py
文件,并在终端中运行它:
python ai-agent.py
现在,你就可以与你的 AI Agent 交互了。例如,你可以输入 “现在几点了?” 或 “你好, 请倒序输出这句话”。
7. mcp-server.py
文件 (Model Context Protocol) 的实现
为了让 ai-agent.py
能够调用 local_time_tool
和 reversed_echo_tool
,我们需要实现 mcp-server.py
文件。 这个文件充当一个服务器,接收来自 ai-agent.py
的请求,并执行相应的工具。
# mcp-server.py
import asyncio
import datetime
from typing import Dict
from mcp.server.base import ToolServer
from mcp.server.stdio import StdioServer
class MyToolServer(ToolServer):
async def local_time(self, args: Dict) -> str:
"""Returns the current local time."""
now = datetime.datetime.now()
return f"现在时间是 {now.strftime('%Y-%m-%d %H:%M:%S')}"
async def reversed_echo(self, args: Dict) -> str:
"""Reverses the given message."""
message = args.get("message", "")
return message[::-1]
async def main():
server = StdioServer(MyToolServer())
await server.start()
if __name__ == "__main__":
asyncio.run(main())
这个脚本创建了一个 MyToolServer
类,它继承自 ToolServer
。MyToolServer
类实现了 local_time
和 reversed_echo
两个工具。StdioServer
类用于启动一个基于标准输入/输出的服务器,它会监听来自 ai-agent.py
的请求,并调用相应的工具。
在运行 ai-agent.py
之前,需要先运行 mcp-server.py
。 确保两个文件在同一目录下。
python mcp-server.py
8. 拓展你的 AI Agent
现在,你已经成功构建了一个基于本地 LLM 的 AI Agent。你可以根据自己的需求拓展它的功能。
- 集成更多工具: 可以集成更多工具,例如天气查询、新闻摘要、代码生成等。
- 优化 Agent 的行为: 可以调整 Agent 的类型和参数,以优化其性能。
- 添加记忆功能: 可以让 Agent 记住之前的对话,使其更具上下文理解能力。
- 使用更强大的 LLM 模型: 可以尝试使用更强大的 LLM 模型,以提高 Agent 的智能水平。
例如,你可以添加一个工具来控制你的智能家居设备。你可以使用 Python 的 requests
库与智能家居设备的 API 进行交互,并创建一个工具来控制灯光、温度等。
# 假设你有一个控制灯光的 API
def control_light(status: str) -> str:
"""Controls the light."""
# 使用 requests 库与智能家居设备的 API 进行交互
import requests
try:
response = requests.post("your_light_api_endpoint", json={"status": status})
response.raise_for_status() # 检查请求是否成功
return f"Light turned {status} successfully."
except requests.exceptions.RequestException as e:
return f"Error controlling light: {e}"
然后,你可以将这个工具添加到工具列表中:
tools.append(
Tool(
name="ControlLight",
func=control_light,
description="Controls the light. Use 'on' to turn on the light, and 'off' to turn off the light."
)
)
现在,你可以告诉 AI Agent “Turn on the light” 或 “Turn off the light”,它会自动调用 control_light
工具来控制你的灯光。 注意描述中详细描述工具的使用方法,这样LLM才能更好的理解,并合理使用。
9. 总结与展望
通过本文,我们学习了如何使用 Python 和 Ollama 从零开始构建一个基于本地 LLM 的 AI Agent。 这种方案不仅保护了数据隐私,还降低了使用成本。 我们可以将这个 AI Agent 集成到各种应用场景中,例如智能助手、自动化脚本等。随着 LLM 技术的不断发展,本地 LLM 的应用前景将更加广阔。未来,我们可以期待更多开源的 LLM 模型和更强大的工具,这将使构建 AI Agent 变得更加容易和高效。 我们可以利用Langchain 的强大功能,结合 Ollama 提供的本地 LLM 能力,创建出更加智能、个性化的 AI 应用。希望本文能帮助你入门 AI Agent 开发,并激发你探索更多 AI 应用的可能性。