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

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

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

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

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

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

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

二、一句话理解 AI Agent

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

更工程一点的定义是:

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

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

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

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

我们提供想法和大概的思路,甚至只给大模型一个思路,大模型负责“想”,补充实现路径和实现细节,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%】
在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐