news 2026/4/23 12:48:30

本地部署大模型-AI Agent

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
本地部署大模型-AI Agent

从“会聊天”,到“会做事”,再到“会协作”,
AI Agent 的本质是把大模型变成一个能持续行动的系统。

一、为什么有了大模型,还需要 AI Agent?

如果你已经折腾过本地大模型、RAG、微调,你大概率会有一个感受:

模型很聪明,但它什么也“不会自己去做”。

它可以:回答问题、写代码、给建议;

但它不会:主动拆解任务、决定下一步该做什么、调用工具并根据结果修正策略

这正是AI Agent 出现的原因,让AI自动进行拆解任务、决定下一步该做什么、调用工具并根据结果修正策略。

二、一句话理解 AI Agent

AI Agent 不是更大的模型,而是“能自己行动的大模型”。

更工程一点的定义是:

AI Agent = 大模型 + 目标 + 记忆 + 工具 + 控制循环

它不再是“一问一答”,而是一个持续运行的决策系统

三、AI Agent 与普通大模型的区别

对比维度普通大模型AI Agent
交互方式一问一答目标驱动
是否拆任务NoYes
是否调用工具被动主动
是否有状态NoYes
是否能纠错NoYes
更像什么搜索引擎助理 / 执行者

我们提供想法和大概的思路,甚至只给大模型一个思路,大模型负责“想”,补充实现路径和实现细节,Agent 负责“想 + 做 + 改”。

现实中 90% 的可用 Agent,其实停留在 Level 2–4,但已经非常强。

五、一个 AI Agent 的最小实现结构(MVP)

从工程角度看,一个 Agent 至少需要这几样:

用户目标 ↓ 任务规划(LLM) ↓ 行动循环(Agent Loop) ├─ 选择工具 ├─ 执行 ├─ 读取结果 ├─ 更新记忆 └─ 判断是否完成 # 伪代码 while not done: plan = llm.plan(goal, memory) action = select_tool(plan) result = action.execute() memory.update(result) done = check_done(memory)

以下是 Agent 的所有“器官”,只差一个控制中枢。

Agent 模块对应技术
大脑本地 LLM
记忆RAG / JSON / SQLite
工具Python / API
行动写代码 / 发消息 / 建待办
控制一个 while 循环

当模型开始为目标负责,而不是为回答负责,
AI 才真正开始“工作”。

实现路线实例:

技术栈(适合 4GB 显卡)

  • 本地模型:deepseek-r1:1.5b(推理/规划)或qwen2.5-coder:1.5b(代码执行更稳)
  • 推理服务:Ollama
  • Agent 框架:自己写一个轻量 Loop(更可控、便于写推文/教学)
  • 工具:文件读写、Python 运行、R 运行、Shell(可选,建议受限)

一键起步(环境 & 拉模型)

# 1) 安装 ollama # 2) 拉取模型(选一个主模型即可) ollama pull deepseek-r1:1.5b # 或更偏代码: ollama pull qwen2.5-coder:1.5b # 3) python 依赖 pip install -U requests pydantic rich

项目结构

local_agent/ agent.py # 主循环(Planner/Executor/Memory) tools.py # 工具注册与实现 llm_ollama.py # 调用 Ollama prompts.py # 系统提示模板 workspace/ # Agent 允许读写的沙箱目录, #建议限制只在工作路径下进行,后期接入VS code很有必要

核心思想:用“结构化动作”驱动工具调用

Ollama 不保证原生 function-calling 一致,所以我们用强约束输出 JSON

Agent 每一步让模型只输出下面三种之一:

  • {"type":"plan","steps":[...]}
  • {"type":"action","tool":"read_file","args":{...}}
  • {"type":"final","answer":"..."}

这样就能稳定解析并执行。

代码:Ollama 调用(llm_ollama.py)

import requests OLLAMA_URL = "http://127.0.0.1:11434/api/chat" def chat_ollama(model: str, messages: list[dict], temperature: float = 0.2) -> str: r = requests.post( OLLAMA_URL, json={"model": model, "messages": messages, "stream": False, "options": {"temperature": temperature}}, timeout=180, ) r.raise_for_status() return r.json()["message"]["content"]

代码:工具系统(tools.py)

建议:工具只允许在workspace/里读写,避免越权。

from __future__ import annotations from dataclasses import dataclass from pathlib import Path import subprocess, json, textwrap WORKSPACE = Path("workspace").resolve() WORKSPACE.mkdir(exist_ok=True) class ToolError(Exception): pass def _safe_path(rel_path: str) -> Path: p = (WORKSPACE / rel_path).resolve() if not str(p).startswith(str(WORKSPACE)): raise ToolError("Path not allowed (outside workspace).") return p def read_file(path: str, max_chars: int = 12000) -> str: p = _safe_path(path) if not p.exists(): raise ToolError(f"File not found: {path}") txt = p.read_text(encoding="utf-8", errors="ignore") return txt[:max_chars] def write_file(path: str, content: str) -> str: p = _safe_path(path) p.parent.mkdir(parents=True, exist_ok=True) p.write_text(content, encoding="utf-8") return f"Wrote {len(content)} chars to {path}" def run_python(code: str) -> str: """ 在受限模式下运行 python:不提供网络、只在 workspace 下运行文件读写(由代码自控,仍需谨慎) 这里用子进程执行,返回 stdout/stderr。 """ code = textwrap.dedent(code).strip() cmd = ["python", "-c", code] proc = subprocess.run(cmd, capture_output=True, text=True, cwd=str(WORKSPACE)) out = (proc.stdout or "") + (("\n[stderr]\n" + proc.stderr) if proc.stderr else "") return out[:20000] TOOLS = { "read_file": read_file, "write_file": write_file, "run_python": run_python, } def tool_schema() -> dict: """给模型看的工具说明""" return { "read_file": {"args": {"path": "string", "max_chars": "int(optional)"}}, "write_file": {"args": {"path": "string", "content": "string"}}, "run_python": {"args": {"code": "string"}}, }

代码:提示词(prompts.py)

SYSTEM_PROMPT = """你是一个本地AI Agent。你的任务是通过“计划-行动-观察-反思”循环完成目标。 你必须严格输出 JSON(不要输出任何额外文字),JSON 只允许三种类型: 1) 计划: {"type":"plan","steps":["...","..."]} 2) 行动(调用工具): {"type":"action","tool":"工具名","args":{...}} 3) 最终回答: {"type":"final","answer":"...(可包含Markdown)"} 规则: - 工具只允许使用提供的列表;参数必须符合工具说明。 - 如果上一步工具返回错误或信息不足,你要调整策略:再次输出 action(例如先读文件、检查数据、打印报错)。 - 不允许臆造文件内容或执行结果;一切依据工具返回的 observation。 - 当目标已完成,输出 final。 """

代码:Agent 主循环(agent.py)

import json from rich import print from llm_ollama import chat_ollama from tools import TOOLS, tool_schema, ToolError MODEL = "qwen2.5-coder:1.5b" # 或 deepseek-r1:1.5b MAX_TURNS = 12 def safe_json_loads(s: str) -> dict: s = s.strip() # 有些模型会包 ```json ... ```,做个兜底剥离 if s.startswith("```"): s = s.strip("`") s = s.replace("json", "", 1).strip() return json.loads(s) def run_agent(goal: str): tools = tool_schema() messages = [ {"role": "system", "content": __import__("prompts").SYSTEM_PROMPT}, {"role": "user", "content": json.dumps({ "goal": goal, "tools": tools, "workspace_note": "所有文件读写都在 workspace/ 目录下完成。" }, ensure_ascii=False)} ] plan_done = False for turn in range(1, MAX_TURNS + 1): raw = chat_ollama(MODEL, messages, temperature=0.2) print(f"\n[bold cyan]Turn {turn} model output:[/bold cyan]\n{raw}") try: obj = safe_json_loads(raw) except Exception as e: # 解析失败:要求模型纠正输出 messages.append({"role": "assistant", "content": raw}) messages.append({"role": "user", "content": json.dumps({ "error": f"你的输出不是合法 JSON:{e}. 请严格按三种 JSON 类型之一重写。" }, ensure_ascii=False)}) continue t = obj.get("type") if t == "plan": plan_done = True messages.append({"role": "assistant", "content": raw}) # 推进到下一步:让它开始行动 messages.append({"role": "user", "content": json.dumps({ "ok": True, "instruction": "请开始执行第1步。需要工具就输出 action。" }, ensure_ascii=False)}) continue if t == "action": tool = obj.get("tool") args = obj.get("args", {}) if tool not in TOOLS: messages.append({"role": "assistant", "content": raw}) messages.append({"role": "user", "content": json.dumps({ "error": f"工具不存在:{tool}。可用工具:{list(TOOLS.keys())}" }, ensure_ascii=False)}) continue try: result = TOOLS[tool](**args) obs = {"tool": tool, "args": args, "result": result} except Exception as e: obs = {"tool": tool, "args": args, "error": str(e)} messages.append({"role": "assistant", "content": raw}) messages.append({"role": "user", "content": json.dumps({ "observation": obs, "instruction": "基于 observation 决定下一步:继续 action 或 final。" }, ensure_ascii=False)}) continue if t == "final": return obj.get("answer", "") # 未知 type messages.append({"role": "assistant", "content": raw}) messages.append({"role": "user", "content": json.dumps({ "error": f"未知 type:{t}。只能是 plan/action/final。" }, ensure_ascii=False)}) return "❌ 超出最大轮次,任务未完成。建议缩小目标或增加工具。" if __name__ == "__main__": goal = "在 workspace 下新建一个 report.md:写一段 AI Agent 的定义(100字),再列出技术路线 Level0-6 的要点。" answer = run_agent(goal) print("\n[bold green]FINAL:[/bold green]\n", answer)

运行:

python agent.py

在1.5b的小模型中,效果并不佳,建议换高参数模型。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

作为一名老互联网人,看着AI越来越火,也总想为大家做点啥。干脆把我这几年整理的AI大模型干货全拿出来了。
包括入门指南、学习路径图、精选书籍、视频课,还有我录的一些实战讲解。全部免费,不搞虚的。
学习从来都是自己的事,我能做的就是帮你把路铺平一点。资料都放在下面了,有需要的直接拿,能用到多少就看你自己了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以点击文章最下方的VX名片免费领取【保真100%】

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:16:43

普通 Python 开发程序员如何转型大模型方向?

这里为你提供一份详细的转型攻略,希望能够帮助你从零开始进入大模型领域。 一、明确目标与方向 在转行之前,首先需要明确自己的目标和方向。大模型领域涉及多个方向,包括但不限于:大模型开发 :参与大模型的训练、微调和…

作者头像 李华
网站建设 2026/4/16 17:51:08

M2FP在艺术创作中的应用:数字人体解构新方式

M2FP在艺术创作中的应用:数字人体解构新方式 🎨 艺术与AI的交汇点:为何需要精准的人体解析? 在当代数字艺术、虚拟形象设计和动画制作中,对人体结构的精确理解是创作高质量视觉内容的基础。传统手绘或3D建模依赖艺术家…

作者头像 李华
网站建设 2026/3/30 20:01:55

MGeo模型安全性评估:是否存在隐私泄露风险

MGeo模型安全性评估:是否存在隐私泄露风险 引言:地址相似度识别中的安全隐忧 随着地理信息数据在电商、物流、智慧城市等领域的广泛应用,地址相似度匹配技术成为实体对齐和数据融合的关键环节。阿里近期开源的 MGeo 模型,专注于中…

作者头像 李华
网站建设 2026/4/23 12:16:17

基于AI的红队渗透测试工具包,集成Nmap与Metasploit等工具

基于AI的红队渗透测试工具包,集成Nmap与Metasploit等工具 GHOSTCREW是一款具有变革意义的开源红队与渗透测试工具包。这款AI驱动的助手利用大语言模型技术,集成MCP协议,并支持可选的RAG架构,通过自然语言指令协调各类安全工具。 …

作者头像 李华
网站建设 2026/4/17 16:13:30

Z-Image-Turbo快捷键功能缺失现状与改进建议

Z-Image-Turbo快捷键功能缺失现状与改进建议 问题背景:高效交互的迫切需求 随着AI图像生成工具在创意设计、内容生产等领域的广泛应用,用户对操作效率的要求日益提升。阿里通义Z-Image-Turbo WebUI作为一款基于DiffSynth Studio框架二次开发的高性能图像…

作者头像 李华
网站建设 2026/4/23 12:24:37

Z-Image-Turbo更新日志解读:v1.0.0新增功能详解

Z-Image-Turbo更新日志解读:v1.0.0新增功能详解 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 引言:从基础能力到生产级工具的跃迁 随着AI图像生成技术的不断演进,用户对生成速度、操作便捷性和输出质量的要求日益提升…

作者头像 李华