别拿 Demo 当终点:大模型工程师的路线,得按生产标准重画
这篇按“先跑起来、再讲取舍”的逻辑回应《岗位变化这么快程序员职业规划真正该补的是什么》。概念点到为止重点放在代码怎么组织、哪里容易踩坑。摘要看完这篇文章你应该能判断这件事值不值得做以及从哪里动手。 最近帮团队审了一个 Agent 项目模型调用没问题RAG 召回也还行但上线前被产品和技术一起拦下没有权限隔离、日志打点缺失、异常分支不可追踪。这其实暴露了当前大模型岗位的真实变化。本文不聊模型有多强只聊程序员该怎么重新设计学习路线才能从“能跑 Demo”跨过“能交付生产”。目录一次需求评审怎么把“大模型热”浇灭了一半岗位趋势企业不再为 Demo 买单能力分层Prompt 只是入场券短期学习计划先把可观测性做进去中期项目沉淀简历上怎么写才算数长期竞争力知道什么时候不该用模型总结一次需求评审怎么把“大模型热”浇灭了一半上周三的需求评审吵得最凶的不是模型选哪个也不是 RAG 召回率而是权限。一个同事带着他花了两周做的内部知识助手上场。演示环节确实丝滑用户问问题系统先查向量库再组装回复最后还能调内部接口查工单状态。大家刚准备点头后端负责人问了三个问题A 用户能不能看到 B 部门的文档Agent 调外部接口时用的是服务账号还是当前登录用户身份如果模型在中间触发死循环谁收到告警日志存哪里现场安静了几秒。这不是挑刺是生产环境的生存问题。Demo 阶段大家看的是“能不能跑通”一旦要上线问的就是“跑不通怎么办”“谁能用”“出了事怎么追责”。这两个阶段之间隔着一整套工程习惯。很多程序员焦虑的来源恰恰是以为自己已经把大模型“学会了”结果发现企业真正在招的人要的是能把这些东西安全送进生产的人。岗位趋势企业不再为 Demo 买单过去半年我看过不少大模型方向的招聘 JD变化非常明确。早期写着“精通 Prompt 工程、熟悉 LangChain/LangGraph”现在后面往往跟着“具备可观测性设计经验、熟悉权限隔离与审计、有生产环境故障排查能力”。这不是 HR 在堆关键词是甲方真的被 Demo 伤过。企业采购的模型服务越来越贵Token 成本、数据泄露风险、幻觉引发的业务错误都是真金白银。一个能回答问题的聊天机器人如果不能控制调用范围、不能追踪每次决策的依据、不能在超时时优雅降级它就不是系统是个玩具。所以岗位重心正在从“模型怎么调”转向“系统怎么管”。面试里开始多问Token 预算怎么设重试策略是什么敏感数据怎么过滤工具调用失败怎么回滚这些问题和框架选型关系不大和工程素养关系很大。能力分层Prompt 只是入场券我把现在大模型相关的能力拆成四层方便大家对照自己的位置第一层基础调用与 Prompt 调优。能跑通官方示例能写 System Prompt能处理常见的格式问题。这块门槛已经低到几乎人人能学也是目前培训班和速成课的主战场。第二层工具调用、RAG 与工作流编排。能把模型接到数据库、API、向量检索上能用 LangGraph 或类似框架串起多步流程。这是初级岗位的主力技能也是简历上最常见的写法。第三层工程化兜底。权限校验、结构化日志、链路追踪、成本控制、降级策略、输入输出清洗。这一层枯燥但决定系统能不能上线。大多数人在这里断层。第四层边界判断与架构取舍。知道哪些问题适合上 Agent哪些用传统代码更稳知道什么时候该砍掉复杂编排回归简单管道。这是资深方向的分水岭。如果你还在第一二层打转焦虑是正常的因为供给太多。真正的职业增量在第三层往上。短期学习计划先把可观测性做进去如果你现在想调整路线我建议别急着换框架先把“生产级思维”嵌进日常练习里。接下来三十天按这个顺序走第一周强制给每次模型调用加结构化日志。记录 prompt 版本、输入长度、Token 消耗、响应时间和异常类型。不要只用print用json格式输出方便后续接入 ELK 或 Loki。第二周给所有工具调用前加上权限网关。明确“谁能调什么”“读哪些数据”“写哪些接口”。不要在 Prompt 里硬编码权限那会被绕过。第三周接一套轻量追踪。哪怕没有完整 APM也可以用一个request_id贯穿整条调用链。一次对话经过路由、检索、模型、工具、后处理每一步都要能对上号。第四周写回归测试。把核心流程的输入输出固化成用例模型版本升级或 Prompt 变更后先跑一遍再决定是否放行。下面是一段我平时用来约束工具调用的封装思路核心就三件事权限拦截、结构化日志、请求追踪。import uuid import logging from functools import wraps from typing import Callable, Any logger logging.getLogger(agent.tools) def authorized_roles(required: set[str]): 工具层面的权限网关角色不符直接拒绝不进入模型上下文 def decorator(func: Callable[..., Any]) - Callable[..., Any]: wraps(func) def wrapper(user: dict, *args, **kwargs): if not required.intersection(user.get(roles, [])): logger.warning( permission_denied, extra{user_id: user[id], tool: func.__name__}, ) raise PermissionError(frole {user[roles]} lacks access to {func.__name__}) return func(user, *args, **kwargs) return wrapper return decorator def instrumented_call(func: Callable[..., Any]) - Callable[..., Any]: 统一埋点trace_id、耗时、入参长度、异常分类 wraps(func) def wrapper(*args, **kwargs): trace_id str(uuid.uuid4()) start_time time.time() try: result func(*args, **kwargs) duration time.time() - start_time logger.info( tool_success, extra{ trace_id: trace_id, tool: func.__name__, duration_ms: duration * 1000, input_len: len(str(args[0])) if args else 0 } ) return result except Exception as e: duration time.time() - start_time logger.error( tool_error, extra{ trace_id: trace_id, tool: func.__name__, duration_ms: duration * 1000, error_type: type(e).__name__, error_msg: str(e) } ) raise return wrapper中期项目沉淀简历上怎么写才算数简历别只写“使用了 LangChain”要写“解决了什么问题”。比如“通过引入request_id链路追踪将线上 Agent 故障定位时间从平均 2 小时缩短至 15 分钟。” 或者“设计基于角色的权限网关拦截了 90% 的非授权工具调用尝试消除了潜在的数据泄露风险。”这些描述背后是你真的在第三层能力上踩过坑、填过坑。长期竞争力知道什么时候不该用模型大模型不是银弹。很多时候正则表达式比 LLM 更适合做格式提取规则引擎比 Agent 更适合做审批流。资深的工程师懂得在“智能”和“可控”之间做权衡。如果你的问题可以用确定性代码解决就别强行上模型。这不仅是为了省钱更是为了系统的稳定性和可维护性。知道什么时候不该用模型才是你区别于初级开发者的关键。总结从 Demo 到生产差的不是模型能力而是工程素养。把可观测性、权限控制和异常处理融入日常你的职业护城河才会真正建立起来。资料展示下面是我整理的AI大模型学习资料和工具包预览适合收藏后按主题逐步学习。如果你想看完整资料目录可以在评论区留言「资料」也欢迎告诉我你更关注AI大模型里的哪类内容。