👋 我是 Yulia,一线 AI 应用开发工程师:4 年工程经验,在职做大模型应用落地。
只写一件事------把最新 AI 技术讲成人话 + 给你能直接上手用的代码 (真实可验证,不搬运不注水)。
有用就点个 关注,持续更新大模型应用的前沿实战。
📚 本文是《后端开发从入门到靠谱》系列第 12 篇。第十一课我们让大模型会"查资料回答"(RAG),但很多任务光会"说"不够,还得会"做"------查天气、订机票、写文件、跑代码。这一课讲 Agent,让大模型学会"调工具、做决策"。
RAG 解决的是"大模型不知道你的知识",但现实中还有一类问题:大模型知道怎么答,却"做"不了。你问它"帮我查一下今天北京的天气",它只能回答"抱歉,我没有实时天气数据"------因为它没有"查天气"这个能力。
Agent(智能体) 就是来补上这块的:给大模型装上"手"(调工具),让它能真正动手做事,而不只是"动嘴说话"。
读完你会拿到:
- 一个直觉模型:RAG 是"会查资料的学生",Agent 是"会自己动手的助理"
- Agent 三要素:大脑(大模型)+ 手(工具)+ 决策循环
- Function Calling 的底层原理(大模型怎么"知道"该调哪个工具)
- ReAct 决策循环(Agent 的灵魂:思考 → 行动 → 观察 → 再思考)
- 一个最小 Agent 的完整实现(代码逐行讲解)
- 多工具编排 + 工具描述怎么写(好 Agent 的关键)
- Agent 常见坑(幻觉调错工具、无限循环、上下文爆炸)
- Agent 和 RAG 的关系 + 何时用哪个
先看全景图,Agent 的工作方式:
#mermaid-svg-7LjGNRfCZBpkBpCI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7LjGNRfCZBpkBpCI .error-icon{fill:#552222;}#mermaid-svg-7LjGNRfCZBpkBpCI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7LjGNRfCZBpkBpCI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7LjGNRfCZBpkBpCI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7LjGNRfCZBpkBpCI .marker.cross{stroke:#333333;}#mermaid-svg-7LjGNRfCZBpkBpCI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7LjGNRfCZBpkBpCI p{margin:0;}#mermaid-svg-7LjGNRfCZBpkBpCI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7LjGNRfCZBpkBpCI .cluster-label text{fill:#333;}#mermaid-svg-7LjGNRfCZBpkBpCI .cluster-label span{color:#333;}#mermaid-svg-7LjGNRfCZBpkBpCI .cluster-label span p{background-color:transparent;}#mermaid-svg-7LjGNRfCZBpkBpCI .label text,#mermaid-svg-7LjGNRfCZBpkBpCI span{fill:#333;color:#333;}#mermaid-svg-7LjGNRfCZBpkBpCI .node rect,#mermaid-svg-7LjGNRfCZBpkBpCI .node circle,#mermaid-svg-7LjGNRfCZBpkBpCI .node ellipse,#mermaid-svg-7LjGNRfCZBpkBpCI .node polygon,#mermaid-svg-7LjGNRfCZBpkBpCI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7LjGNRfCZBpkBpCI .rough-node .label text,#mermaid-svg-7LjGNRfCZBpkBpCI .node .label text,#mermaid-svg-7LjGNRfCZBpkBpCI .image-shape .label,#mermaid-svg-7LjGNRfCZBpkBpCI .icon-shape .label{text-anchor:middle;}#mermaid-svg-7LjGNRfCZBpkBpCI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7LjGNRfCZBpkBpCI .rough-node .label,#mermaid-svg-7LjGNRfCZBpkBpCI .node .label,#mermaid-svg-7LjGNRfCZBpkBpCI .image-shape .label,#mermaid-svg-7LjGNRfCZBpkBpCI .icon-shape .label{text-align:center;}#mermaid-svg-7LjGNRfCZBpkBpCI .node.clickable{cursor:pointer;}#mermaid-svg-7LjGNRfCZBpkBpCI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7LjGNRfCZBpkBpCI .arrowheadPath{fill:#333333;}#mermaid-svg-7LjGNRfCZBpkBpCI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7LjGNRfCZBpkBpCI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7LjGNRfCZBpkBpCI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7LjGNRfCZBpkBpCI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7LjGNRfCZBpkBpCI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7LjGNRfCZBpkBpCI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7LjGNRfCZBpkBpCI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7LjGNRfCZBpkBpCI .cluster text{fill:#333;}#mermaid-svg-7LjGNRfCZBpkBpCI .cluster span{color:#333;}#mermaid-svg-7LjGNRfCZBpkBpCI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7LjGNRfCZBpkBpCI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7LjGNRfCZBpkBpCI rect.text{fill:none;stroke-width:0;}#mermaid-svg-7LjGNRfCZBpkBpCI .icon-shape,#mermaid-svg-7LjGNRfCZBpkBpCI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7LjGNRfCZBpkBpCI .icon-shape p,#mermaid-svg-7LjGNRfCZBpkBpCI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7LjGNRfCZBpkBpCI .icon-shape .label rect,#mermaid-svg-7LjGNRfCZBpkBpCI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7LjGNRfCZBpkBpCI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7LjGNRfCZBpkBpCI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7LjGNRfCZBpkBpCI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-7LjGNRfCZBpkBpCI .blue>*{fill:#4E79A7!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .blue span{fill:#4E79A7!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .blue tspan{fill:#fff!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .orange>*{fill:#F28E2B!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .orange span{fill:#F28E2B!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .orange tspan{fill:#fff!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .green>*{fill:#59A14F!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .green span{fill:#59A14F!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .green tspan{fill:#fff!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .red>*{fill:#E15759!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .red span{fill:#E15759!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .red tspan{fill:#fff!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .cyan>*{fill:#76B7B2!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .cyan span{fill:#76B7B2!important;color:#fff!important;stroke:none!important;}#mermaid-svg-7LjGNRfCZBpkBpCI .cyan tspan{fill:#fff!important;} 要
不要
用户提问
大模型 大脑
要不要调工具
调工具 函数
工具结果
直接回答
一、Agent 是什么?和 RAG 差在哪?
先用一个类比把 Agent 和 RAG 的区别讲透:
- RAG 是"会查资料的学生":你问它问题,它会翻书(检索知识库),然后照着书回答。但它的能力止于"查 + 答"。
- Agent 是"会自己动手的助理 ":你交给它一个任务,它会自己拆解任务、调用工具、根据结果调整、直到完成。它会"查天气"、"发邮件"、"写文件"、"跑代码"。
#mermaid-svg-OTgZ0cZuRqUh9nQF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OTgZ0cZuRqUh9nQF .error-icon{fill:#552222;}#mermaid-svg-OTgZ0cZuRqUh9nQF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OTgZ0cZuRqUh9nQF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .marker.cross{stroke:#333333;}#mermaid-svg-OTgZ0cZuRqUh9nQF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OTgZ0cZuRqUh9nQF p{margin:0;}#mermaid-svg-OTgZ0cZuRqUh9nQF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .cluster-label text{fill:#333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .cluster-label span{color:#333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .cluster-label span p{background-color:transparent;}#mermaid-svg-OTgZ0cZuRqUh9nQF .label text,#mermaid-svg-OTgZ0cZuRqUh9nQF span{fill:#333;color:#333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .node rect,#mermaid-svg-OTgZ0cZuRqUh9nQF .node circle,#mermaid-svg-OTgZ0cZuRqUh9nQF .node ellipse,#mermaid-svg-OTgZ0cZuRqUh9nQF .node polygon,#mermaid-svg-OTgZ0cZuRqUh9nQF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OTgZ0cZuRqUh9nQF .rough-node .label text,#mermaid-svg-OTgZ0cZuRqUh9nQF .node .label text,#mermaid-svg-OTgZ0cZuRqUh9nQF .image-shape .label,#mermaid-svg-OTgZ0cZuRqUh9nQF .icon-shape .label{text-anchor:middle;}#mermaid-svg-OTgZ0cZuRqUh9nQF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OTgZ0cZuRqUh9nQF .rough-node .label,#mermaid-svg-OTgZ0cZuRqUh9nQF .node .label,#mermaid-svg-OTgZ0cZuRqUh9nQF .image-shape .label,#mermaid-svg-OTgZ0cZuRqUh9nQF .icon-shape .label{text-align:center;}#mermaid-svg-OTgZ0cZuRqUh9nQF .node.clickable{cursor:pointer;}#mermaid-svg-OTgZ0cZuRqUh9nQF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .arrowheadPath{fill:#333333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OTgZ0cZuRqUh9nQF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OTgZ0cZuRqUh9nQF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OTgZ0cZuRqUh9nQF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OTgZ0cZuRqUh9nQF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OTgZ0cZuRqUh9nQF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OTgZ0cZuRqUh9nQF .cluster text{fill:#333;}#mermaid-svg-OTgZ0cZuRqUh9nQF .cluster span{color:#333;}#mermaid-svg-OTgZ0cZuRqUh9nQF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OTgZ0cZuRqUh9nQF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OTgZ0cZuRqUh9nQF rect.text{fill:none;stroke-width:0;}#mermaid-svg-OTgZ0cZuRqUh9nQF .icon-shape,#mermaid-svg-OTgZ0cZuRqUh9nQF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OTgZ0cZuRqUh9nQF .icon-shape p,#mermaid-svg-OTgZ0cZuRqUh9nQF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OTgZ0cZuRqUh9nQF .icon-shape .label rect,#mermaid-svg-OTgZ0cZuRqUh9nQF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OTgZ0cZuRqUh9nQF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OTgZ0cZuRqUh9nQF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OTgZ0cZuRqUh9nQF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-OTgZ0cZuRqUh9nQF .blue>*{fill:#4E79A7!important;color:#fff!important;stroke:none!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .blue span{fill:#4E79A7!important;color:#fff!important;stroke:none!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .blue tspan{fill:#fff!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .orange>*{fill:#F28E2B!important;color:#fff!important;stroke:none!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .orange span{fill:#F28E2B!important;color:#fff!important;stroke:none!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .orange tspan{fill:#fff!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .green>*{fill:#59A14F!important;color:#fff!important;stroke:none!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .green span{fill:#59A14F!important;color:#fff!important;stroke:none!important;}#mermaid-svg-OTgZ0cZuRqUh9nQF .green tspan{fill:#fff!important;} Agent 会做
大模型
调工具做事
完成
RAG 会答
大模型
检索知识
回答
一句话总结 :RAG 给大模型加的是"知识 ",Agent 加的是"行动能力"。两者不冲突,反而常常结合------RAG 可以成为 Agent 手里的一个"工具"(Agent 想查资料时就调检索工具)。
二、Agent 的三大要素
一个 Agent,本质由三部分组成:
#mermaid-svg-6a9jMRSjbQAoORIX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6a9jMRSjbQAoORIX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6a9jMRSjbQAoORIX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6a9jMRSjbQAoORIX .error-icon{fill:#552222;}#mermaid-svg-6a9jMRSjbQAoORIX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6a9jMRSjbQAoORIX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6a9jMRSjbQAoORIX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6a9jMRSjbQAoORIX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6a9jMRSjbQAoORIX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6a9jMRSjbQAoORIX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6a9jMRSjbQAoORIX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6a9jMRSjbQAoORIX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6a9jMRSjbQAoORIX .marker.cross{stroke:#333333;}#mermaid-svg-6a9jMRSjbQAoORIX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6a9jMRSjbQAoORIX p{margin:0;}#mermaid-svg-6a9jMRSjbQAoORIX .edge{stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .section--1 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section--1 path,#mermaid-svg-6a9jMRSjbQAoORIX .section--1 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section--1 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section--1 text{fill:#ffffff;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth--1{stroke-width:17;}#mermaid-svg-6a9jMRSjbQAoORIX .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-0 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-0 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-0 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-0 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-0 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-0{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-0{stroke-width:14;}#mermaid-svg-6a9jMRSjbQAoORIX .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-1 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-1 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-1 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-1 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-1 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-1{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-1{stroke-width:11;}#mermaid-svg-6a9jMRSjbQAoORIX .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-2 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-2 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-2 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-2 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-2 text{fill:#ffffff;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-2{stroke-width:8;}#mermaid-svg-6a9jMRSjbQAoORIX .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-3 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-3 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-3 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-3 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-3 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-3{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-3{stroke-width:5;}#mermaid-svg-6a9jMRSjbQAoORIX .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-4 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-4 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-4 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-4 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-4 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-4{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-4{stroke-width:2;}#mermaid-svg-6a9jMRSjbQAoORIX .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-5 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-5 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-5 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-5 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-5 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-5{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-5{stroke-width:-1;}#mermaid-svg-6a9jMRSjbQAoORIX .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-6 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-6 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-6 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-6 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-6 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-6{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-6{stroke-width:-4;}#mermaid-svg-6a9jMRSjbQAoORIX .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-7 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-7 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-7 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-7 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-7 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-7{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-7{stroke-width:-7;}#mermaid-svg-6a9jMRSjbQAoORIX .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-8 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-8 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-8 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-8 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-8 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-8{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-8{stroke-width:-10;}#mermaid-svg-6a9jMRSjbQAoORIX .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-9 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-9 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-9 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-9 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-9 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-9{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-9{stroke-width:-13;}#mermaid-svg-6a9jMRSjbQAoORIX .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-10 rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-10 path,#mermaid-svg-6a9jMRSjbQAoORIX .section-10 circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-10 polygon,#mermaid-svg-6a9jMRSjbQAoORIX .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-10 text{fill:black;}#mermaid-svg-6a9jMRSjbQAoORIX .node-icon-10{font-size:40px;color:black;}#mermaid-svg-6a9jMRSjbQAoORIX .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .edge-depth-10{stroke-width:-16;}#mermaid-svg-6a9jMRSjbQAoORIX .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled,#mermaid-svg-6a9jMRSjbQAoORIX .disabled circle,#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:lightgray;}#mermaid-svg-6a9jMRSjbQAoORIX .disabled text{fill:#efefef;}#mermaid-svg-6a9jMRSjbQAoORIX .section-root rect,#mermaid-svg-6a9jMRSjbQAoORIX .section-root path,#mermaid-svg-6a9jMRSjbQAoORIX .section-root circle,#mermaid-svg-6a9jMRSjbQAoORIX .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-6a9jMRSjbQAoORIX .section-root text{fill:#ffffff;}#mermaid-svg-6a9jMRSjbQAoORIX .section-root span{color:#ffffff;}#mermaid-svg-6a9jMRSjbQAoORIX .section-2 span{color:#ffffff;}#mermaid-svg-6a9jMRSjbQAoORIX .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-6a9jMRSjbQAoORIX .edge{fill:none;}#mermaid-svg-6a9jMRSjbQAoORIX .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-6a9jMRSjbQAoORIX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Agent 三要素
大脑
大模型
手
工具调用
决策循环
思考
行动
观察
- 大脑(大模型):负责理解任务、做决策、生成回答。它是 Agent 的"思考核心"。
- 手(工具 Tools) :Agent 能调用的外部能力------查天气的函数、发邮件的 API、检索知识库的工具。没有工具的 Agent 只是"嘴强王者"。
- 决策循环(Decision Loop):Agent 不是一次就能完成任务,而是"思考 → 行动 → 观察结果 → 再思考"地循环,直到完成。这是 Agent 区别于普通"一问一答"的关键。
三、Function Calling:大模型怎么"动手"
Agent 能"调工具",靠的是一个叫 Function Calling(函数调用) 的机制。理解它,就理解了 Agent 的根基。
3.1 大模型本身不能执行函数
大模型只能"生成文字",它不能真的去联网、查数据库、执行代码。那它怎么"调工具"?答案是:大模型负责"说要调哪个工具、传什么参数",由你的应用去真正执行,再把结果喂回给大模型。
3.2 工具是怎么定义的
你要先告诉大模型"我有哪些工具可用",用结构化的描述:
python
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询某个城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称,如 北京"}
},
"required": ["city"] # 必填参数
}
}
}]
这段代码就相当于给了大模型一份"工具说明书":有一个叫 get_weather 的工具,作用是查天气,需要传一个 city 参数。
3.3 调用的完整流程
工具函数 你的应用 大模型 工具函数 你的应用 大模型 #mermaid-svg-IX1NdXQewSO4eaqZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IX1NdXQewSO4eaqZ .error-icon{fill:#552222;}#mermaid-svg-IX1NdXQewSO4eaqZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IX1NdXQewSO4eaqZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IX1NdXQewSO4eaqZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IX1NdXQewSO4eaqZ .marker.cross{stroke:#333333;}#mermaid-svg-IX1NdXQewSO4eaqZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IX1NdXQewSO4eaqZ p{margin:0;}#mermaid-svg-IX1NdXQewSO4eaqZ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IX1NdXQewSO4eaqZ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-IX1NdXQewSO4eaqZ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IX1NdXQewSO4eaqZ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-IX1NdXQewSO4eaqZ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-IX1NdXQewSO4eaqZ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-IX1NdXQewSO4eaqZ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-IX1NdXQewSO4eaqZ .sequenceNumber{fill:white;}#mermaid-svg-IX1NdXQewSO4eaqZ #sequencenumber{fill:#333;}#mermaid-svg-IX1NdXQewSO4eaqZ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-IX1NdXQewSO4eaqZ .messageText{fill:#333;stroke:none;}#mermaid-svg-IX1NdXQewSO4eaqZ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IX1NdXQewSO4eaqZ .labelText,#mermaid-svg-IX1NdXQewSO4eaqZ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-IX1NdXQewSO4eaqZ .loopText,#mermaid-svg-IX1NdXQewSO4eaqZ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-IX1NdXQewSO4eaqZ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IX1NdXQewSO4eaqZ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-IX1NdXQewSO4eaqZ .noteText,#mermaid-svg-IX1NdXQewSO4eaqZ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-IX1NdXQewSO4eaqZ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IX1NdXQewSO4eaqZ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IX1NdXQewSO4eaqZ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IX1NdXQewSO4eaqZ .actorPopupMenu{position:absolute;}#mermaid-svg-IX1NdXQewSO4eaqZ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-IX1NdXQewSO4eaqZ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IX1NdXQewSO4eaqZ .actor-man circle,#mermaid-svg-IX1NdXQewSO4eaqZ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-IX1NdXQewSO4eaqZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户问题我要调 get_weather 北京执行 get_weather 北京返回 25度 晴把结果喂回最终回答
关键点:大模型输出的不是最终答案,而是一个"函数调用请求"(函数名 + 参数),你的应用去执行,把结果作为"工具消息"喂回给大模型,大模型再生成最终答案。
四、ReAct:Agent 的决策循环(灵魂)
Function Calling 只解决"调一次工具",但真实任务往往要多步 。比如"帮我查北京和上海的天气,告诉我哪个更适合周末出游"------要调两次天气工具,再比较判断。这就需要决策循环。
ReAct(Reason + Act,推理 + 行动) 是目前最主流的 Agent 循环范式,它让大模型按"思考 → 行动 → 观察"循环推进:
#mermaid-svg-zvILyAyfJyoz0tIm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zvILyAyfJyoz0tIm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zvILyAyfJyoz0tIm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zvILyAyfJyoz0tIm .error-icon{fill:#552222;}#mermaid-svg-zvILyAyfJyoz0tIm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zvILyAyfJyoz0tIm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zvILyAyfJyoz0tIm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zvILyAyfJyoz0tIm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zvILyAyfJyoz0tIm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zvILyAyfJyoz0tIm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zvILyAyfJyoz0tIm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zvILyAyfJyoz0tIm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zvILyAyfJyoz0tIm .marker.cross{stroke:#333333;}#mermaid-svg-zvILyAyfJyoz0tIm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zvILyAyfJyoz0tIm p{margin:0;}#mermaid-svg-zvILyAyfJyoz0tIm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zvILyAyfJyoz0tIm .cluster-label text{fill:#333;}#mermaid-svg-zvILyAyfJyoz0tIm .cluster-label span{color:#333;}#mermaid-svg-zvILyAyfJyoz0tIm .cluster-label span p{background-color:transparent;}#mermaid-svg-zvILyAyfJyoz0tIm .label text,#mermaid-svg-zvILyAyfJyoz0tIm span{fill:#333;color:#333;}#mermaid-svg-zvILyAyfJyoz0tIm .node rect,#mermaid-svg-zvILyAyfJyoz0tIm .node circle,#mermaid-svg-zvILyAyfJyoz0tIm .node ellipse,#mermaid-svg-zvILyAyfJyoz0tIm .node polygon,#mermaid-svg-zvILyAyfJyoz0tIm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zvILyAyfJyoz0tIm .rough-node .label text,#mermaid-svg-zvILyAyfJyoz0tIm .node .label text,#mermaid-svg-zvILyAyfJyoz0tIm .image-shape .label,#mermaid-svg-zvILyAyfJyoz0tIm .icon-shape .label{text-anchor:middle;}#mermaid-svg-zvILyAyfJyoz0tIm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zvILyAyfJyoz0tIm .rough-node .label,#mermaid-svg-zvILyAyfJyoz0tIm .node .label,#mermaid-svg-zvILyAyfJyoz0tIm .image-shape .label,#mermaid-svg-zvILyAyfJyoz0tIm .icon-shape .label{text-align:center;}#mermaid-svg-zvILyAyfJyoz0tIm .node.clickable{cursor:pointer;}#mermaid-svg-zvILyAyfJyoz0tIm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zvILyAyfJyoz0tIm .arrowheadPath{fill:#333333;}#mermaid-svg-zvILyAyfJyoz0tIm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zvILyAyfJyoz0tIm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zvILyAyfJyoz0tIm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zvILyAyfJyoz0tIm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zvILyAyfJyoz0tIm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zvILyAyfJyoz0tIm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zvILyAyfJyoz0tIm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zvILyAyfJyoz0tIm .cluster text{fill:#333;}#mermaid-svg-zvILyAyfJyoz0tIm .cluster span{color:#333;}#mermaid-svg-zvILyAyfJyoz0tIm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zvILyAyfJyoz0tIm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zvILyAyfJyoz0tIm rect.text{fill:none;stroke-width:0;}#mermaid-svg-zvILyAyfJyoz0tIm .icon-shape,#mermaid-svg-zvILyAyfJyoz0tIm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zvILyAyfJyoz0tIm .icon-shape p,#mermaid-svg-zvILyAyfJyoz0tIm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zvILyAyfJyoz0tIm .icon-shape .label rect,#mermaid-svg-zvILyAyfJyoz0tIm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zvILyAyfJyoz0tIm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zvILyAyfJyoz0tIm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zvILyAyfJyoz0tIm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-zvILyAyfJyoz0tIm .blue>*{fill:#4E79A7!important;color:#fff!important;stroke:none!important;}#mermaid-svg-zvILyAyfJyoz0tIm .blue span{fill:#4E79A7!important;color:#fff!important;stroke:none!important;}#mermaid-svg-zvILyAyfJyoz0tIm .blue tspan{fill:#fff!important;}#mermaid-svg-zvILyAyfJyoz0tIm .orange>*{fill:#F28E2B!important;color:#fff!important;stroke:none!important;}#mermaid-svg-zvILyAyfJyoz0tIm .orange span{fill:#F28E2B!important;color:#fff!important;stroke:none!important;}#mermaid-svg-zvILyAyfJyoz0tIm .orange tspan{fill:#fff!important;}#mermaid-svg-zvILyAyfJyoz0tIm .green>*{fill:#59A14F!important;color:#fff!important;stroke:none!important;}#mermaid-svg-zvILyAyfJyoz0tIm .green span{fill:#59A14F!important;color:#fff!important;stroke:none!important;}#mermaid-svg-zvILyAyfJyoz0tIm .green tspan{fill:#fff!important;} 不能
能
思考 Thought
行动 Action 调工具
观察 Observation 看结果
能回答了吗
最终回答
- Thought(思考):我该做什么?先查哪个?
- Action(行动):调用某个工具,传某个参数;
- Observation(观察):工具返回了什么?这个结果够不够回答?
- 循环,直到能给出 Final Answer(最终答案)。
ReAct 的价值:它把"完成一个任务"拆成"一系列可追溯的步骤",每一步都基于上一步的结果做决定------这就是 Agent 能做复杂任务的原因。
五、一个最小 Agent 的完整实现
把 Function Calling + ReAct 循环串起来,写一个最小 Agent:
python
def get_weather(city: str) -> str:
"""工具:查天气(真实项目里调天气 API)"""
return f"{city}今天 25 度,晴"
def get_news(topic: str) -> str:
"""工具:查新闻"""
return f"关于 {topic} 的最新新闻:..."
# 工具注册表:函数名 -> 函数
TOOL_MAP = {"get_weather": get_weather, "get_news": get_news}
def run_agent(user_question: str, max_steps: int = 5):
messages = [{"role": "user", "content": user_question}]
for step in range(max_steps): # 最多循环 max_steps 次
resp = call_llm(messages, tools=tools) # 问大模型
if resp.has_tool_call: # 大模型要调工具
name = resp.tool_call.name
args = resp.tool_call.arguments
result = TOOL_MAP[name](**args) # 应用真正执行工具
messages.append({"role": "tool", "content": result}) # 结果喂回
else:
return resp.content # 大模型直接给最终答案
return "任务太复杂,超出最大步数" # 防止无限循环
逐行讲清三个关键点:
TOOL_MAP:把"工具名"映射到"真实函数"。大模型只说名字,你的应用负责执行------大模型永远碰不到真实工具(安全边界)。for step in range(max_steps):ReAct 循环,最多跑max_steps步------必须有上限,否则模型可能无限循环。has_tool_call判断:大模型每次返回后,检查它是"要调工具"还是"要给答案",据此决定继续循环还是返回。
六、多工具编排:工具描述怎么写
真实 Agent 往往有十几个工具,这时"工具描述写得好不好"直接决定 Agent 调得准不准。三个原则:
python
# ✅ 好的工具描述:具体、有例子、说清参数
{
"name": "search_knowledge_base",
"description": "在公司的产品知识库里检索文档。当用户询问产品功能、价格、使用方法时使用此工具。",
"parameters": {
"query": {"type": "string", "description": "检索关键词,如 产品报价"}
}
}
# ❌ 差的工具描述:太笼统,模型不知道该什么时候用
{
"name": "search",
"description": "搜索", # 模型根本不知道该不该用它
}
三个原则:
- 说清"什么时候用":描述里写"当用户询问 X 时使用",帮模型做选择;
- 参数要具体:每个参数写清含义 + 例子;
- 功能要单一:一个工具干一件事,别塞一堆功能(模型容易调错)。
工具描述本质是"给大模型看的说明书",写得好不好,就是"好 Agent"和"瞎调一通"的差别。
七、Agent 的常见坑
| 坑 | 原因 | 解决方案 |
|---|---|---|
| 幻觉调错工具 | 工具描述太笼统,模型误判 | 工具描述写清"什么时候用" + 参数例子 |
| 无限循环 | 没设最大步数,模型反复调工具 | max_steps 上限 + 超限终止 |
| 上下文爆炸 | 每次工具结果都塞进 messages,越滚越长 | 只保留关键信息,或做上下文压缩 |
| 工具执行失败不处理 | 工具报错直接崩 | 把错误信息喂回模型,让它换策略 |
| 传错参数类型 | 模型输出参数格式不对 | 用 JSON schema 约束参数 + 校验 |
八、Agent vs RAG:什么时候用哪个
| RAG | Agent | |
|---|---|---|
| 解决什么 | 大模型不知道你的私有知识 | 大模型不会动手做事 |
| 加什么能力 | 知识(检索) | 行动(调工具) |
| 适合任务 | 知识问答、文档咨询 | 多步任务、需调外部工具 |
| 复杂度 | 较低 | 较高 |
判断标准 :如果任务"查了资料就能答"→ 用 RAG;如果任务"需要动手做"(查天气、发邮件、跑代码、多步推理)→ 用 Agent。最强大的应用是两者结合:Agent 的决策循环里,把 RAG 检索当成一个工具来用------既会查知识,又会调其他工具做事。
总结:一张图带走
这课的核心,一句话串起来:
- RAG 会答,Agent 会做:RAG 加"知识",Agent 加"行动能力"。
- Agent 三要素:大脑(大模型)+ 手(工具)+ 决策循环(ReAct)。
- Function Calling 是根基:大模型"说要调哪个工具",应用执行,结果喂回------大模型永远碰不到真实工具。
- ReAct 是灵魂:思考 → 行动 → 观察,循环直到完成,所以 Agent 能做多步复杂任务。
- 好 Agent 的关键 :工具描述写清"什么时候用" +
max_steps防无限循环 + 错误结果喂回模型。 - 最强形态是 RAG + Agent 结合 :把检索当成一个工具,既会查又会做。

三个立即可用的行动:
- 用第五节的
run_agent骨架,加一个你自己的工具(比如"算数计算器"函数),跑通一个最小 Agent; - 故意不设
max_steps,看模型会不会无限循环,再设上上限体会差别; - 给 Agent 加第二个工具,观察模型能不能根据问题"自己选对工具",如果选错,回头改工具描述。
如果这篇对你有帮助,点个赞、收藏一下 ,下一篇我们讲 大模型评测------怎么量化"这个模型/这套 prompt 到底好不好"。
关注我,我会持续更新 AI 应用开发的前沿实战,陪你从 RAG 到 Agent 一路进阶。
你在开发 Agent 时踩过什么坑?是模型反复调错工具,还是陷入了无限循环?评论区聊聊你的实战经验,我挨个回。
(本文 Agent 方案基于 Function Calling + ReAct 的通用范式,具体框架可选 OpenAI SDK / LangChain / 自研,模型与 API 随版本变化,评论区提醒我。)