本文以工单分析Agent原型实践为例,详细梳理AI Agent从最小闭环到工程化落地的关键环节,包括Tool Calling实现模型与工具的交互、LangChain封装业务能力、工作流编排确保流程可控、RAG知识库增强回答事实依据以及Eval评估体系验证效果。文章强调Agent工程化核心在于将模型置于可控系统中,而非单纯编写Prompt,并提供了原生代码与LangChain的对比分析、流程层设计要点、RAG实施注意事项及评估方法,帮助开发者理解如何构建稳定可靠的智能Agent。

大模型 Demo 很容易跑通,但真正进入业务系统后,难点会迅速从“模型会不会回答”变成“流程是否可控、结果是否可信、效果是否可评估”。
本文以一个工单分析 Agent 的原型实践为例,梳理 AI Agent 从最小闭环到工程化落地的几个关键环节:Tool Calling、LangChain 封装、工作流编排、RAG 知识库和 Eval 评估。
一、为什么 Agent 不只是 Prompt
很多 AI 应用的第一版 Demo 都是从 Prompt 开始的:用户输入问题,模型直接返回答案。这种方式适合验证想法,但一旦进入真实业务场景,就会遇到几个典型问题:
- 模型无法直接访问实时业务数据,例如账号状态、订单状态、历史工单。
- 模型回答可能缺少事实来源,用户很难判断是否可信。
- 业务流程里存在高风险操作,不能让模型自由执行。
- 团队需要持续迭代 Prompt 和工具,但缺少稳定的评估手段。
因此,Agent 工程化的核心不是“写一个更长的 Prompt”,而是把模型放进一个可控系统里。
以“账号到期后无法登录”这类问题为例,如果直接把问题丢给大模型,模型可能给出一个看似合理的通用建议,但它无法知道学校订单是否真的到期、账号是否被禁用、登录失败日志是什么原因,也不知道当前用户是否有权限查看这些数据。
这类场景的正确做法是把 Agent 拆成多个可验证环节:先识别问题类型,再通过受控工具查询真实数据,必要时检索 SOP 文档,最后基于事实生成回复。如果中间任何一步失败,最终回答也必须把失败点说清楚,而不是继续编造结论。
二、整体架构:把 Agent 拆成四层
为了避免 Agent 变成一个难以维护的“大 Prompt”,我们将系统拆成四层:模型层、工具层、流程层和评估层。每一层只承担一类职责。
Agent 工程化分层

| 层次 | 主要职责 | 典型问题 |
| 模型层 | 理解用户意图、决定是否调用工具、生成解释和回复。 | Prompt 约束不足、输出格式不稳定、误读上下文。 |
| 工具层 | 封装学校查询、账号查询、订单查询、知识库检索等业务能力。 | 参数错误、权限越界、工具失败后模型继续编造。 |
| 流程层 | 控制主流程、条件分支、人工确认、结束条件和状态传递。 | 模型无限循环、高风险操作缺少审批、流程不可回放。 |
| 评估层 | 用测试集、trace 和指标验证 Agent 是否稳定。 | 改 Prompt 后效果退化但没人发现,线上问题难定位。 |
这个拆分的好处是,每一层都可以单独替换和演进。例如第一版知识库检索可以只是本地 Markdown + 词频向量,后续再替换为 embedding + 向量数据库;第一版流程可以用固定 DAG,后续再加入人机协同和长任务恢复。
三、Agent 的最小闭环:Tool Calling
Agent 的基础能力是 Tool Calling。模型不直接执行函数,而是输出一个结构化的工具调用请求。业务程序解析请求,执行真实工具,再把工具结果作为上下文传回模型。
这里最容易误解的一点是:大模型不是一次性直接给出最终结果。在需要外部事实的场景里,代码要先把“可用工具列表”随同用户问题一起提交给模型。模型看到工具名称、工具描述和参数 Schema 后,才会决定是否生成一个 function call。随后,代码根据 function call 调用本地函数或业务接口,再把工具执行结果提交回模型。模型拿到工具结果后,才继续判断下一步或生成最终回答。
Tool Calling 不是一次请求,而是多轮交互

第一轮请求里,除了用户问题,还会包含工具描述。工具描述大致是这样的:
{
"type":"function",
"function":{
"name":"search_school",
"description":"按学校名称搜索学校,返回 school_id、tenant_id、学校状态。",
"parameters":{
"type":"object",
"properties":{
"keyword":{
"type":"string",
"description":"学校名称或关键词"
}
},
"required":["keyword"]
}
}
}
以工单分析为例,用户问:
杭州未来学校老师反馈账号到期后不能登录,帮我看看原因。
模型看到用户问题和可用工具后,可能不会直接回答,而是先返回一个 tool_call:
{
"role":"assistant",
"tool_calls":[
{
"id":"call_001",
"type":"function",
"function":{
"name":"search_school",
"arguments":"{/"keyword/":/"杭州未来学校/"}"
}
}
]
}
这一步只是模型在“请求调用工具”。它并没有真的查数据库,也没有真的访问业务接口。真正执行的是我们的代码:
result := searchSchool({"keyword": "杭州未来学校"})
代码执行工具后,要把结果作为 tool 消息继续提交给模型:
{
"role": "tool",
"tool_call_id": "call_001",
"content": "{/"ok/":true,/"data/":{/"school_id/":/"sch_1001/"}}"
}
模型拿到学校信息后,可能继续生成下一次 tool call,例如查询账号状态或订单状态:
{
"role":"assistant",
"tool_calls":[
{
"id":"call_002",
"type":"function",
"function":{
"name":"get_account_status",
"arguments":"{/"tenant_id/":/"tenant_hz_future/",/"user_type/":/"teacher/"}"
}
}
]
}
工单分析中的多轮工具调用

这就是 Agent 和普通聊天最大的区别:普通聊天通常是“一问一答”,而 Tool Calling 是“模型提出工具调用意图,代码执行工具,再把结果交还给模型”的多轮协作。
for step := 0; step < maxSteps; step++ {
resp := callModel(messages, tools)
if noToolCall(resp) {
return finalAnswer(resp)
}
for _, call := range toolCalls(resp) {
result := executeTool(call)
messages = append(messages, toolMessage(result))
}
}
这里有两个工程细节非常重要。第一,需要设置最大循环次数,防止模型反复调用工具。第二,工具的参数和结果必须结构化,便于校验、记录和回放。
工具设计的几个约束
- 工具名要表达业务含义。例如 get_order_status 比 query 更容易被模型正确选择。
- 参数要少而明确。优先使用 tenant_id、school_id、user_id 这类可校验字段。
- 返回值要结构化。建议统一成 { ok, data, error },而不是一段自由文本。
- 失败要显式返回。工具超时、权限不足、数据不存在都应该返回明确错误,让模型在最终回答中说明。
工具层还应该承担权限控制,而不是把安全约束写在 Prompt 里。Prompt 可以告诉模型“不要越权”,但真正的租户隔离、字段脱敏、写操作审批必须在后端代码中执行。
ChatModel 的三种常见调用方式
不管是原生 SDK 还是 LangChain,ChatModel 常见的调用方式可以概括为 invoke、stream 和 batch。
| 方式 | 含义 | 适用场景 |
| invoke | 单次调用。输入一组 messages,等待模型完整返回一个结果。 | 普通问答、工具调用中的每一轮模型判断、后台任务。 |
| stream | 流式调用。模型边生成边返回 token 或事件。 | 聊天界面、长文本生成、需要用户实时看到输出的场景。 |
| batch | 批量调用。一次提交多个输入,批量获得多个结果。 | 离线评估、批量总结、批量打标签、批量生成测试数据。 |
在 Agent 场景里,最常用的是 invoke:每一轮把当前 messages 和 tools 发给模型,拿到 tool call 或最终回答。面向用户的聊天产品通常会把最终回答阶段改成 stream,让用户看到逐字输出。做 Eval 或离线数据处理时,则更适合使用 batch。
四、原生代码与 LangChain 的取舍
在理解 Tool Calling 的底层链路后,一个自然的问题是:既然原生代码已经能完成工具调用循环,为什么还要引入 LangChain?
我们的实践路径是先用原生代码把 Agent 最小闭环跑通,再用 LangChain 对比同样的能力。这样做的好处是,团队不会把框架当成黑盒;即使用了 LangChain,也能理解其内部大致在维护 messages、暴露 tools、解析 tool calls、执行工具并把结果传回模型。
原生 Tool Calling 与 LangChain Agent 的关系

原生代码适合什么
原生代码最大的优势是透明和可控。对于团队早期理解 Agent 机制、排查 tool calling 行为、对接特定模型 API、实现自定义日志和权限校验,原生代码更直接。
messages := []Message{
{Role: "system", Content: instructions},
{Role: "user", Content: question},
}
resp := callModel(messages, tools)
for _, call := range resp.ToolCalls {
result := registry.Call(call.Name, call.Arguments)
messages = append(messages, ToolMessage(call.ID, result))
}
这类写法虽然代码量更多,但每一步都清楚:模型返回了什么、工具怎么执行、结果如何回传、最大循环次数在哪里控制、错误怎么处理。
LangChain 适合什么
LangChain 的优势是抽象统一,适合快速把模型、工具和 Agent 组合起来。以 Python 为例,一个工具可以通过 @tool 暴露给 Agent:
@tool
def get_order_status(tenant_id: str) -> dict:
"""按 tenant_id 查询学校最近订单、到期时间和续费状态。"""
return ORDERS.get(tenant_id, {})
agent = create_agent(
model=model,
tools=[search_school, get_account_status, get_order_status],
system_prompt="你是一个工单分析 Agent,必须先查询事实再回答。"
)
这段代码背后,LangChain 会负责把工具描述交给模型、接收 tool call、调用对应工具并把工具结果写回消息上下文。相比原生实现,它减少了大量重复编排代码。
| 维度 | 原生代码 | LangChain |
| 透明度 | 最高,所有 messages 和 tool call 都自己维护。 | 较高,但部分循环逻辑由框架封装。 |
| 开发效率 | 前期代码量更大。 | 更适合快速验证 Agent + Tool。 |
| 定制能力 | 非常强,适合特殊模型协议和复杂审计。 | 常规场景足够,复杂场景需要深入框架扩展点。 |
| 学习价值 | 适合理解 Agent 本质。 | 适合工程组合和生态集成。 |
五、从自由决策到可控流程:LangGraph
Tool Calling 解决了“模型如何调用外部能力”的问题,但真实业务流程通常不适合完全交给模型自由决策。
例如一个账号登录问题,比较稳妥的流程是固定的:
工单分析工作流

LangGraph 可以把这类流程显式建模成有向状态图。节点是处理步骤,边是流转关系,状态在各节点之间传递。
graph.add_node("search_school", search_school)
graph.add_node("check_account", check_account)
graph.add_node("judge_risk", judge_risk)
graph.add_edge("search_school", "check_account")
graph.add_conditional_edges(
"judge_risk",
route_after_risk,
{
"human_confirm": "human_confirm",
"generate_reply": "generate_reply",
},
)
Agent 工具调用循环

对生产系统来说,LangGraph 的价值在于可控:每一步做什么、什么条件下进入人工确认、什么情况下自动回复,都可以清晰表达和测试。
这里还有一个容易被忽略的点:LangGraph 里的 State 不只是中间变量,它也是 Agent 的执行证据。一次完整运行后,我们可以从 State 里看到问题是什么、查到了哪所学校、账号状态是什么、订单是否到期、风险判断为什么进入人工确认。这为后续的日志、审计和 Eval 提供了基础。
什么时候用普通 Agent,什么时候用 LangGraph?
如果任务只是简单问答或一两次工具调用,普通 Agent 足够。如果流程里存在固定业务步骤、条件分支、高风险确认、长任务恢复或可审计要求,LangGraph 更合适。
| 场景 | 推荐方式 |
| 临时问答、简单工具调用 | LangChain Agent |
| 工单流转、审批流、学习课程流程 | LangGraph |
| 需要人工确认或可恢复任务 | LangGraph + Checkpoint |
六、让回答基于事实:RAG 知识库
即使 Agent 能调用工具,也不能让模型凭空解释业务规则。企业里大量知识存在于 SOP、FAQ、产品文档和历史方案里,这些内容更适合通过 RAG 检索后注入上下文。
在完整的工单分析 Agent 中,LangGraph 更像主流程控制器,RAG 是其中一个知识检索节点,Tool Calling 则负责把模型和外部系统连接起来。
LangGraph + RAG + Tool Calling 的整合流程

这样看会更清楚:LangGraph 不替代 RAG,也不替代工具调用。它负责决定“下一步走哪个节点”;RAG 负责补充业务知识;工具负责查询实时业务数据;模型负责理解问题、选择动作并组织最终表达。
RAG 的核心可以概括为:先检索,再回答。
RAG 基本链路

例如用户问:
老师账号到期后不能登录,客服应该怎么处理?
系统应先召回类似内容:
[chunk_002] 账号到期与登录问题 SOP / 排查步骤
1. **查询账号状态,确认账号是否有效、是否超过权益有效期。**
2. **查询学校最近订单,确认订单是否已续费、是否已到期。**
3. **查询登录失败日志,确认失败原因是否为 account_expired。**
然后模型基于这些上下文回答,而不是依赖模型记忆或自由发挥。回答中还需要带引用来源,方便排查和复核。
第一版 RAG 不一定马上引入复杂向量数据库。我们可以先用 Markdown 文档、本地切片和轻量检索跑通闭环;后续再替换成 embedding、pgvector、Qdrant、Milvus 或 rerank。
RAG 工程里最容易踩的坑
RAG 的难点不在于“能不能搜出几段文本”,而在于检索结果是否真的能支撑回答。实际项目中常见问题包括:
- Chunk 切分不合理。切得太大,噪音多;切得太小,关键上下文断掉。
- 召回结果看似相关但缺少关键事实。例如只召回“账号无法登录”,却没有召回“订单到期”和“临时试用流程”。
- 模型没有严格基于上下文回答。即使检索结果不足,模型也可能补充自己的猜测。
- 权限过滤缺失。不同租户或角色不应该看到同一批知识片段。
因此,RAG 的 Prompt 需要明确约束:“只能基于上下文回答;上下文不足时说明缺少什么信息;最终回答必须带引用来源。” 同时,检索阶段也要记录 query、chunk_id、score 和 source,方便定位问题。
七、让效果可验证:Eval 测试集
Agent 工程化最容易被忽略的一点是评估。很多 Demo 的验证方式是“人工看一眼回答还不错”,但这无法支撑持续迭代。
我们把典型问题沉淀成 Eval Case,用来检查检索、工具调用和最终回答是否符合预期。
{
"id": "account_expired_login",
"question": "老师账号到期后不能登录,客服应该怎么处理?",
"expected_sources": ["account_login_sop.md"],
"expected_keywords": ["订单", "登录失败日志", "临时试用"]
}
第一版可以从几个简单维度开始:
| 评估对象 | 检查项 |
| RAG 检索 | 是否召回正确文档,召回片段是否包含关键事实。 |
| Tool Calling | 是否调用正确工具,工具参数是否符合预期。 |
| Workflow | 是否进入正确分支,例如高风险进入人工确认。 |
| 最终回答 | 是否包含结论、证据、处理建议和引用来源。 |
Eval 的价值不仅是给出通过率,更重要的是定位问题。Agent 回答错误可能来自检索错误、工具参数错误、业务数据错误、流程分支错误,也可能只是模型生成时误读上下文。没有 trace 和 Eval,很难判断该改 Prompt、改工具,还是改业务规则。
Eval 结果如何反哺优化?
可以,但不建议理解成“把正负面结果直接丢给大模型,模型以后就自动变好”。更稳妥的方式是把 Eval 结果沉淀成可复用的优化资产。
从评估到优化的闭环

| Eval 结果 | 更适合怎么用 |
| 正样本 | 沉淀成 few-shot 示例、标准答案、回归测试集,用来约束后续版本不要退化。 |
| 负样本 | 先归因:是检索没召回、工具参数错、流程分支错,还是回答格式不合格,再针对性修复。 |
| 高质量人工修正 | 可以作为监督微调、偏好优化或模型评审标准的候选数据,但要经过脱敏、去重和质量审核。 |
对多数业务 Agent 来说,优先级通常是:先用负样本修检索、工具和流程,再把稳定正样本加入回归测试;只有当样本规模、质量和合规都足够时,再考虑微调或偏好优化。
在实践中,我们可以把 Eval 分成三类:
- 规则型 Eval:检查是否召回指定文档、是否包含关键字、是否进入正确分支。稳定、便宜,适合 CI。
- 模型型 Eval:让另一个模型判断回答是否符合标准。覆盖面更广,但成本和稳定性要控制。
- 人工抽检:对高风险场景保留人工复核,尤其是新功能上线初期。
- 线上指标:观察任务完成率、人工接管率、用户追问率、工具失败率和平均成本。
八、可观测性与安全治理
Agent 的一次回答并不是单次模型调用,而是一串动作:输入理解、检索、工具调用、分支判断、最终生成。要想线上可排查,就必须记录完整 trace。
{
"trace_id": "trace_20260515_001",
"user_id": "u_1001",
"question": "账号到期不能登录怎么处理?",
"retrieval": [
{"chunk_id": "chunk_002", "source": "account_login_sop.md", "score": 0.2899}
],
"tool_calls": [
{"name": "get_order_status", "args": {"tenant_id": "tenant_hz_future"}, "ok": true}
],
"route": "human_confirm",
"final_answer": "该问题涉及订单到期,需要人工确认是否开通临时试用。"
}
有了 trace,排查问题时就可以沿着链路定位:是知识库没召回、工具参数错了、订单服务返回异常,还是模型生成阶段误读了上下文。
安全治理不应该只靠 Prompt
Prompt 可以表达规则,但不能作为唯一安全边界。生产系统需要在工具层和流程层做硬约束:
- 工具白名单:模型只能调用注册过的工具。
- 参数校验:对 school_id、tenant_id、user_id 做格式和权限检查。
- 字段脱敏:手机号、邮箱、订单金额等敏感字段按场景脱敏。
- 写操作确认:修改账号有效期、关闭工单、发送正式通知等操作必须人工确认。
- 成本上限:限制单次请求最大工具轮数、最大 token 和最大耗时。
- 任务完成率:衡量 Agent 是否真的解决问题。
- 工具成功率:衡量外部能力是否稳定可用。
- 人工接管率:衡量高风险或低置信度任务占比。
- 引用命中率:衡量 RAG 回答是否有可靠来源。
- 平均延迟:衡量多轮工具调用后的用户体验。
- 单次成本:衡量 token、检索和工具调用成本。
九、工程化原则与后续演进
经过 Tool Calling、LangGraph、RAG 和 Eval 的拆解后,一个可落地 Agent 系统大致可以分成四层:
- 模型层:负责理解问题、生成 tool call、总结答案和产出自然语言。
- 工具层:封装业务能力,负责参数校验、权限控制、错误处理和审计。
- 流程层:用工作流控制主路径、条件分支、人工确认和任务状态。
- 评估层:用测试集、trace 和指标证明 Agent 是否稳定可用。
几个实践原则
- 不要让模型直接操作高风险业务数据。
- 重要业务流程优先用 Workflow 控制,而不是完全交给模型自由发挥。
- 工具调用必须结构化,必须有错误处理和审计日志。
- RAG 回答要有引用来源,检索不到时要明确说明不足。
- 没有 Eval 的 Agent 很难持续迭代。
后续演进方向
- 把本地检索升级为 embedding + 向量数据库。
- 增加 BM25 + 向量混合检索和 rerank。
- 把知识库检索封装成 Agent Tool。
- 增加 trace,记录每次 query、chunk、score、tool call 和最终回答。
- 把 Eval 接入 CI,在 Prompt 或工具变更后自动跑回归测试。
Agent 的价值不在于“让模型看起来更聪明”,而在于把模型能力稳定地接入真实业务流程。真正可上线的 Agent,往往不是最自由的 Agent,而是边界清晰、流程可控、结果可追溯、效果可评估的 Agent。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包:
- ✅ 从零到一的 AI 学习路径图
- ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
- ✅ 百度/阿里专家闭门录播课
- ✅ 大模型当下最新行业报告
- ✅ 真实大厂面试真题
- ✅ 2026 最新岗位需求图谱
所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》,下方扫码获取~

① 全套AI大模型应用开发视频教程
(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)

② 大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

③ 大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

④ AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

⑤ 大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

⑥ 大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

以上资料如何领取?

为什么大家都在学大模型?
最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

不出1年,“有AI项目经验”将成为投递简历的门槛。
风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!


这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


以上全套大模型资料如何领取?

360

被折叠的 条评论
为什么被折叠?



