1. 这不是考你写代码,而是考你拆解“人”的工作流
字节面试官抛出“如何设计一个自动写周报的 Agent”这个问题时,眼睛根本没盯着你的 Python 语法或 LLM API 调用是否优雅。他真正想看的,是你能不能把“写周报”这件事——这个看似简单、人人会做、但没人真想干的日常事务——像外科医生解剖一样,一层层剥开它的肌肉、神经和血管。我带过三届校招生,也作为面试官参与过字节飞书、效率工程部的多轮技术面,见过太多候选人一上来就猛敲键盘:“我用 LangChain + OpenAI + SQLite 做个 RAG 系统……”,话音未落,面试官已经低头记下“缺乏问题抽象能力”。
为什么?因为周报从来不是一份文档,它是一套隐性协作契约。它表面是“我这周干了什么”,背后却承载着:向上对齐目标进度(OKR 拆解是否合理)、横向同步阻塞风险(跨团队依赖是否暴露)、向下传递工作价值(避免功劳被稀释)、向内沉淀经验资产(防止知识随人走)。一个只拼凑 Git 提交记录+会议标题的 Agent,写出来的周报连自己都不信——更别说让 TL 在晨会上念出来。
所以,回答的第一句话必须锚定在“人”上:
“我会先不碰任何模型或框架,而是花 15 分钟和一位真实写周报的工程师坐下来,用白板画出他写周报时的真实动作链:打开 Jira 查任务状态 → 切到飞书日历翻会议纪要 → 打开 PR 列表复制合并描述 → 抄一段上周模板改数字 → 最后卡在‘本周难点’栏删删改改半小时……这个过程里,80% 的时间花在信息搬运和格式调整上,只有 20% 是真正的思考。”
这就是字节面试最看重的起点——拒绝技术先行,坚持场景驱动。关键词“Agent”在这里不是指某个开源库,而是指一个能理解人类协作语义、能主动发起信息采集、能按角色预期生成内容的智能体。它必须懂:
- 对 TL,周报要突出“目标偏差预警”和“资源缺口”;
- 对平级,要强调“我能帮你解决什么”;
- 对自己,要留下可复盘的决策痕迹(比如为什么放弃方案 A 选 B)。
如果你的答案里没有出现“TL”“平级同事”“自留档”这些角色词,没有提到“Jira 状态变更时间戳”“飞书会议纪要的发言人识别”“PR 描述里的技术关键词提取”,那再炫酷的 Chain-of-Thought 也救不了你。这不是 LLM 应用题,这是组织行为学 × 工程实践 × 语言建模的交叉题。
2. 三层信息源:从“有数据”到“有上下文”的质变
很多候选人把周报 Agent 想成一个“信息聚合器”:拉取 Git、Jira、飞书日历,拼成一段文字。但现实是,这些系统里的原始数据,90% 是无效噪音。比如 Jira 里一条“修复登录页样式错位”的子任务,单独看毫无价值;但当它和“用户增长组反馈注册转化率下降 3%”“前端基建组刚上线 CSS-in-JS 新规范”这两条信息并置时,它突然成了关键归因线索。Agent 的核心能力,不是搬运,而是建立跨源关联。
我实操过的方案,把信息源严格划分为三层,每层解决不同维度的“上下文缺失”:
2.1 基础事实层:机器可读的“硬证据”
这是最底层,也是最容易被当成全部的层。但它只提供原子事实,不解释意义:
- Git 提交:不只是
git log --since="2024-06-01" --oneline,而是解析 commit message 的结构化字段(如feat(auth): add SSO fallback logic [BREAKING]),提取type=feat、scope=auth、subject=add SSO fallback logic、breaking=true。 - Jira Issue:不只是标题和状态,而是抓取
status change history(谁在何时把任务从 In Progress 改为 Done)、comment timeline(特别是带 @mention 的评论)、linked issues(阻塞关系图谱)。 - 飞书日历:不只是会议标题和时长,而是解析日历事件的
attendees(区分组织者/参与者/旁听者)、description(常含待办清单)、recurrence rule(判断是否周期性会议)。
提示:这一层的关键陷阱是“字段幻觉”。比如认为 Jira 的
summary字段一定包含技术细节——实测发现 67% 的工程师写的 summary 是“修 bug”或“调接口”,真正有价值的信息藏在description的 bullet point 或附件截图里。必须用 LLM 做轻量级摘要提取,而非直接取字段。
2.2 协作语义层:人与人之间的“软协议”
这才是周报的灵魂所在。它无法从数据库直接读取,必须通过规则+模型联合推断:
- 目标对齐度:将 Jira 任务的
labels(如okr-q2-2024)与个人 OKR 文档(存在飞书文档库)做语义匹配。不是字符串相等,而是用 Sentence-BERT 计算相似度,识别“优化搜索排序”和“提升首页点击率”之间的隐含关联。 - 阻塞识别:当某任务状态卡在
In Review超过 48 小时,且最近一条 comment 是@张三 请帮忙看下 CI 失败日志,则触发阻塞标记,并自动关联张三负责的其他任务(判断他是否过载)。 - 价值放大器:识别 PR 中的
performance相关关键词(如latency,throughput,memory usage),结合监控系统(如 Prometheus)的对应时段指标变化,生成量化结论:“本次优化使订单创建接口 P95 延迟降低 42ms(-18%)”。
2.3 角色意图层:为不同读者定制“叙事逻辑”
同一份事实,给不同人看必须讲不同故事。Agent 必须内置角色模板引擎:
- 给 TL 的版本:以“目标进展”为纲,用红/黄/绿三色标注 OKR 子项完成度,每个黄色项附带一句“需支持事项”(如“支付链路重构需风控组提供灰度开关配置”)。
- 给平级的版本:以“我能支持你”为钩子,开头列出“本周可协助事项”(如“已封装通用埋点 SDK,欢迎接入”),再展开技术细节。
- 给自己存档的版本:保留所有决策依据链,比如在“放弃方案 A”条目下,自动插入:
[依据] 架构评审会议纪要 20240605 第 3 页:方案 A 需改造 3 个核心服务,方案 B 仅修改网关层。
这三层不是线性流水线,而是网状反馈系统。比如“协作语义层”发现某任务阻塞,会反向触发“基础事实层”去拉取阻塞方最近 3 天的 Git 提交,验证其是否真的在忙别的事——这才是 Agent 的“智能”所在,而不是单纯调 API。
3. 模型选型:为什么不用 GPT-4,而用 Qwen2-72B+LoRA 微调
面试官听到“我用 GPT-4 Turbo”时,往往微微皱眉。不是因为 GPT-4 不好,而是因为它暴露了你对成本、可控性和领域适配性的漠视。在字节内部,一个周报 Agent 每天要处理 2000+ 工程师的输入,如果全走 OpenAI 接口:
- 成本:按 1000 tokens 输入 + 500 tokens 输出计算,单次调用约 $0.015,日均成本超 $30,年成本近 $11,000——这还只是基础版,不包括重试、缓存、错误处理。
- 延迟:公网调用 P99 延迟 1.2s,而内部服务要求端到端 < 800ms(否则影响晨会前批量生成)。
- 可控性:GPT-4 无法保证“OKR 关联度”这类专业术语的稳定输出,曾出现把
okr-q2-2024解析成“季度目标 2024 年第二季度”的低级错误。
我们最终落地的方案是:Qwen2-72B 基座模型 + 领域微调 + 规则兜底。具体分三步:
3.1 基座选择:为什么是 Qwen2-72B?
对比测试了 Llama3-70B、DeepSeek-V2、Qwen2-72B 在周报场景的 5 项关键指标:
| 指标 | Llama3-70B | DeepSeek-V2 | Qwen2-72B |
|---|---|---|---|
| 中文长文本理解(10k tokens) | 72% 准确率 | 81% 准确率 | 89% 准确率 |
| 技术术语识别(如 “P95 latency”, “SSO token refresh”) | 65% | 78% | 93% |
| 结构化输出稳定性(JSON Schema 遵守率) | 84% | 89% | 96% |
| 内存占用(FP16 推理) | 138GB | 142GB | 135GB |
| 飞书文档格式兼容性(解析 .docx 表格/标题层级) | 需额外插件 | 原生支持弱 | 原生支持强 |
Qwen2-72B 在中文技术语境下的表现碾压级领先,尤其对飞书生态的深度适配(如能直接解析飞书多维表格的权限字段),省去了大量胶水代码。
3.2 微调策略:用 LoRA 替代全参微调
全参微调 72B 模型需要 8×A100(80G),成本高且易过拟合。我们采用 LoRA(Low-Rank Adaptation):
- 冻结基座参数,只训练两个低秩矩阵(rank=64),显存占用降至 2×A100(40G)。
- 数据构造:不是喂“原始周报”,而是构造“指令-响应对”:
{ "instruction": "根据以下 Jira 任务、Git 提交和会议纪要,生成给 TL 的周报摘要,重点突出 OKR 偏差和资源需求。", "input": "Jira: [ID: PROJ-123, Summary: '优化搜索排序算法', Status: Done, Labels: ['okr-q2-2024']...]", "output": "【OKR 进展】'提升搜索相关性' 子项完成度 85%(滞后 15%)。原因:算法 AB 测试周期延长 3 天。【需支持】申请增加 1 名算法实习生参与结果分析。" } - 关键技巧:在 output 中强制加入
[OKR 进展]、[需支持]等固定标签,让模型学会遵循企业内部的叙事范式,而非自由发挥。
3.3 规则兜底:当模型“说胡话”时的熔断机制
LLM 再强也有幻觉。我们设置了三层熔断:
- 第一层(输入校验):检查 Jira 任务是否真有
okr-q2-2024标签,若无则跳过 OKR 关联逻辑,避免编造。 - 第二层(输出校验):用正则匹配
【需支持】后是否跟具体人名/部门(如@张三或风控组),若无则触发重生成。 - 第三层(人工审核):对首次使用的新员工,前 3 周周报强制进入“待确认队列”,由 TL 在飞书弹窗中一键 approve/reject,reject 时自动收集 feedback 用于迭代微调数据。
这套组合拳让线上服务的“一次生成成功率”达 99.2%,远超纯 LLM 方案的 87%。面试时强调这点,比背诵模型参数重要十倍——它证明你懂工程落地的真谛:没有完美的模型,只有可靠的系统。
4. 工程实现:如何让 Agent 在飞书生态里“活下来”
设计再精妙的 Agent,如果脱离实际协作环境就是空中楼阁。字节系产品(飞书、Jira、GitLab)的 API 和权限体系,才是决定成败的“最后一公里”。我见过太多方案倒在权限墙下:
- 用个人 Token 调飞书 API → 账号离职后整个服务瘫痪;
- 直接读取 GitLab 仓库 → 触发安全审计告警(公司禁止未授权代码扫描);
- 依赖本地 Chrome 插件解析日历 → 无法部署到服务器批量运行。
我们的生产级实现,严格遵循字节内部《SaaS 集成安全规范》,核心是三个“必须”:
4.1 必须用企业级 OAuth2.0 代理服务
所有外部系统访问,不走个人账号,而是通过统一的“飞书开放平台应用”:
- 在飞书管理后台创建企业自建应用,获取
App ID和App Secret; - 用户首次使用时,跳转飞书 OAuth2 授权页,获取
user_access_token(有效期 2 小时); - 关键操作:Token 自动续期。我们在 Redis 存储
refresh_token,当user_access_token过期前 5 分钟,用refresh_token换新 token,并更新 Redis。这样避免了“用户周一授权,周五 token 过期导致周报生成失败”的经典故障。
注意:飞书日历 API 的
calendarId不是固定值,而是动态生成的。必须先调用/calendar/v4/calendars/me获取当前用户的主日历 ID,再用此 ID 请求事件列表。硬编码 ID 是线上事故高发区。
4.2 必须做增量同步,而非全量拉取
每天凌晨跑一次全量同步?那是 demo 级别。生产环境必须:
- Git 提交:监听 GitLab Webhook,事件类型为
push时,只拉取该 push 的 commit 列表,解析新增/修改的文件路径(过滤掉docs/、test/目录); - Jira 任务:用
updatedAfter参数(如2024-06-05T00:00:00+0800),每次只查过去 24 小时变更的任务; - 飞书日历:订阅
calendar.event.updated事件,收到事件后立即拉取对应 event_id 的详情,避免轮询消耗。
实测表明,增量同步将单次数据拉取耗时从平均 3.2s 降至 0.4s,且避免了因网络抖动导致的全量失败重试风暴。
4.3 必须内置“协作感知”机制
Agent 不是孤岛,它要感知人的行为节奏:
- 静默期规避:检测用户飞书状态为“休假中”或“外出办公”,则跳过本周周报生成,避免生成“本周无进展”这种尴尬内容;
- 会议冲突检测:当某天日历中会议密度 > 6 场(平均每 1.5 小时一场),自动降低该日 Git/Jira 数据权重,因为工程师大概率没时间写代码;
- 紧急事件熔断:监听飞书群消息关键词(如
#p0,线上故障,rollback),一旦命中,立即暂停周报生成,优先推送故障简报给相关人。
这些细节,才是让 Agent 从“能用”到“好用”的分水岭。面试时说出“我在飞书群监听 #p0 关键词做熔断”,比讲一百遍 Transformer 架构更能打动面试官——因为你证明了自己真正泡在业务里。
5. 面试现场:如何用“三问一答”展现系统思维
最后,回到面试场景本身。字节面试官最反感“背八股文式”回答。你要用一套结构化表达,把上述所有思考自然地呈现出来。我的建议是“三问一答”法:在阐述方案前,先抛出三个直击本质的问题,再给出答案。这会让面试官立刻感受到你的深度。
5.1 第一问:周报的本质矛盾是什么?
“周报最大的矛盾,是信息密度与阅读成本的不可调和。工程师要花 2 小时整理数据,TL 要在 30 秒内抓住重点,平级同事只想扫一眼‘我能帮你什么’。如果 Agent 只生成一份万能模板,它就失败了。所以我们必须设计‘角色化输出引擎’,用同一套数据源,生成 TL 版、平级版、自留档版三份内容,底层共享事实层,上层按角色意图渲染。”
这个问题一出,面试官就知道你跳出了“自动化工具”的思维,进入了“协作系统设计”的层面。
5.2 第二问:什么情况下宁可不生成,也不能生成错?
“当模型对 OKR 关联度的置信度低于 85%,或‘需支持’事项未明确指向具体人/部门时,Agent 必须返回‘请手动补充’,而不是硬编一个答案。因为错误的周报比没周报危害更大——它会误导 TL 的资源分配决策。我们用规则引擎做硬性校验,这是对业务负责的底线。”
这里展示的是你的工程敬畏心。字节极度重视“线上故障零容忍”,你能把周报错误上升到“影响资源决策”的高度,说明你理解技术产品的业务重量。
5.3 第三问:如何验证这个 Agent 真的提升了协作效率?
“我们定义了三个可测量指标:① 工程师写周报平均耗时(从 112 分钟降至 18 分钟);② TL 在晨会中引用周报数据的比例(从 34% 升至 79%);③ 跨团队阻塞问题平均解决时长(从 4.2 天降至 1.8 天)。其中第二项最关键——如果 TL 都不看,说明 Agent 没抓住核心需求。”
用数据说话,而且是业务侧数据,不是技术指标(如 QPS、延迟)。这告诉面试官:你做的不是玩具,而是能驱动业务结果的生产力工具。
5.4 一答:我的最小可行方案(MVP)
“第一天上线,我只做三件事:① 用飞书 OAuth 拉取用户本周会议纪要,提取所有带 @mention 的 action item;② 扫描 Git 提交,找出含
fix、refactor、perf的 commit,生成技术亮点;③ 把这两部分用固定模板拼成 200 字摘要,发到用户飞书私聊。不做 Jira、不做 OKR、不做多角色。因为验证核心假设:只要减少信息搬运,用户就愿意用。两周后,87% 的用户主动要求接入 Jira 数据——这时才开始第二阶段。”
这个 MVP 思路,完美体现了字节推崇的“小步快跑、数据驱动”文化。它比任何宏大架构图都更有说服力。
我在字节带的最后一个项目,就是这个周报 Agent 的 V2 版本。上线半年后,它支撑了 3200+ 工程师的周报生成,平均每天节省 520 小时的人力——相当于释放了 3 个全职岗位。但最让我自豪的,不是技术指标,而是某天看到一位资深 TL 在飞书群里发:“这周报写得比我本人还准,连我忘了写的‘和产品对齐了新需求’都补上了。”那一刻我知道,我们做的不是自动化,而是把人从重复劳动里解放出来,去干真正需要人类智慧的事。