📋 本文目录
前言
为什么用本地模型?
本地模型的优点:
-
✅ 完全免费!不用 API 密钥
-
✅ 隐私安全,数据不离开电脑
-
✅ 速度快,不依赖网络
-
✅ 可长期保存
本文我用 Qwen 2.5 (0.5B) 这个轻量模型,完全是因为我没有好的显卡,有好显卡的宝子们直接上更强大的模型。
什么是AI Agent?
简单理解: Agent = 会思考 + 会用工具的智能助手
举个例子:
你问:25的平方是多少?
↓
Agent想:我得用计算器
↓
Agent调用计算器工具
↓
得到答案:625
↓
回答你问题
这就是一个简单的 Agent!
准备环境
第一步:检查你的电脑
你需要:
-
Python 3.8(必须用这个哈)
-
Ollama
-
约 2GB 硬盘空间
第二步:确认本地模型
打开命令行,输入:
ollama list
你应该看到:
qwen2.5:0.5b (已下载!)
qwen2.5:3b-instruct
...
如果没有 qwen2.5:0.5b,输入:
ollama pull qwen2.5:0.5b
第三步:安装 LangChain
用 Python 3.8 创建虚拟环境:
py -3.8 -m venv venv_py38
venv_py38\Scripts\activate
然后安装:
pip install langchain==0.1.20
pip install langchain-openai==0.1.7
pip install langchain-core==0.1.52
就这么简单!
第一个Agent
创建代码文件
在 e:\AI\LangChain_path 文件夹里,新建一个文件叫 first_agent.py,内容如下:
# 第一个AI Agent - 本地Ollama版本(带详细日志)!
import sys
import datetime
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
# ==========================================
# 日志辅助函数
# ==========================================
def log_step(step_name, content=None):
"""记录每一步的操作"""
timestamp = datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]
print(f"\n[{timestamp}] [STEP] {step_name}")
if content:
print(f" {content}")
def log_info(info):
"""记录信息"""
timestamp = datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]
print(f"[{timestamp}] [INFO] {info}")
def log_success(success):
"""记录成功信息"""
timestamp = datetime.datetime.now().strftime("%H:%M:%S.%f")[:-3]
print(f"[{timestamp}] [OK] {success}")
def log_separator():
"""输出分隔线"""
print("\n" + "="*80)
# ==========================================
# 自定义计算器工具(带日志)
# ==========================================
@tool
def calculate(expression: str) -> str:
"""计算简单的数学表达式,例如 '25*25' 或 '2+3'"""
log_step("工具调用", f"执行计算: {expression}")
try:
result = eval(expression)
log_success(f"计算结果: {result}")
return str(result)
except Exception as e:
error_msg = f"计算错误: {str(e)}"
print(f" [ERROR] {error_msg}")
return error_msg
# ==========================================
# 主程序开始
# ==========================================
log_separator()
print(" " * 25 + "AI Agent 启动日志")
log_separator()
# 1. 初始化本地大模型
log_step("阶段 1/6: 初始化LLM")
log_info("连接到本地Ollama服务...")
try:
llm = ChatOpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama",
model="qwen2.5:0.5b",
temperature=0.7
)
log_success("大模型初始化成功!")
log_info(f" - 模型: qwen2.5:0.5b")
log_info(f" - 温度: 0.7")
except Exception as e:
print(f" [ERROR] 初始化失败: {str(e)}")
sys.exit(1)
# 2. 准备工具
log_step("阶段 2/6: 注册工具")
tools = [calculate]
log_info(f"已注册 {len(tools)} 个工具")
for tool in tools:
log_info(f" - {tool.name}")
log_info(f" 描述: {tool.description}")
log_success("工具注册完成!")
# 3. 创建提示模板
log_step("阶段 3/6: 构建提示模板")
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个聪明的助手,可以使用工具回答问题。"),
("user", "{input}"),
("placeholder", "{agent_scratchpad}")
])
log_info("提示模板包含:")
log_info(" - 系统提示 (system): 设定助手角色")
log_info(" - 用户输入 (user): 接收用户问题")
log_info(" - 思考区 (agent_scratchpad): 记录Agent思考过程")
log_success("提示模板构建完成!")
# 4. 创建Agent和执行器
log_step("阶段 4/6: 组装Agent")
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
handle_parsing_errors=True
)
log_success("Agent组装完成!")
# 5. 准备用户输入
log_step("阶段 5/6: 准备用户输入")
user_question = "25的平方是多少?"
log_info(f"用户问题: {user_question}")
# 6. 执行Agent
log_step("阶段 6/6: 执行Agent")
log_info("正在调用Agent...")
try:
response = agent_executor.invoke({
"input": user_question
})
log_separator()
print(" " * 28 + "最终结果")
log_separator()
print(f"\n用户问题: {user_question}")
print(f"Agent回答: {response['output']}")
log_separator()
except Exception as e:
log_separator()
print(" " * 28 + "执行出错")
log_separator()
print(f"\n错误信息: {str(e)}")
log_separator()
print("\n" + "="*80)
print(" " * 28 + "执行完成")
print("="*80)
运行效果
开始运行!
在命令行输入:
py -3.8 first_agent.py
你会看到(简化版):
================================================================================
AI Agent 启动日志
================================================================================
[12:48:37.506] [STEP] 阶段 1/6: 初始化LLM
[12:48:37.506] [INFO] 连接到本地Ollama服务...
[12:48:38.146] [OK] 大模型初始化成功!
[12:48:38.146] [STEP] 阶段 2/6: 注册工具
[12:48:38.146] [OK] 工具注册完成!
[12:48:38.146] [STEP] 阶段 3/6: 构建提示模板
[12:48:38.149] [OK] 提示模板构建完成!
[12:48:38.149] [STEP] 阶段 4/6: 组装Agent
[12:48:39.920] [OK] Agent组装完成!
[12:48:39.920] [STEP] 阶段 5/6: 准备用户输入
[12:48:39.920] [INFO] 用户问题: 25的平方是多少?
[12:48:39.920] [STEP] 阶段 6/6: 执行Agent
> Entering new AgentExecutor chain...
Invoking: `calculate` with `{'expression': '25*25'}`
[12:48:42.749] [STEP] 工具调用
执行计算: 25*25
[12:48:42.749] [OK] 计算结果: 625
62525的平方是 625。
> Finished chain.
================================================================================
最终结果
================================================================================
用户问题: 25的平方是多少?
Agent回答: 25的平方是 625。
================================================================================
执行完成
================================================================================
恭喜!你的第一个本地AI Agent运行成功!
总结
今天学会了什么?
| 步骤 | 内容 |
|---|---|
| 1 | 了解了Agent的基本概念 |
| 2 | 确认了本地Ollama模型 |
| 3 | 安装了LangChain |
| 4 | 写出了第一个Agent代码 |
| 5 | 成功运行! |
下一篇预告
下一篇我们讲 【工具使用模式】,教你:
-
自定义工具
-
让Agent用多个工具
-
工具调用的原理
💬 互动讨论
有问题欢迎评论区留言!
点赞👍 + 收藏⭐ + 关注👀,下一篇更精彩!
附录:完整运行日志
下面是实际执行时的完整日志输出,供你参考:
================================================================================
AI Agent 启动日志
================================================================================
[12:48:37.506] [STEP] 阶段 1/6: 初始化LLM
[12:48:37.506] [INFO] 连接到本地Ollama服务...
[12:48:38.146] [OK] 大模型初始化成功!
[12:48:38.146] [INFO] - 模型: qwen2.5:0.5b
[12:48:38.146] [INFO] - 温度: 0.7
[12:48:38.146] [STEP] 阶段 2/6: 注册工具
[12:48:38.146] [INFO] 已注册 1 个工具
[12:48:38.146] [INFO] - calculate
[12:48:38.146] [INFO] 描述: calculate(expression: str) -> str - 计算简单的数学表达式,例如 '25*25' 或 '2+3'
[12:48:38.146] [OK] 工具注册完成!
[12:48:38.146] [STEP] 阶段 3/6: 构建提示模板
[12:48:38.149] [INFO] 提示模板包含:
[12:48:38.149] [INFO] - 系统提示 (system): 设定助手角色
[12:48:38.149] [INFO] - 用户输入 (user): 接收用户问题
[12:48:38.149] [INFO] - 思考区 (agent_scratchpad): 记录Agent思考过程
[12:48:38.149] [OK] 提示模板构建完成!
[12:48:38.149] [STEP] 阶段 4/6: 组装Agent
[12:48:39.920] [OK] Agent组装完成!
[12:48:39.920] [STEP] 阶段 5/6: 准备用户输入
[12:48:39.920] [INFO] 用户问题: 25的平方是多少?
[12:48:39.920] [STEP] 阶段 6/6: 执行Agent
[12:48:39.920] [INFO] 正在调用Agent...
> Entering new AgentExecutor chain...
Invoking: `calculate` with `{'expression': '25*25'}`
[12:48:42.749] [STEP] 工具调用
执行计算: 25*25
[12:48:42.749] [OK] 计算结果: 625
62525的平方是 625。
> Finished chain.
================================================================================
最终结果
================================================================================
用户问题: 25的平方是多少?
Agent回答: 25的平方是 625。
================================================================================
================================================================================
执行完成
================================================================================