国产大模型应用成本优化实战:从计费解析到降本增效方案
最近在调研将大模型能力集成到公司内部系统时面对各家厂商的报价单一个直观的感受是成本压力巨大。无论是按Token计费还是包月套餐当业务量稍微起来账单数字就变得相当“可观”。这不仅是个人开发者或小团队的困境即便是中型企业在规划规模化应用时也必须精打细算。本文将围绕“国产大模型应用成本”这一核心议题深入拆解其计费模式、成本构成并提供一套从技术选型、优化策略到落地实践的全方位降本增效方案。无论你是正在评估大模型技术的架构师还是负责具体集成的开发工程师都能从中找到可复用的思路和代码级的解决方案。1. 国产大模型成本现状与核心挑战1.1 主流计费模式解析当前国内主流大模型厂商如百度文心、阿里通义、腾讯混元、智谱GLM、月之暗面Kimi等的API服务收费方式主要分为以下几类理解这些模式是成本控制的第一步。1. 按量计费按Token这是最常见的模式费用与输入Prompt和输出Completion的总Token数量直接挂钩。输入Token单价通常低于输出Token。例如某模型输入可能为0.005元/千Tokens输出为0.02元/千Tokens。计费公式总费用 (输入Token数 * 输入单价 输出Token数 * 输出单价)特点灵活用多少付多少适合低频、不定量的场景。但Token消耗速度可能远超预期尤其是生成长文本时。2. 预付费资源包厂商出售固定Token数量的资源包价格通常比按量计费有一定折扣。例如购买1000万Tokens的资源包价格200元相当于0.02元/千Tokens混合均价。特点适合用量可预估的场景能锁定成本避免突发流量导致账单失控。但存在过期风险且如果业务调整可能造成浪费。3. 按QPS/并发套餐针对企业级高频调用场景提供不同等级的查询每秒速率QPS或并发连接数套餐按月或按年收费。例如基础版10 QPS每月5000元企业版100 QPS每月30000元。特点适合有稳定、高并发需求的在线服务。成本固定便于财务预算但若实际QPS远低于套餐则单价偏高。4. 私有化部署一次性支付软件授权费可能高达数十万至数百万并自行承担服务器硬件、运维和电费成本。特点数据完全私有网络延迟低长期看可能更经济。但初始投入巨大且需要专业的MLOps团队进行模型维护、更新和优化。1.2 成本为何“感觉”很高除了直接的API调用费以下几个隐性因素加剧了“用不起”的感受Prompt工程试错成本寻找最佳提示词Prompt需要反复调用、测试这些“实验性”调用同样产生费用。上下文长度Context Length为处理长文档或多轮对话需要使用支持长上下文如128K、200K Tokens的模型。这类模型单价更高且每次调用即使只问最后一句也需要为整个上下文付费。非结构化数据预处理将PDF、图片、表格等内容转化为模型可理解的文本例如通过OCR、解析需要额外的处理步骤和成本。流量波动与冗余调用简单的重试机制、未优化的批处理、无效的查询都会产生不必要的费用。多模型调用策略为平衡效果与成本可能采用“小模型路由大模型精调”的策略但策略本身的开发和维护也有成本。2. 环境准备与成本监控基础在开始优化前必须建立成本可观测性。盲目优化等于闭眼开车。2.1 搭建一个简单的成本监控代理我们可以创建一个轻量级的Python代理服务在调用大模型API的同时记录每次请求的Token消耗和费用。项目结构llm_cost_monitor/ ├── config.yaml # 配置文件存放API Key和单价 ├── cost_tracker.py # 成本追踪核心类 ├── proxy_server.py # 简易代理服务器 └── requirements.txt # 依赖1. 安装依赖 (requirements.txt)fastapi0.104.0 uvicorn0.24.0 httpx0.25.0 pydantic2.5.0 pyyaml6.02. 配置文件 (config.yaml)model_pricing: # 示例价格请替换为实际厂商价格 qwen-plus: # 以通义千问Plus为例 input_price_per_1k_tokens: 0.008 # 元/千Tokens output_price_per_1k_tokens: 0.020 ernie-4.0: # 以文心4.0为例 input_price_per_1k_tokens: 0.012 output_price_per_1k_tokens: 0.024 api_keys: aliyun: your_aliyun_api_key_here baidu: your_baidu_api_key_here proxy: host: 127.0.0.1 port: 80003. 成本追踪核心类 (cost_tracker.py)import json import time from typing import Dict, Any, Optional from pydantic import BaseModel import yaml class LLMCallRecord(BaseModel): 单次API调用记录 model: str timestamp: float prompt_tokens: int completion_tokens: int total_tokens: int cost_cny: float user_id: Optional[str] None project: Optional[str] default class CostTracker: 成本追踪器 def __init__(self, config_path: str config.yaml): with open(config_path, r, encodingutf-8) as f: self.config yaml.safe_load(f) self.pricing self.config.get(model_pricing, {}) self.records: list[LLMCallRecord] [] def calculate_cost(self, model: str, prompt_tokens: int, completion_tokens: int) - float: 根据Token数计算费用元 if model not in self.pricing: print(f警告: 未找到模型 {model} 的定价费用记为0) return 0.0 price self.pricing[model] input_cost (prompt_tokens / 1000) * price[input_price_per_1k_tokens] output_cost (completion_tokens / 1000) * price[output_price_per_1k_tokens] return round(input_cost output_cost, 4) def add_record(self, record: LLMCallRecord): 添加调用记录 self.records.append(record) # 简单打印日志生产环境应写入数据库或日志系统 print(f[成本记录] 模型:{record.model}, 输入Token:{record.prompt_tokens}, f输出Token:{record.completion_tokens}, 费用:{record.cost_cny}元) def get_daily_cost(self, date_str: Optional[str] None) - float: 获取某日总成本简化版按记录时间判断 # 实际应根据record.timestamp和date_str进行过滤 total sum(r.cost_cny for r in self.records) return total def export_records(self, filepath: str): 导出记录到JSON文件 with open(filepath, w, encodingutf-8) as f: json.dump([r.dict() for r in self.records], f, indent2, ensure_asciiFalse) # 全局追踪器实例 tracker CostTracker()4. 简易代理服务器 (proxy_server.py)这个代理会拦截应用发出的请求添加计费逻辑后再转发给真实的大模型API。from fastapi import FastAPI, Request from fastapi.responses import JSONResponse import httpx import asyncio from cost_tracker import tracker, LLMCallRecord import json app FastAPI(titleLLM Cost Proxy) # 假设我们代理阿里云DashScope API TARGET_BASE_URL https://dashscope.aliyuncs.com/api/v1 app.post(/v1/chat/completions) async def proxy_chat_completion(request: Request): 代理聊天补全请求 client httpx.AsyncClient(timeout30.0) # 1. 获取原始请求体 body await request.json() model body.get(model, qwen-plus) # 2. 转发请求到真实API (需配置真实API Key此处从config读取) headers { Authorization: fBearer {tracker.config[api_keys][aliyun]}, Content-Type: application/json } target_url f{TARGET_BASE_URL}/chat/completions try: response await client.post(target_url, jsonbody, headersheaders) response.raise_for_status() result response.json() # 3. 提取Token使用量并计费 usage result.get(usage, {}) prompt_tokens usage.get(prompt_tokens, 0) completion_tokens usage.get(completion_tokens, 0) cost tracker.calculate_cost(model, prompt_tokens, completion_tokens) # 4. 记录本次调用 record LLMCallRecord( modelmodel, timestampasyncio.get_event_loop().time(), prompt_tokensprompt_tokens, completion_tokenscompletion_tokens, total_tokensprompt_tokens completion_tokens, cost_cnycost, user_idbody.get(user) # 可从请求中提取用户/项目标识 ) tracker.add_record(record) # 5. 返回结果可在结果中添加成本元数据 result[_cost_metadata] { prompt_tokens: prompt_tokens, completion_tokens: completion_tokens, estimated_cost_cny: cost } return JSONResponse(contentresult) except httpx.HTTPStatusError as e: return JSONResponse( status_codee.response.status_code, content{error: fUpstream error: {e.response.text}} ) finally: await client.aclose() if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8000)运行与测试将你的API Key填入config.yaml。运行代理服务器python proxy_server.py将你的应用程序中的大模型API endpoint从https://dashscope.aliyuncs.com/api/v1改为http://127.0.0.1:8000/v1。所有调用都将被代理成本自动记录并打印。这个监控基础搭建好后我们才能清晰地看到钱花在了哪里为后续优化提供数据支撑。3. 核心优化策略从提示词到系统架构3.1 提示词Prompt优化最直接的省钱手段低效的Prompt是成本浪费的首要原因。优化Prompt不仅能省钱还能提升效果。1. 精简指令避免冗余# 低效示例指令冗长包含大量无关上下文 prompt_inefficient 你是一个AI助手。请仔细阅读以下用户问题并给出全面、准确、详细的回答。 用户可能来自不同背景请确保回答通俗易懂。 现在问题是请解释什么是机器学习 记住回答要友好。 # 高效示例指令清晰、简洁 prompt_efficient 用通俗语言解释机器学习的概念。优化原则删除所有不必要的礼貌用语、重复说明和开放式引导。直接、明确地表达任务。2. 使用结构化指令和少样本学习Few-Shot对于复杂任务提供1-3个高质量的示例比用长篇大论描述规则更有效、更省Token。# 少样本Prompt示例情感分析 few_shot_prompt 请判断以下文本的情感倾向积极/消极/中性 示例1: 文本: “这部电影太精彩了演员演技在线” 情感: 积极 示例2: 文本: “服务很差等了半个小时也没人理。” 情感: 消极 现在请判断 文本: “产品功能符合预期但物流有点慢。” 情感: 3. 设定明确的输出格式和长度限制# 明确要求JSON输出和字数限制 structured_prompt 请根据用户输入提取公司名、产品和情绪。 以JSON格式输出键为company, product, sentiment。 输出不超过100字。 用户输入我刚买了苹果的手机体验非常流畅就是价格有点高。 这能防止模型生成冗长、散漫的回答精确控制输出Token。3.2 缓存与去重避免为相同问题重复付费很多业务场景下用户会提出相似甚至相同的问题。为每个请求都调用大模型是巨大的浪费。实现一个基于语义相似度的问答缓存import hashlib from sentence_transformers import SentenceTransformer import numpy as np import faiss # 高效的向量相似度搜索库 import json class SemanticCache: def __init__(self, model_nameparaphrase-multilingual-MiniLM-L12-v2): self.encoder SentenceTransformer(model_name) self.index faiss.IndexFlatL2(384) # 向量维度根据模型而定 self.cache_dict {} # 存储向量对应的答案 self.text_to_hash {} def _get_hash(self, text: str) - str: 生成文本的语义哈希简化版实际可用向量聚类 return hashlib.md5(text.encode()).hexdigest() def add(self, question: str, answer: str): 将问答对加入缓存 q_hash self._get_hash(question) if q_hash in self.cache_dict: return # 生成问题向量并存入索引 q_vector self.encoder.encode([question])[0] self.index.add(np.array([q_vector])) self.cache_dict[q_hash] answer self.text_to_hash[q_hash] question def search(self, question: str, similarity_threshold0.9): 查找相似问题返回缓存答案 q_vector self.encoder.encode([question])[0].reshape(1, -1) distances, indices self.index.search(q_vector, k1) if distances[0][0] (1 - similarity_threshold): # 距离小于阈值则认为相似 # 找到最相似的那个问题的哈希 # 这里简化处理实际需要维护向量到哈希的映射 # 假设我们通过遍历查找生产环境需优化 for q_hash, cached_q in self.text_to_hash.items(): cached_vec self.encoder.encode([cached_q])[0] if np.linalg.norm(q_vector - cached_vec) (1 - similarity_threshold): return self.cache_dict.get(q_hash) return None # 使用示例 cache SemanticCache() # 首次询问调用大模型并缓存 answer_from_llm call_llm_api(Python中如何读取文件) cache.add(Python中如何读取文件, answer_from_llm) # 第二次询问相似问题 cached_answer cache.search(用Python读取一个txt文件该怎么做) if cached_answer: print(命中缓存直接返回:, cached_answer) else: # 未命中调用大模型 new_answer call_llm_api(用Python读取一个txt文件该怎么做) cache.add(用Python读取一个txt文件该怎么做, new_answer)3.3 模型路由与降级策略不所有任务都需要“大炮打蚊子”不同的任务对模型能力要求不同。我们可以设计一个路由层将任务分配给最经济适用的模型。简单的模型路由决策器from enum import Enum class TaskComplexity(Enum): SIMPLE_QA 1 # 简单问答事实性 SUMMARIZATION 2 # 摘要 COMPLEX_REASONING 3 # 复杂推理、代码生成 CREATIVE_WRITING 4 # 创意写作 class ModelRouter: def __init__(self): # 定义模型梯队和单价示例 self.model_tiers { TaskComplexity.SIMPLE_QA: { model: qwen-turbo, # 低成本、高速模型 max_tokens: 2000 }, TaskComplexity.SUMMARIZATION: { model: qwen-plus, # 中等能力模型 max_tokens: 4000 }, TaskComplexity.COMPLEX_REASONING: { model: qwen-max, # 高性能模型 max_tokens: 8000 }, TaskComplexity.CREATIVE_WRITING: { model: qwen-max, max_tokens: 8000 } } def route(self, user_query: str, history: list None) - dict: 根据查询内容决定使用哪个模型 # 1. 基于规则或简单分类器判断任务复杂度 task_type self._classify_task(user_query) # 2. 获取推荐模型配置 config self.model_tiers.get(task_type, self.model_tiers[TaskComplexity.SIMPLE_QA]) # 3. 可选根据历史或上下文进一步调整例如长对话切换到更大上下文模型 if history and len(history) 5: config[model] qwen-long # 假设有长上下文专用模型 return config def _classify_task(self, query: str) - TaskComplexity: 简单的基于关键词的任务分类生产环境建议用轻量级ML模型 query_lower query.lower() simple_keywords [是什么, 怎么, 如何, 步骤, 定义] complex_keywords [为什么, 分析, 比较, 优缺点, 论证, 代码] creative_keywords [写一首诗, 编一个故事, 创意, 假设] if any(kw in query_lower for kw in creative_keywords): return TaskComplexity.CREATIVE_WRITING elif any(kw in query_lower for kw in complex_keywords): return TaskComplexity.COMPLEX_REASONING elif 总结 in query_lower or 概括 in query_lower: return TaskComplexity.SUMMARIZATION else: return TaskComplexity.SIMPLE_QA # 使用路由 router ModelRouter() user_question 请解释一下Transformer模型的核心思想。 model_config router.route(user_question) print(f推荐模型: {model_config[model]}, 最大Token: {model_config[max_tokens]}) # 然后使用推荐的模型配置去调用API4. 完整实战构建一个成本优化的智能客服系统让我们综合运用以上策略设计一个面向内部知识库的智能客服系统目标是高准确率的同时将月度API成本控制在预算内。4.1 系统架构设计用户请求 | v [网关/负载均衡] | v [请求预处理层] -- 请求去重检查语义缓存 | | v v (缓存命中) [任务分类路由] 直接返回缓存答案 | v [模型调用层] |-----------------------| v v [简单QA] [复杂查询] (使用 qwen-turbo) (使用 qwen-plus/max) | | v v [后处理与日志] [后处理与日志] | | v v [成本记录与告警] [答案返回用户]4.2 核心代码实现1. 主服务入口 (smart_qa_service.py)import asyncio from typing import Optional from model_router import ModelRouter from semantic_cache import SemanticCache from cost_tracker import tracker, LLMCallRecord from llm_client import call_llm_api # 假设封装好的统一LLM客户端 class SmartQAService: def __init__(self): self.router ModelRouter() self.cache SemanticCache() self.cost_threshold_daily 100.0 # 每日成本告警阈值元 async def process_query(self, user_id: str, query: str, project: str customer_service) - dict: 处理用户查询的核心流程 # 1. 缓存查询 cached_answer self.cache.search(query) if cached_answer: print(f[INFO] 缓存命中 for query: {query[:50]}...) return { answer: cached_answer, source: cache, estimated_cost: 0.0, model: None } # 2. 路由决策 route_config self.router.route(query) model_to_use route_config[model] max_tokens route_config[max_tokens] # 3. 构造Prompt优化版 optimized_prompt self._construct_optimized_prompt(query) # 4. 调用大模型API print(f[INFO] 调用模型 {model_to_use} 处理查询...) llm_response await call_llm_api( modelmodel_to_use, messages[{role: user, content: optimized_prompt}], max_tokensmax_tokens, temperature0.7 ) # 5. 提取结果和用量 answer llm_response[choices][0][message][content] usage llm_response.get(usage, {}) prompt_tokens usage.get(prompt_tokens, 0) completion_tokens usage.get(completion_tokens, 0) # 6. 记录成本 cost tracker.calculate_cost(model_to_use, prompt_tokens, completion_tokens) record LLMCallRecord( modelmodel_to_use, timestampasyncio.get_event_loop().time(), prompt_tokensprompt_tokens, completion_tokenscompletion_tokens, total_tokensprompt_tokens completion_tokens, cost_cnycost, user_iduser_id, projectproject ) tracker.add_record(record) # 7. 加入缓存仅当答案质量高时 if self._is_answer_quality_high(answer): self.cache.add(query, answer) # 8. 成本告警检查 daily_cost tracker.get_daily_cost() if daily_cost self.cost_threshold_daily: self._send_cost_alert(daily_cost) return { answer: answer, source: llm, estimated_cost: cost, model: model_to_use, tokens_used: prompt_tokens completion_tokens } def _construct_optimized_prompt(self, query: str) - str: 构建优化后的Prompt包含系统指令和上下文 system_prompt 你是一个专业的客服助手。请根据已知信息用简洁、准确的语言回答用户问题。如果信息不足请明确告知“根据现有信息无法回答”不要编造。回答请控制在3句话以内。 # 这里可以拼接从向量数据库检索到的相关上下文RAG # retrieved_context self.vector_db.search(query, top_k3) # context_str \n.join([doc[content] for doc in retrieved_context]) # 简化版不包含RAG final_prompt f{system_prompt}\n\n用户问题{query} return final_prompt def _is_answer_quality_high(self, answer: str) - bool: 简单判断答案是否值得缓存例如不是拒绝回答或低质量回复 low_quality_indicators [无法回答, 信息不足, 我不知道, 抱歉] return not any(indicator in answer for indicator in low_quality_indicators) def _send_cost_alert(self, current_cost: float): 发送成本告警示例打印日志生产环境可集成邮件/钉钉 print(f[告警] 当日API成本已超过阈值当前成本: {current_cost} 元) # 异步服务示例 async def main(): service SmartQAService() result await service.process_query( user_iduser_001, query我们公司的年假政策是怎样的 ) print(f回答: {result[answer][:100]}...) print(f来源: {result[source]}, 预估成本: {result[estimated_cost]}元) if __name__ __main__: asyncio.run(main())4.3 效果评估与成本对比假设我们部署上述系统与“无优化、全量使用最贵模型”的方案进行对比场景月请求量平均输入Token平均输出Token无优化方案全量qwen-max优化后方案路由缓存节省比例简单QA (60%)60万5010060万 * (0.050.030.10.06) ≈ 5400元60万 * (0.050.0080.10.02) ≈ 1440元73%复杂查询 (30%)30万20030030万 * (0.20.030.30.06) ≈ 7200元30万 * (0.20.0120.30.024) ≈ 2880元60%缓存命中 (假设30%)---0元0元100%月度总成本---~12,600元~4,320元~65%(注以上Token单价为示例假设缓存命中率30%意味着30%的请求完全不调用API)可以看到通过模型路由和缓存成本下降非常显著。5. 常见问题与排查思路在实施成本优化过程中你可能会遇到以下典型问题问题现象可能原因排查步骤与解决方案缓存命中率极低1. 语义相似度阈值设置过高或过低。2. 用户问题高度多样化。3. 缓存未正确存储或检索。1. 调整相似度阈值如从0.9调到0.85。2. 分析问题日志看是否可归类。引入问题分类对高频类别单独优化Prompt。3. 检查向量编码模型是否适合你的领域可尝试微调或更换模型。检查FAISS索引是否正常构建。模型路由决策错误1. 分类规则过于简单或过时。2. 任务复杂度判断不准导致简单任务用了大模型或复杂任务用了小模型效果差。1. 收集一批标注数据问题-推荐模型训练一个轻量级文本分类器如FastText、BERT tiny替代规则。2. 建立反馈机制当用户对答案点“踩”或会话轮数异常增多时记录该问题后续手动修正路由规则或加入回退机制小模型答不好时自动用大模型重试。Token消耗远超预估1. Prompt未优化包含大量无关系统指令或示例。2. 未设置max_tokens参数模型生成了过长的回答。3. 上下文History管理不当重复发送了全部历史消息。1. 定期Review和精简系统Prompt移除冗余描述。2.务必在每次API调用时设置合理的max_tokens。3. 实现上下文总结Summarization或滑动窗口只保留最近N轮或最重要的历史消息而不是全部发送。私有化部署后单次响应慢1. 本地GPU算力不足。2. 未使用量化模型或推理优化。3. 未启用批处理Batch Inference。1. 监控GPU利用率考虑升级硬件或使用多卡。2. 将FP16模型转换为INT8或GPTQ量化模型可大幅提升推理速度、降低显存占用。3. 对于异步任务将请求队列化进行批量推理提高GPU利用率。成本监控数据不准1. 代理漏记了某些API调用如直接调用。2. 不同模型的定价配置有误或未更新。3. Token计数方式与厂商不一致。1. 确保所有调用都必须经过成本代理网关可在网络层面进行限制。2. 建立定价配置的定期检查和更新流程厂商可能调价。3. 用已知长度的文本进行测试对比自己计算的Token数和API返回的usage是否一致。使用官方的Tokenizer工具。6. 进阶最佳实践与工程建议当基本优化完成后可以考虑以下进阶策略进一步压榨成本、提升系统鲁棒性。6.1 实施更精细的用量配额与限流为不同部门、项目或用户设置API调用预算和速率限制。from datetime import datetime, timedelta import redis # 使用Redis做分布式计数 class QuotaManager: def __init__(self, redis_client): self.redis redis_client def check_and_consume(self, user_key: str, cost: float, daily_limit: float 50.0) - bool: 检查并消耗配额返回是否允许调用 today datetime.now().strftime(%Y%m%d) redis_key fquota:{user_key}:{today} # 使用Redis原子操作增加当日已用额度 current_used self.redis.incrbyfloat(redis_key, cost) # 设置键的过期时间第二天凌晨过期 if self.redis.ttl(redis_key) -1: # 键是新建的 self.redis.expireat(redis_key, self._get_tomorrow_expiry()) if current_used daily_limit: # 超出限额回滚本次增加可选也可记录超额 self.redis.incrbyfloat(redis_key, -cost) return False return True def _get_tomorrow_expiry(self) - int: 获取明天0点的时间戳 tomorrow datetime.now().replace(hour0, minute0, second0, microsecond0) timedelta(days1) return int(tomorrow.timestamp())6.2 异步处理与队列削峰对于非实时性任务如报告生成、内容总结将其放入消息队列在业务低峰期批量处理。# 使用Celery Redis的示例 from celery import Celery app Celery(cost_optimized_tasks, brokerredis://localhost:6379/0) app.task def process_batch_queries(queries: list): 批量处理查询可以利用模型的批处理API如果支持 # 1. 将相似查询聚类合并Prompt如多个用户问同一问题 # 2. 调用支持批处理的API端点 # 3. 分发结果到各自用户 pass # 用户提交非实时任务时 process_batch_queries.delay([query1, query2, query3])6.3 定期评估与模型选型大模型领域迭代迅速新的、更具性价比的模型不断出现。建立评估流水线每月用一批标准测试集涵盖你业务的主要问题类型评测新发布的模型对比效果和成本。考虑混合云策略将敏感、核心业务放在私有化模型将公开、非核心的查询路由到性价比更高的公有云API。关注开源模型如ChatGLM、Qwen、Baichuan等都有开源版本。虽然需要自备算力但对于特定场景微调后长期成本可能更低且数据完全可控。6.4 合同与商务谈判对于用量较大的企业用户争取阶梯定价承诺年度用量获取更低的单价。预留容量Reserved Capacity类似云服务器的预留实例预付费用换取大幅折扣。明确SLA和计费粒度确认计费是按请求四舍五入还是按Token精确计算。了解服务等级协议确保稳定性。将大模型从“用不起”的炫技玩具变为“用得好”的生产力工具核心在于建立成本意识、数据驱动和持续优化的工程体系。从搭建监控开始让每一分钱的花费都可见然后通过Prompt优化、缓存、路由等战术手段快速降低成本最后在系统架构层面通过配额、异步、评估等战略手段实现长期可控。技术选型上没有银弹最适合你的方案往往是在效果、成本、数据安全与工程复杂度之间找到的最佳平衡点。