对大语言模型的一些思考

随着大语言模型(以下简称大模型)的兴起,coding agent也流行起来,各家大模型厂商都推出了自己的coding agent,此外还有不少本身没有大模型,但专注于agent开发的公司。

某天上下班路上对coding agent有了一些想法,记录一下。大概是因为主要做软件开发,接触coding agent相对多一些,所以脑子里才冒出这些想法的。

当前各家的大模型,本质上是个下一个词预测器。它最擅长做的事情是根据你提供的文本,预测接下来最可能出现的下一个词(严格地说应该是词元)。不信你可以拿同一个问题反复问一个大模型,它的每一次输出都不太一样(这一点上,如果真的是严格遵循按最大概率输出,同一问题的输出就应当是固定的。但那样生成的文本容易重复、呆板,不像人说的话,导致使用体验差,所以在最终输出前还添加了一步随机采样,让输出具有随机性1)。

这就好比,一个人做一件事,每次结果都不一样,且难以事先预测。问题不在于随机,而在于无法可靠复现和校验。这种情况下,大模型目前只能当个玩具,而不能用于严肃的生产工作2。

试想,你让一个员工反复做同一个方案。他虽然每次结果都不完全一样,但你能看出是同一个人的手笔,能让他基于上一版改进,也能问他为什么这么改——最终你能验收、能兜底。相比之下,大模型每次的输出,不是在上一版上迭代,更像是换了一个人从头再来:既没有延续性,也无法解释自己为何不同。这样的输出,直接拿来用是不行的。

为了解决这个问题,出现了很多方法,从最开始的提示词工程,到现在的coding agent、MCP,都是为了解决这个问题。

这些方法归结起来主要有两点:

  1. 通过给大模型一些特定的提示词,让它的输出趋近于稳定。这是通过约束输入,收窄输出的可能范围,让大模型保持一定的确定性。
  2. 通过工具调用(tool calling),把大模型的输出和真实世界中的工具绑定起来,让模型可以稳定地与现实世界交互。这是在大模型与现实世界中建立某种确定的联系。

有了以上两种方法,就可以把大模型输出的随机性收敛到可以用于严肃生产的程度。当前最亮眼的应用领域就是编程。至于coding agent时代的编程(又称为vibe coding)与传统古法编程有什么区别,放到下次再写吧。

  1. 上面是较为通俗的说法,更准确的说法是:如果每次严格取概率最大的词元(即贪心解码),同一问题的输出就应当是固定的。但那样生成的文本容易重复、呆板;而且在实际部署中,批处理、浮点运算顺序等因素仍会破坏可复现性。因此实际解码时会引入采样(temperature、top-p 等),让输出具有随机性。 ↩

  2. 用大模型创作短剧、短视频、小说时,这种随机性可能是好事。但我不把它们当作严肃的生产工作。 ↩