Agent入门:用本地模型从零搭建

📋 本文目录


前言

为什么用本地模型?

本地模型的优点:

  • ✅ 完全免费!不用 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 成功运行!

下一篇预告

下一篇我们讲 【工具使用模式】,教你:

  1. 自定义工具

  2. 让Agent用多个工具

  3. 工具调用的原理


💬 互动讨论

有问题欢迎评论区留言!

点赞👍 + 收藏⭐ + 关注👀,下一篇更精彩!


附录:完整运行日志

下面是实际执行时的完整日志输出,供你参考:

复制代码
================================================================================
                         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。

================================================================================

================================================================================
                            执行完成
================================================================================
相关推荐
rGzywSmDg5 小时前
如何在Dev-C++中设置TDM-GCC为默认编译器
开发语言·c++
xyq20246 小时前
Ruby 日期 & 时间处理指南
开发语言
qxwlcsdn6 小时前
CSS如何实现元素镜像翻转_使用transformscalex负值
jvm·数据库·python
2301_803934616 小时前
mysql如何处理大量重复值索引_mysql索引存储特征分析
jvm·数据库·python
IpdataCloud6 小时前
如何用Python和IP离线库查询IP归属地?获取国家、城市、经纬度的完整代码
开发语言·python·tcp/ip
EnCi Zheng6 小时前
09-斯坦福CS336作业 [特殊字符]
人工智能·pytorch·python·深度学习·神经网络
端平入洛6 小时前
Python 切片赋值 vs 普通赋值:你真的改了那个 list 吗?
python