ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【Day 01】从Chatbot到Agent:让AI从“只会说“到“能做事“

【Day 01】从Chatbot到Agent:让AI从“只会说“到“能做事“ 系列专栏AI Agent实战Day 01 / 18前置专栏AI办公自动化建议先读 Day 14-18署名梅雅达编程笔记摘要华泰证券研报指出2026年AI产业正从模型竞赛切入Agent商业化落地期国产大模型与海外差距缩至3-4个月。但多数开发者仍停留在调API问问题阶段。本篇从Chatbot与Agent的本质差异切入讲解Agent Loop五步循环用GLM-4.7-Flash从零搭建能自主决策的Agent框架骨架。① 场景痛点为什么直接问LLM不够华泰证券2026年7月发布的研报指出一个关键趋势AI产业正从大模型竞赛正式切入AI Agent商业化落地期。同一份报告还提到以Kimi K3、GLM 5.2为代表的国产大模型与海外顶尖模型的差距已缩小至3-4个月。大模型越来越强但你有没有发现一个尴尬的事实你让大模型帮你算个税它给你一堆公式和步骤但不会帮你算出最终数字你让它帮你整理文件它告诉你建议按日期排序但不会真的去动你的文件你让它帮你写周报它给你一个模板但不会去读取你的工作记录。LLM很聪明但它只会说不会做。这就是Chatbot和 Agent 的本质区别Chatbot聊天机器人Agent智能体核心能力理解问题 → 生成回答理解问题 → 自主决策 → 执行动作 → 观察结果 → 继续推进输出一段文本一个完成的任务能否调用工具不能能是否有记忆通常无有能记住之前的步骤终止条件生成完回答就结束任务完成才结束在前置专栏《AI Python办公自动化》的 Day 14我们用ReAct模式实现了一个简单的 Agent——让 LLM 输出Thought/Action/Observation文本来循环调用工具。那是一个很好的起点但离真正的 Agent 框架还有距离。本篇我们要做的是从零搭建一个结构化的 Agent 框架骨架包含工具系统、Agent Loop、记忆管理让 LLM 真正从回答者进化为执行者。② 传统写法写死if-else的困境面对用户可能问任何问题的场景传统做法是写死分支# 传统做法写死 if-else 分支处理不同请求defhandle_request(user_input):if几点inuser_inputor时间inuser_input:returnget_current_time()elif计算inuser_inputor算inuser_input:expressionextract_expression(user_input)returncalculate(expression)elif读文件inuser_input:filepathextract_filepath(user_input)returnread_file(filepath)else:return我无法处理这个请求这种做法的问题很明显新功能要改代码每加一个能力就要加一个if分支无法处理未知请求用户的表述千变万化关键词匹配太脆弱无法多步推理用户说先查时间再算一年有多少小时if-else 无法拆解多步任务维护噩梦分支越来越多代码越来越乱本质上if-else是在替 AI 做决策——你提前猜好了所有可能的情况然后写死规则。而 Agent 的思路完全不同让 AI 自己决策。你只需要告诉它有哪些工具可用它自己决定用哪个、怎么用、什么时候用。③ AI增强Agent Loop核心循环Agent 的核心是一个循环——Agent Loop┌──────────┐ │ 1. 感知 │ ← 接收任务和历史记忆 └────┬─────┘ ▼ ┌──────────┐ │ 2. 规划 │ ← LLM 决策做什么用什么工具 └────┬─────┘ ▼ ┌──────────┐ │ 3. 行动 │ ← 执行工具 └────┬─────┘ ▼ ┌──────────┐ │ 4. 观察 │ ← 获取工具返回结果 └────┬─────┘ ▼ ┌──────────┐ │ 5. 反思 │ ← 更新记忆判断是否完成 └────┬─────┘ │ ▼ 完成了吗 ──否──→ 回到第1步感知 │ 是 ▼ 返回最终结果五步循环的含义感知PerceiveAgent 接收用户的任务描述以及之前所有步骤的执行记录记忆规划PlanLLM 分析当前情况决定下一步做什么——调用哪个工具、传什么参数行动Act执行 LLM 选择的工具观察Observe获取工具的返回结果反思Reflect将结果存入记忆判断任务是否完成。未完成则回到第1步继续循环和前置专栏的ReAct模式相比这个框架有几个关键升级结构化输出不再用正则解析文本而是让 LLM 输出标准 JSON解析更可靠工具系统Tool基类统一管理新增工具只需注册不用改 Agent 逻辑记忆管理每一轮的思考、行动、观察都记录在 history 中Agent 能看到自己之前做了什么终止保护max_steps防止死循环和 Day 02 的关系本篇用 JSON 文本协议让 LLM 输出决策下一篇会升级为标准Function Calling让工具调用更规范。④ 完整代码从零搭建 Agent 框架代码结构整个 Agent 框架分为四层agent_skeleton.py ├── Tool 类 → 工具基类统一工具接口 ├── Agent 类 → Agent Loop 核心实现 ├── 内置工具函数 → calculate / get_time / read_file / write_file └── __main__ → 演示运行环境准备pipinstallopenai python-dotenv在项目目录下创建.env文件# GLM API Key永久免费注册地址https://open.bigmodel.cn/ GLM_API_KEY你的Key第一层Tool工具基类Tool类是所有工具的统一接口。每个工具需要四个属性名称、描述、参数说明、执行函数。classTool:def__init__(self,name,desc,params,func):self.name,self.desc,self.params,self.funcname,desc,params,funcdefexecute(self,**kw):try:returnstr(self.func(**kw))exceptExceptionase:returnfError:{e}设计要点execute方法永远返回字符串不抛异常。这样 Agent 不用处理工具报错只需要读取返回文本就能判断成功还是失败。第二层Agent类 -Agent Loop核心Agent类是整个框架的大脑。它的run方法实现了完整的Agent LoopclassAgent:PROMPTYou are an AI agent. Use tools to complete tasks. Tools: {tools} Respond JSON: {{thought:..., action:tool_name or final, action_input:{{...}}}} Done: actionfinal with {{answer:...}}def__init__(self,toolsNone,max_steps10):self.llmLLMClient(providerglm)self.tools{t.name:tfortin(toolsor[])}self.max_stepsmax_steps核心的run方法——这是Agent Loop的具体实现defrun(self,task):history[]forstepinrange(1,self.max_steps1):sys_msgself.PROMPT.format(toolsself._build_tools_desc())msgfTask:{task}\nifhistory:msgPrevious:\n\n.join(history)\nmsgNext?respself.llm.chat_json(msg,system_promptsys_msg,temperature0.3)try:decjson.loads(resp)except:returnresp thought,action,inpdec.get(thought,),dec.get(action,final),dec.get(action_input,{})ifactionfinal:returninp.get(answer,str(inp))ifisinstance(inp,dict)elsestr(inp)obsself._execute_tool(action,inp)print(f[Step{step}]{thought}→{action}→{obs})history.append(fStep{step}: Think「{thought}」→{action}({json.dumps(inp,ensure_asciiFalse)}) →{obs})returnTask incomplete上面只展示了核心逻辑完整代码包含错误处理、日志输出等细节见配套源码文件agent_skeleton.py。第三层内置工具四个内置工具覆盖计算、时间、文件读写defcalc(expression:str)-str:ifnotre.match(r^[\d\-*/.()\s]$,expression):returnError: invalidtry:returnstr(eval(expression,{__builtins__:{}},{}))exceptExceptionase:returnfError:{e}defget_time()-str:returndatetime.now().strftime(%Y-%m-%d %H:%M:%S)defread_file(path:str)-str:ifnotos.path.exists(path):returnfError: no file:{path}withopen(path,r,encodingutf-8)asf:returnf.read()defwrite_file(path:str,content:str)-str:dos.path.dirname(path)ifd:os.makedirs(d,exist_okTrue)withopen(path,w,encodingutf-8)asf:f.write(content)returnfWritten{len(content)}chars完整代码中包含安全检查如calculate限制字符、read_file截断超长内容和错误处理详见agent_skeleton.py。第四层演示运行if__name____main__:agentAgent(tools[Tool(calc,Calculate math,{expression:expr},calc),Tool(time,Get current time,{},get_time),Tool(read,Read file,{path:path},read_file),Tool(write,Write file,{path:path,content:text},write_file),])agent.run((1500500)*0.15 and write to result.txt)运行效果 任务: 现在几点了然后帮我算一下一年有多少小时 --- 步骤 1 --- 思考: 用户想知道当前时间我需要先调用 get_time 工具 行动: get_time 输入: {} ️ 观察: 当前时间: 2026年07月24日 15:30:00 周四 --- 步骤 2 --- 思考: 已获取时间接下来需要计算一年有多少小时即 365 * 24 行动: calculate 输入: {expression: 365 * 24} ️ 观察: 计算结果: 8760 --- 步骤 3 --- 思考: 已获取时间和计算结果可以汇总回答了 行动: final 输入: {answer: 现在是2026年7月24日15:30周四。一年有8760小时365×24} ✅ 完成: 现在是2026年7月24日15:30周四。一年有8760小时365×24Agent 自主完成了三步先查时间再算乘法最后汇总回答。整个过程没有一行if-else——LLM 自己决定了每一步该做什么。此套代码是核心代码想要完整代码的请评论区留言领取⑤ 成本透明项目费用GLM-4.7-Flash API永久免费上下文窗口200K Token最大输出128K TokenChromaDB后续篇用到开源免费本篇代码运行成本0 元GLM-4.7-Flash 是智谱AI提供的永久免费模型200K上下文窗口足够覆盖大多数 Agent 任务。注册地址https://open.bigmodel.cn/⑥ 练手改造学完本篇试试这些改造入门级添加天气查询工具写一个tool_weather(city: str)函数可以先返回假数据注册到tools列表让 Agent 回答北京今天天气怎么样调整max_steps把max_steps改成 3 或 15观察 Agent 行为变化修改系统提示词在SYSTEM_PROMPT中加一条规则如果任务需要多步计算先列出步骤再逐步执行进阶级添加工具使用限制给每个Tool加一个max_calls属性记录调用次数超过限制就返回该工具已达使用上限实现流式输出用LLMClient的流式接口替代chat_json让思考过程实时显示多任务管理让 Agent 支持同时接收多个任务按优先级排序执行本篇的 JSON 文本协议虽然能用但依赖 LLM 输出格式正确。Day 02 会用标准Function Calling替代让工具调用更可靠。⑦ 资源链接GLM 开发平台https://open.bigmodel.cn/注册免费获取 API Key前置专栏AI Python办公自动化Day 14 ReAct Agent 是本篇的前置内容ReAct 论文https://arxiv.org/abs/2210.03629 Reasoning Acting 的原始论文Reflexion 论文https://arxiv.org/abs/2303.11366 Agent 自我反思Day 11 会详细讲解本篇完整源码agent_skeleton.pyllm_client.py.env.example下篇预告Day 02 · Function Calling 精通——让AI主动调用你的函数。本篇用 JSON 文本协议让 Agent 决策但这种方式依赖 LLM 输出格式正确。下一篇我们用标准 Function Calling让工具调用从解析文本升级为原生支持。专栏持续更新中点个关注不迷路 ✨专栏推荐「AI Python 系列」第 05 栏 · AI Agent实战连载中「AI Python 系列」第 01 栏 · AI自动化办公连载中「AI Python 系列」第 02 栏 · AI数据可视化已完结「AI Python 系列」第 03 栏 · AIPython 爬虫实战已完结「AI Python 系列」第 04 栏 · AIWeb全栈连载中「AI Python 系列」第 06 栏 · AI多模态连载中资源领取关注作者获取本栏完整代码和数据集©️ 梅雅达编程笔记原创 · 首发 CSDN · 转载请注明出处
返回列表