老王的面馆开了半年,口碑时好时坏。顾客有时夸面条筋道,有时骂汤底寡淡,最气人的是周末高峰期有人等了四十分钟才吃上面。老王很委屈:菜谱没变,大厨没换,问题出在哪?直到他请来质检经理老张,老张干了三件事:每天翻食材仓库看温湿度,站在出餐口掐表计出餐时间,再到大厅偷听顾客聊天。三个月后,面馆稳定得像个钟表。RAG 客服系统和面馆一模一样——上线一个客服机器人只是开始,真正考验人的是它上线之后:回答质量有没有下滑?检索是不是变慢了?大模型是不是“嘴瓢”开始编造事实?这些都不会敲锣打鼓地告诉你,只会悄悄变成用户的一句“这客服真蠢”。监控与告警,就是给这个机器人装上的眼睛、耳朵和火警铃。
掌握监控与告警体系,是从“能跑通 demo”的工程师走向“能稳定运营生产系统”的 AI 工程师的分水岭,也是面试中区分初级与高级岗位的高频考点。
可视化演示
展示RAG客服系统四层监控架构、检索延迟P50/P95/P99分布告警与模型漂移检测,交互切换模式查看不同监控维度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
四层监控架构 基础设施层:CPU/GPU/内存利用率 检索层:向量查询延迟与召回率 生成层:LLM推理延迟与Token消耗 监控覆盖率 = 已采集指标数 / 总设计指标数 分层监控实现全链路可观测
监控体系设计
质检经理老张上任后定下的第一条规矩,是“先建体检表,再谈出问题”。他把巡查分成三层:隔三差五去翻食材仓库,看肉有没有变质、调料是不是快见底——这是基础层;站在出餐口掐着秒表,看一碗面从下单到上桌要多久、有没有做错单——这是应用层;最后溜达到大厅,竖着耳朵听顾客聊天,记下“汤咸了”“面不够筋道”——这是业务层。三层各有各的检查表,互不替代。老张说:仓库塌了、厨房乱了、顾客骂了,是三件完全不同的事,得分三次解决。
RAG 客服系统的监控体系设计,逻辑完全一致。基础层指标盯服务器 CPU、内存、磁盘、网络带宽,对应“食材仓库的温湿度”;应用层指标盯向量检索延迟、大模型调用量、接口错误率,对应“出餐速度和做错单的比例”;业务层指标盯回答质量分、用户满意度、转人工率,对应“顾客的真实表情”。这三层加起来,才是完整的健康画像。很多团队只会在后端配一个“服务存活检测”,就像老张只检查门有没有锁,却不知道厨房已经着火——这就是监控目标定位不清。
监控最终要回答两个问题:系统到底可不可用?以及坏了能不能第一时间知道?前者靠可用性指标量化,后者靠告警通道设计。可用率的计算并不复杂:把一段时间内所有请求当作分母,扣除失败的请求,剩下的比例就是可用率。告警通道则讲究分级分渠道:P0 级(服务整体不可用)直接电话轰炸值班人,P1 级(质量明显下滑)发即时消息并拉群,P2 级(轻微波动)只写进日报。全量告警推给所有人,等于没人看告警。
有了这层设计,老王的面馆再也没出过“菜坏了三天没人知道”的丑事。监控体系是一切的根基:它把看不见的隐患变成看得见的数字,把“感觉还行”变成“有数据撑腰”。没有这套地基,后面所有的质量问题、延迟问题、漂移问题,都只能靠用户骂街来发现。
- N\_total(总请求数)统计周期内进入客服系统的全部用户请求,对应面馆一天接待的总顾客桌数,是分母。
- N\_fail(失败请求数)超时、异常、返回空结果的请求数,相当于后厨做砸了、打翻了的菜,要单独记一笔。
- 求差得到成功数用总请求减去失败请求,得到真正被妥善回答的请求量。
- 求占比并转成百分比成功请求占总请求的比例,再乘以 100% 变成日常可读的百分数,例如 99.9%。
回答质量监控
质量监控是面馆最花心思的一环。老张的招数是“三管齐下”:第一,安排试菜员每天随机抽几碗面,对照菜谱打分——这相当于系统自动计算回答与知识库内容的贴合度;第二,在每张桌上放反馈卡,顾客勾“咸了淡了好吃难吃”——这相当于用户对客服回答的点赞、点踩和追问行为;第三,也是最高明的一招,老张偶尔会故意问大厨一句“这道菜里放的是哪年的老酒”,要是大厨张口就编,说明他开始偷工减料了——这就是幻觉检测。
落到技术上,回答质量不是一个单一信号能衡量的,工程上通常把它拆成三个来源加权合成。第一个来源是语义相似度,把客服生成的答案和检索到的知识片段分别编码成向量,再用余弦相似度衡量它们“说的是不是同一件事”;第二个来源是用户反馈信号,包括点赞、点踩、追问“你再说一遍”、主动点击转人工等行为;第三个来源是幻觉程度,即答案中编造事实的严重程度。三个信号按权重合成,就是每一轮回答的质量分。
试菜员、反馈卡和“故意刁难”这三招,让面馆第一次做到了“不等顾客骂人,就自己先发现味道不对”。对 RAG 客服系统来说,这套质量分体系就是它的味觉:每天自动给成千上万轮回答打分,把低分样本捞出来人工复核,再反哺给知识库。回答质量监控不是给机器人找茬,而是给它当镜子。
- S\_sim(语义相似度)客服回答与检索知识库内容的语义贴近程度,取值范围 0 到 1,由两个向量的余弦相似度归一化而来,相当于“这碗面有没有按菜谱做”。
- F\_feedback(用户反馈)用户对本次解答的点赞、点踩、追问、转人工等行为转化成的得分,相当于顾客在反馈卡上勾的选项。
- H\_hallucination(幻觉程度)答案中编造事实的严重程度,越高说明大模型“自由发挥”越离谱,相当于大厨报出根本不存在的“三十年老酒”。
- α、β、γ(权重系数)三个系数决定各信号的优先级和数量级,工程上由历史标注数据标定,比如更怕幻觉就把 γ 调大。
- 加权合成总分相似度和用户反馈加分,幻觉减分,三者合成最终质量分,再截断到 0 到 1 之间。
检索延迟告警
面馆高峰期有个怪现象:平均出餐时间只有五分钟,数据很好看,但每周都有人投诉“等了四十分钟”。老张一查才发现,平均值被绝大多数出餐快的订单拉低了,真正让顾客记住的,是那 1% 等了四十分钟的倒霉蛋。于是他定了一条新规矩:不看平均,看 P95——也就是把当天所有出餐时间从快到慢排序,取排在第 95% 位置的那一单作为考核线。只要第 95% 位的那碗面超过二十分钟,就说明高峰期的体验已经崩了。
RAG 系统的检索延迟一模一样。请求的平均延迟可能只有 200 毫秒,但总有零星请求因为向量库慢查询、连接池打满、重排序模型超时而被拖到几秒开外。这些尾部延迟(tail latency)才是用户真实感受到的“卡顿”。工程上的标准做法是用 P95 甚至 P99 延迟作为告警指标:把窗口期内的 N 个延迟样本升序排列,取第 95% 位置的值,超过阈值就触发告警。阈值一般根据业务容忍度设定,客服场景通常定在 300 到 500 毫秒之间。
告警只是第一步,更重要的是“慢查询定位”。延迟告警响起后,工程上要沿着链路逐段拆解:是用户问题编码成向量太慢,还是向量数据库检索本身慢,还是重排序模型计算量大,还是大模型生成阶段的排队太挤?每一段都埋点记录耗时,才能像老张那样精准地说出“是第二排的灶台火小了,不是大厨手慢”。延迟告警的本质,是把“顾客骂娘”翻译成工程师能看懂的技术语言。
- 采集 N 个延迟样本在一个统计窗口内,记录每次用户请求从发出到收到回复的耗时,样本越多越稳定。
- 升序排序把所有延迟值从快到慢排成有序数组,相当于把当天所有出餐单按等待时间排队。
- 取 95% 位置的下标用 0.95 乘以样本数再向下取整,定位到排序后数组中的具体位置。
- 与阈值比较触发告警P95 超过设定阈值(如 300ms)就触发告警,说明尾部体验已恶化到不可接受。
模型漂移检测
面馆遇到过一个最诡异的投诉:老顾客说“味道变了,但说不清哪里变了”。老张里里外外查了三天,菜谱没改、大厨没换、食材采购单也没变动。最后他在调料库里发现,供应商悄悄换了一种酱油——口味只差一点点,单尝尝不出来,但连续吃一个月的老顾客一下就吃出来了。这就是“漂移”:不是一次爆炸性的事故,而是每天退化一点点,等量变积累成质变,已经流失了一波客人。
RAG 客服系统里的模型漂移也是一样的慢性病。客服机器人的代码没变、模型版本没换,但线上的输入分布悄悄变了——比如新品上市后,用户问的问题从“退换货政策”变成了“新品成分表”,而知识库里根本没有相关内容;或者大模型供应商悄悄更新了底座模型,回答风格整体偏移。这种变化不会让服务报错,只会让质量分一天比一天低。检测漂移的核心思路,是把“当前线上数据的分布”和“上线时的基线分布”做对比,看它们偏离了多远。工程上最常用的量化工具是 PSI(群体稳定性指标,Population Stability Index)。
漂移检测出来后,最常见的干预动作是“知识库同步”:如果漂移源于知识库内容过期,就要重新构建向量索引;如果源于大模型底座更新,就要重新跑一遍质量回归。面馆换回原来的酱油后,老顾客又回来了。道理是一样的——漂移不可怕,可怕的是没人发现它,直到老顾客悄悄流失。
- 分箱把指标取值范围(比如质量分 0 到 1)切成 k 个等宽的小区间,相当于把顾客按口味分成“重口、中口、淡口”几档。
- 计算各自占比基线分布中落入第 i 个箱的比例记为 P_i,当前线上分布的比例记为 Q_i。
- 逐箱计算差异每个箱用占比差乘以对数比,衡量这一档里“说话声变多还是变少”。
- 汇总成指数所有箱的结果求和得到 PSI,与 0.1、0.25 两个门槛比较,判断漂移程度。
A/B测试迭代
新菜式要不要上菜单?老张从不拍脑袋。他的做法是“试营业”:找三成桌位先上新菜,其余七成维持老菜单,统计两边的回头客比例。如果试吃桌的回购率明显更高,再逐步放量到五成、七成、全量;如果数据没差异或者更差,就默默撤掉,谁也没损失。老张说:改菜单不是赌博,是实验。
RAG 客服系统的迭代也一样。无论是换一套提示词、调大模型的温度参数,还是改知识库的切分策略,都不能直接全量上线——万一改坏了,所有用户都替你买单。正确的做法是 A/B 测试:把用户流量按比例分成对照组和实验组,两组分别走旧策略和新策略,跑一段时间后比较关键指标(满意度、转人工率、问题解决率)是否存在显著差异。
A/B 测试让面馆的菜单进化不再靠“老板拍脑袋”,而是靠“数据投票”。RAG 客服系统的对话策略、提示词模板、知识库内容,都能在这种小步快跑、用数据验证的节奏里持续迭代。测试的目的不是证明“新的一定好”,而是降低改错的风险——改对了赚,改错了也不伤筋动骨。
- 两组均值实验组 A 与对照组 B 的效果指标均值,比如平均满意度或问题解决率,是两组表现的中心点。
- 方差与样本量s² 反映组内数据的波动程度,n 是样本量,体现“这组数据靠不靠谱”——波动越大、样本越少,结论越不可信。
- 差值除以标准误两组均值之差除以合并标准误,把“差距”换算成“多少个标准差”,衡量差异是不是大得不像偶然。
- 与临界值比较t 的绝对值超过 1.96 说明差异在统计上显著,可以放心放量;否则说明改版效果存疑。
告警处理流程
面馆后厨装过一种火警铃,声音特别大,一响全楼都能听见。结果呢?有次老鼠碰倒了锅盖,铃声大作,所有服务员扔下顾客往后厨跑,现场乱成一团。老张后来把告警分成了三级:厨房起火这种要命的事,响铃并直接打电话给店长;食材快过期这种要紧事,只在后厨亮黄灯并记录在案;餐具少了几把这种小事,只写进周报。同时安排每天一名值班店长,告警来了先接住、再分类、再处理,最后每周复盘一次,把“为什么着火”写在墙上。
生产环境中的 RAG 客服系统,告警处理流程的章法完全一样。第一是分级:P0 级是服务不可用或大面积回答报错,要求立即响应、电话通知;P1 级是质量分显著下滑或延迟明显超标,要求 15 分钟内上线处理;P2 级是轻微波动,记录观察即可。第二是值班响应机制:任何时刻都有人“接警”,先恢复服务再查根因,避免告警来了没人看。第三是闭环改进:每次故障都要复盘根因、写出改进项、验证效果,把“这次救火”变成“下次不起火”。
最后老张还做了一件小事:把所有告警记录整理成册,每周翻一遍,把反复出现的告警条数一条条划掉。这对应到工程上叫“告警疲劳治理”——通过去重、聚合、静默把无效告警降到最低,让人把注意力留给真正重要的信号。告警闭环的目的,是让团队从“天天救火”进化到“很少着火”。监控与告警的终极形态,不是忙碌的报警声,而是一个安静但随时能响的系统。
- 故障总时长从告警触发到服务恢复的时间,按分钟累计,是团队“救火速度”的总账。
- 故障次数同一窗口内的同类故障合并计数,避免一次抖动被算成十次故障来刷低指标。
- 相除取平均总时长除以次数,得到每次故障的平均修复时间,用来衡量值班响应和修复能力。
AI 应用场景
智能客服的每日质量巡检
阶段:生产部署后的监控与告警
解决的问题:传统客服靠用户投诉才能发现服务问题,一天下来只能抽检几十条对话,大量低质量回答悄悄漏过。AI 通过质量评分公式给每一轮回答自动打分,把“转人工率突然升高”“回答与知识库语义偏离过大”的对话捞出来,推送给运营复核。
具体案例:某电商平台的 RAG 客服机器人上线后,运营每天早上一键拉取前一日“低质量回答 Top 50”清单,发现大量用户问“新品是否含酒精”时,机器人答非所问。运营将这些样本补充进知识库,一周后质量分从 0.81 回升到 0.89。
大促前的压测与告警演练
阶段:容量规划与告警阈值调优
解决的问题:大促流量是平时的十倍,检索延迟会在几分钟内从 200ms 飙到 2 秒,靠人工盯大盘根本来不及。通过压测工具模拟峰值流量,提前标定 P95 延迟阈值和告警级别,确保告警在流量陡增的第一时间触达值班工程师。
具体案例:某美妆品牌大促前夜,压测发现向量检索服务的连接池被打满,P95 延迟突破 800ms。工程师提前扩容并加了一条 P1 告警规则,大促当天告警精确触发,值班组三分钟完成扩容,全程无客诉。
话术策略的灰度迭代
阶段:A/B 测试驱动对话策略迭代
解决的问题:直接更换客服话术模板风险太大,万一用户不买账,满意度断崖式下跌。用 A/B 测试把新话术放给 10% 流量,跑一周再用显著性检验判断是否值得全量。
具体案例:某银行客服机器人想在解释贷款被拒时,把冷冰冰的“不符合条件”改成先共情再给建议的话术。A/B 测试跑了两周,实验组满意度提升 5.2%,转人工率下降 1.8%,t 值为 2.31,显著优于对照组,随后全量上线。
Python 演示
# -*- coding: utf-8 -*-"""RAG customer service monitoring: quality score, p95 alarm, psi drift."""import mathimport random class QualityMonitor: """Quality monitor: compute a composite score for each answer.""" def __init__(self, alpha=0.5, beta=0.3, gamma=0.2): self.alpha = alpha self.beta = beta self.gamma = gamma self.scores = [] def score(self, sim_score, feedback, hallucination): # sim_score: semantic similarity, feedback: user feedback, # hallucination: severity of hallucination in the answer q = self.alpha * sim_score + self.beta * feedback - self.gamma * hallucination self.scores.append(max(0.0, min(1.0, q))) return self.scores[-1] def avg_score(self): if not self.scores: return 0.0 return sum(self.scores) / len(self.scores) class LatencyAlarm: """Latency alarm based on p95 tail latency.""" def __init__(self, threshold_ms=300, window=100): self.threshold_ms = threshold_ms self.window = window self.latencies = [] def push(self, ms): self.latencies.append(ms) if len(self.latencies) > self.window: self.latencies.pop(0) def p95(self): if not self.latencies: return 0.0 ordered = sorted(self.latencies) idx = int(math.ceil(0.95 * len(ordered))) - 1 return ordered[max(0, idx)] def check(self): p = self.p95() return p, p > self.threshold_ms def psi(reference, current, bins=10): """PSI drift index: <0.1 stable, 0.1-0.25 slight, >0.25 significant.""" lo = min(min(reference), min(current)) hi = max(max(reference), max(current)) if hi - lo < 1e-9: return 0.0 width = (hi - lo) / bins edges = [lo + width * i for i in range(bins + 1)] eps = 1e-6 result = 0.0 for i in range(bins): lo_i, hi_i = edges[i], edges[i + 1] e_lo = sum(1 for v in reference if lo_i <= v < hi_i) e_hi = sum(1 for v in reference if i == bins - 1 and v == hi) a_lo = sum(1 for v in current if lo_i <= v < hi_i) a_hi = sum(1 for v in current if i == bins - 1 and v == hi) expected = e_lo + e_hi + eps actual = a_lo + a_hi + eps e_ratio = expected / (len(reference) + eps * bins) a_ratio = actual / (len(current) + eps * bins) result += (a_ratio - e_ratio) * math.log(a_ratio / e_ratio) return result def main(): random.seed(42) # 1) Answer quality monitoring monitor = QualityMonitor() for _ in range(200): sim = max(0.0, min(1.0, random.gauss(0.82, 0.06))) fb = max(0.0, min(1.0, random.gauss(0.78, 0.10))) hal = max(0.0, min(1.0, random.gauss(0.08, 0.04))) monitor.score(sim, fb, hal) print("Average answer quality: {:.3f}".format(monitor.avg_score())) # 2) Retrieval latency alarm: inject a slow query every 17 turns alarm = LatencyAlarm(threshold_ms=300) for i in range(100): if i % 17 == 0: alarm.push(420) else: alarm.push(max(40.0, random.gauss(180, 50))) p95, triggered = alarm.check() print("P95 latency: {:.0f}ms, alarm triggered: {}".format(p95, triggered)) # 3) Model drift detection between baseline and current distribution reference = [max(0.0, min(1.0, random.gauss(0.85, 0.04))) for _ in range(500)] current = [max(0.0, min(1.0, random.gauss(0.72, 0.09))) for _ in range(500)] drift = psi(reference, current) if drift < 0.1: state = "stable" elif drift < 0.25: state = "slight drift" else: state = "significant drift" print("PSI drift index: {:.4f}, state: {}".format(drift, state)) if __name__ == "__main__": main()
monitor.score(sim, fb, hal)按质量公式给每轮回答打分,幻觉越高分数扣得越狠,对应“试菜员给面条打分”。self.scores.append(max(0.0, min(1.0, q)))把分数截断到 0~1 区间,防止异常输入把指标推得不可读。alarm.push(420)每 17 轮注入一次 420ms 的慢查询,模拟生产环境中偶发的检索抖动。idx = int(math.ceil(0.95 * len(ordered))) - 1定位 P95 在排序数组中的位置,把“95% 请求都没超时”翻译成具体的延迟值。(a_ratio - e_ratio) * math.log(a_ratio / e_ratio)PSI 的单箱差异计算,衡量该区间内当前分布相对基线是“人变多了”还是“人变少了”。if drift < 0.1 ... else ...用 0.1 和 0.25 两个门槛把漂移状态分成稳定、轻微、显著三档,对应老张判定“酱油换没换”的尺子。
常见误区
误区看监控只看平均响应时间,平均值低于 200ms 就觉得系统很健康。反正均值这么低,偶尔慢几个请求无所谓。
正解平均延迟会被大多数快请求“稀释”掉。只要 95% 的请求够快,哪怕剩下 5% 慢到 10 秒,平均值照样好看。用户记住的永远是那 5% 的糟糕体验,好比面馆平均出餐五分钟,但每 20 桌就有一桌等半小时。所以必须用 P95/P99 这类尾部延迟指标盯住“最差的那批人”。
为何常见:均值是普通人最容易理解、最容易计算的统计量,而尾部延迟需要排序和百分位概念,直觉上不那么直观。
误区搞一个大屏,把 CPU、延迟、质量分全部画成花花绿绿的曲线,就觉得万事大吉。指标偶尔飘红了,心想“应该没事吧”,继续忙别的。
正解监控(看到数字)和告警(主动通知你)是两回事。曲线只在屏幕上闪,不会主动喊人;没有配置阈值和通知通道,深夜故障发生四个小时也没人知道。正确的做法是给每个关键指标配阈值、配分级、配值班人,让数字变成能叫醒人的火警铃。
为何常见:监控大盘肉眼可见、容易交付,而告警配置要思考阈值和响应流程,属于“看不见的功夫”,容易被轻视。
误区只要服务进程还活着、接口没报错,就认为系统一切正常。至于回答质量变差,归咎于“最近用户问的问题太难了”。
正解漂移恰恰是“看似正常地变坏”:进程活着,接口通着,但输入分布变了或者底座模型悄悄换了,回答风格和准确率缓慢下滑。它和突发的系统故障是两种病——故障是急性病,漂移是慢性病。PSI 这类分布对比工具,专门用来抓这种“温水煮青蛙”的变化。
为何常见:漂移没有错误码、没有报错日志,它只表现为统计分布上的一点一点偏移,肉眼很难在短时间窗口内察觉。
误区把新策略直接放给 50% 用户,跑两天看哪个组骂的人少,就拍板全量上线。觉得样本量越大越可靠,时间越短越高效。
正解A/B 测试的前提是控制变量、明确指标、样本量足够、结果通过显著性检验。放量太快可能带崩整体体验,跑得太短则分不清差异是真是假——运气波动在样本不足时能伪装成“显著提升”。t 检验就是用来过滤这种“假信号”的。
为何常见:“对比一下谁更好”是人的本能,但本能不会告诉你样本量、显著性、置信区间这些统计前提,于是实验很容易做成拍脑袋的遮羞布。
面试题
Q1. 在 RAG 客服系统的监控体系中,业务层指标主要衡量什么?
- A.CPU 与内存使用率
- B.回答质量与用户满意度← 正确答案
- C.向量库的索引数量
- D.大模型的参数规模
答案:B。业务层指标对应顾客的真实体验,即回答质量和用户满意度,相当于老张偷听顾客聊天。CPU 与内存属于基础层,索引数量和参数规模属于系统配置而非运行状态指标。
Q2. P95 延迟的含义是什么?
- A.95% 的请求比该值更快← 正确答案
- B.平均延迟乘以零点九五
- C.最慢的一次请求延迟
- D.最快请求与平均的差值
答案:A。P95 是把所有请求延迟升序排序后,排在第 95% 位置的值,代表“95% 的顾客出餐时间都短于这个值”。它不是平均延迟的 95%,也不是最慢值,而是一个百分位截点。
Q3. 在质量评分 Q=αS+βF−γH 中,符号 H 代表什么?
- A.用户好评率高低的得分
- B.检索命中知识条目的数量
- C.模型编造事实的严重程度← 正确答案
- D.客服对话轮次的长短指标
答案:C。H 代表 hallucination,即答案中幻觉的严重程度。质量分里它前面的系数是减号,说明幻觉越严重扣分越多,好比大厨报出根本不存在的原料。好评率和检索命中的是 S 和 F 的范畴。
Q4. PSI 漂移指数达到多少时,通常认为发生了显著漂移?
- A.大于 0.1 列为需要关注
- B.大于 0.25 视为显著漂移← 正确答案
- C.大于 0.5 必须立即回滚
- D.大于 1.0 模型直接下线
答案:B。工程惯例以 0.1 为关注线、0.25 为显著漂移线。大于 0.25 说明当前分布与基线偏离明显,需要人工介入定位根因。0.5 和 1.0 已经不是“检测”层面的事,而是应急止损动作。
Q5. 告警通道设计中最应避免的做法是什么?
- A.按级别通知对应角色
- B.全量告警推送给所有人← 正确答案
- C.为夜间设置静默时段
- D.记录告警处理全流程
答案:B。全量告警推送给所有人会导致“告警疲劳”——狼来了太多次,真正出事时反而没人响应。正确做法是分级分渠道通知,P0 电话、P1 群消息、P2 日报,让每条告警找到真正该处理它的人。
Q6. 模型漂移与系统故障的主要区别是什么?
- A.漂移是渐进而故障是突发← 正确答案
- B.漂移是突发而故障是渐变
- C.两者本质上没有区别
- D.漂移只影响速度不影响质量
答案:A。漂移是慢性病,质量一天天缓慢下滑,服务进程始终正常;故障是急性病,服务突然不可用或大量报错。这正是漂移危险的原因——它不会被错误率发现,只能靠分布对比才能抓到。
Q7. 关于 A/B 测试的实验结论,下列说法正确的是?
- A.只要样本量大结论就一定可靠
- B.差异必须通过显著性检验判定← 正确答案
- C.用户反馈良好就可以立刻全量
- D.每天更换分组才能保证公平
答案:B。样本量大只是前提,真正的判据是显著性检验——t 值超过临界值才能排除“抽样运气”。用户反馈好但差异不显著,仍然可能是偶然;每天更换分组则破坏了实验的稳定性,两者都不符合科学实验原则。
Q8. 检索延迟告警触发后,应从哪些环节排查慢查询?
- A.向量检索耗时日志分析← 正确答案
- B.重排序模型计算开销← 正确答案
- C.知识库文档的排版格式
- D.数据库连接池满负荷← 正确答案
答案:ABD。延迟链路通常由向量检索、重排序、大模型生成和数据库连接池等环节组成,A、B、D 都是链路上的常见瓶颈点。知识库文档的排版格式主要影响解析质量,不影响检索耗时的数量级。
Q9. 关于幻觉检测,常用的思路包括哪些?
- A.比对答案与上下文相似度← 正确答案
- B.检查答案中的知识库外实体← 正确答案
- C.调低温度参数消除幻觉现象
- D.抽取三元组并与知识库核对← 正确答案
答案:ABD。对比语义相似度、识别知识库中不存在的实体、抽取事实三元组做一致性校验,都是检测幻觉的可行手段。调低温度参数只能抑制幻觉的生成,属于缓解措施而非检测方法,二者不能混为一谈。
Q10. 监控数据沉淀后,可用于哪些持续优化?
- A.用低质量样本反哺标注集← 正确答案
- B.按热点问题扩充知识库← 正确答案
- C.删除历史日志节省存储
- D.训练自动质检模型← 正确答案
答案:ABD。低质量回答样本是有价值的标注素材,热点问题统计能指导知识库扩充,历史打分结果还能训练更聪明的自动质检器。删除历史日志只省了存储,却丢了最宝贵的优化弹药。