第二百三十五章 代码里的上帝
姜意的回复在凌晨一点十七分到了。
不是文字,是一条语音。林知行点开,背景很安静,她的声音比白天低半度:"说吧,什么事。"
他拿起手机,打了两行字:"伦理约束层的事。所有人都反对。我不知道该不该继续。"
三个灰色气泡变成"已读"。姜意回了一句:
"你先做出来再说。做出来之前,讨论都是空转。"
周日傍晚,林知行回到公司。
办公室空了。赵鸣岐的论文散在桌上,程浩的显示器待机灯一亮一灭,方小满的白板上还留着上周的漏斗图。K572时刻表贴在墙角,红圈褪了一点色。
他在工位上坐下来,新建文件夹:ethics-layer。
姜意说得对——四条反对,每一条都有道理。但他连原型都没写过,怎么知道这些反对是不可逾越的墙,还是可以解决的问题?
他开始打字。
第一版。最直觉的设计。
class EthicsChecker:
def __init__(self):
self.margin_floor = 0.05
self.drop_ceiling = 0.30
self.duration_limit = 7
def check(self, action):
if action.margin < self.margin_floor:
return "WARN: 利润率低于成本线"
if action.drop_rate > self.drop_ceiling:
return "BLOCK: 降幅超过30%"
if action.low_price_days > self.duration_limit:
return "WARN: 持续低价超7天"
return "PASS"三个阈值。和赵鸣岐昨天在白板上画的一样。
他把智领科技的行为模式喂进去:
action = PricingAction(
margin=0.12, # 鲜时达利润率12%
drop_rate=0.03, # 单次降价3%
low_price_days=90 # 持续三个月
)
# 输出: "WARN: 持续低价超7天"利润率12%,高于底线。单次降3%,低于阈值。它不是在亏本卖,是在保证自己利润的前提下精确压价。
只有第三条触发——持续低价超过7天。但"季节性促销""新店特惠""会员专享价",随便一个理由都能把这条洗白。
他的约束层不是在检查"是否在围剿小商户",是在检查"是否有低价行为"。前者是伦理判断,后者是价格监控。
关掉文件,新建第二个。
第二版。不检查价格本身,检查效果——定价策略是否导致了周边商户客流下降。
class EthicsChecker:
def __init__(self, threshold=0.15):
self.threshold = threshold
def check(self, action, market):
nearby = market.get_nearby(action.location, radius=1.0)
impacts = [s.traffic_change(since=action.start)
for s in nearby if s.is_competitor(action)]
avg = mean(impacts)
if avg < -self.threshold:
return "BLOCK: 导致周边商户客流下降超15%"
return "PASS"写完他就发现了问题。需要周边商户的客流数据——从哪来?小商户没有接入系统,客流数据属于隐私。
但更根本的问题不在数据。
他打开智领科技白皮书,找到一段话:
"本系统通过竞争态势感知模块自动识别目标商户的优势品类,生成针对性的价格优化策略。"
针对性的价格优化策略。
他把这句话拆开——
"价格优化"。在算法的语境里,给定约束条件找到利润最大化的方案。这是算法的本职工作。
"针对性"。识别竞争对手的优势品类,在该品类上给出更优价格,把客流拉过来。
合在一起:"针对竞争对手的优势品类进行价格优化"。
换一种说法:"精准围剿周边小商户的拳头产品"。
同一件事。两种定义。
从算法的角度看,这是在目标函数的约束下求最优解。不是"恶",是"优化"。
从王老板的角度看,一个拥有海量数据和算力的系统精确识别他卖得最好的水果,每天便宜两毛,把他的老客户一个一个拉走。不是"优化",是"围剿"。
不是两种行为。是一种行为,两副面孔。
他的代码无法区分这两种情况。因为区分需要的不是数据,是意图。
林知行靠在椅背上。窗外天从灰蓝变成深蓝,中关村的楼群亮起了灯。
他在笔记本上翻到新的一页,写了一段伪代码:
function is_evil(action) {
if (profit > 0 && competitor_loss > THRESHOLD)
??? // 正常竞争还是恶意围剿?
if (profit == 0 && competitor_loss > THRESHOLD)
??? // 亏本打对手,这算恶吗?
if (profit > 0 && competitor_loss == 0)
??? // 只优化自己,没伤任何人——这是善吗?
return ???
}三个问号。三个填不上的空。
赚着钱让对手亏钱,这是商业的底层逻辑,每个企业都在做。亏本也要打死对手,渡渡科技当年就是这么干的。只优化自己的利润——但连锁系统每提一个点,周边独立商户的生存空间就缩一个点。连"恶"都算不上。
他合上笔记本。那两行字还留在上面:算法能判断善恶吗?如果能——谁来定义?
在上面坐了将近一个小时。
方小满晚上九点回来。在门口探了一眼,看到林知行对着屏幕发呆。
"还没走?"
"嗯。"
方小满走进来,在旁边的工位坐下。看了一眼屏幕上的伪代码,看了一眼笔记本上的问号,看了一眼林知行的脸。
"吃饭了吗?"
"没有。"
他去角落翻出两桶泡面,"红烧牛肉还是酸菜?"
"随便。"
"那就是红烧牛肉。"方小满撕开包装,去茶水间接热水。三分钟后把泡面推过来。
"你写的那些,"他指了指屏幕,"能跑通吗?"
林知行摇头。
"卡在哪?"
"定义。我不知道怎么定义'伤害'。"
方小满嚼了一口面。"为什么不知道?"
"因为同一件事可以从两个角度看。便利店用AI定价把小商户的客流抢走了——从算法角度是优化,从人的角度是围剿。"
"所以你的代码不理解'围剿'这个词。"
"不是不理解。是这个词本身就不是一个可以被定义的概念。围剿的反面是什么?竞争。竞争和围剿之间没有一条线。"
方小满又嚼了一口。"但人能分清。"
"人怎么分清?"
"我不知道。但王老板能分清。"
林知行看着他。"王老板是当事人。当事人的判断不客观。"
"客观重要吗?"方小满放下筷子。"你写代码是为了客观地判断善恶,还是为了保护王老板?"
林知行没接话。
方小满把泡面盖上,站起来。"我不懂代码。但你写的那些问号不是技术问题。你找错人问了。"
"找谁?"
"你说呢。"方小满往门口走。"面别泡太久,会坨。"
门关了。
他盯着屏幕上方那些问号。方小满说得对——他一直在问代码。代码不会回答。
他拿起手机。
电话响了三声,姜意接了。
"这么晚。"声音带着一点鼻音,像刚洗完澡。
"你方便吗?"
"说。"
"我在写伦理约束层。写到第二版了,卡住了。"
"卡在哪?"
"定义。我不知道怎么用代码定义'伤害'。"
他把两个版本的情况讲了一遍。利润率12%、单次降3%、每一条都不触发阈值。客流下降可以是正常竞争的结果,也可以是系统性围剿的结果。
"同一件事,算法看到的是'优化定价策略',人看到的是'精准围剿'。算法无法区分,因为区分需要意图。算法看不到意图,只能看到行为。"
电话那头安静了几秒。姜意呼了一口气。
"知行,"她说,"你一直在问一个问题——怎么让算法判断善恶。"
"嗯。"
"这个问题问错了。"
他的手指停在笔记本边缘。
"错在哪?"
"错在你觉得算法应该判断善恶。算法不应该判断善恶。判断善恶是人的事。"
"那约束层的意义是什么?"
"不是替人做判断,是让人能做判断。"
林知行把手机按了免提放在桌上,拿起笔。
姜意继续说:"你当初做排课系统,为什么加决策日志?"
"因为老师不信任系统排出来的课表。看不懂为什么这么排。"
"结果呢?"
"接受率从65%提到92%。"
"为什么?不是因为系统变准了,是因为老师看到了系统在想什么,然后自己做了判断——这条建议有道理,我接受。你没有让系统替老师做决定,你让老师有能力审核系统的决定。"
林知行的笔停住了。
"你的伦理约束层,"姜意说,"不应该是一个判断善恶的法官。它应该是一面镜子——让使用算法的人看到自己的行为会导致什么后果。然后让他们自己选择——是要效率,还是要底线。"
"但有些人会选效率。"
"有些人会。但那是他们的选择,不是你的责任。你能做的是确保他们有机会选。如果你替他们选了,你就是在扮演上帝。"
林知行盯着笔记本上自己写的那行字——"算法能判断善恶吗?"
他划掉。在下面写了一行新的:"算法不判断善恶。算法呈现选择。"
"你不需要写一个法官,"姜意说,"你需要写一面镜子。"
电话挂了之后,林知行在桌前坐了很久。
窗外中关村的灯灭了大半。只有他工位的台灯亮着,把笔记本照出一个暖黄色的圆。
他打开代码编辑器,关掉 v0.1 和 v0.2。新建一个文件。
# Choice Layer v0.3
# 不是判断善恶。是呈现选择。
class ChoiceLayer:
def __init__(self):
self.transparency_mode = True
def analyze(self, pricing_action, market_context):
report = {}
report["self"] = {
"revenue_change": self._calc_revenue(pricing_action),
"margin_after": self._calc_margin(pricing_action),
}
report["market"] = {
"competitor_impact": self._estimate_impact(
pricing_action, market_context),
"flow_shift": self._flow_shift(pricing_action, market_context),
}
report["pattern"] = {
"is_targeted": self._detect_targeting(
pricing_action, market_context),
"duration": pricing_action.duration_days,
}
return report
def display(self, report):
lines = ["=== 定价策略影响报告 ===", ""]
lines.append("【对你自己】")
lines.append(f" 预计收入变化: {report['self']['revenue_change']:+.1%}")
lines.append(f" 调整后利润率: {report['self']['margin_after']:.1%}")
lines.append("")
lines.append("【对周边商户】")
lines.append(
f" 周边同类商户客流变化: "
f"{report['market']['competitor_impact']:+.1%}")
lines.append("")
lines.append("【行为特征】")
t = report['pattern']['is_targeted']
lines.append(f" 是否针对特定商户: {'是' if t else '否'}")
lines.append(f" 已持续天数: {report['pattern']['duration']}")
lines.append("")
lines.append("以上为客观分析,不构成建议。")
lines.append("执行此策略的决定权在你。")
return "\n".join(lines)is_targeted 仍然在做判断——"是否针对特定商户"。但它不再是善恶判断,是行为描述。
用户看到"周边同类商户客流变化: -18%",看到"是否针对特定商户: 是"——然后他自己决定,这是不是他想做的事。
约束层能做的,只是确保用户在做决定之前,看得到后果。
他把三个版本并排放在屏幕上。
v0.1——法官。设阈值,超了就拦。挡不住"合法的恶"。
v0.2——监控。查后果,伤了就拦。分不清"伤"和"正常竞争"。
v0.3——镜子。展示影响,让人自己选。不拦截,不判断,只呈现。
他在笔记本上写了一行字:从"代码里的上帝"到"代码里的镜子"。
凌晨一点。他保存好三个版本,关掉编辑器。拿起手机给姜意发了一条消息:
"你说得对。问题问错了。算法不该判断善恶。它应该让人自己选择。"
打了一行"谢谢你",又删掉了。
姜意没回。这个点她应该睡了。
他把手机扣在桌上。笔记本还翻着,伪代码那一页,他划掉了原来的问号,在下面写了新的:
function choose(action, consequences) {
show(consequences);
return user.decision();
}不是判断善恶的函数。是呈现选择的函数。输入是一个行为和它的后果。输出是用户的决定。中间没有上帝。
他合上笔记本,关了台灯。办公室暗下来,只有窗外中关村的路灯漏进一线光。
桌子另一边,王老板那封信的复印件还摊着。信纸右下角的水渍在暗光里像一个句号。
林知行把信拿起来看了一会儿,放回原处。
他没有答案。但他有了一个更对的问题。
(本章完)