我和5个AI玩游戏,居然还输了?

2024-07-30 20:08:58 浏览数 (2)

有读者问:

现在AI大模型那么火,有没有可能在自己写的游戏里用上AI?

今天我们就来浅试一下,通过接入AI大模型的API接口,制作一个与AI进行对话的文字游戏。

大家应该都听过「图灵测试」:如果一台机器能让屏幕另一端与他聊天的人判断不出它究竟是人还是机器,那么这台机器就算通过了图灵测试。

而我们这个游戏,与图灵测试相反。是看AI能否判断出,跟它对话的到底是一个人,还是另一个AI?

游戏玩法的灵感来源于一个叫做《谁是卧底》的游戏。

我们的参与者是多个AI,和一个人类玩家。AI需要根据所有玩家的发言,投票选出最可能是人类的那个玩家。每一轮结束后,累计票数最多的一个玩家出局。当人类出局,游戏结束,AI胜利。而如果人类苟到最后,则人类胜利。

这个游戏就叫做:

谁是人类

简要介绍一下这个游戏的程序设计,和接入AI的操作:

目前AI大模型的API接口和平台有很多,国外和国内的都有。本游戏演示里用的是百度千帆。当然接入API是需要付费的,不过相比于自己买显卡或者用云算力搭建,还是相对成本更低,而且也更方便。

比如我们可以通过这一个平台,就可以接入Llama2、ChatGLM、悟道天鹰、BloomZ等多个开源大模型的接口。再加上百度自己的文心大模型,就组成了我们在游戏中的不同AI玩家。

接入方法也很简单,注册并等待审核通过后,在「应用接入」中创建一个应用,就会得到API Key和Secret Key。

在「在线服务」中开通你需要的大模型接口,然后在「自助服务」的「示例代码中心」里,就能生成调用接口的Python代码,下载到本地可直接使用。

代码的核心是两次请求,第一次是根据API Key和Secret Key进行鉴权,获取Access Token,第二次是带上这个Access Token去请求接口,获取大模型的回答。不到10行Python代码就可以完成。

代码语言:javascript复制
def main():
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token="   get_access_token()
    payload = json.dumps({
        "messages": [
            {
                "role": "user",
                "content": "你是谁"
            }
        ]
    })
    headers = {
        'Content-Type': 'application/json'
    }
    response = requests.request("POST", url, headers=headers, data=payload)
    print(response.text)

def get_access_token():
    """
    使用 AK,SK 生成鉴权签名(Access Token)
    :return: access_token,或是None(如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))

有了大模型的回答,就可以构建我们的游戏主体了。

  • 首先通过接口,让AI给我们一个讨论的话题。
  • 然后再将此话题作为提示词,分别调用5个大模型的接口获取回答
  • 同时也需要获取人类玩家的输入
  • 将6个回答按编号合并后,构造出新的提示词,再次分别调用5个大模型,询问它们认为其中哪一个是人类的回答
  • 对结果进行处理,提取编号,统计每个玩家的得票数,并判断是否存在一个累计最高票的玩家,有的话则出局。如果出局的是人类,游戏结束,否则游戏继续,重新开始下一轮,以此类推。
  • 游戏还有一种结局,那就是最后只剩下人类玩家,那么人类胜利。

这个流程并不复杂,用前面封装好的请求代码,再套上两层循环就能实现。不过为了让游戏更具有可玩性,我们再给它加上一个交互更友好的界面。

编写界面布局是一项繁琐而枯燥的任务,于是也把它交给AI。

通过对布局进行文字描述,让AI用tkinter模块编写好相应的代码。AI生成的代码通常并不能一次到位,但可以根据结果反复引导它修改,以及再加上一点点人类程序员的二次加工。程序的界面就有了。

剩下的,就是把前面写好的游戏逻辑和GUI界面代码整合起来。

这里需要提醒注意的是:游戏主循环要放在一个单独的子线程中运行,否则整个界面都会卡住。

而获取人类玩家的输入,则通过python中队列来实现线程间的数据传递。

两部分代码对接好之后,编程教室的首款AI游戏,《谁是人类》demo版 就完成了!

这里头像也是通过AI绘图生成的。

游戏的具体效果可以看视频中的演示:

测试了2局,人类都不幸败给了AI……

游戏代码已开源。试试看,你能不能骗过AI。也欢迎你在我的代码基础上二次开发,看看能魔改出什么有意思的玩法来。

这个demo只是一个AI与游戏结合的尝试,游戏性还有待加强。现在市面上也有一些实验性游戏使用大模型控制NPC的对话甚至行为,以期望增加游戏的开放性。不过总体来说,目前AI在游戏中的应用还处早期阶段,探索意义大于实用价值,游戏中AI的潜力还有待发掘。我个人对未来AI在游戏中的应用还是比较乐观的,期待之后能有令人眼前一亮的游戏出现。

作者:Crossin的编程教室

0 人点赞