面试问权限日志可观测,我才知道Demo和上线之间差了多少
聊《别急着重做程序员就业先看岗位到底在筛什么》之前先说一句实在的别急着背概念先看它在真实项目里到底解决什么问题。摘要摘要2026年的大模型岗位招聘已经过了会调API就能上岗的阶段。本文从一次真实的需求评审切入复盘企业真正在筛选什么能力——权限、日志、可观测性以及如何在简历和面试中证明你具备这些工程化思维。---目录一次需求评审把我打醒了2026年企业到底在筛什么人权限、日志、可观测性别只当知识点背简历里的项目怎么写出工程感面试怎么答才能显得你真的做过总结---一次需求评审把我打醒了去年秋天我参与了一个内部Agent项目的评审。业务方提的需求很典型做一个能自动查询数据库、生成报告、再推送到飞书的助手。Demo阶段我用了LangChain搭了个流程调了几个工具跑通以后大家鼓掌。我以为这事稳了。结果评审会上运维同学问了三个问题 你的工具调用有没有权限隔离查客户数据和查公开数据用的是同一个Token吗 Agent执行失败的时候日志能追溯到哪一步能告诉我它调了哪个模型、传了什么参数、返回了什么吗 如果这个Agent被恶意调用怎么限制它的token消耗有没有熔断机制我当场答不上来。后来这个项目拖了三个月不是因为模型调不通而是因为权限方案、日志规范和成本兜底这三个问题一直没定下来。这件事让我意识到Demo能跑和能上线中间隔着的不是技术难度而是工程化的成熟度。---2026年企业到底在筛什么人我去看了不少大模型相关岗位的描述也面了几家公司。发现一个趋势初级岗位在减少工程化能力在溢价。以前你写熟悉LangChain做过RAG项目HR会多看两眼。现在JD里开始出现这些要求了解大模型应用的权限设计和鉴权方案有日志追踪和可观测性实践经验了解Agent工具调用的边界控制和异常处理这不是企业要求变高了是市场变理性了。2023年那种会调API就能写AI应用的红利期已经结束了。我面试过一个候选人简历很漂亮GraphRAG、LangGraph、多Agent协作全部配齐。但问到你的Agent在什么情况下会无限循环调用工具他答不上来。我问另一个候选人他的项目看起来简单很多就是一个带权限控制的文档问答系统。但他说我们用RBAC控制了不同角色能访问的数据范围每个工具调用都打了结构化日志包含userid、toolname、inputhash、outputtruncated_flag方便事后审计。后者拿了offer。这不是说前者不好而是前者展示的是我会用工具后者展示的是我知道边界在哪。---权限、日志、可观测性别只当知识点背这三个东西很多教程一带而过但面试和实际工作中它们是分界线。权限别只用一个API Key跑全部我见过最省事的做法把一个API Key硬编码在代码里所有工具调用都用同一个身份。这在Demo里没问题在生产里是定时炸弹。真实的工程做法是分层# 伪代码示例工具调用的权限上下文 class ToolExecutionContext: def __init__(self, user_id: str, role: str, allowed_databases: list[str]): self.user_id user_id self.role role self.allowed_databases allowed_databases def validate_access(self, target_db: str) - bool: 工具调用前的权限校验 if target_db not in self.allowed_databases: logger.warning( fAccess denied: user{self.user_id}, frole{self.role}, target{target_db} ) raise PermissionError(fUser {self.user_id} cannot access {target_db}) return True这不是什么高深技术但很多候选人简历里完全看不到这个意识。日志结构化别只打printDemo里用print就够了。但上线以后如果Agent出了问题你要能在10秒内定位到是哪一步、传了什么、返回了什么。一个实用的日志规范import logging import json from datetime import datetime logger logging.getLogger(agent) def log_tool_call(context: ToolExecutionContext, tool_name: str, input_data: dict, output: dict, duration_ms: int): 结构化日志一条日志包含完整调用上下文 log_entry { timestamp: datetime.utcnow().isoformat(), event: tool_call, user_id: context.user_id, tool: tool_name, input_hash: hash(json.dumps(input_data, sort_keysTrue)), output_keys: list(output.keys()), output_truncated: len(json.dumps(output)) 2000, duration_ms: duration_ms, status: success if output.get(error) is None else failed } logger.info(json.dumps(log_entry, ensure_asciiFalse))可观测性成本失控比功能bug更致命Agent最容易翻车的地方不是逻辑错误是成本失控。一个循环调用工具的Agent可能几分钟就把token烧光了。import time from contextlib import contextmanager contextmanager def cost_control(max_tokens: int 10000, max_duration_sec: int 300): 成本兜底token消耗和时长双重限制 start time.time() token_count 0 try: yield {tokens: token_count, duration: 0} finally: elapsed time.time() - start if elapsed max_duration_sec: logger.error(fAgent execution exceeded time limit: {elapsed:.1f}s) raise TimeoutError(Agent execution timeout)---简历里的项目怎么写出工程感很多人写项目经历只写做了什么功能不写解决了什么工程问题。对比一下❌ 使用LangChain搭建了一个RAG问答系统支持多轮对话✅ 搭建基于LangChain的RAG问答系统实现了以下工程化能力基于RBAC的工具权限隔离区分公开数据和敏感数据访问结构化日志记录每次工具调用的输入输出摘要支持事后审计Token消耗监控和熔断机制单次对话成本控制在5元以内后者让面试官知道你不仅会调API还知道生产环境需要什么。另一个建议给项目加一个边界讨论段落。比如写本项目在以下场景存在局限当用户询问超出权限范围的数据时系统返回无权限而非数据不存在避免泄露数据存在性信息。这种表述传递了一个信号你考虑过安全边界。---面试怎么答才能显得你真的做过面试中被问到工程化问题不要背书要讲判断过程。比如被问你怎么设计Agent的权限系统可以这样回答 我之前的项目里权限设计分三层。第一层是API Key隔离不同工具用不同的Key比如读数据库用一个Key写数据库用另一个。第二层是业务层权限在工具调用前校验用户角色和目标资源的关系这个校验放在工具装饰器里不侵入业务逻辑。第三层是审计层所有调用打结构化日志包含用户ID、工具名、输入摘要和结果状态方便事后排查。 做过之后我发现最难的不是技术实现而是确定权限边界。比如一个Agent既能查订单又能查用户信息那它查订单时能不能看到用户的手机号这种问题没有标准答案取决于业务风险偏好。这种回答比我用的是RBAC有力得多。因为它展示了判断过程而不仅仅是知识点。---总结2026年找大模型相关的工作Demo能力是门槛工程化能力是区分点。权限、日志、可观测性这三个词在教程里经常出现但真正理解它们的人不多。它们不是高深技术而是工程素养的体现——你知道系统上线后可能出什么问题你知道怎么让问题可追溯你知道边界在哪里。如果你正在准备求职建议做一件事把你之前的Demo项目补上权限校验、结构化日志和成本兜底这三层。不需要做到生产级但要在简历和面试中能说出你为什么这么做、怎么做的、遇到了什么问题。这比多写两个Agent框架有用。资料展示下面是我整理的AI大模型学习资料和工具包预览适合收藏后按主题逐步学习。如果你想看完整资料目录可以在评论区留言「资料」也欢迎告诉我你更关注AI大模型里的哪类内容。