碳路先锋 AI coding 社招一面
这是社群小伙伴分享的 社招面经 双非本 4年工作经验
1. 自我介绍
2. 展开讲一下你们决策系统的整体架构,你在里面具体负责什么?
答案:这个系统整体分成数据层、模型层、知识层、决策层和应用层。数据层负责接入客户侧的电表数据、设备数据、天气数据、电价数据和业务配置;模型层负责负荷预测、异常检测和策略打分;知识层负责接入制度文档、设备说明书、调度规则和历史案例;决策层把预测结果、规则约束和知识库证据结合起来,生成调度建议;应用层提供报表、问答、预警和人工确认入口。
我主要负责三块:第一是负荷预测链路,包括数据清洗、特征构造、模型训练、离线评估和线上推理接口;第二是知识问答链路,包括文档解析、向量入库、混合检索和重排;第三是 Agent 执行链路,把“查负荷预测结果、查设备状态、查调度规则、生成建议”封装成可调用的 Skills。这个系统不是纯算法系统,真正难点在于数据质量不稳定、客户差异很大、模型结果要能解释,而且自动建议不能越过业务安全边界。
system_arch = {
"data_layer": ["meter_data", "weather", "device_status", "price_policy"],
"model_layer": ["load_forecast", "anomaly_detection", "strategy_score"],
"knowledge_layer": ["rag_docs", "device_manual", "operation_rules"],
"decision_layer": ["rule_engine", "agent_planner", "risk_guard"],
"app_layer": ["dashboard", "qa", "report", "alert"]
}
3. 客户规模有多少?不同客户的数据差异怎么处理?
答案:当时系统服务的是多个园区和楼宇客户,不是单一客户。客户之间差异非常明显,有的是办公楼,有的是工业厂房,有的是商场,还有一部分是混合型园区。不同客户的用电曲线差异很大,比如办公楼工作日白天高、夜间低;商场周末和节假日更高;工业客户可能受生产排班影响,夜间也有明显负荷。
处理方式不是把所有客户直接混在一起训练一个模型。我们会先做客户画像和负荷形态聚类,把客户按用电模式、峰谷特征、行业类型、容量等级、工作日/节假日差异做分组。数据量足够的客户可以单独训练或微调模型,数据量较少的客户走相似客户迁移和全局模型兜底。线上预测时也会根据客户历史误差动态选择模型,而不是固定只用一个模型。
customer_profile = {
"industry_type": "commercial_complex",
"peak_hour": [11, 14, 19],
"weekday_weekend_gap": 0.32,
"load_level": "medium",
"data_quality": "good"
}
4. 负荷预测模型训练时用了多少列特征?分别是什么类型?
答案:我们最终线上使用的特征大概分成六类,不是简单只用历史用电量。第一类是历史负荷特征,比如前 15 分钟、前 1 小时、前 24 小时、前 7 天同一时刻负荷;第二类是时间特征,比如小时、星期、月份、是否工作日、是否节假日、是否调休;第三类是天气特征,比如温度、湿度、风速、降雨、体感温度;第四类是客户静态特征,比如行业类型、容量等级、用电类别;第五类是电价和策略特征,比如峰平谷电价、需求响应事件;第六类是设备和异常特征,比如空调主机状态、设备检修标记、数据缺失标记。
特征列数不是固定越多越好。早期做过 60 多列,后面通过特征重要性和消融实验压到 30 多列左右。很多特征看起来合理,但实际会带来噪声,比如低质量天气数据、频繁缺失的设备状态,如果不做缺失标记和异常处理,反而会拖累模型。
features = [
"load_lag_1", "load_lag_4", "load_lag_96", "load_lag_672",
"hour", "weekday", "is_holiday", "is_workday",
"temperature", "humidity", "rainfall", "wind_speed",
"price_type", "demand_response_flag",
"industry_id", "capacity_level",
"device_running_ratio", "missing_flag"
]
5. 做负荷预测时除了历史用电量,还需要考虑哪些外部因素?
答案:只看历史用电量会有很强局限,因为负荷不是纯自回归过程。天气是非常重要的外部因素,尤其对空调负荷占比高的商业楼宇,温度和湿度变化会明显影响用电。节假日、调休、工作日类型也很关键,比如五一、春节、周末和普通工作日的曲线差异很大。工业客户还要考虑生产计划、班次、设备启停和检修。
还有一些容易被忽略的因素,比如电价策略、需求响应、临时活动、极端天气、数据采集异常。模型层面可以把这些因素作为 exogenous variables 输入;工程层面还要做异常标记,否则模型会把停电、采集故障、设备检修误认为正常用电规律。
def build_external_features(row):
return {
"is_extreme_temp": int(row["temperature"] > 35 or row["temperature"] < 0),
"is_holiday": int(row["date_type"] == "holiday"),
"is_demand_response": int(row["event_type"] == "demand_response"),
"is_maintenance": int(row["device_status"] == "maintenance")
}
6. 客户用电量千差万别,LSTM 的泛化能力能满足要求吗?
答案:如果直接用一个普通 LSTM 去拟合所有客户,泛化能力通常不够。原因是不同客户的负荷尺度、周期性、噪声水平、行业规律都不一样,LSTM 会倾向于学习平均模式,对长尾客户和突发变化不稳定。尤其是新客户数据少的时候,单纯 LSTM 很容易预测成“平滑曲线”,峰值和拐点跟不上。
更合理的方案是全局模型加个性化校准。全局模型学习通用的周期性和天气影响,客户级别通过归一化、客户 embedding、分群模型、残差校正或轻量微调做适配。线上还要保留规则兜底,比如节假日特殊策略、异常数据修正和预测区间,而不是只输出一个点预测。
import torch
import torch.nn as nn
class LoadLSTM(nn.Module):
def __init__(self, input_dim, hidden_dim, customer_num, emb_dim=8):
super().__init__()
self.customer_emb = nn.Embedding(customer_num, emb_dim)
self.lstm = nn.LSTM(input_dim + emb_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, 1)
def forward(self, x, customer_id):
emb = self.customer_emb(customer_id).unsqueeze(1).repeat(1, x.size(1), 1)
x = torch.cat([x, emb], dim=-1)
out, _ = self.lstm(x)
return self.fc(out[:, -1, :])
7. 负荷预测里为什么要做归一化?不同客户的尺度怎么处理?
答案:负荷预测里不同客户的用电规模可能差几十倍甚至上百倍,如果不做归一化,模型会优先拟合大客户,小客户的误差在损失里几乎被淹没。常见做法是按客户做标准化或按容量做归一化,比如用每个客户的均值、标准差、最大容量、历史分位数进行缩放。
但归一化也要小心。不能把未来统计量泄漏进训练,比如用全量数据算均值和方差会导致数据泄漏。线上新客户还可能没有足够历史数据,这时需要使用行业默认统计量或相似客户统计量。预测输出后再反归一化,最终评估时同时看绝对误差和相对误差。
def normalize_by_customer(load, mean, std):
return (load - mean) / (std + 1e-6)
def denormalize_by_customer(pred, mean, std):
return pred * (std + 1e-6) + mean
8. 负荷预测为什么不能只看 RMSE?还应该看哪些指标?
答案:RMSE 对大误差更敏感,适合关注峰值预测偏差,但它容易被大客户主导。对于不同规模客户,单独看 RMSE 不公平。还需要看 MAE、MAPE、sMAPE、峰值误差、峰值时刻偏移、分客户误差、分时段误差和节假日误差。
实际业务里,预测低谷稍微偏一点影响不大,但高峰预测错了可能会影响调度决策,所以还要专门评估峰段误差。对于接近 0 的负荷,MAPE 会不稳定,这时 sMAPE 或加权误差更合适。线上评估不能只看总体平均,要看高负荷客户、低负荷客户、节假日、极端天气这些切片。
import numpy as np
def metrics(y_true, y_pred):
mae = np.mean(np.abs(y_true - y_pred))
rmse = np.sqrt(np.mean((y_true - y_pred) ** 2))
smape = np.mean(2 * np.abs(y_pred - y_true) / (np.abs(y_true) + np.abs(y_pred) + 1e-6))
return {"mae": mae, "rmse": rmse, "smape": smape}
9. 时间序列预测里如何避免数据泄漏?
答案:时间序列数据不能随机打散切分训练集和测试集,否则未来信息会泄漏到训练阶段。正确做法是按时间切分,比如前
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

查看14道真题和解析