通过大模型来实现多个智能体进行游戏对局这个想对已经比较成熟了无论是去年惊艳的斯坦福小镇还是比如metaGPT或者类似的框架都是使用智能体技术让大模型来操控,从而让大模型跳出自身“预测下一个token”的文字功能去探索更多的应用落地可能性。不过一直没有真正操作过,直到前段时间看到一个新闻《和GPT-4
通过大模型来实现多个智能体进行游戏对局这个想对已经比较成熟了。无论是去年惊艳的斯坦福小镇还是比如metaGPT或者类似的框架都是使用智能体技术让大模型来操控,从而让大模型跳出自身“预测下一个token”的文字功能去探索更多的应用落地可能性。不过一直没有真正操作过,直到前段时间看到一个新闻《和GPT-4这些大模型玩狼人杀,人类因太蠢被票死,真·反向图灵测试》决定自己来玩一下。
斗地主是一款国人比较熟悉的棋牌游戏,考虑到这个游戏受众群体,所以基础大模型使用国产的通义千问提供的API接口(GPT4太贵用不起)。通过阿里云百炼大模型平台即可简单注册并申请使用:
https://bailian.console.aliyun.com/
接着就是整体框架设计,其实整个游戏设计比较简单,随机发牌->随机定义一个玩家作为地主并发出尾牌(由于主要是模拟大模型使用Agent的玩牌所以这里就不加入抢地主环节了)->从地主开始玩家轮流出牌->谁的牌出完根据其角色决定是地主胜利还是农民胜利。
游戏整体使用c#编程,游戏主要的处理逻辑就是检测AI出牌的合法性,包括AI出牌是否是当前智能体的持有的手牌、牌型是否正确(单排/连子/对子/顺子/三带一/炸弹),出的牌是否可以压住上一轮玩家的牌等等逻辑。核心的部分如下:
以及玩牌部分的核心逻辑:
接着就是一些游戏状态管理,包括初始化牌组、分派给三个玩家手牌,玩家自身的手牌管理等等这里就不一一赘述了,这里主要讲一下基于阿里千问大模型如何设计Agent代理的部分。在阿里百炼上,可以查看模型的调用示例,这里我们选择阿里目前最大的千亿参数大模型千问-MAX,进入调用示例就可以看到类似如下示例代码(如果你喜欢SDK则可以选择python和java的包。如果是其他语言则只有自己手写http请求调用):
调用的部分比较简单,就是一个httpclient的封装,以及对调用入参和出参DTO的实体定义:
接着就是比较关键的部分,即入参的定义,这决定了大模型如何调用智能体的关键,这里面其实主要还是编写特定的prompt让大模型知道自己要干嘛。由于是斗地主游戏,所以这里我们需要在系统提示词中编写一些关于斗地主的基本游戏规则、不同角色可以采取的常规游戏策略,游戏当前的对局情况。接着在用户提示词中需要告知大模型扮演智能体的角色、持有的手牌,可以调取的游戏函数。其中游戏函数比较关键,这也是大模型唯一可以让游戏“动起来”的方式。以下是我定义的关于斗地主游戏的请求入参:
接下来就是游戏的运行主要部分逻辑,定义一个游戏实例,通过一个死循环检测是否已经有玩家手牌出尽来判断游戏是否已经达到结局,没有出尽则依次让大模型调用智能体通过函数玩游戏,并且当模型出牌不符合规则时通过函数回调告知模型出错的逻辑指导模型重新进行对应的出牌:
以上内容基本就是主要的部分,演示的内容如下:
可以看到模型的表现还是比较“蠢”,这是因为斗地主是一个典型的信息不完全(信息不透明)的游戏。这意味着在游戏过程中不是所有的信息都是对所有玩家开放的。策略的多样性和不确定性让玩家在游戏中必须基于有限的信息做出决策,比如是否抢地主(本示例没有)、如何出牌以及如何配合或对抗其他玩家。玩家的策略不仅受到手牌的限制,还受到对其他玩家策略的猜测和解读的影响。加之当前大模型对于数学的理解能力较差和逻辑短板导致其表现的比较“智障”。一般的斗地主AI主要依赖搜索算法+剪枝策略或者基于神经网络+强化学习+搜索算法来实现比如典型的棋牌类AI比如Pluribus和AlphaGo都是依赖类似的技术来实现,而大模型本身主要并非转向基于游戏决策做过训练,所以这里也就不展开了。本作主要还是想讨论大模型在智能体应用上有哪些可能的落地方式。
完整的代码如下,有兴趣的朋友可以自行申请百炼的千问API接口进行尝试(没有依赖任何包,所以可以创建一个控制台程序直接粘贴到program.cs即可运行):
小编推荐阅读