作者 | 崔皓
审校 | 重楼
摘要
本文作者受到一位国外博主的启发,决定尝试使用大语言模型创建一个地下城文字游戏。通过大语言模型生成富有创意和连贯性的游戏内容。他的游戏灵感主要来源于经典的桌面角色扮演游戏“龙与地下城”(D&D)。该游戏通过对话驱动,包括两个主要角色:故事描述者和主人公。故事描述者负责下达任务和推动故事,而主人公负责完成任务。作者设计了一个对话模拟器,用于处理角色之间的互动和游戏进程。此外,作者还考虑了游戏设计中的两个关键问题:记忆机制和发言规范。
开篇
自从在短视频平台上看到一位国外博主通过AI创建了一个模拟经营游戏,我就被深深吸引了。在他的虚拟小镇上,众多的NPC人物因AI的赋能而拥有了各种独特的性格,使得他们之间的互动充满了趣味和惊喜。这让我有点心痒痒,一直对游戏情有独钟的我,为什么不尝试借助AI的力量,创造一个属于自己的地下城文字游戏呢?然而,缺乏游戏开发经验成了我面前的一道障碍。不过转念一想,最近正在从事大语言模型开发的工作,而大语言模型本身就具备生成文字的能力。 我看到有人利用提示词和大模型可以玩文字的冒险游戏。带着这个想法,我查找了一些资料,发现通过prompt的方式真的可以“催眠”大模型,让它帮我创建一个游戏世界。
探索与尝试
有了上面的想法就要付诸行动了,说干就干,不过在开干之前需要对游戏进行构思,同时还要对实施的可行性进行评估。我的探索开始于ChatGPT,通过手动输入的方式,我和ChatGPT玩起了文字游戏。很快,我发现它与流行的龙与地下城游戏有异曲同工之妙—一个基于角色扮演的奇幻世界,玩家通过解决棘手的问题、勇敢的探险和激烈的战斗来推进故事。
龙与地下城(Dungeons & Dragons, 简称D&D)是一款源于1974年的桌上角色扮演游戏,它允许玩家在一个奇幻的中世纪环境中探险和战斗。玩家可以选择不同的角色,如战士、法师或盗贼,并通过掷骰子来决定行动的结果。游戏由一名地下城主(Dungeon Master, DM)来引导故事和管理游戏规则。D&D不仅创造了桌上角色扮演游戏的标准,也影响了后来的电子游戏和奇幻文学的发展。它的核心是集体讲述故事、解决问题和角色扮演,为玩家提供了一个丰富多彩、想象力驱动的游戏体验。
我可以通过龙与地下城游戏的玩法蓝本,来设计我的文字游戏。由于我没有任何的游戏设计经验,因此将游戏规则设计得简单明了,主要通过角色间的对话来推进游戏进程,以降低新手玩家的入门门槛。这里对话角色分为两个,分别是故事描述者和主人公,通过对话交互,玩家能够逐步深入游戏的核心,挑战和完成各种任务,同时享受与虚拟角色交流的乐趣。
趁热打铁,我们来设计一下文字游戏具体完成的任务。如下图所示,在文字游戏初始化的时候需要定义参与者,包括:主角(主人公)和故事的讲述者,故事的讲述者负责下达任务,而主人公负责完成任务。当然他们之间通过文字完成任务的交互,这里需要定义一个发言的规则。故事讲述者下达任务之后,主角会接着发言,推进故事,接着通过轮流发言的方式完成所有的任务。
准备出发
有了思路以后就要准备开发所需要的模型和工具了。模型方面,我选择了OpenAI 的GPT-3.5-Turbo的版本,另外也考虑了使用百度千帆模型库中提供的ChatGLM2-6B-32K模型,不过在输入字符长度上前者比较有优势,因此还是选择了GPT,不过后面代码的部分,我会把ChatGLM2版本的代码以remark的方式呈现给大家,如果大家有兴趣可以自行尝试。
有了游戏背景,接着就需要考虑文字游戏都会遇到的两个问题:
记忆机制
在地下城游戏中,保持对话的连贯性和角色身份的一致性至关重要。为解决这个问题,我们设计了一个消息系统,它可以保存参与者的背景信息,包括:身份,发言的方式,以及哪些事情应该做,哪些事情不能做。每次提供提示给大模型时,都会利用该系统强化模型的记忆,确保游戏的流畅进行。刚好可以利用LangChain中的System Message 机制完成。
LangChain的`SystemMessage`是一个特殊的消息类型,它用于在与大语言模型的交互中提供上下文或指令。通过`SystemMessage`,可以向模型传达关于游戏的背景信息或其他重要指示,帮助模型生成更符合场景的回应。它是在构建交互式应用时,提供上下文和指导信息的有效方式。
发言规范
为保证游戏的有序进行,我们需要设定明确的发言顺序。在这个简单的场景中,我们选择了轮流发言的规则。为了未来能够轻松扩展到更多玩家或更复杂的交互规则,我们将发言规则独立为一个模块,从而为游戏提供了更多的灵活性。在实施的时候,也就是通过一个取模的函数就能够轻松搞定。如果遇到多人参与,或者存在交叉发言,玩家互相提问的场景,也可以设计更加负责的发言规则。总之需要将规则的部分独立出来,做到高内聚低耦合。
程序设计
有了游戏设计思路,接着我们对基本的程序进行设计。如下图所示,在入口的Main函数中我们会进行对话参数的初始化,例如:人物基本信息,背景信息的定义。然后,调用DialogueSimulator 添加玩家,同时设置发言规则,以及发起任务。接下来就是通过DialogueAgent 类进行文字消息的处理,这里只需要处理发送消息和接受消息。由于,本例中只有两个参与者,故事描述者和主人公所以发送和介绍消息会在两者之间轮流进行。
代码实践
完成了基本的设计工作,就是写代码了。这里我们使用Colab作为IDE工具,以及如何在此环境中配置和使用Langchain和GPT-3.5 Turbo。
Colab,即Google Colaboratory,是一个免费的Jupyter笔记本环境,无需进行任何设置就可以在浏览器中使用。它不仅提供了可靠的计算资源,还配备了GPU和TPU,可以加速机器学习或深度学习项目。Colab的特点包括实时多人协作、免费GPU资源、易于分享和集成Google Drive等。使用Colab的主要原因是它的便捷性和高效性。它省去了配置环境的麻烦。
首先,通过如下代码在colab中安装包和相关依赖:
!pip install openai langchain
分享说明:转发分享请注明出处。