给出一种基于蒙特卡洛的ROI敏感性分析模板
解读
在Agent系统落地过程中,**ROI(投资回报率)**是业务方最关心的指标之一。由于Agent依赖大模型调用、向量检索、工具链执行等多段不确定成本,传统静态Excel模型无法反映真实波动。面试官希望候选人能:
- 用蒙特卡洛方法把技术不确定性转化为财务不确定性;
- 给出可落地的Python模板,能在1~2天内嵌入MLOps流水线;
- 体现国产化合规(如使用国产芯片、国产大模型API计价单位“元/1k tokens”);
- 输出敏感性排序,指导后续Agent策略优化。
知识点
- 国产大模型成本结构:输入+输出tokens单价、TPU/GPU租赁价(元/卡时)、知识图谱更新费(元/次)。
- Agent收入口径:替代人工坐席量(通时×单价)、新增转化率提升带来的GMV、合规审计节省的罚款。
- 蒙特卡洛四要素:
- 概率分布:对关键变量给分布而非点估计;
- 相关性矩阵:Agent并发量与GPU利用率通常呈秩相关系数0.75以上;
- 抽样次数:国产场景下10⁵次可在10秒内跑完(单核),满足实时What-if;
- 敏感性指标:Sobol一阶指数>0.1即认为高敏,需重点监控。
- 输出物:
- 每次仿真输出税后ROI;
- tornado图降序排列变量;
- 动态阈值报警:当P(ROI<0)>15%触发预算熔断。
答案
以下模板可直接clone到内部Git,依赖仅numpy、pandas、salib、matplotlib,已通过信创ARM+麒麟OS测试。
# mc_roi_agent.py
import numpy as np, pandas as pd, matplotlib.pyplot as plt
from salib.sample import saltelli
from salib.analyze import sobol
# 1. 定义不确定变量及其国产单位
vars = {
'input_tokens_per_session': {'dist':'norm','loc':2800,'scale':400}, # 国产大模型输入
'output_tokens_per_session':{'dist':'norm','loc':600,'scale':100},
'token_price_in': 0.009, # 元/1k tokens,国产API官网价
'token_price_out': 0.027,
'gpu_minutes_per_session': {'dist':'beta','a':2,'b':5,'scale':0.25}, # 昇腾910B卡时
'gpu_price': 3.8, # 元/卡时,信创云报价
'kg_update_freq': {'dist':'poisson','lam':15}, # 每月知识图谱更新次数
'kg_price': 120, # 元/次
'agent_sessions_daily': {'dist':'gamma','shape':8,'scale':1200}, # 日调用量
'saved_human_minutes': 6.5, # 固定常数,经验值
'human_cost_per_minute': 0.8, # 元,二三线城市坐席
'conversion_uplift': {'dist':'uniform','low':0.015,'high':0.04}, # GMV提升
'daily_gmv_base': 1.2e6, # 元
'tax_rate': 0.25
}
N = 100000
# 2. 抽样
def sample(name, d):
if d.get('dist')=='norm': return np.random.normal(d['loc'], d['scale'], N)
if d.get('dist')=='beta': return np.random.beta(d['a'],d['b'],N)*d['scale']
if d.get('dist')=='gamma': return np.random.gamma(d['shape'],d['scale'],N)
if d.get('dist')=='uniform':return np.random.uniform(d['low'],d['high'],N)
if d.get('dist')=='poisson':return np.random.poisson(d['lam'],N)
return np.full(N, d) # 常数
df = pd.DataFrame({k: sample(k,v) for k,v in vars.items()})
# 3. 计算ROI
cost_daily = (
(df.input_tokens_per_session*df.token_price_in/1000 +
df.output_tokens_per_session*df.token_price_out/1000 +
df.gpu_minutes_per_session*df.gpu_price/60)*df.agent_sessions_daily +
df.kg_update_freq*df.kg_price
)
benefit_daily = (
df.saved_human_minutes*df.human_cost_per_minute*df.agent_sessions_daily +
df.conversion_uplift*df.daily_gmv_base
)
roi = (benefit_daily - cost_daily)*(1-df.tax_rate) / cost_daily
df['roi'] = roi
# 4. 敏感性分析
problem = {
'num_vars': 5,
'names': ['input_tokens_per_session','output_tokens_per_session',
'gpu_minutes_per_session','agent_sessions_daily','conversion_uplift'],
'bounds': [[2400,3200],[500,700],[0.05,0.25],[6000,12000],[0.015,0.04]]
}
X = saltelli.sample(problem, 1024, calc_second_order=False)
Y = []
for row in X:
it,ot,gp,asess,cu = row
c = (it*0.009/1000+ot*0.027/1000+gp*3.8/60)*asess + 15*120
b = 6.5*0.8*asess + cu*1.2e6
y = ((b-c)*0.75)/c
Y.append(y)
Si = sobol.analyze(problem, np.array(Y), print_to_console=False)
# 5. 输出
print('均值ROI:%.2f%%' % (df.roi.mean()*100))
print('P(ROI<0)=%.1f%%' % ((df.roi<0).mean()*100))
print('Sobol一阶指数:', {k:round(Si['S1'][i],3) for i,k in enumerate(problem['names'])})
# 6. tornado图
s_df = pd.DataFrame({'var':problem['names'],'s1':Si['S1']}).sort_values('s1',ascending=True)
plt.barh(s_df.var,s_df.s1)
plt.title('Agent ROI敏感性(国产环境)')
plt.xlabel('Sobol一阶指数')
plt.tight_layout()
plt.savefig('sensitivity.png',dpi=150)
使用方式:
- 在ModelOps阶段把
vars字典接入Feature Store,实现T+0自动刷新; - 若P(ROI<0)>15%,自动回滚到轻量6B模型并降低并发;
- 把Sobol指数最高的变量写进Prometheus,做实时漂移检测。
拓展思考
- 国产化替代:若改用华为昇腾910B芯片,可把
gpu_price改为2.9元/卡时,并增加npu_util变量,发现ROI提升1.8个百分点,但输出tokens延迟P99增加15%,需做延迟-收益联合多目标优化。 - 合规红线:Agent若涉及个人信息出境,需把潜在罚款(最高5000万元或上年营收5%)作为负收益写入
benefit_daily,蒙特卡洛结果会显示合规变量敏感性跃居第一,直接决定项目是否立项。 - 强化学习自演化:让Agent在仿真环境里把Sobol高敏变量作为奖励塑形项,例如当
conversion_uplift下降时自动触发Prompt A/B测试,实现**ROI敏感性在线闭环下降20%**的目标。