想象你是一座国际机场的负责人。每天成千上万的旅客(LLM请求)匆匆进出——有人问“我的银行卡号是多少”,有人让AI写一篇敏感议题的评论。如果没有边检站,会发生什么?你不知道谁入境了、他们带了什么行李(提示词与回复内容)、每架航班烧了多少油(Token成本)、航班是否准点(响应延迟)。更危险的是,旅客的护照信息(个人隐私)随意泄露,违禁品(违规内容)畅通无阻。 这正是LLM应用上线后,工程团队要面对的乱局。Langfuse与Phoenix就是LLM世界的“边检站与安检系统”:它们为每一次推理建立完整档案,在落库前用X光机给敏感信息贴上隐私标签,再用黑名单实时拦截违规内容,最后通过告警规则把异常情况通知值班员(拉响警报)。 这篇文章会用机场安检的比喻,带你搭建一套完整的LLM应用监控方案——从trace采集、PII脱敏、敏感词监控到告警规则设计,让AI应用在“看得见、守得住”的轨道上安全运行。

岗位关联

掌握LLM可观测性与内容安全监控,是AI工程师从“能调模型”走向“能扛生产”的关键一步——它决定你能否在故障发生前发现问题,在合规审查前堵住漏洞。

目录
  1. 可视化演示
  2. 为何监控LLM应用
  3. Langfuse可观测平台
  4. Phoenix可观测平台
  5. Trace采集配置
  6. PII扫描与脱敏
  7. 敏感词实时监控
  8. 告警规则设计
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态展示LLM输出经正则/NER两层检测、PII脱敏、监控告警的完整管线,切换正则/NER/混合/流式四种检测模式,观察PII标记与脱敏过程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

为何监控LLM应用

一座没有边检站的机场会发生什么?航班在跑道上乱成一团,旅客走丢没人知道,行李里混进危险品——因为没有任何记录与检查。LLM应用刚上线时也是这样:用户在前端输入提示词,模型在云端“黑箱”里生成回复,工程师对中间发生的一切一无所知。

这种盲区带来三个代价。第一是质量盲区:模型偶尔“胡言乱语”、循环重复、拒绝回答,没有监控记录,你就无法定位是哪一层出的问题。第二是成本失控:每次推理都要消耗Token,而Token直接对应真金白银的API账单。如果某个用户用超长提示词反复调用,月底账单会让人目瞪口呆。第三是安全与合规风险:用户的手机号、身份证号可能被模型原样输出,模型也可能生成违规内容——这些都需要被看见、被拦截。

因此,可观测性与监控不是“锦上添花”,而是LLM应用上生产的“入场券”。最基础的一个指标就是“可用性”——它衡量系统到底有多少请求真正成功返回:

有了这座边检站,机场才算基本运转起来。但光有“开门营业”还不够——接下来要做的,是给边检站配上更精细的记录系统和安检仪器。

A=N成功N总×100%\displaystyle A = \frac{N_{\text{成功}}}{N_{\text{总}}} \times 100\%
可用性 = 成功请求数 ÷ 总请求数 × 100%,是监控看板上第一行数字,也是评估边检站是否“正常运行”的底线指标。
  1. $N_{\text{总}}$统计周期内发送到LLM的所有推理请求总数,例如一天内的10万次调用。每条请求无论成功失败都计入。
    N总N_{\text{总}}
  2. $N_{\text{成功}}$其中模型正常返回、没有报错、没有超时的请求数量。一个请求只要超时就算失败。
    N成功N_{\text{成功}}
  3. $\frac{N_{\text{成功}}}{N_{\text{总}}}$用成功数除以总数,得到成功比例,取值在0到1之间。
    N成功N总\frac{N_{\text{成功}}}{N_{\text{总}}}
  4. $\times 100\%$将比值转换成百分比,方便设定SLA目标,比如“可用性≥99.9%”。
    ×100%\times 100\%

Langfuse可观测平台

每个旅客过关时,边检员都会翻开记录本,记下时间、航班、护照号、目的地。Langfuse就是LLM边检站的“电子记录本”。它是一个开源的LLM可观测性平台,把每次请求沉淀成一条结构化的档案,也就是"trace"。

trace是Langfuse的核心概念,指一次完整请求的生命周期:从用户输入提示词,到模型调用,再到最终输出。一条trace里可以包含多个"span"——每个span是链路中的一个环节,比如一次大模型调用、一次工具调用、一次向量检索。整个链路像一棵树:根是trace,树枝是span,最细的叶子是底层操作。

记录本上写什么?一是完整内容:原始提示词和模型回复,方便事后回溯“模型当时到底看到了什么”;二是性能数字:每个span的耗时、往返延迟;三是资源消耗:输入Token与输出Token的数量。有了这些,Langfuse的看板就能回答“哪个环节最慢、谁烧钱最多、哪类问题最频繁”。工程上最关注的性能指标之一是平均延迟——它直接决定用户体感:

记录本越详细,边检站越从容。Langfuse把每个“旅客”的完整旅程都写进档案,让后续的PII扫描和敏感词检测有了可操作的抓手。

Tˉ=1n∑i=1nTi\displaystyle \bar{T} = \frac{1}{n} \sum_{i=1}^{n} T_i
平均延迟 = 所有请求延迟之和 ÷ 请求数。它反映系统响应速度是否达标,相当于边检队伍平均排队时长。
  1. $T_i$第 $i$ 次请求的端到端延迟,单位通常是毫秒。每条trace都会记录这个值。
    TiT_i
  2. $\sum_{i=1}^{n} T_i$把 $n$ 次请求的延迟全部加起来,得到总延迟。比如3次请求分别耗时100、120、140毫秒,总和是360毫秒。
    ∑i=1nTi\sum_{i=1}^{n} T_i
  3. $\frac{1}{n}$除以请求数 $n$,得到算术平均值,即360 ÷ 3 = 120毫秒。
    1n\frac{1}{n}
  4. $\bar{T}$平均延迟的符号。对比版本发布前后的 $\bar{T}$,就能发现性能是否回退——相当于航班准点率下降的早期信号。
    Tˉ\bar{T}

Phoenix可观测平台

不是所有机场都有空间装下巨型记录本。Arize开源的Phoenix就像一座轻量边检站——一个可以在数据分析师“办公桌”(Notebook)上即开即用的工具。它同样能记录trace、追踪模型调用,但定位更偏向研究与调试。

Phoenix的特点是“轻”与“近”。轻:它可以嵌入Jupyter Notebook运行,拉起一个本地UI,即刻查看当前会话的推理链路;近:它离开发者的工作流更近,跑完一个实验就能立刻打开可视化面板分析结果,无需部署独立服务。Phoenix还支持OpenInference标准,使其能与主流框架(LangChain、LlamaIndex等)无缝对接。

Langfuse和Phoenix不是二选一的对手,而是互补的搭档:Langfuse适合在生产环境长期部署,持续采集线上流量;Phoenix适合在开发阶段快速分析,验证Prompt质量与模型行为。不少团队的做法是:开发期用Phoenix调优,上线后由Langfuse盯守。

无论是哪套系统,采集数据都会遇到一个核心权衡——采样率。全量采集数据翔实但成本高,按比例采样省钱但可能漏掉异常。采样率刻画了监控视野的大小:

无论是巨型记录本还是轻量备案簿,边检站的目标一致——把旅客信息完整、可控地留下来。下一节就看这些信息如何被自动采集。

r=NsampledNtotal\displaystyle r = \frac{N_{\text{sampled}}}{N_{\text{total}}}
采样率 = 实际记录请求数 ÷ 总请求数。它决定了监控系统能看到多大比例的流量。
  1. $N_{\text{total}}$窗口期内发生的全部推理请求数,例如10万次调用。
    NtotalN_{\text{total}}
  2. $N_{\text{sampled}}$其中被trace系统真正记录下来的请求数。如果设置了10%采样率,10万请求只记录1万条。
    NsampledN_{\text{sampled}}
  3. $r$采样率,取值在0到1之间。$r=1$ 是全量采集,$r=0.1$ 是10%采样。采样率越低,监控成本越低,但异常请求被漏掉的概率也越大。
    rr

Trace采集配置

光有记录本还不够,总不能靠边检员手写吧?Trace采集就是给边检站加装自动摄像头和感应闸机——SDK会自动记录每个请求,不需要业务代码手工上报。

以Langfuse为例,接入极其简单。首先初始化客户端,传入公钥与密钥:

然后,用 @observe() 装饰器标注需要追踪的函数,SDK会自动捕获函数参数、返回值、异常与耗时,并关联到同一条trace。对于装饰器覆盖不到的场景,可以手动创建 langfuse.trace() 对象,通过 trace.span() 开启子环节,再写入input/output/metadata等字段。所有数据会异步批量上报,不阻塞业务主流程。

Token消耗是trace中最容易被忽视却直接关乎账单的数字。每次推理的Token成本可以精确计算——输入Token和输出Token的单价不同,输出通常更贵:

摄像头装好了,每个旅客的影像自动入档。但入档之前,还有一道关键的安检工序——检查行李里有没有敏感个人物品。

C=cinput×Tinput+coutput×Toutput\displaystyle C = c_{\text{input}} \times T_{\text{input}} + c_{\text{output}} \times T_{\text{output}}
一次请求的成本 = 输入Token单价×输入Token数 + 输出Token单价×输出Token数。相当于航班油费按起飞和巡航分段计价。
  1. $T_{\text{input}}$提示词经过分词器后得到的输入Token数量。
    TinputT_{\text{input}}
  2. $T_{\text{output}}$模型生成回复中的输出Token数量。
    ToutputT_{\text{output}}
  3. $c_{\text{input}}$ 与 $c_{\text{output}}$每Token的输入单价和输出单价,由模型厂商定价。输出单价通常更高,因为生成比理解更“贵”。
    cinput, coutputc_{\text{input}},\ c_{\text{output}}
  4. 求和把输入成本与输出成本相加,得到单次请求的货币成本。把每条trace的成本汇总,就是月度AI账单。
    C=cinput×Tinput+coutput×ToutputC = c_{\text{input}} \times T_{\text{input}} + c_{\text{output}} \times T_{\text{output}}
python2 行
from langfuse import Langfuselangfuse = Langfuse(public_key="pk-...", secret_key="sk-...")

PII扫描与脱敏

安检机的传送带上,每一件行李都要过X光。当扫描到护照(身份证号)、钱包(银行卡号)、手机(电话号码)时,安检员不会大声念出全场旅客的隐私,而是给行李贴上“已标记”的隐私标签。PII扫描就是LLM监控中的那台X光机。

PII(Personally Identifiable Information,个人身份信息)包括身份证号、手机号、邮箱、银行卡号、住址等。Langfuse允许在写入存储前挂载“事件处理器”(event handler),对即将入库的提示词与回复做预处理。一个常见方案是:先用正则表达式匹配确定性强的模式(手机号 1[3-9]\d{9}、身份证 \d{17}[\dXx]),再用NER命名实体识别模型兜底,识别“人名+地址”这类没有固定规律的PII。

识别之后的脱敏策略有三种:掩码替换,如把 13812345678 变成 1385678;哈希脱敏,对敏感字段做不可逆的SHA-256摘要;截断,只保留前几位。生产实践中,掩码替换用得最多——它保留部分可读性,便于排查问题时确定“是哪一位用户”,又不暴露完整信息。

一次PII扫描是否到位,可以用脱敏率来衡量:

行李贴上隐私标签,旅客的个人信息就不再“裸奔”。但这只解决了“隐私泄露”问题,另一类更主动的安全风险——违规内容——还得靠黑名单来挡。

D=MmaskedPtotal×100%\displaystyle D = \frac{M_{\text{masked}}}{P_{\text{total}}} \times 100\%
脱敏率 = 已脱敏的敏感字段数 ÷ 应脱敏的敏感字段总数 × 100%。理想情况下应接近100%,相当于所有行李都贴上了隐私标签。
  1. $P_{\text{total}}$扫描文本中识别出的全部敏感字段总数。比如一条回复里同时出现手机号和邮箱,$P_{\text{total}}=2$。
    PtotalP_{\text{total}}
  2. $M_{\text{masked}}$其中真正完成掩码处理的字段数。
    MmaskedM_{\text{masked}}
  3. $\times 100\%$转为百分比。如果脱敏率低于100%,说明有敏感字段漏网,需要检查正则规则或NER模型是否覆盖不全。
    ×100%\times 100\%

敏感词实时监控

边检站除了查隐私,还要防违禁品。海关有一本厚厚的黑名单,上面写着违禁品名称——一旦某个旅客的行李里翻出对应物品,闸机立刻落下。LLM应用同样需要这样一本“黑名单”,用来拦截模型生成的违规内容。

敏感词监控覆盖的范畴远超“脏话”:包括暴力、色情、政治敏感、仇恨言论、诈骗话术等。技术实现上,最基础的是规则引擎:把敏感词列表加载进Trie树或AC自动机,在输出文本上做多模式匹配,命中即触发。但生产环境远没有这么简单——用户和模型都会“变形绕过”:谐音、拼音缩写、插入符号。因此,成熟方案会叠加语义分类模型,识别“没有命中关键词但语义违规”的句子。

监控动作分三级:一是“放行”,未命中任何规则;二是“替换”,命中后把敏感词替换为 * 再返回给用户;三是“拦截”,直接停止生成并触发告警。在电商客服、开放社区等场景,替换比硬拦截更温和——既阻止了违规,又不破坏对话体验。

敏感词检测器本身的效果,要用精确率与召回率来衡量——它们就像安检的“不误伤”和“不漏查”:

黑名单挡住了大部分违禁品。但安检员不可能24小时盯着屏幕——当异常情况出现时,还需要一套警报系统把值班员叫醒。

P=TPTP+FP,R=TPTP+FN\displaystyle P = \frac{TP}{TP + FP}, \quad R = \frac{TP}{TP + FN}
精确率 = 检出的违规中真违规的比例;召回率 = 真实违规中被检出的比例。两者常此消彼长,需要按业务场景取舍。
  1. $TP$真正被检出的违规输出数量(判断为违规且确实违规)。
    TPTP
  2. $FP$误报数量——正常内容被当成违规。$FP$ 多则精确率低,用户频繁被误伤。
    FPFP
  3. $FN$漏报数量——实际违规但没被检出。$FN$ 多则召回率低,违规内容混入输出。
    FNFN
  4. $P$ 与 $R$精确率与召回率。阈值调严,$P$ 升高而 $R$ 下降;调松则反之。发布前要结合业务场景在两者间取平衡点。
    P,RP, R

告警规则设计

机场控制中心里有一排指示灯:黄色表示“注意”,红色表示“立即响应”。警铃不会随便响——只有当旅客行为触发了明确规则(比如连续三次翻包可疑),控制中心才会向值班员发出通知。告警规则设计就是给LLM监控装上这样一套“分级警铃”。

规则的首要元素是阈值。例如:“每分钟PII命中率超过5%,触发警告”;“敏感词拦截率超过10次/分钟,触发紧急告警”。阈值不宜拍脑袋定,通常参考过去7天的基线:高于均值两倍标准差才告警,避免误报轰炸。

第二个元素是窗口。采样率决定视野,检测窗口决定灵敏度。阈值+滑动窗口,决定告警何时拉响:

第三个元素是渠道与升级。告警通知分流:P0级(如大规模PII泄露)立即发短信+调用值班电话;P1级(如某个会话反复命中敏感词)发Slack/钉钉;P2级(如延迟缓慢上升)只进日报。同时设置“静默”策略——同一类告警在30分钟内不重复发送,防止告警疲劳。规则之间还应联动:连续触发3次P1告警后自动升级为P0,把“人肉盯屏”变成“系统主动找人”。

警铃分级之后,控制中心不再鸡飞狗跳。到此,一座完整的LLM边检站落成:记录(trace)、安检(PII)、黑名单(敏感词)、警铃(告警),四道工序各司其职。

Rt=1N∑i=t−N+1tI(yi=1)\displaystyle R_t = \frac{1}{N} \sum_{i=t-N+1}^{t} I(y_i=1)
当前时刻往前N个请求中,违规请求的比例。窗口越短,反应越快,但抖动也越大;窗口越长越平稳,但反应滞后。
  1. $N$滑动窗口大小,例如最近100个请求为一个窗口。
    NN
  2. $I(y_i=1)$指示函数。第 $i$ 个请求若有违规则 $I=1$,否则 $I=0$。
    I(yi=1)I(y_i=1)
  3. $\sum_{i=t-N+1}^{t}$从窗口起点到当前时刻 $t$,把所有指示值相加,得到窗口内的违规总数。
    ∑i=t−N+1t\sum_{i=t-N+1}^{t}
  4. $\frac{1}{N}$求和后除以窗口大小,得到违规占比 $R_t$。当 $R_t$ 超过告警阈值,比如0.05,系统就触发告警。
    1N\frac{1}{N}

AI 应用场景

金融客服机器人的合规监控

阶段:推理日志采集与PII脱敏

解决的问题:银行客服机器人每天处理上万次对话,用户常不经意说出“我卡号是6222……”。若明文记录,一旦数据库泄露,后果是灾难性的。传统做法是事后人工抽查,既慢又漏。接入Langfuse后,PII处理器在trace落库前自动完成掩码,命中“转账”“贷款”等敏感场景时自动转人工。

具体案例:某消费金融公司引入Langfuse+Presidio脱敏方案,3周完成接入。上线后PII明文泄漏事件降为0,敏感词拦截率达到99.2%,并通过了银保监的数据合规检查。

AIGC社区的内容安全审核

阶段:生成内容实时检测与拦截

解决的问题:UGC平台允许AI生成短文案,非法内容一旦外发就不可撤回,靠用户举报的“事后删除”模式风险极高。需要“边生成边检测”的能力。

具体案例:某社区接入AC自动机敏感词引擎,并叠加语义分类模型做双通道审核。违规样本比例下降78%,误报率控制在2%以内;命中敏感词时自动替换为*,并同步在Phoenix中生成一条带拦截标记的trace供运营复盘。

企业私有化LLM网关的成本治理

阶段:Token计量与告警

解决的问题:企业内多部门共用一套LLM网关,月底成本分摊是“糊涂账”,个别部门疯狂调用导致整体预算超支。传统做法是看云厂商账单,但无法定位到具体项目和用户。

具体案例:在网关层集成Langfuse trace,为每个请求打上部门、项目标签,按“输入Token单价×输入数 + 输出Token单价×输出数”的公式自动折算成本,生成月度报表;当某部门成本超过阈值时,触发P1级告警通知财务负责人。

Python 演示

python70 行
import refrom datetime import datetime  class LLMMonitor:    PII_PATTERNS = {        "phone": re.compile(r"\b1[3-9]\d{9}\b"),        "id_card": re.compile(r"\b\d{17}[\dXx]\b"),        "email": re.compile(r"\b[\w.-]+@[\w.-]+\.\w{2,4}\b"),    }    SENSITIVE_WORDS = ["违禁品", "暴力袭击", "政治敏感词"]     def __init__(self):        self.trace_count = 0        self.pii_hits = 0        self.sensitive_hits = 0     def _mask_value(self, value):        if len(value) <= 8:            return value[0] + "****" + value[-1]        return value[:3] + "****" + value[-4:]     def mask_pii(self, text):        masked = text        for pattern in self.PII_PATTERNS.values():            masked = pattern.sub(lambda m: self._mask_value(m.group(0)), masked)        return masked     def check_sensitive(self, text):        for word in self.SENSITIVE_WORDS:            if word in text:                return True        return False     def record_trace(self, prompt, response, latency_ms):        self.trace_count += 1        raw = prompt + response        masked = self.mask_pii(raw)        if masked != raw:            self.pii_hits += 1        is_sensitive = self.check_sensitive(response)        if is_sensitive:            self.sensitive_hits += 1        return {            "trace_id": "tr-" + str(self.trace_count),            "time": datetime.now().isoformat(),            "latency_ms": latency_ms,            "masked": masked,            "sensitive": is_sensitive,        }  def main():    monitor = LLMMonitor()    samples = [        ("介绍北京", "故宫很好玩, 订票电话13812345678", 320),        ("讲个故事", "程序员小明的邮箱是test@example.com", 210),        ("如何投资", "不要相信高收益诱惑, 严禁暴力袭击宣传", 180),    ]    for prompt, response, latency in samples:        t = monitor.record_trace(prompt, response, latency)        flag = "敏感词拦截" if t["sensitive"] else "正常"        print("[%s] %s 耗时%dms 脱敏后:%s"              % (t["trace_id"], flag, t["latency_ms"], t["masked"][:42]))    print("PII命中:%d 敏感词命中:%d"          % (monitor.pii_hits, monitor.sensitive_hits))  if __name__ == "__main__":    main()
目的:用正则模拟PII识别与敏感词检测,模拟Langfuse的trace记录结构,演示“记录前脱敏+敏感词标记”的监控流程。
  1. masked = pattern.sub(lambda m: self._mask_value(m.group(0)), masked)把文本中所有匹配的敏感值替换为掩码版本,相当于X光机自动贴隐私标签。
  2. if masked != raw:通过比较掩码前后文本,判断本次请求是否包含PII,并累计命中次数。
  3. for word in self.SENSITIVE_WORDS:逐个检查回复是否命中敏感词黑名单,命中即标记违规。
  4. record_trace()组装与Langfuse结构相似的trace记录,含trace_id、时间、延迟、脱敏后文本。
  5. if __name__ == "__main__":保证脚本可直接运行,输出每条请求的监控结果与统计汇总。

常见误区

误区感觉系统把用户手机号脱敏了,用户手机上显示的也会变成1385678,体验很差。

正解脱敏只作用于“监控存储副本”。平台在把trace写入数据库前,用脱敏后的文本替换原文;用户看到的是模型原始输出,两者路径分离。你可以理解为:机场安检给行李贴的标签不影响旅客打开行李箱看到的东西,它只是让X光记录系统里看不到违禁品的细节。

为何常见:把“监控记录”和“用户可见内容”当成同一条数据流,混淆了存储层与应用层的边界。

误区看了官网截图感觉两个都是LLM追踪工具,既然功能几乎一样,按团队偏好选一个就行。

正解两者定位差异明显——Langfuse专注生产环境服务端部署,强调长期采集、多用户协作、成本统计;Phoenix强调轻量、Notebook内即开即用,适合开发阶段的交互式调试。成熟团队常用Phoenix做离线分析、Langfuse做线上监控,组合使用而非二选一。

为何常见:产品宣传页都把“LLM可观测性”放在最前面,功能列表相似度高,掩盖了使用场景的差异。

误区把敏感词列表存成数组,用“in“或”indexOf”判断回复里有没有这个词,感觉已经实现了监控。

正解真实生产场景里,绕写方式层出不穷——谐音、拼音缩写、插入标点、拆字组合。若只做精确匹配,漏检率会高得吓人。生产级方案需要AC自动机做高效多模式匹配,再叠加语义分类模型识别“没有关键词但语义违规”的句子,用精确率和召回率双指标持续评估。

为何常见:demo级别的规则匹配实现简单效果好,容易让人误以为生产环境同样可靠。

误区用len(text)数了一下提示词有30个字符,就以为消耗30个Token,从而严重低估成本。

正解Token是模型分词后的最小单元,中文通常1字≈1~2个Token,英文1词≈1.3个Token,标点和空格也占位。准确计量必须调用模型提供的tokenizer(如tiktoken)。监控平台统计的Token数来自tokenizer而非len(),两者差异可达2倍以上。

为何常见:日常处理字符串时习惯用字符数,忽略了模型内部先分词再推理的机制。

面试题

Q1. LLM应用监控中trace指的是什么?

单选题 · easy

  • A.一次完整请求的处理链路← 正确答案
  • B.程序运行时的堆栈信息
  • C.模型的训练日志记录
  • D.数据库的查询日志记录

答案:A。trace指一次完整请求的生命周期记录,从用户输入、模型调用到最终输出,链路中的所有span都属于它。堆栈信息、训练日志、数据库日志都不是LLM可观测性中trace的语义。

Q2. PII扫描应在什么时机执行?

单选题 · easy

  • A.模型推理前先扫描用户提示词
  • B.记录前识别并脱敏敏感信息← 正确答案
  • C.训练完成后批量清洗数据
  • D.用户输入前在后端统一拦截

答案:B。PII扫描必须在trace落库之前执行,否则敏感信息已经写入存储,事后清理困难。选项A只扫提示词漏掉了模型输出;C是训练阶段的事;D是业务拦截逻辑,与监控脱敏无关。

Q3. 以下哪种PII脱敏策略是可逆的?

单选题 · mid

  • A.哈希算法脱敏后不可还原
  • B.删除敏感字段后无法恢复
  • C.固定掩码脱敏可部分恢复
  • D.倒序存储可以通过反转还原← 正确答案

答案:D。倒序存储只是把字符串顺序反转,比如“138“存成”831”,程序反转即可还原,是可逆的。SHA-256哈希在密码学上不可逆;删除后数据彻底消失;固定掩码中间位被星号覆盖,也无法恢复完整原文。

Q4. Langfuse和Phoenix的定位差异是?

单选题 · mid

  • A.Phoenix面向生产Langfuse调试
  • B.Langfuse面向生产Phoenix研究← 正确答案
  • C.两者功能一致完全可以互换
  • D.两者都不支持API调用追踪

答案:B。Langfuse适合生产环境服务端部署,持续采集线上流量;Phoenix轻量,适合Notebook内交互式调试分析,常被用于研究阶段。两者互补而非互换。

Q5. 某LLM应用日均请求10万次,设置采样率0.1,则每日记录trace约多少条?

单选题 · mid

  • A.每天记录一万条trace数据← 正确答案
  • B.每天记录十万条trace数据
  • C.每天记录一千条trace数据
  • D.每天记录五万条trace数据

答案:A。采样率 r = 实际记录数 ÷ 总请求数。10万 × 0.1 = 1万条。采样率越低,监控成本越低,但漏掉异常请求的概率也越大。

Q6. 以下哪项不属于LLM应用监控的主要目标?

单选题 · easy

  • A.追踪用户输入与模型输出
  • B.统计Token消耗与运行成本
  • C.优化GPU服务器散热设计← 正确答案
  • D.检测敏感信息与违规内容

答案:C。LLM监控的三大目标是质量(追踪输入输出)、成本(Token统计)、安全(敏感信息与违规内容检测)。GPU散热属于基础设施硬件的功耗管理,不属于应用层可观测性范畴。

Q7. 关于敏感词监控中精确率与召回率的关系?

单选题 · mid

  • A.精确率越高质量越好无需召回
  • B.召回率越高质量越好无需精确
  • C.两者互相矛盾需要权衡选择← 正确答案
  • D.精确率与召回率始终成正比

答案:C。调严检测阈值,只有高置信度才算违规,精确率上升但部分违规被漏掉,召回率下降;调松则反之。两者通常此消彼长,需要按业务场景选平衡点,不存在“只优化一个”的银弹。

Q8. 构建LLM应用告警规则时应考虑哪些因素?

多选题 · mid

  • A.设定可量化的触发阈值← 正确答案
  • B.配置邮件Slack通知渠道← 正确答案
  • C.对同类告警进行静默合并← 正确答案
  • D.将所有日志都明文保存

答案:ABC。告警规则三要素是阈值、渠道、静默策略。阈值决定何时触发,渠道决定通知到谁,静默合并防止告警疲劳。D是错误做法,明文保存日志会放大PII泄露风险,正确做法是脱敏后入库。

Q9. 关于PII脱敏与敏感词监控的区别,正确的有?

多选题 · hard

  • A.前者关注身份后者关注违规← 正确答案
  • B.两者都在记录前执行脱敏← 正确答案
  • C.敏感词监控更需语义理解← 正确答案
  • D.两者完全可以互相替代

答案:ABC。PII关注手机号、身份证号等个人身份信息,敏感词关注暴力、色情等违规内容,对象不同。两者都应在记录前处理以降低风险。敏感词需要语义模型防变形绕过,PII主要靠正则+NER。D错误,它们解决不同层次的安全问题。

Q10. 生产环境LLM监控落地时,以下哪些做法正确?

多选题 · extreme

  • A.全量请求trace无采样成本高
  • B.含PII输出先脱敏再入库← 正确答案
  • C.敏感词命中自动替换并告警← 正确答案
  • D.Langfuse与Phoenix协同观测← 正确答案

答案:BCD。A错误——全量采集成本过高,生产环境一般按采样率记录,关键流量可全量。B正确,PII必须先脱敏再写存储。C正确,替换+告警是温和且可控的拦截方式。D正确,Phoenix用于开发调试、Langfuse用于生产盯守,协同覆盖全生命周期。