想象你打算开一家“智能奶茶店”:白天自动接单,晚上不打烊,客人报一句“来一杯少冰三分甜的芋泥奶茶”,店员三秒内翻出配方、备好原料、做好奶茶递到窗口。RAG 客服系统,就是这样一家“知识奶茶店”——知识库是你进货的原料仓库,检索服务是翻菜单的点单员,生成服务是经验老到的奶茶师傅,而整个部署过程,就是把这家店从一张图纸变成现实、再开门迎客的全过程。 部署不是把代码跑起来那么简单,它像装修一家店:先画图纸(架构设计),再通水电(环境准备),接着进货备料(服务初始化),然后雇点单员和师傅(检索与生成服务),设好收银台(接口网关),最后是开业后的日常维护(运维保障)。本文就用这家“奶茶店”的搭建故事,带你走一遍 RAG 客服系统的完整部署流程。
对于 AI 从业者来说,掌握系统部署是把模型能力变现为稳定服务的最后一公里。懂部署,你才能让 RAG 客服从“能跑”变成“扛得住、可运维、敢上线”,这是从算法工程师走向全栈 AI 工程师的关键一步。
可视化演示
演示RAG客服系统的微服务部署架构、容器化编排扩缩容与监控告警链路,通过步进切换分阶段观察部署流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
微服务部署架构 网关分流请求 检索与推理服务 网关→检索→推理 按需独立扩缩容
部署架构设计
开奶茶店第一步不是买锅买料,而是画图纸:吧台放哪、后厨在哪、储物间多大,各区域既要独立又要协同。RAG 客服系统的部署也一样,先想清楚“谁负责什么”。一个典型的部署架构分为四层:客户端层(网页、小程序、App)、网关层(统一收口请求)、应用服务层(检索服务和生成服务)、数据层(向量数据库和业务数据库)。每层独立部署、通过 API 通信,像店铺里不同岗位各司其职,互不越界。
从图纸到施工,模块边界的划分直接决定日后的扩展性。检索服务只负责“查配方”,生成服务只负责“做奶茶”,网关只负责“接单和叫号”,职责单一、接口清晰。这样当大促流量暴增时,你可以只给检索服务多加几个“店员”,而不必重建整个店铺。
架构设计中最朴素也最关键的公式,是评估“需要几个员工同时上班”——即副本数估算:
图纸画清、数量算准,奶茶店的骨架就立起来了。接下来的装修才有章可循。
- $N_{\text{replicas}}$(副本数)需要部署的服务实例数量,相当于奶茶店要开的收银窗口数。
- $\left\lceil \cdot \right\rceil$(向上取整)只要有零头哪怕多一个请求,也得再多开一个实例,保证高峰不堵。
- $\text{QPS}_{\text{peak}}$(峰值流量)大促或热点事件时,每秒最多涌进多少请求。
- $\text{QPS}_{\text{per}}$(单实例吞吐)一个实例经过压测后确认能稳定承受的每秒请求数。
环境准备配置
图纸画好就开工,第一件事是通水电——没有稳定的水电,装修队根本无法干活。对部署而言,“水电”就是运行环境。Python 版本、CUDA 驱动、依赖库版本,任何一个不匹配,服务就会在启动时报出一堆看不懂的错误,就像电压不稳把电器烧坏一样。
环境准备最怕“在我机器上明明能跑”。解决这个问题要两手抓:一是用虚拟环境隔离,virtualenv 或 conda 给每个项目一个独立的“房间”,避免全局库互相污染;二是锁定依赖版本,用 requirements.txt 或 poetry.lock 把每个库的版本号固定下来,像菜谱精确标注“白糖 15 克”而不是“适量糖”。
密钥管理也是环境准备的重头戏。数据库密码、API Key 绝不能写进代码里,要通过环境变量或在部署平台配置 .env 文件注入。这样换环境时只改配置、不改代码,好比店铺换了新地址,只需改门牌号而不必重装修。估算部署资源时,内存是首要指标:
水电通畅、物料齐备,装修队才能放手干活。环境这关过了,后续部署才能少踩坑。
- $M_{\text{total}}$(总内存)服务启动并正常处理请求所需的全部内存。
- $M_{\text{base}}$(基础内存)加载模型、框架初始化等固定开销。
- $B$(批量大小)一次同时处理的请求数,batch 越大内存占用越高。
- $M_{\text{per}}$(单样本开销)处理一条请求平均需要的内存,用于估算扩容边界。
服务初始化
水电通了,就要进货备料。奶茶店要采购茶叶、牛奶、珍珠,还要提前煮好放冰箱备用。RAG 客服系统的“备料”就是服务初始化:把知识库的文档(产品手册、退换货政策、常见问题)加载进来,切分成适合检索的片段,再用 Embedding 模型把每段文字编码成向量,存入向量数据库构建索引。
这个环节有三道工序。第一,文档加载与切分:把 PDF、Word、网页等格式统一转成纯文本,按固定长度切成段落,相邻片段之间保留一定重叠,避免一句话被拦腰截断——就像切菜时每一段都带一点“连接筋”,保证营养不流失。第二,Embedding 编码:用 text-embedding 类模型把每段文本变成一串数字向量,向量的几何距离能反映语义远近。第三,向量索引构建:把海量向量组织成 ANN(近似最近邻)索引,让后续检索不用遍历全部数据也能秒级找到相似片段。
初始化完成后,向量库就像备好货的储物间,每件商品都有了自己的“坐标位”。当顾客提问时,点单员只需要按坐标找最近的几件货。衡量两段文本“口味是否接近”,靠的是余弦相似度:
备料越充分,点单员越好干活。知识库索引构建完成,服务初始化的“货架”就摆好了,等开业迎客。
- $\vec{q}$(查询向量)把用户问题经过 Embedding 编码后得到的向量,可以理解为“顾客想要的口味坐标”。
- $\vec{d}$(文档向量)知识库某一片段编码后的向量,代表“某款原料的风味坐标”。
- $\vec{q} \cdot \vec{d}$(点积)逐位相乘再求和,衡量两个向量在方向上的重合程度。
- $\lVert \vec{q} \rVert \cdot \lVert \vec{d} \rVert$(模长乘积)对向量长度做归一化,消除文本长短带来的偏差。
检索服务部署
原料备齐,该招点单员了。一位优秀的点单员拿到顾客的需求,不会把整本菜单背一遍,而是迅速锁定最匹配的几款推荐给后厨。检索服务就是这个“点单员”:接收用户问题,通过向量检索从知识库中召回最相关的 Top-K 个片段,再按相关度排序交给生成服务。
检索服务的部署要点在于“快”和“准”的平衡。向量检索直接按余弦相似度召回,速度快但偶尔“眼花”(把字面不同但语义相近的漏掉);因此实践中常用混合检索:同时跑向量检索和关键词检索,再用重排序模型(Reranker)对两类结果做一次精排,就像点单员先按口味筛一遍,再对照当季新品做二次推荐。
重排序时,需要一个综合分数来决定最终顺序。常用的融合策略是加权求和:
点单员眼疾手快还不够,他得知道什么情况下多信语义、什么情况下多信关键词。权重调好了,推荐才精准,后厨做出来的奶茶才合客人口味。
- $s$(最终得分)重排序后文档的最终相关度分数,分数高者排在前面。
- $\alpha$(融合权重)0 到 1 之间的超参数,部署时通过验证集调优。
- $s_{\text{vec}}$(语义分)向量检索给出的相似度得分,代表“口味对口”程度。
- $s_{\text{lex}}$(字面分)关键词匹配的得分,代表“点名命中”程度。
生成服务部署
点单员把订单递给后厨,奶茶师傅按标准配方开始制作。生成服务就是这位“师傅”:拿到检索回来的文档片段,把它们组装进提示词模板,再调用大语言模型生成自然流畅的客服回答。
生成服务的部署核心是提示词模板的设计。模板里通常包含系统指令(“你是某品牌的客服”)、检索到的上下文(“参考以下资料回答”)、用户问题(“顾客的提问”三部分)。模板要让模型明白:只能基于给定上下文回答,不知道就不要编。这就像师傅的配方卡:规定用什么料、加多少量、不能乱发挥。调用 LLM 时,要配置好超时时间、最大 token 数和重试策略——如果模型没在限定时间内答复,就自动换一个实例重试,避免顾客在柜台干等。
面向用户的体验优化,流式输出是关键。RAG 客服的回复往往较长,如果等全文生成完再返回,用户会觉得“卡住了”。流式输出(SSE)让模型边生成边推送文字,用户看到第一个字的时间从十几秒缩短到一两秒,体验从“死等”变成“看它打字”。生成过程本质上是在预测下一个词的概率链:
师傅手艺稳、配方标准,出品自然又快又好。但要想让上万名顾客同时点单不崩,光靠一个好师傅还不够,前台收银得先稳住。
- $P(w_{1T})$(整句概率):生成整段回答 $w_1$ 到 $w_T$ 的联合概率。
- $\prod_{t=1}^{T}$(连乘)把每一步的概率相乘,任何一步偏低都会拉低整体。
- $P(w_t \mid w_{<t})$(条件概率)已知前 $t-1$ 个词时,下一个词选 $w_t$ 的概率。
接口网关设计
现在轮到收银台登场。一家再好的奶茶店,如果收银台乱成一锅粥——顾客找不到点单入口、订单混进后厨、付了钱没小票——体验照样崩盘。网关就是系统的收银台:所有外部请求先进网关,由它统一鉴权、校验参数、路由转发到相应的后端服务。
接口网关设计的第一步是定义清晰的 REST 接口。比如 RAG 客服系统至少要有两个端点:POST /chat(对话入口)和 GET /health(健康检查探针)。请求体用 Pydantic 模型校验,字段缺失或类型错误在网关处就直接拒绝,不让脏数据流到后厨。第二步是鉴权:通过 API Key 或 JWT 验证调用方身份,像收银台先确认顾客是不是会员、有没有优惠资格。第三步是路由与限流:把对话请求转发给生成服务,把检索请求转发给检索服务;当请求量超过阈值时,网关直接返回“客满请稍后再试”,保护后端不被冲垮。
网关层的吞吐能力决定了整个系统能接多少客,衡量指标是 QPS:
收银台理顺了,点单、付款、传菜一气呵成。客人多起来之后,怎样让店不排队、不混乱?这就是性能优化的课题了。
- $\text{QPS}$(每秒查询数)系统每秒能处理多少请求,类似收银台每秒能结几单。
- $N_{\text{requests}}$(请求总数)在一段时间里进入系统的请求总量。
- $T_{\text{seconds}}$(时间秒数)统计所跨越的时长,通常取 1 秒或 60 秒做均值。
性能优化策略
奶茶店生意火爆,高峰期队伍排到门口。店长开始想办法:把卖得最好的几款奶茶提前做好(缓存),多开几个窗口同时接单(并发),把相似订单合并制作(批处理)。RAG 客服系统的性能优化也是这三板斧。
第一板斧是缓存机制。把高频问题(如“怎么退货”)的问答结果缓存到 Redis,命中后直接返回,不再走检索和生成链路。缓存命中率越高,平均响应延迟越低,大模型调用的成本也越低。第二板斧是并发与批处理。Embedding 模型支持批量编码,把多个请求的文本合并成一个 batch 再送入模型,GPU 利用率能提升数倍;同时用异步框架(FastAPI 的 async 端点)和连接池,避免线程空转和数据库连不上。第三板斧是吞吐与延迟的平衡:通过压测找出系统的性能拐点,为网关限流设定合理阈值,宁可排队也不能宕机。
衡量缓存优不优化,核心看命中率:
缓存让老顾客秒取奶茶,并发让新顾客不用久等,限流让店不至于被挤爆。店开得又稳又快,下一步就是开业后的长久经营。
- $h$(命中率)缓存中被直接命中的请求占比,数值在 0 到 1 之间。
- $n_{\text{hit}}$(命中次数)请求的内容在缓存中直接找到了答案的次数。
- $n_{\text{miss}}$(未命中次数)缓存中没有现成答案、需要回源计算的次数。
上线运维保障
开业只是开始,真正考验店长的是日复一日的经营:每天打烊要盘点库存(日志)、设备要定期检修(监控)、遇到停电要有应急方案(容灾回滚)。RAG 客服系统上线后的运维保障,决定它能稳定运行多久。
首先,日志系统要完善。每个请求从进网关到出结果的完整链路都应记录:耗时、命中的知识片段、生成的回答、是否出错。用 ELK(Elasticsearch + Logstash + Kibana)集中收集和检索日志,出了问题能快速定位“是哪一环掉链子”。其次,健康检查不能停。部署平台(如 Kubernetes)会定期调用 /health 端点探活,发现服务无响应就自动重启或摘除流量,像店里的自动报警器,设备坏了立刻通知店长。最后,版本回滚要有预案。每次发布新版本前,保留上一版的镜像和数据库备份,一旦新版本出现严重故障,能在几分钟内切回旧版,避免长时间停业。
衡量系统“稳不稳”的经典公式是可用性:
日志是药店的病历,健康检查是血压计,回滚是备胎。这三样备齐,奶茶店才能让顾客每天都放心推门进来——AI 客服系统也才能真正扛住生产环境的风雨。
- $A$(可用性)系统在总时间中能正常服务的比例,99.9% 意味着一年只允许宕机约 8.7 小时。
- $\text{MTBF}$(平均故障间隔时间)两次故障之间平均能正常运行多久。
- $\text{MTTR}$(平均修复时间)从故障发生到恢复服务平均需要多久。
AI 应用场景
电商大促的客服扩容
阶段:部署架构设计与性能优化
解决的问题:传统客服在大促期间人工接线量暴增,排队等待动辄几分钟,大量用户在“转人工”环节流失。RAG 客服系统通过水平扩容(增加实例副本)+ 网关限流 + 缓存热问,在几秒内应答常见问题,人工只处理长尾复杂诉求。
具体案例:某电商平台在“双十一”前一周用本文的副本数公式估算出需要 16 个 RAG 客服实例,配合 Redis 缓存“物流时效”“退换货规则”等高频问题,系统扛住了每秒 2000+ 的峰值请求,人工客服量下降 60%。
金融企业的私有化部署
阶段:环境准备、服务初始化与生成服务部署
解决的问题:银行、保险等机构对数据安全要求极高,客户数据不能出域,不能调用公有云 LLM API。RAG 客服系统需在客户内网完成部署:环境隔离、私有向量库、本地大模型服务全部部署在防火墙内。
具体案例:某保险公司将产品条款、理赔流程等 3000 份文档导入内网向量库,用本地部署的开源模型作为生成服务,通过 /health 探活保证服务连续性,实现“数据不出大楼”的客服问答能力。
多语言跨国客服的流式输出
阶段:接口网关设计与生成服务部署
解决的问题:跨国电商需要客服系统支持多语言实时应答,传统“人工翻译+邮件回复”效率极低。RAG 客服通过网关统一接收多语言请求,生成服务用流式输出(SSE)即时返回回答,配合检索服务的混合检索策略提升跨语言召回准确率。
具体案例:某出海品牌在东南亚上线 RAG 客服,用户提问用英语或本地语言均可,检索层先做语义向量召回、再经重排序筛选,生成层按用户语言输出。流式输出让首字延迟低于 1.5 秒,客服满意度提升 35%。
Python 演示
import osimport timeimport uvicornfrom fastapi import FastAPI, Header, HTTPExceptionfrom pydantic import BaseModel # 部署配置全部从环境变量读取,避免密钥写死在代码里DATA_DIR = os.getenv("DATA_DIR", "./data")LLM_MODEL = os.getenv("LLM_MODEL", "gpt-4o-mini")API_KEY = os.getenv("API_KEY", "")CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", "200"))CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", "50")) app = FastAPI(title="RAG 客服系统")knowledge = [ {"id": 1, "text": "退货政策:签收后 7 天内可无理由退货", "vector": [1.0, 0.2, 0.0]}, {"id": 2, "text": "退款时效:退货成功后 3 个工作日原路退回", "vector": [0.2, 1.0, 0.1]}, {"id": 3, "text": "优惠券不可叠加使用,每单限用一张", "vector": [0.0, 0.1, 1.0]},] def load_and_chunk(file_path, chunk_size=CHUNK_SIZE, overlap=CHUNK_OVERLAP): with open(file_path, "r", encoding="utf-8") as f: text = f.read() chunks = [] start = 0 while start < len(text): piece = text[start:start + chunk_size] if piece: chunks.append(piece) start += chunk_size - overlap return chunks def embed(text): # 生产环境替换为真实 embedding 模型,例如 text-embedding-3-small return [1.0, 0.0, 0.0] def search(query, top_k=2): qv = embed(query) scored = [] for doc in knowledge: dot = sum(a * b for a, b in zip(qv, doc["vector"])) scored.append((dot, doc)) scored.sort(reverse=True) return [doc["text"] for _, doc in scored[:top_k]] class ChatBody(BaseModel): question: str @app.get("/health")def health(): return {"status": "ok", "uptime": round(time.time(), 2)} @app.post("/chat")def chat(body: ChatBody, authorization: str = Header(default="")): if API_KEY and authorization != f"Bearer {API_KEY}": raise HTTPException(status_code=401, detail="invalid api key") docs = search(body.question) context = "\n".join(docs) # 生产环境替换为真实 LLM 调用,例如 OpenAI 兼容接口 answer = f"根据知识库,{context}。请问还有其他可以帮您的吗?" return {"question": body.question, "answer": answer, "sources": len(docs)} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)
/health 健康检查和 /chat 对话接口),演示了从启动到探活的全流程。DATA_DIR = os.getenv("DATA_DIR", "./data")从环境变量读取配置并带默认值,换环境只改变量不改代码。API_KEY = os.getenv("API_KEY", "")密钥从环境变量注入,避免硬编码泄露。CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", "50"))切分重叠量也做成可配置,方便调优。def load_and_chunk(...)按固定长度切分文档,相邻片段保留重叠,防止语义断裂。start += chunk_size - overlap滑窗前进的步长是“长度减重叠”,保证每个片段都有上下文衔接。def search(query, top_k=2)检索服务入口:编码问题向量,遍历知识库算相似度。scored.sort(reverse=True)按相似度降序排序,取前 Top-K 个片段。@app.get("/health")健康检查端点,部署平台靠它判断服务是否存活。@app.post("/chat")对话接口,先鉴权、再检索、后拼接生成。if API_KEY and authorization != f"Bearer {API_KEY}"网关层校验 Bearer Token,非法请求直接 401。uvicorn.run(app, host="0.0.0.0", port=8000)服务启动入口,监听所有网卡端口 8000。
常见误区
误区我本地跑得好好的,部署到服务器上肯定也没问题,直接 `pip install` 装最新依赖就行。
正解依赖库的版本升级可能引入不兼容变化,比如新版 transformers 改了 API 签名,代码就起不来了。部署时务必用 requirements.txt 或 poetry.lock 锁定所有依赖的精确版本,像菜谱写明“白糖 15 克”而不是“适量糖”。
为何常见:本地开发时环境是逐步搭建的,很少有人会完整重装一次,导致“能跑”是运气而非可复现的结果。
误区API Key 和数据库密码写进代码文件里没关系,反正仓库是私有的。
正解一旦仓库被分享、开源或泄露,所有密钥全部曝光,攻击者能直接调用你的 LLM 接口刷爆账单。正确做法是通过环境变量或配置中心注入密钥,让代码仓库里只有“变量名”没有“秘密”。
为何常见:写死在代码里最省事,而安全问题要等出事才被感知,人们天然倾向于先做容易的事。
误区功能测试通过就说明系统可以上线了,压测是性能团队的事,和我无关。
正解RAG 客服是典型的高并发在线服务,不压测就不知道 QPS 上限和 GPU 显存瓶颈。用 Locust 或 wrk 模拟真实流量做压测,才能算出副本数、配好网关限流阈值,避免开业第一天就被挤爆。
为何常见:功能正确性看得见摸得着,性能问题要到流量峰值才暴露,容易产生“应该没事”的侥幸心理。
误区服务挂了直接重启就行,重启能解决 90% 的问题,不需要搞什么健康检查。
正解手动重启无法感知依赖服务的状态——向量库连不上、模型加载失败、GPU 显存溢出,这些都不会因为一次重启而消失。Kubernetes 的 liveness/readiness 探针会持续调用 /health,发现异常自动摘流量,该扩容扩容、该重启重启,绝不把故障抛给用户。
为何常见:开发环境服务模型小、依赖少,重启确实立竿见影;但生产环境的故障链路长得多,重启只是表面安抚。
面试题
Q1. 部署 RAG 客服系统时,最推荐用哪种方式隔离 Python 依赖?
- A.系统全局 pip install
- B.使用虚拟环境隔离依赖← 正确答案
- C.手工拷贝 site-packages
- D.修改系统 Python 路径
答案:B。虚拟环境(virtualenv/conda)能为每个项目创建独立的依赖空间,避免全局库版本互相冲突,这正是奶茶店“每个房间独立配电”的思路。全局安装和手工拷贝都会导致环境不可复现。
Q2. 关于部署配置中的密钥(API Key),正确做法是?
- A.写死在代码中方便调试
- B.存放在公开的配置仓库
- C.通过环境变量注入密钥← 正确答案
- D.提交到 Git 便于共享
答案:C。密钥属于敏感信息,必须通过环境变量或配置中心注入,代码仓库里只放变量名不放真实值。写死在代码、提交到 Git 都可能在仓库泄露时导致密钥暴露。
Q3. 检索服务中,近似最近邻(ANN)索引的主要作用是?
- A.压缩向量存储的维度
- B.提升相似度计算精度
- C.在亿级向量中快速召回← 正确答案
- D.完全替代生成式模型
答案:C。ANN 索引通过聚类或图结构组织向量,把需要线性遍历的相似度计算变成“先定位区域再精搜”,在亿级向量中也能毫秒级召回,相当于奶茶店按口味分区存放原料,点单员不用翻遍整个仓库。
Q4. RAG 客服系统部署时,向量索引构建失败最可能的原因是?
- A.前端样式表配置错误
- B.Embedding 维度不一致← 正确答案
- C.数据库表字段太冗余
- D.用户浏览器缓存过期
答案:B。索引构建时要求所有文档向量的维度一致。如果文档切分后部分文本走了不同的 Embedding 模型,向量维度不同,索引就会报错,就像储物架的格子尺寸不统一,东西塞不进去。
Q5. 网关层进行限流的目的是?
- A.强制用户完成人机验证
- B.保护后端避免流量打垮← 正确答案
- C.提升单次回答文本长度
- D.削减知识库的文档数量
答案:B。限流是网关的“刹车阀”,当请求量超过后端承受能力时,网关直接拒绝超量请求,保证已有请求能正常完成。这就像奶茶店门口排队超过容量时先暂停进店,避免后厨全面瘫痪。
Q6. 关于部署后健康检查(health check),正确理解是?
- A.只检查进程是否还活着
- B.探活且检查依赖服务状态← 正确答案
- C.每次探活都重启服务进程
- D.健康检查仅在前台生效
答案:B。健壮的 /health 不仅要返回进程存活,还应顺带验证向量库连接、模型可用性等依赖状态,并返回当前服务的负载情况。只检查进程活着,如同只看到店门开着却不知道后厨失火。
Q7. 部署中使用 Docker 的主要好处是?
- A.让代码运行速度显著变快
- B.统一运行环境消除环境差异← 正确答案
- C.替代所有自动化功能测试
- D.自动生成业务运营统计报表
答案:B。Docker 把代码、依赖、运行环境一起打包成镜像,在任何机器上都能保持一致的运行结果,解决了“在我机器上能跑”的经典问题。它不改变代码运行速度,也不能替代测试和报表。
Q8. 以下属于部署性能优化手段的有哪些?
- A.Redis 缓存热门问答数据← 正确答案
- B.异步处理配合复用连接池← 正确答案
- C.每次请求重新加载模型
- D.批量处理 Embedding 请求← 正确答案
答案:ABD。缓存减少重复计算,异步与连接池提升并发利用效率,批量 Embedding 提高 GPU 利用率,这三者都是部署期的关键优化手段。每次请求重新加载模型是典型反模式,会拖慢响应几个数量级。
Q9. 关于版本回滚,正确做法包括?
- A.保留上一版本的镜像包← 正确答案
- B.回滚前对数据库做备份← 正确答案
- C.回滚后无需做任何验证
- D.用 CI/CD 记录版本号← 正确答案
答案:ABD。回滚前保留旧镜像和数据库备份是基本保障,CI/CD 记录版本号让你能准确“回到哪一版”。回滚后必须重新走健康检查和核心用例验证,直接跳过验证可能在新旧版本间反复横跳。
Q10. 关于系统可用性,以下哪些表述正确?
- A.平均故障间隔时间 MTBF 越长越好← 正确答案
- B.平均修复时间 MTTR 越短越好← 正确答案
- C.单次请求生成的 Token 数影响可用性
- D.故障恢复速度直接影响可用性数值← 正确答案
答案:ABD。可用性公式 $A = \frac{\text{MTBF}}{\text{MTBF} + \text{MTTR}}$ 说明:MTBF 越长(越不容易坏)、MTTR 越短(坏了修得快),可用性越高。Token 数只影响单次响应的时长,不决定系统能否持续服务。