0. 现象:RAG 的天花板与 Agent 的必然性
你做完前六篇的 RAG,发现模型成了一个“博学的图书管理员”:
问它公司制度,它答得头头是道(RAG)。
问它“帮我查下 A 仓库库存”,它傻了:“对不起,知识库里没有实时库存。”
说“帮我给老板发个请假邮件”,它更傻了:“我只是个语言模型。”
RAG 只能“读”,Agent 才能“做”。
Agent 的第一性原理:LLM + 记忆 + 规划 + 工具 = 自主智能体。
工程上没这么玄乎,Agent 本质上就是:循环调用(Loop) + 工具路由(Router)。
1. 核心解密:ReAct 模式(Reasoning + Acting)
Agent 为什么能自己决定下一步干嘛?全靠一个 Prompt 模式,叫ReAct。
别被学术名词吓到,它的逻辑就像人类思考:
Thought(思考):用户想查库存,我应该先调用“查询库存接口”。
Action(行动):调用 search_inventory(sku=“A001”)。
Observation(观察):接口返回 { “A001”: 50 }。
Thought(再思考):库存查到了,是 50。用户还问能不能发货?我看下规则。
Final Answer(回答):库存充足,可以发货。
工程实现:这不是魔法,是LLM 在一个 while 循环里不断地输出 Thought 和 Action,直到它认为任务完成了。
2. 工程基石:Function Calling(工具定义)
要让 Agent 跑起来,你首先得把你的后端 API 包装成模型能看懂的“工具说明书”。
2.1 定义工具(Schema)
这跟写 Swagger/OpenAPI 文档一模一样。你必须告诉模型:
工具名叫啥?(send_email)
干啥用的?(发送邮件给指定收件人)
参数是啥?(to: string, subject: string, body: string)
示例(OpenAI 格式):
{ "type": "function", "function": { "name": "query_inventory", "description": "查询指定商品的实时库存数量", "parameters": { "type": "object", "properties": { "sku_code": { "type": "string", "description": "商品SKU编码,如 A-101" } }, "required": ["sku_code"] } } }2.2 工具调用的工程坑点
描述(Description)比代码更重要:模型是根据 description 来决定用不用这个工具的。如果你写得含糊,它就不调,或者乱调。
参数校验(Validation):模型传回来的参数可能是错的(比如把日期写成 “tomorrow”)。后端拿到参数后,必须先做校验,不行就把错误信息塞回给模型让它重试(类似第五篇的重试逻辑)。
3. 多租户下的 Agent 架构:权限是个大雷
RAG 的权限在“查”的时候卡住就行,Agent 的权限涉及“改”(发邮件、改库存),风险极大。
3.1 权限透传(User Context Injection)
绝对不能给 Agent 配置一个超级管理员账号。
Agent 调用后端 API 时,必须复用当前操作用户的 Token/Session。
用户 U 发起请求 -> Agent 决定调 get_salary -> Agent 请求后端。
后端检查:Header 里有没有 U 的 Token?U 有没有 get_salary 权限?
无权:后端返回 403。
Agent 收到 403:思考(Thought) -> 回复用户:“对不起,你没权限查工资。”(
这就对了!)
3.2 敏感操作的“人机确认”(Human-in-the-loop)
对于写操作(发邮件、删库、转账),永远不要让 Agent 自动跑完。
架构模式:
Agent 决定调用 transfer_money(to=“Bob”, amount=100)。
系统暂停(Suspend)。
前端弹窗:“Agent 想要转账 100 给 Bob,是否批准?”
用户点“批准”。
系统把“用户已批准”作为 Observation 塞回给 Agent。
Agent 继续执行。
4. 一个可落地的 Agent Loop 代码逻辑(伪代码)
这就是 Agent 的后端核心逻辑,其实就是一个 While 循环。
messages = [{"role": "user", "content": "帮我查下 A001 库存,够的话发个邮件给老板"}] while True: 1. 调大模型,把工具定义(Schema)传进去 response = llm.chat(messages, tools=[query_inventory, send_email]) # 2. 判断模型是否想调工具 if response.tool_calls: tool_call = response.tool_calls[0] func_name = tool_call.function.name args = json.loads(tool_call.function.arguments) # --- 权限校验与执行 --- # 必须带上当前用户的 context if func_name == "query_inventory": result = api.query_inventory(sku=args['sku_code'], user=current_user) elif func_name == "send_email": # 敏感操作,插入人工确认逻辑 if not user_approved(func_name, args): result = "User denied the operation." else: result = api.send_email(**args, user=current_user) # 3. 把执行结果(Observation)追加到消息历史 messages.append(response.message) # 把模型的 Action 加上 messages.append({ # 把结果加上 "role": "tool", "tool_call_id": tool_call.id, "content": str(result) }) # 进入下一轮循环,模型会看到结果,然后决定下一步 else: # 4. 模型不想调工具了,直接回答用户(Final Answer) print("Agent 回复:", response.content) break5. Agent 的常见死法与救法
5.1 死循环(Looping)
现象:模型不停地查库存,查完了又查,不输出结果。
解法:
设置 max_steps(最大步数,比如 10 步)。超过就强制停止并报错。
System Prompt 里加一句:“如果多次尝试失败,请停止并询问用户。”
5.2 乱调参(Hallucinated Arguments)
现象:调用 search_user(id=“张三”),但接口要求 id 必须是数字。
解法:
把错误信息(Error: id must be integer)塞回给模型(Observation)。
聪明的模型(如 GPT-4)看到报错会自我修正:“对不起,我应该先按名字查 ID。” -> get_user_id(name=“张三”)。
6. 本篇小结(从 Demo 到生产)
Agent = Loop + Tools。核心是 ReAct 循环。
工具定义要像写代码一样严谨。Description 是给模型看的文档。
权限控制必须在后端。Agent 只是一个代理,不能绕过业务鉴权。
敏感操作必须有人工确认(Human-in-the-loop)。
做好容错。把 API 报错喂回给模型,让它自己修。
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋
📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~