Skip to content

第二百三十五章 代码里的上帝

姜意的回复在凌晨一点十七分到了。

不是文字,是一条语音。林知行点开,背景很安静,她的声音比白天低半度:"说吧,什么事。"

他拿起手机,打了两行字:"伦理约束层的事。所有人都反对。我不知道该不该继续。"

三个灰色气泡变成"已读"。姜意回了一句:

"你先做出来再说。做出来之前,讨论都是空转。"


周日傍晚,林知行回到公司。

办公室空了。赵鸣岐的论文散在桌上,程浩的显示器待机灯一亮一灭,方小满的白板上还留着上周的漏斗图。K572时刻表贴在墙角,红圈褪了一点色。

他在工位上坐下来,新建文件夹:ethics-layer。

姜意说得对——四条反对,每一条都有道理。但他连原型都没写过,怎么知道这些反对是不可逾越的墙,还是可以解决的问题?

他开始打字。


第一版。最直觉的设计。

python
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"

三个阈值。和赵鸣岐昨天在白板上画的一样。

他把智领科技的行为模式喂进去:

python
action = PricingAction(
    margin=0.12,       # 鲜时达利润率12%
    drop_rate=0.03,    # 单次降价3%
    low_price_days=90  # 持续三个月
)
# 输出: "WARN: 持续低价超7天"

利润率12%,高于底线。单次降3%,低于阈值。它不是在亏本卖,是在保证自己利润的前提下精确压价。

只有第三条触发——持续低价超过7天。但"季节性促销""新店特惠""会员专享价",随便一个理由都能把这条洗白。

他的约束层不是在检查"是否在围剿小商户",是在检查"是否有低价行为"。前者是伦理判断,后者是价格监控。

关掉文件,新建第二个。


第二版。不检查价格本身,检查效果——定价策略是否导致了周边商户客流下降。

python
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。新建一个文件。

python
# 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();
}

不是判断善恶的函数。是呈现选择的函数。输入是一个行为和它的后果。输出是用户的决定。中间没有上帝。

他合上笔记本,关了台灯。办公室暗下来,只有窗外中关村的路灯漏进一线光。

桌子另一边,王老板那封信的复印件还摊着。信纸右下角的水渍在暗光里像一个句号。

林知行把信拿起来看了一会儿,放回原处。

他没有答案。但他有了一个更对的问题。


(本章完)