当前位置: 首页 > news >正文

【LLM推理优化与部署工程⑧】模型部署了,但没人知道它在干什么——出事了你都不知道

某公司部署了一个AI客服,运行了三周,看起来一切正常。直到有一天,客户投诉到了总经理那里——AI在过去两周里,一直在告诉用户一个错误的退款政策,金额说错了,时间说错了,几百个用户受影响。

技术团队翻日志,发现日志里只有这样的记录:

2024-03-01 09:23:11 - POST /chat - 200 OK - 1.2s 2024-03-01 09:23:45 - POST /chat - 200 OK - 0.9s

状态码200,响应时间正常,一切看起来很健康。

但AI说了什么、说得对不对,没有任何记录。

这是AI项目里最常见、最危险的盲区:你知道服务在运行,但不知道它在说什么、说得对不对、用户是否满意。


传统后端监控和AI监控的本质差异

传统API的监控很直接:状态码200就是成功,500就是失败,延迟超过阈值就告警。对错是确定性的。

AI系统的问题在于:200 OK不代表回答是对的。

模型可以在0.8秒内信心满满地给出一个完全错误的答案,HTTP层面看起来完美无缺。

# 传统API:对错是确定性的defget_user_balance(user_id:str)->dict:balance=db.query(user_id)# 要么查到,要么报错return{"balance":balance}# 结果是确定的# AI接口:对错是概率性的,你不知道它在说什么defai_answer_question(question:str)->dict:response=llm.generate(question)return{"answer":response}# HTTP 200,但answer对不对?不知道

这意味着AI项目的监控需要额外多做一件事:监控输出的内容质量,不只是监控系统的运行状态。


AI监控需要关注的四个层次

层次四:业务效果 用户有没有真正被帮到?问题有没有解决? 指标:任务完成率、用户满意度、用户是否重复问同一个问题 难点:需要追踪用户行为,不只是单次对话 层次三:输出质量 AI说的内容对不对?有没有幻觉?有没有风险内容? 指标:事实准确率、有害内容率、拒绝率是否异常 难点:需要LLM-as-Judge或规则检测,成本较高 层次二:用户体验 用户满不满意这次交互? 指标:点赞/踩率、对话轮次(多轮可能说明没解决问题)、退出时机 难点:需要前端埋点 层次一:系统运行 服务有没有在跑?速度正常吗?花了多少钱? 指标:TTFT、总延迟、错误率、Token消耗量、成本 难点:相对容易,传统监控工具大多能做

大多数团队只做了层次一,最多到层次二。层次三和四,做的人极少——但恰恰是这两层,能发现那个"三周内一直说错退款政策"的问题。


层次一:系统监控,五分钟搭起来

先把最基础的系统监控做好,这是一切的前提。

importtimeimportfunctoolsimportloggingfromdataclassesimportdataclass,fieldfromtypingimportOptional,Callable,Anyfromdatetimeimportdatetime logger=logging.getLogger(__name__)@dataclassclassLLMCallRecord:"""一次LLM调用的完整记录"""call_id:strtimestamp:strmodel:str# 输入prompt_tokens:intprompt_preview:str# 前100个字符,用于排查问题# 输出completion_tokens:intresponse_preview:str# 前100个字符# 性能ttft_ms:Optional[float]# 首token延迟total_latency_ms:float# 总延迟# 成本(根据你用的模型换算)cost_usd:float# 状态success:boolerror:Optional[str]=None# 业务信息user_id:Optional[str]=Nonesession_id:Optional[str]=Nonefeature_name:Optional[str]=None# 哪个功能调用的(客服/摘要/分类)deftrack_llm_call(model_name:str,feature_name:str,price_per_1k_input:float=0.001,# 根据实际模型价格填price_per_1k_output:float=0.002,):""" 装饰器:自动记录LLM调用的各项指标 用法:在你的LLM调用函数上加这个装饰器 """defdecorator(func:Callable)->Callable:@functools.wraps(func)asyncdefwrapper(*args,user_id=None,session_id=None,**kwargs):importuuid call_id=str(uuid.uuid4())[:8]start_time=time.perf_counter()record=LLMCallRecord(call_id=call_id,timestamp=datetime.now().isoformat(),model=model_name,prompt_tokens=0,prompt_preview="",completion_tokens=0,response_preview="",ttft_ms=None,total_latency_ms=0,cost_usd=0,success=False,user_id=user_id,session_id=session_id,feature_name=feature_name,)try:result=awaitfunc(*args,**kwargs)# 从结果里提取指标(根据你用的SDK调整)record.prompt_tokens=result.usage.prompt_tokens record.completion_tokens=result.usage.completion_tokens record.response_preview=result.choices[0].message.content[:100]record.total_latency_ms=(time.perf_counter()-start_time)*1000record.cost_usd=(record.prompt_tokens/1000*price_per_1k_input
http://www.jsqmd.com/news/739160/

相关文章:

  • 5个理由告诉你为什么gInk是Windows上最好的免费屏幕标注工具
  • Visual C++ Redistributable AIO:Windows运行库自动化部署架构革新
  • 离开山东那天,我在钱包里发现一张异地废卡 - 抖抖收
  • 终极激活指南:三步搞定Windows和Office永久激活难题
  • PREEMPT_RT 技术实现:Sleeping spinlocks
  • Helm Dashboard:Kubernetes包管理的可视化驾驶舱
  • CVE-2026-31431 PoC(含C代码的PoC)
  • 抽屉深处翻出的京东e卡,我是这样处理的 - 抖抖收
  • 从手动排版到一键生成:桌游设计师的卡牌制作效率革命
  • 麒麟KYLINOS系统盘空间告急?别慌!手把手教你用LVM在线扩容(附详细命令与避坑点)
  • Scroll Reverser:macOS多设备滚动方向终极解决方案
  • csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
  • 跨平台项目中QString 与 非Qt 跨平台动态库在字符集上的一个实用的互操作约定.
  • Taotoken API Key 的精细化管理与访问审计实践分享
  • 别再死记硬背了!AutoSar RTE里S/R Port的显式和隐式,用这个比喻一下就懂了
  • 2026压力传感器行业排名推荐之选 广东犸力品牌值得信赖 - 速递信息
  • 让旧款iOS设备重获新生:Legacy-iOS-Kit终极指南
  • spring boot集成redis缓存
  • 喜马拉雅VIP音频下载终极指南:3步实现付费内容本地化
  • OpenCore完整指南:专业硬件兼容性与系统引导解决方案
  • 魔兽争霸3终极优化神器:WarcraftHelper让你的经典游戏焕发新生
  • Figma中文插件:让全球设计工具说中文的智能本地化解决方案
  • 3年踩坑总结:工业现场Python点云处理必避的6个“反模式”(含YOLOv8+PointPillars融合部署避坑清单)
  • 华为光猫配置解密工具:AES算法实现与模块化架构设计深度解析
  • 京东e卡回收实测:会员到期后的处理方案 - 抖抖收
  • Taotoken用量看板如何帮助个人开发者监控API消耗
  • 3步掌握GlosSI控制器映射:解锁全平台游戏控制优化终极方案
  • 抖音视频怎么保存到相册?抖音视频保存到相册的方法汇总,2026实测有效 - 科技热点发布
  • tfstk最新算法
  • TaleStreamAI:AI小说推文全自动工作流技术解析与实战指南