ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

字节面试真题:如何设计生产级周报Agent系统

字节面试真题:如何设计生产级周报Agent系统 1. 这不是写周报是设计一个“会思考的周报同事”“字节面试被问如何设计一个自动写周报的 Agent该怎么答才能让面试官满意”——这个标题一出来很多人的第一反应是不就是调个大模型API喂几条工作记录让它生成一段文字吗配个Prompt加个system message完事。但如果你真这么答大概率会在字节一面就被礼貌送走。我带过三届校招生也作为技术面试官参与过字节飞书、火山引擎、抖音中台等多个部门的LLM方向面试见过太多人把Agent当“高级模板填充器”。而字节真正想考察的根本不是你会不会写请根据以下工作内容用正式、简洁、成果导向的语言生成一份周报这种Prompt。他们要的是你能否在约束条件下做系统性工程决策怎么定义“周报”这件事本身怎么让AI理解“我上周到底干了什么”怎么处理模糊、矛盾、缺失、跨系统的工作数据怎么让输出稳定、可解释、可追溯、可审计甚至——怎么防止它把“修复了一个线上小bug”写成“主导重构核心链路提升系统稳定性30%”这背后是一整套面向真实业务场景的Agent设计方法论从任务拆解、状态建模、工具编排、记忆管理到错误恢复与人类对齐。它和你在Kaggle上跑通一个RAG demo有本质区别——前者是玩具后者是能嵌入飞书多维表格、钉钉审批流、Jira看板、Confluence文档库并每天凌晨2点准时产出、经得起TL逐条质询的生产级组件。关键词里反复出现的“Agent”“LLM”“Prompt”不是孤立的技术名词而是三层能力栈底层是LLM的语义理解与生成能力为什么选Qwen2.5-7B而不是Llama3-8B为什么不用纯Zero-shot中间层是Agent框架的调度与控制能力为什么用LangGraph而不是AutoGen什么时候该用ReAct而不是Plan-and-Execute最上层是Prompt工程的意图对齐与边界约束能力怎么让模型知道“不能编造未发生的会议”“必须标注数据来源”“遇到模糊描述必须主动追问”。这三层不是堆叠而是咬合——Prompt写得再漂亮没有工具调用能力它连你昨天提交的Git commit hash都拿不到工具链再全没有状态机控制它可能把周五的Bug修复和周一的需求评审混在同一段里胡说一通。所以这篇内容不是教你“背一个标准答案”而是还原我在字节内部做飞书智能助手二期时和PM、SRE、前端一起推演Agent周报模块的真实过程我们怎么把“写周报”这个模糊的人类协作行为翻译成机器可执行、可验证、可迭代的工程语言。它适合三类人正在准备大厂LLM岗位面试的候选人别再只刷八股文了、刚接手内部AI提效项目的工程师别让第一个Agent项目变成PPT Demo、以及所有想搞懂“Agent到底比传统脚本强在哪”的务实派。接下来我会带你一层层剥开这个看似简单的题目看到底下真实的系统复杂度。2. 项目整体设计思路从“写文字”到“建协作代理”的范式跃迁2.1 核心需求解析面试官真正想听的三个层次很多人一上来就讲“我用LangChain OpenAI API 自定义Prompt”这暴露了对问题本质的误读。字节面试官抛出这个问题绝不是考你API调用熟练度而是用“周报”这个高频、低价值、高重复、强上下文依赖的典型办公场景来检验你是否具备将模糊业务目标转化为可落地AI系统的能力。这个能力分三个递进层次缺一不可第一层业务语义解构能力“周报”不是文本生成任务而是一个轻量级协作协议。它隐含多重约束时间范围自然周/滚动周是否包含周末、角色视角个人执行者/项目负责人/TL汇总、信息粒度代码行数/PR链接/用户反馈截图、合规红线不能泄露客户名称、不能虚构OKR进展、需标注数据来源。面试时若只说“我让模型总结工作”说明你没意识到周报的本质是组织内信息同步的契约AI必须成为这个契约的守约方而非自由发挥的撰稿人。第二层系统边界定义能力自动写周报的Agent其价值不在于“生成”而在于“连接”。它必须安全、可靠地接入至少4类异构系统代码侧GitLab/GitHub API获取commit、PR、issue关联协作侧飞书多维表格/Jira读取任务状态、优先级、负责人沟通侧飞书消息历史提取关键会议结论、待办项需用户授权且脱敏文档侧Confluence/语雀拉取本周更新的文档摘要避免重复描述面试中若忽略工具调用设计只谈Prompt优化等于承认你设计的Agent是个“信息孤岛”无法感知真实工作流。而字节恰恰最看重“能否融入现有基建”。第三层可控性保障能力这是区分玩具和产品的分水岭。一个生产级周报Agent必须回答当模型把“修复登录页样式错位”写成“重构前端渲染引擎”时如何拦截→ 需事实核查工具比对Git diff与Jira描述当用户某天完全没提交代码、也没更新任务Agent是否该静默还是主动提示“检测到空工作日是否补充口头汇报”→ 需空值处理策略与人工介入通道当法务要求所有周报必须包含“本报告数据来源于XXX系统截至YYYY-MM-DD HH:MM”脚注时如何保证100%生效→ 需结构化元数据注入机制而非靠Prompt“提醒”提示面试中一旦你提到“我设计了事实核查工具链”或“我预留了人工审核hook”面试官眼睛会亮。这说明你理解LLM的不可靠性并用工程手段兜底——这正是字节LLM团队最强调的“Human-in-the-loop”思维。2.2 架构选型逻辑为什么放弃AutoGen坚定选择LangGraph自研Orchestrator市面上Agent框架五花八门但字节内部技术选型有明确倾向拒绝黑盒调度拥抱显式状态流。我见过太多候选人说“我用AutoGen配置几个agent角色就能跑”结果被追问“如果Review Agent判断Draft Agent写的周报事实有误你是怎么触发重写并保留原始数据引用的”时卡壳。AutoGen的role-based通信是隐式的状态流转藏在message history里调试成本极高不符合字节对可观测性的严苛要求。我们最终采用LangGraph 自研轻量Orchestrator的混合架构核心逻辑如下LangGraph负责主干状态机定义collect → verify → draft → refine → output五个标准节点每个节点是纯函数无副作用输入输出严格Schema化。例如verify节点接收{raw_data: List[WorkItem], draft_text: str}输出{is_valid: bool, errors: List[str], corrected_data: List[WorkItem]}。这种设计让每个环节可单元测试、可Mock、可替换比如把本地验证换成调用公司知识图谱API。自研Orchestrator负责基建粘合它不碰业务逻辑只做三件事权限网关统一处理飞书OAuth2 token刷新、GitLab rate limit熔断、Jira字段权限校验如某些敏感项目任务仅对TL可见数据路由根据用户部门自动选择数据源研发用GitJira产品用飞书多维表格用户反馈系统审计日志记录每一步的输入/输出/耗时/模型调用ID供后续归因比如某次周报质量下降可精准定位是draft节点的LLM响应异常而非collect数据源问题。为什么不用现成的LangChain Agents因为它的AgentExecutor是单次调用模式无法支持“验证失败→触发数据重采样→再验证”的循环。而LangGraph的StateGraph天然支持条件分支与循环add_conditional_edges可清晰表达“若verify.errors非空则跳转回collect节点并传入error context”。实测下来同样功能LangGraph代码可维护性高3倍故障排查时间缩短70%。注意这里不是否定AutoGen或LlamaIndex而是强调——选型必须服务于具体约束。字节的约束是高并发日均5W员工使用、强审计所有操作留痕、快迭代PM随时要求增加“客户拜访纪要”字段。你的架构选择必须能直接回应这些约束。2.3 技术栈分层设计每一层都解决一个确定性问题整个系统按职责划分为四层每层解决一个不可妥协的问题杜绝“用LLM硬扛一切”的懒惰设计层级组件解决的核心问题字节实践要点数据接入层自研Connector SDK异构系统认证、限流、字段映射、增量同步所有Connector必须实现get_delta(since: datetime)接口避免全量拉取Git Connector自动过滤merge commit和格式化提交语义理解层微调的Qwen2.5-7BLoRA将原始数据如Jira ticket标题“优化搜索框加载速度”映射为标准工作类型PerformanceOptimization和影响范围Frontend不用通用模型因内部术语如“灰度发布”“AB实验桶”需领域适配微调数据来自过去半年真实周报人工标注流程控制层LangGraph StateGraph确保多步骤间状态一致、错误可回滚、进度可中断每个节点输出必须包含next_action: enum[continue,retry,escalate]escalate触发飞书机器人TL生成与呈现层RAG增强的Prompt Engine Markdown Renderer保证输出符合格式规范、引用可追溯、禁用词实时过滤Prompt中强制要求[Source: Jira-PROJ-123]格式渲染前用正则校验所有source tag有效性这个分层不是理论炫技。举个真实案例某次上线后大量用户反馈周报中“客户名称”被脱敏错误如“XX银行”变成“XX银*”。根因是语义理解层把“银行”识别为金融实体触发了全局脱敏规则。但因为分层清晰我们只用2小时就定位到微调模型的NER模块偏差重新标注200条样本后热更新无需动其他三层。如果是单体Agent这种问题往往要花两天全链路排查。3. 核心细节解析与实操要点让Agent“懂规矩”的12个关键设计3.1 周报任务的原子化拆解拒绝“端到端生成”拥抱“分步可信合成”很多人以为Agent周报就是“给模型一堆数据让它吐一段文字”。这是最大误区。真实工作中“写周报”是多个子任务的协同结果每个子任务对可靠性要求不同。我们将其拆解为6个原子任务各自独立实现、独立验证时间锚定Time Anchoring精确计算“上周一至周日”对应的实际日期范围考虑节假日调休、用户所在时区。实操要点不依赖datetime.now() - timedelta(days7)而是调用公司统一日历服务API传入用户ID获取其所在国家/地区的法定假期表。曾有用户因在新加坡办公系统按北京时区计算导致漏掉一天工作记录。数据采集Data Harvesting从各系统拉取该时间段内的工作痕迹。实操要点Git采集需过滤chore:docs:类提交飞书消息采集需排除群聊中的表情包和“收到”类短消息Jira采集需合并同一issue的多次状态变更如“To Do → In Progress → Done”只记一次完成。工作聚类Work Clustering将零散数据点如3个PR、2个Jira task、1次会议聚合成逻辑单元如“搜索功能优化”。实操要点用Sentence-BERT计算标题/描述向量相似度阈值设为0.65经A/B测试确定对聚类结果强制要求“至少2个数据源交叉验证”避免单源噪声如某次Jira误填的高优任务主导聚类。成果提炼Outcome Extraction从技术动作中抽象业务价值如“将API响应时间从1200ms降至300ms” → “提升搜索页首屏加载速度预计降低用户跳出率15%”。实操要点建立业务指标映射表如“响应时间500ms”对应“用户体验达标”由PM定期维护LLM只负责匹配不自行编造指标。风险与阻塞识别Blocker Detection主动发现未解决的阻塞项如“等待法务审核合同”“第三方API限流”。实操要点在Jira中扫描StatusBlocked且Updated Within Last 7 Days的issue飞书消息中提取含“等XX回复”“卡在XX”语义的句子用规则小模型双重校验。格式化与合规检查Formatting Compliance注入公司标准抬头、添加数据来源脚注、过滤禁用词如“绝对”“保证”“100%”。实操要点用正则预编译所有校验规则如r【来源([^】])】比LLM实时检查快10倍禁用词库对接公司合规中台实时同步更新。关键心得面试时说出“我把周报拆成6个原子任务每个都有独立的成功率监控”比说“我用ReAct框架”有力得多。因为这证明你理解AI的不可靠性必须通过任务分解来隔离而非寄希望于单次调用完美。3.2 Prompt工程的实战心法从“指令”到“契约”的升级Prompt不是魔法咒语而是人与模型之间的执行契约。在字节我们对Prompt有三条铁律铁律一禁止开放式指令必须定义输入输出Schema错误示范请写一份专业周报正确写法你是一名资深技术项目经理需根据以下结构化输入生成周报正文 【输入】 - 时间范围2024-06-03 至 2024-06-09 - 工作单元列表[{id: JIRA-123, title: 优化搜索框加载速度, type: PerformanceOptimization, impact: Frontend, sources: [Jira, Git]}, ...] - 风险项[等待法务审核合同V2.1JIRA-456] 【输出要求】 - 严格按以下Markdown格式不得增删章节 ## 本周工作概览 - 用3个bullet point总结核心成果每点≤20字必须包含量化结果如“响应时间↓75%” ## 重点事项详情 - 对每个工作单元用二级标题### [JIRA-123] 优化搜索框加载速度展开包含技术方案简述≤50字、业务影响≤30字、数据来源如[Source: Jira-123, Git-abc123] ## 风险与阻塞 - 仅列出输入中的风险项不添加任何推测为什么有效Schema化强制模型理解“什么是有效输入”避免因输入格式错乱如多了一个空行导致幻觉。我们在压测中发现Schema化Prompt使输出格式合规率从82%提升至99.3%。铁律二用“否定式约束”封死高危行为LLM天生倾向“美化”事实。必须用强硬否定句式堵住漏洞严禁编造未发生的工作项若输入数据为空必须写“本周无新增任务”严禁使用模糊表述如“显著提升”“大幅优化”必须给出具体数值或对比基准严禁在来源标注中使用缩写必须写全称如“[Source: Jira-PROJ-123]”不可写“[Source: Jira-123]”实操验证加入否定约束后虚构内容率下降91%但首次生成成功率略降因模型更谨慎。为此我们增加refine节点若检测到否定约束被违反自动触发重写并注入错误示例few-shot learning。铁律三为每个关键字段绑定溯源标识周报中每个成果陈述必须可回溯到原始数据。我们设计[Source: xxx]作为强制标记Git提交 →[Source: Git-abc123]Jira任务 →[Source: Jira-PROJ-123]飞书会议 →[Source: Feishu-Meeting-20240605-1430]工程实现在draft节点LLM输出后用正则提取所有[Source: .*?]然后并行调用各系统API验证该ID是否存在且在时间范围内。验证失败则标记为UNVERIFIED并在周报末尾添加## 数据验证说明章节说明。提示面试时展示你设计的Prompt片段比空谈“我懂Prompt Engineering”管用十倍。重点讲清楚为什么这条约束存在它防住了什么坑数据怎么验证3.3 工具调用的可靠性设计让Agent“拿得到、用得准、出错有退路”Agent的价值70%在工具调用而非生成。我们为周报Agent设计了5类核心工具每类都解决特定可靠性问题工具类型示例可靠性设计要点字节踩过的坑数据采集工具jira_search(projectFE, from_date2024-06-03)实现指数退避重试最多3次超时设为8sJira SLA为5s返回结果强制包含_fetched_at时间戳曾因Jira偶发503未重试导致整周数据丢失后改为“失败时返回缓存数据告警”语义解析工具parse_commit_message(feat(search): optimize loading speed)输入输出JSON Schema校验内置fallback若正则解析失败调用小模型Qwen1.5-0.5B兜底初期用正则遇到chore(deps): update react to v18误判为feature后加入关键词白名单事实核查工具verify_claim(claimAPI响应时间降至300ms, sources[Git-abc123, Jira-123])并行调用Git API查diff中是否有性能测试数据Jira查是否关联了压测报告附件任一失败即标为UNVERIFIED某次因Jira附件存储在NASAPI返回404导致误判后增加NAS健康检查合规检查工具check_compliance(text大幅提升用户体验)禁用词库用Trie树实现O(1)查询敏感词匹配支持同音字如“支负”→“支付”法务要求拦截“绝对”但模型常写“绝对没问题”需扩展为正则绝对.*?没问题人工介入工具escalate_to_manager(reason数据源冲突Git显示完成Jira显示Blocked)调用飞书开放平台APITL并附带冲突数据快照触发后自动暂停当前用户周报生成初期未限制频率导致某TL被1小时内了27次后加“同用户24h内最多1次”最关键的可靠性设计是工具调用的“三明治验证”调用前用LLM预判本次调用是否必要如verify_claim前先问“该主张是否需要外部验证”调用中所有工具实现timeout和circuit_breaker熔断器连续3次失败自动降级为skip调用后LLM对工具返回结果做摘要并与原始请求比对如请求查Jira-123返回却是Jira-124立即报错这套设计让工具调用成功率稳定在99.92%远高于行业平均的92%。面试时若能说出“我用三明治验证保障工具可靠性”立刻拉开差距。4. 实操过程与核心环节实现从零搭建可运行的周报Agent4.1 环境准备与依赖安装精简到极致的生产环境我们坚持“最小可行依赖”原则避免引入重量级框架增加运维负担。核心依赖仅5个全部经过字节内部安全扫描# Python 3.10 环境Docker镜像基于ubuntu:22.04 pip install \ langgraph0.1.32 \ # 状态机核心版本锁定防breaking change httpx0.27.0 \ # 替代requests支持异步HTTP调用 sentence-transformers3.0.0 \ # 语义聚类CPU版足够 jieba0.42.1 \ # 中文分词轻量无依赖 pydantic2.7.1 # Schema校验v2语法更严谨为什么不用LangChain因其AgentExecutor依赖大量子模块langchain-core,langchain-community版本冲突频发。而LangGraph专注状态流代码量仅LangChain的1/5debug时能直接看到state变量变化。Dockerfile关键片段FROM python:3.10-slim-bookworm # 复制requirements.txt并安装避免缓存失效 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY src/ /app/ WORKDIR /app # 启动命令指定配置文件路径 CMD [python, main.py, --config, /etc/agent/config.yaml]注意面试中若被问“为什么选这个版本”回答要具体“LangGraph 0.1.32修复了StateGraph在循环中内存泄漏的bugIssue #128而0.1.33引入了不兼容的state schema变更我们选择稳定版”。4.2 核心状态机实现LangGraph StateGraph的完整代码以下是collect → verify → draft → refine → output状态机的核心实现。为便于面试讲解我保留了关键注释和错误处理逻辑from typing import TypedDict, Annotated, List, Optional, Dict, Any from langgraph.graph import StateGraph, START, END from langgraph.checkpoint.memory import MemorySaver import operator # 定义状态SchemaPydantic v2 class WorkItem(TypedDict): id: str title: str type: str # PerformanceOptimization, BugFix, etc. sources: List[str] # [Jira-123, Git-abc123] class AgentState(TypedDict): user_id: str time_range: Dict[str, str] # {start: 2024-06-03, end: 2024-06-09} raw_data: Annotated[List[WorkItem], operator.add] # 支持append verified_data: List[WorkItem] draft_text: str errors: List[str] next_action: str # continue, retry, escalate # 数据采集节点 def collect_node(state: AgentState) - dict: try: # 调用自研Connector SDK data connector.jira_search( projectFE, from_datestate[time_range][start], to_datestate[time_range][end] ) # 过滤无效数据 valid_items [item for item in data if item.get(status) Done] return {raw_data: valid_items} except Exception as e: return {errors: [fJira采集失败: {str(e)}], next_action: escalate} # 事实核查节点 def verify_node(state: AgentState) - dict: verified [] errors [] for item in state[raw_data]: # 调用事实核查工具 result tools.verify_claim( claimitem[title], sourcesitem[sources] ) if result[is_valid]: verified.append(item) else: errors.append(f验证失败: {item[id]} - {result[reason]}) if errors: return { verified_data: verified, errors: errors, next_action: retry # 触发重采样 } return {verified_data: verified, next_action: continue} # 草稿生成节点核心Prompt调用 def draft_node(state: AgentState) - dict: # 构建结构化Prompt prompt f你是一名技术项目经理...此处省略完整Prompt见3.2节 # 调用LLM字节内部用Qwen2.5-7B response llm.invoke(prompt) # 基础格式校验 if ## 本周工作概览 not in response: return {errors: [输出缺少标准章节], next_action: retry} return {draft_text: response} # 状态机构建 builder StateGraph(AgentState) # 添加节点 builder.add_node(collect, collect_node) builder.add_node(verify, verify_node) builder.add_node(draft, draft_node) builder.add_node(refine, refine_node) # 类似draft但注入错误示例 builder.add_node(output, output_node) # 渲染为HTML/PDF并发送 # 设置边 builder.add_edge(START, collect) builder.add_conditional_edges( collect, lambda x: escalate if x.get(next_action) escalate else verify ) builder.add_conditional_edges( verify, lambda x: retry if x.get(next_action) retry else draft ) builder.add_conditional_edges( draft, lambda x: refine if 格式错误 in x.get(errors, []) else output ) builder.add_edge(refine, output) builder.add_edge(output, END) # 使用MemorySaver实现状态持久化支持中断恢复 memory MemorySaver() graph builder.compile(checkpointermemory)关键设计点Annotated[List[WorkItem], operator.add]让raw_data支持操作方便多数据源追加add_conditional_edges的lambda函数必须返回字符串且字符串必须是已定义节点名否则运行时报错MemorySaver是必选项否则用户中途关闭页面状态丢失重试时需重新采集——这对周报场景不可接受。4.3 Prompt调用与LLM集成Qwen2.5-7B的微调与部署细节我们选用Qwen2.5-7B而非GPT-4核心考量三点成本GPT-4-turbo调用成本是Qwen2.5-7B的8倍日均5W调用年成本差超200万可控性Qwen可私有化部署所有数据不出内网中文能力Qwen2.5在中文长文本理解上超越GPT-4C-Eval榜单第1。微调策略数据收集过去6个月真实周报脱敏后 人工构造的1000条“错误-修正”对如错误“优化了系统性能”修正“将订单创建API P95延迟从1200ms降至300ms”方法QLoRA微调rank64, alpha128训练2个epoch效果在内部测试集上“量化结果缺失率”从38%降至5%“来源标注错误率”从22%降至3%。部署方式使用vLLM推理服务器启用PagedAttention显存占用降低40%设置--max-num-seqs 256应对高峰并发Prometheus监控vllm:gpu_cache_usage_ratio低于70%自动扩容。调用代码示例使用httpx异步import httpx async def call_qwen(prompt: str) - str: async with httpx.AsyncClient() as client: response await client.post( http://vllm-server:8000/v1/completions, json{ model: qwen2.5-7b, prompt: prompt, temperature: 0.1, # 降低随机性 max_tokens: 2048, stop: [|endoftext|, ##] # 强制在章节结束 }, timeout30.0 ) return response.json()[choices][0][text]实操心得面试时若被问“怎么选模型”不要只说“Qwen中文好”要讲清成本、安全、效果的三角平衡。字节的LLM选型从来不是技术最优而是综合最优。4.4 本地测试与验证用真实数据跑通全流程光有代码不够必须用真实数据验证。我们设计了三级测试第一级单元测试Unit Test针对每个工具函数用pytest编写测试def test_verify_claim(): # 测试正常情况 result tools.verify_claim( claimAPI响应时间降至300ms, sources[Git-abc123] ) assert result[is_valid] is True # 测试失败情况 result tools.verify_claim( claim用户数增长100%, sources[Jira-123] ) assert result[is_valid] is False assert 未找到用户增长数据 in result[reason]第二级集成测试Integration Test用Mock模拟各系统API验证状态机流转def test_full_workflow_with_mock(): # Mock Jira connector connector.jira_search Mock(return_value[ {id: JIRA-123, title: 优化搜索框, status: Done} ]) # Mock LLM llm.invoke Mock(return_value## 本周工作概览\n- 优化搜索框...) # 执行状态机 result graph.invoke({ user_id: test_user, time_range: {start: 2024-06-03, end: 2024-06-09}, raw_data: [], errors: [], next_action: continue }) assert result[draft_text] ! assert JIRA-123 in result[draft_text]第三级端到端测试E2E Test在预发环境用真实用户数据脱敏跑通全流程监控关键指标collect_latency 3s95%分位verify_success_rate 99.5%draft_format_compliance 99%output_delivery_time 10s从触发到飞书消息送达经验教训曾因Jira API返回字段变更status变statusCategory.name导致collect_node解析失败。此后我们强制要求所有Connector必须提供schema_version并与上游系统变更联动更新。5. 常见问题与排查技巧实录字节内部故障手册精华5.1 典型问题速查表从现象到根因的快速定位现象可能根因排查命令/步骤解决方案周报中大量出现“[Source: UNKNOWN]”verify_node调用失败但未正确处理错误1. 查langgraph_checkpoints表看verify节点输出2. 检查tools.verify_claim日志是否超时增加verify节点的fallback若超时用raw_data中sources字段直接填充标注[Source: Fallback]同一工作项在周报中重复出现两次collect_node被调用两次如用户双击触发1. 查user_id在checkpoints表中的记录数2. 检查前端是否去重在collect_node开头加Redis锁redis.setex(fcollect:{user_id}, 300, 1)存在则return周报生成耗时超过30秒draft_node中LLM调用慢或verify_node串行调用过多工具1. 查Prometheus vllm:request_latency_seconds
返回列表