1. 项目概述:当开源大模型遇上经典压测工具

最近在搞一个智能问答系统的性能评估,团队里有人提议用Open-AutoGLM,有人坚持用JMeter,两边争得不可开交。这让我想起一个老段子:你有一把锤子和一把瑞士军刀,到底该用哪个来拧螺丝?其实,很多时候答案不是二选一,而是怎么让锤子敲钉子、军刀开瓶盖,各司其职还能互相配合。Open-AutoGLM和JMeter的对比与协同,就是这么回事。Open-AutoGLM,简单说,是一个围绕智谱AI的ChatGLM系列大模型构建的开源自动化框架,它能帮你自动化处理与大模型交互的很多任务,比如批量提问、结果评估、报告生成。而JMeter,则是性能测试领域的老牌“瑞士军刀”,从HTTP接口到数据库,从消息队列到TCP连接,几乎无所不压。

表面上看,一个专注AI对话,一个专注系统压测,井水不犯河水。但当你需要评估一个集成了大模型能力的应用时,比如一个智能客服、一个AI写作助手,或者一个内容审核系统,问题就来了。你光用JMeter压测接口,能知道模型回复的质量和稳定性吗?你光用Open-AutoGLM去批量问问题,能知道系统在高并发下的响应时间和吞吐量吗?显然不能。所以,这个“终极对比”的目的,绝不是要分个高下,而是要把两者的边界画清楚,再把它们能“握手”的五个关键场景给挖出来,实现“1+1>2”的协同优化。这适合所有正在或计划将大模型能力集成到产品中的开发者、测试工程师和架构师,帮你构建更立体、更可靠的AI应用质量保障体系。

2. 核心思路拆解:划清边界,找准握手区

要谈协同,先得明白各自的核心能力圈和局限性。我们不能指望用螺丝刀去砍树,也不能用斧头去拧螺丝。

2.1 Open-AutoGLM的核心价值与测试盲区

Open-AutoGLM的设计初衷,是降低开发者使用、评估和迭代ChatGLM系列模型的门槛。它的核心能力集中在“模型交互与评估”这个层面。

它能做什么(核心价值):

  1. 自动化对话流水线 :你可以定义好一系列问题(Prompt),它帮你批量、自动地发送给模型(可以是本地部署的,也可以是API),并收集回复。这比手动在网页里一个个问效率高太多了。
  2. 多维度的结果评估 :这是它的杀手锏。除了基础的响应时间,它更关注回复的“质量”。比如,通过内置或自定义的评估器(Evaluator),可以判断回复的相关性、流畅性、信息完整性,甚至是否符合特定格式(如JSON)。这对于需要模型输出结构化数据的场景至关重要。
  3. 报告与可视化 :自动生成测试报告,对比不同模型版本或不同参数(如temperature)下的表现,直观展示效果提升或回退。
  4. Prompt工程辅助 :方便地进行A/B测试,比较不同Prompt设计对输出结果的影响。

它的测试盲区:

  1. 并发压力能力弱 :Open-AutoGLM虽然可以多线程运行,但其设计重点不在模拟海量用户并发。它的线程更多是为了加速批量任务处理,而非制造系统级压力。你很难用它来精确测量系统在1000个用户同时访问时的吞吐量极限。
  2. 缺乏系统资源监控 :它不关心你的服务器CPU、内存、磁盘IO在测试期间是否爆了。而这些指标,对于评估一个AI服务能否稳定运行至关重要。
  3. 协议支持单一 :主要围绕HTTP/HTTPS与模型API交互,对于更底层或更复杂的协议(如WebSocket、gRPC、JDBC)无能为力。
  4. 场景编排能力有限 :对于需要模拟复杂用户行为链路的场景(如先登录、再查询、后提交),其编排能力不如专业的性能测试工具灵活。

注意 :Open-AutoGLM的评估器(Evaluator)是其灵魂。常见的如 StringMatchEvaluator (字符串匹配)、 EmbeddingSimilarityEvaluator (向量相似度)、 LLMAsJudgeEvaluator (用大模型当裁判)。选择合适的评估器,是保证测试结果可信度的关键。

2.2 JMeter的强项与面对AI的短板

JMeter是Apache旗下的开源性能测试工具,它的核心是“模拟用户行为,施加系统压力”。

它的强项:

  1. 强大的并发模拟 :通过线程组(Thread Group)、定时器(Timer)等元件,可以精确控制并发用户数、加压速率(如阶梯加压Ramp-Up)、持续时间,真实模拟生产环境流量。
  2. 全面的协议支持 :HTTP、HTTPS、FTP、JDBC、LDAP、SOAP、TCP、Java等,几乎覆盖了所有常见后端通信方式。
  3. 完善的资源监控与报告 :通过插件(如PerfMon Metrics Collector),可以实时监控服务器CPU、内存、网络、磁盘等资源使用情况,并与性能曲线关联分析。生成的HTML报告内容丰富,包含响应时间、吞吐量、错误率等关键指标。
  4. 灵活的场景编排 :逻辑控制器(Logic Controller)可以实现复杂的测试逻辑,如循环、条件判断、随机选择等,配合取样器(Sampler)和断言(Assertion),能构建出非常贴近真实用户的操作流。

面对AI应用时的短板:

  1. 无法评估内容质量 :JMeter可以断言HTTP状态码是否为200,可以检查响应体里是否包含某个关键字。但它完全无法判断一个大模型返回的300字回答是否“答非所问”、“胡言乱语”或者“格式错误”。这是功能正确性的问题,而JMeter只擅长性能正确性。
  2. 处理长文本和流式响应麻烦 :大模型的回复往往是长文本,甚至是以流式(Server-Sent Events)的方式返回。JMeter对解析和验证长文本、处理流式响应支持不够友好,需要编写复杂的后置处理器(如JSON Extractor)和脚本来处理。
  3. 难以模拟智能对话上下文 :一个多轮对话中,后一轮的问题依赖于前一轮的回答。在JMeter中实现这种动态的、基于内容的上下文传递,需要大量使用“正则表达式提取器”或“JSON提取器”来抓取上一轮的回复内容,并拼接成下一轮的Prompt,配置复杂且容易出错。
  4. 测试数据构造复杂 :对于需要大量、多样、符合语义的测试问题(Prompt),JMeter通常需要依赖CSV文件或数据库。维护一个高质量的、覆盖各种边界的Prompt测试集,在JMeter中是一件繁琐的事情。

2.3 协同优化的总体思路

基于以上分析,协同的思路就清晰了: 让专业的工具做专业的事,并在它们之间建立数据和流程的桥梁。

  • JMeter的角色 系统压力施加者与基础设施监控者 。负责模拟高并发用户请求,冲击系统的接入层、服务层,收集接口级别的性能指标(RT、TPS、错误率)和服务器资源数据。它回答的问题是:“这个AI服务能扛住多少流量?在压力下资源消耗是否正常?”
  • Open-AutoGLM的角色 AI功能正确性验证者与内容质量评估者 。负责在特定压力背景下(可以是JMeter制造的压力下),执行精心设计的Prompt测试集,并对模型的每一次回复进行智能化的质量评估。它回答的问题是:“在压力下,AI模型回复的内容质量是否下降了?是否出现了更多的幻觉或格式错误?”

两者的握手,就发生在“测试场景”、“测试数据”和“结果分析”这三个环节。接下来,我们就深入那五个核心协同场景。

3. 五大核心协同场景深度解析

这里讲的不是简单的先后顺序使用,而是有机融合,让两个工具的数据流和任务流产生交互。

3.1 场景一:压力背景下的内容质量衰减测试

这是最经典、最重要的协同场景。目标是验证系统在高并发时,AI服务的响应内容是否依然可靠。

传统做法的局限 :只用JMeter压测,你看到接口响应都返回200,平均响应时间也还行,就认为服务正常。但很可能模型因为计算资源被挤占,回复开始变得敷衍、跑题甚至乱码。这些“功能错误”在JMeter的报告中是完全隐形的。

协同方案设计:

  1. 双轨并行测试
    • 轨道A(JMeter) :部署一个线程组,以较高的并发数(如100线程)持续向AI服务接口发送一个“轻量级”或“缓存型”请求。例如,发送一个简单的“你好”,或者请求一个无需调用大模型的健康检查接口。目的是持续给服务后端(包括GPU/CPU、内存、网络)施加压力,模拟生产环境的高负载状态。
    • 轨道B(Open-AutoGLM) :在JMeter压力启动并稳定后,启动Open-AutoGLM测试套件。这个套件包含一组精心设计的、用于评估模型核心能力的“黄金问题集”(Golden Dataset)。例如,包含事实问答、逻辑推理、创意写作、格式输出等不同维度的Prompt。
  2. 执行与数据关联 :Open-AutoGLM在压力背景下执行测试,记录每个问题的响应时间和 内容质量评分 。同时,通过时间戳,将Open-AutoGLM的测试执行时段与JMeter的监控图表(CPU使用率、内存使用率、接口RT)进行关联。
  3. 结果分析 :对比分析在系统压力(高CPU/内存)期间和空闲期间,Open-AutoGLM评估出的内容质量分数(如相关性得分、格式正确率)是否有显著差异。如果发现压力下质量分数骤降,即使JMeter的接口成功率仍是100%,也意味着服务出现了严重质量劣化,需要扩容或优化。

实操心得 :JMeter的压力请求最好与Open-AutoGLM的评估请求调用同一个服务的不同端点或参数,避免评估请求本身被JMeter的压力流量淹没或干扰。同时,Open-AutoGLM的测试节奏可以放慢(如每隔10秒测一个黄金问题),以观察在不同压力波动阶段的质量变化。

3.2 场景二:复杂多轮对话链路的性能与正确性联合测试

很多AI应用不是一问一答,而是多轮对话,且后文依赖前文。

协同方案设计:

  1. 用Open-AutoGLM设计并验证对话流 :首先,在无压力环境下,使用Open-AutoGLM开发和调试一个复杂的多轮对话测试脚本。利用其便捷的上下文管理能力,确保每一轮的问题能正确引用上一轮的回答,并且最终输出的结果符合预期。这相当于完成了功能测试用例的开发和验证。
  2. 将验证过的对话流“翻译”成JMeter脚本 :把Open-AutoGLM脚本中每一轮的Prompt和预期的上下文提取逻辑,转化为JMeter中的取样器(HTTP Request)和后置处理器(JSON Extractor/正则表达式提取器)。例如,第一轮问“介绍下巴黎”,从返回的JSON中提取出模型回答里关于“首都”的描述,存储到一个JMeter变量 city_intro 中;第二轮的问題就变成“ city_intro 这个城市有哪些美食?”,其中 city_intro 会被变量替换。
  3. JMeter执行压力测试 :使用JMeter线程组来并发执行这个翻译好的、包含多轮交互的测试脚本,从而测试整个对话链路在高并发下的性能。
  4. 结果校验 :JMeter的断言(Assertion)可以检查接口状态和基础关键字。但对于回答质量的深度校验,可以在压测结束后,抽样提取一部分JMeter的请求和响应日志(JTL文件),导入或手动用Open-AutoGLM的评估器进行离线批量质量评估,检查压力下对话的连贯性和准确性是否受损。

工具选型理由 :Open-AutoGLM在设计和调试阶段更高效直观;而JMeter在模拟大规模用户执行相同复杂链路时,其并发控制和资源监控能力无可替代。

3.3 场景三:测试数据集(Prompt库)的共建与共享

高质量、多样化的测试Prompt是评估AI系统的基石。两者可以共享这个基石。

协同工作流:

  1. Open-AutoGLM作为Prompt库管理器和质量标定器
    • 利用Open-AutoGLM的框架,维护一个结构化的Prompt测试库(可以是YAML、JSON或数据库)。为每个Prompt打上标签,如 领域: 科技 类型: 事实问答 难度: 高
    • 对新加入的Prompt,先用Open-AutoGLM在基准模型上运行,并使用评估器生成一个“基准质量分数”和“标准回复样例”,作为后续测试的对比基准。
  2. JMeter消费共享的Prompt库
    • 将Open-AutoGLM维护的Prompt库导出为CSV文件。
    • 在JMeter中使用 CSV Data Set Config 元件来读取这个CSV文件。这样,JMeter的每个虚拟用户(线程)在发起请求时,都能从共享库中读取不同的Prompt作为请求参数,实现了测试数据的多样化和真实化。
  3. 价值 :避免了在JMeter中维护一堆难以理解和管理的测试数据。Open-AutoGLM确保了Prompt的质量和覆盖度,JMeter则利用这些高质量数据发起更真实的压力测试。

3.4 场景四:全链路压测中的AI服务节点专项评估

在微服务或全链路压测中,AI服务可能只是链路上的一个环节。需要评估这个环节在整体流量洪峰下的表现。

协同方案设计:

  1. JMeter模拟全链路流量 :使用JMeter构建一个完整的用户业务场景,例如“用户登录 -> 浏览商品 -> 向AI客服咨询商品信息 -> 下单”。AI客服咨询是这个链路中的一个步骤(一个HTTP取样器)。
  2. 在AI调用点植入探针 :在JMeter脚本中,当调用AI服务接口时,不仅发送请求和接收响应,还可以通过JSR223 Sampler等元件,将关键的元数据(如 请求时间戳 线程ID 使用的Prompt )和 响应体全文 ,异步写入到一个共享的消息队列(如Kafka)或日志文件。
  3. Open-AutoGLM进行异步消费与评估 :启动一个Open-AutoGLM的后台服务,实时或定时从消息队列/日志中消费这些请求-响应对。利用其评估引擎,对每一次AI调用进行内容质量评分。
  4. 关联分析 :最终,你可以得到两张图:一张是JMeter生成的全链路性能大盘(包括AI接口的RT、TPS);另一张是Open-AutoGLM生成的内容质量随时间/压力变化的曲线。将两者叠加,就能精准定位:当全链路TPS达到某个阈值时,AI服务的响应时间是否飙升,同时内容质量是否开始滑坡。

这个场景实现了 性能与功能质量在真实业务场景下的联动监控 ,对于设定AI服务的SLA(服务水平协议)至关重要。

3.5 场景五:模型版本发布前后的回归测试与基准对比

在升级ChatGLM模型版本(例如从ChatGLM3-6B升级到ChatGLM3-12B)或微调模型后,需要评估新版本在性能和效果上是否有提升或倒退。

协同方案设计:

  1. 建立基准(Baseline) :在旧版本模型上,使用Open-AutoGLM运行完整的“黄金问题集”,记录每个问题的响应时间、质量分数以及token消耗(如果API支持)。同时,用JMeter对旧版本服务进行一轮标准压力测试(如100并发,持续5分钟),记录性能基准。
  2. 测试新版本 :部署新版本模型服务后, 完全复用 上述的Open-AutoGLM测试套件和JMeter压力测试脚本。
  3. 自动化对比分析
    • Open-AutoGLM会自动生成新老版本的对比报告,清晰展示在相同问题下,内容质量分数(如准确性、相关性)的变化。
    • JMeter的测试报告可以对比响应时间、吞吐量、错误率等性能指标。
  4. 决策支持 :如果新版本模型在Open-AutoGLM评估中效果显著提升,但JMeter压测发现其吞吐量下降了一半,那么就需要权衡:是接受更慢的速度换取更好的效果,还是需要进一步做性能优化?反之,如果性能提升但效果下降,则可能是一个失败的升级。

这个场景将“模型效果评估”和“服务性能评估”标准化、自动化,为模型迭代提供了数据驱动的决策依据。

4. 实操配置与关键步骤详解

理论说完了,我们来点实在的。以**场景一(压力下的质量衰减测试)**为例,展示一个具体的协同测试配置流程。

4.1 环境与工具准备

  • AI服务 :一个基于ChatGLM的智能问答API服务,假设接口为 POST http://your-ai-service/v1/chat ,请求体为JSON格式 {"prompt": "你的问题"}
  • JMeter :版本5.6以上,安装 PerfMon 插件用于服务器监控。
  • Open-AutoGLM :从GitHub克隆最新代码,并按照其文档安装依赖。
  • 被测试服务器 :部署AI服务的机器,需要安装 ServerAgent (PerfMon插件配套的代理),以允许JMeter监控其资源。

4.2 JMeter压力轨道配置

  1. 创建线程组 :命名为“背景压力”。线程数设为50,Ramp-Up时间设为30秒,循环次数设为“永远”。
  2. 添加HTTP请求取样器
    • 名称: 背景压力请求
    • 协议: http
    • 服务器名称: your-ai-service
    • HTTP请求: POST
    • 路径: /v1/chat
    • 在“Body Data”中填入一个简单的、计算量小的请求,例如:
      {"prompt": "请说你好"}
      
  3. 添加监听器
    • 查看结果树 :调试用,正式压测时可禁用。
    • 聚合报告 :查看整体性能指标。
    • 用表格查看结果 :查看样本详情。
    • PerfMon Metrics Collector :添加需要监控的服务器指标(CPU, Memory, Network I/O)。

这个线程组的目的不是做功能测试,而是持续消耗后端资源,制造负载。

4.3 Open-AutoGLM质量评估轨道配置

  1. 准备测试套件YAML文件 :创建一个 quality_test.yaml
    # quality_test.yaml
    model: # 模型配置,指向你的服务
      type: openai_api
      api_base: "http://your-ai-service/v1"
      model_name: "chatglm3"
      api_key: "dummy" # 如果服务不需要,可填任意值
    
    dataset: # 数据集,即我们的“黄金问题集”
      type: csv
      path: "./golden_questions.csv"
      # CSV格式:question, expected_keyword (可选)
      # 例如: "爱因斯坦的相对论主要讲了什么?", "时空弯曲"
    
    evaluators: # 评估器
      - type: string_match  # 检查回复中是否包含预期关键词
        args:
          pattern: "{expected_keyword}"
      - type: llm_as_judge  # 使用大模型本身作为裁判,评估相关性
        args:
          judge_prompt: "请判断以下回答是否与问题相关。回答:{response}。问题:{question}。只输出‘相关’或‘不相关’。"
          expected_output: "相关"
    
    runner: # 运行器配置
      type: concurrent
      args:
        num_workers: 5 # 使用5个并发worker,不要太高,避免干扰成为压力源本身
    
  2. 准备 golden_questions.csv 文件 :包含20-50个涵盖不同维度的问题。
    question,expected_keyword
    请用Python写一个快速排序函数,def quick_sort
    太阳系最大的行星是什么,木星
    简述光合作用的过程,叶绿体
    ...
    

4.4 协同执行流程

  1. 启动JMeter背景压力 :运行配置好的JMeter测试计划。通过 PerfMon 监听器观察服务器CPU、内存使用率,等待其稳定在一个较高水位(例如CPU使用率稳定在70%以上)。此时,系统处于“压力状态”。
  2. 在压力状态下执行Open-AutoGLM :在终端执行命令 opengl -c quality_test.yaml 。Open-AutoGLM会以5个并发worker,依次读取CSV中的问题,向AI服务发起请求,并使用两个评估器进行评分。
  3. 收集结果
    • JMeter侧:保存聚合报告和PerfMon监控数据。
    • Open-AutoGLM侧:运行结束后会生成一个详细的报告文件(如 results.json 或HTML),包含每个问题的响应时间、是否通过关键词检查、LLM裁判给出的相关性判断等。
  4. 关联时间线分析 :记录Open-AutoGLM开始和结束的时间点。在JMeter的监控图表中,定位这个时间区间。对比这个压力区间和之前无压力时(单独运行Open-AutoGLM)的结果。

关键参数解析

  • JMeter线程数 :取决于你想制造多大压力。目标是让服务器资源(特别是GPU/CPU)出现明显瓶颈,但又不能直接压垮服务导致大量错误。需要反复调整找到临界点。
  • Open-AutoGLM的 num_workers :不宜设置过高。它的任务是“抽样检测”,而不是“施加压力”。通常设置为3-10,确保能较快完成测试集即可。设置太高,它本身就会成为压力源,干扰测试目标。

5. 常见问题与排查技巧实录

在实际协同测试中,你会遇到各种坑。以下是一些典型问题及解决思路。

5.1 资源争抢导致测试相互干扰

问题现象 :当JMeter高并发压测时,Open-AutoGLM的请求超时或失败率极高,无法完成质量评估。 排查与解决

  1. 隔离网络或资源 :最理想的方式是将JMeter的压力机和Open-AutoGLM的执行机部署在不同的物理机或虚拟机,确保它们之间没有CPU/网络资源的直接争抢。
  2. 调整优先级与配额 :如果必须在同一环境,可以考虑使用 cgroups (Linux)或任务管理器(Windows)为Open-AutoGLM进程分配一定的CPU和内存保障,并降低其进程的nice值,使其在资源紧张时仍能获得一定调度。
  3. 错峰执行 :如果测试目的是观察“持续压力下”的质量,那么干扰是预期的。如果只是想获取“压力峰值时刻”的质量快照,可以尝试让Open-AutoGLM在JMeter压力测试启动后稍等片刻(如1分钟),待压力稳定但尚未达到峰值时快速执行。

5.2 结果时间戳同步与关联分析困难

问题现象 :无法精确地将Open-AutoGLM的某次低质量回复,对应到JMeter监控图中具体的资源峰值时刻。 排查与解决

  1. 统一时钟源 :确保JMeter压测机、Open-AutoGLM执行机以及被监控服务器的系统时间通过NTP服务同步,误差在毫秒级。
  2. 在请求中植入链路追踪ID :改造AI服务,使其在每个请求的响应头中返回一个唯一ID(如 X-Trace-Id )。在JMeter和Open-AutoGLM的请求配置中,都记录下这个ID和时间戳。
    • 在JMeter中,可以通过 BeanShell PostProcessor JSR223 PostProcessor 来记录。
    • 在Open-AutoGLM中,可以通过自定义的回调(Callback)或修改其HTTP客户端来实现。
  3. 使用中央日志系统 :将JMeter的采样结果(含时间戳、TraceID)和Open-AutoGLM的评估结果(含时间戳、TraceID、质量分)都发送到同一个ELK(Elasticsearch, Logstash, Kibana)或时序数据库(如InfluxDB)中。通过TraceID进行关联查询,可以完美实现跨工具的数据透视。

5.3 Open-AutoGLM评估器(Evaluator)选择不当

问题现象 :评估结果不稳定,或者无法有效检测出内容质量的退化。 排查与解决

  1. 理解评估器原理
    • StringMatchEvaluator :简单关键字匹配,速度快但不智能,适合检测固定格式输出(如JSON key)。
    • EmbeddingSimilarityEvaluator :将问题和回答都转化为向量,计算余弦相似度。比关键字匹配更灵活,能捕捉语义相似度,但依赖于嵌入模型的质量。
    • LLMAsJudgeEvaluator :用另一个(通常更强的)大模型来评估回答质量。最灵活、最接近人类判断,但成本高、速度慢。
  2. 组合使用评估器 :对于关键测试项,可以采用“漏斗式”评估。先用 StringMatch 检查必备关键词(快速失败),再用 LLMAsJudge 进行深度相关性或有用性评估。在Open-AutoGLM配置中,可以顺序定义多个评估器,只有全部通过才算测试通过。
  3. 定期校准评估器 :特别是 LLMAsJudge ,其评判标准可能存在漂移。需要定期用一批人工标注好的“标准问答对”去校验它,确保其评估标准与你的业务要求一致。

5.4 JMeter处理AI长响应或流式响应的问题

问题现象 :AI返回的JSON很大(包含长文本),或者使用Server-Sent Events (SSE)流式返回,JMeter解析困难,内存占用高,甚至导致OOM(内存溢出)。 排查与解决

  1. 对于大JSON响应
    • 在HTTP请求的“高级”选项卡中,勾选“ Use KeepAlive ”并合理设置超时。
    • 使用 JSON Extractor JSON JMESPath Extractor 插件时,只提取你真正需要的字段,而不是保存整个响应体。
    • 增加JMeter堆内存。修改 jmeter.bat jmeter.sh 中的 HEAP 参数,例如设置为 -Xms4g -Xmx8g
  2. 对于SSE流式响应
    • JMeter原生对SSE支持不友好。可以考虑两种方案:
      • 方案A(推荐) :在测试架构前增加一个适配层。让JMeter向一个简单的代理服务发送请求,由这个代理服务去处理SSE流,等流完全结束后,将最终完整内容返回给JMeter。这样对JMeter透明。
      • 方案B :使用JSR223 Sampler编写Groovy或Java代码来处理SSE连接。但这需要较强的编程能力,且性能开销大,不适合高并发压测。
    • 根本性建议 :性能压测时,可以考虑让AI服务提供一个“非流式”的测试接口,或者关闭流式返回,以简化测试复杂度。毕竟压测首要关注的是服务端处理能力和资源消耗,流式传输的客户端体验在此场景下优先级可降低。

协同优化的道路从来不是单一的,正是这些细节上的磨合与突破,让Open-AutoGLM和JMeter从两个独立的工具,融合成一套评估AI应用健壮性的组合拳。记住,没有最好的工具,只有最适合场景的组合。

更多推荐