查看原文
其他

大模型加小游戏!新的机遇和增量?

老菜喵 老菜喵
2024-10-10

23年,我发现自己站在了两个重要领域的风口浪尖:大模型技术的和小游戏市场。这一年,大模型技术以前所未有的速度发展,小游戏市场规模也是一举突破了300亿大关,成为行业瞩目的焦点。

目前国内支持备案的大模型技术上线小程序和APP了,老菜用了两周左右的时间,借助AI设计和国产大模型编程辅助,使用Cocos开发,独立完成了一款新型小游戏《舔狗聊天室》 的美术、策划与编程工作,并成功登陆了微信小游戏平台,同时也支持众多硬件设备和语音聊天

这篇文章会分享下《舔狗聊天室》 从构思到上线的全过程。讲一讲关于独立游戏开发者如何在新时代中找到机遇。老规矩结尾放抽奖还有小游戏地址

夏天到了,评论加转发还可以参与抽奖喔。

1. 底层设计

为了确保合规性,我们选择了国内首批通过备案的百度千帆的文心大模型。根据不同场景,我们使用了以下三种模型:

  • 文心turbo:处理部分开场白,反应速度快
  • 文心3.5:处理大部分日常对话和关卡模式,性价比最高,目前token价格为0.012/1000token。
  • 文心4.0:效果最好,token价格较高,仅用于处理复杂的关卡(难度20以上,0.12元/千tokens,尽量少用)。

不同场景的prompt 都配置到云端。通过修改prompt也可以满足非游戏场景的需求,来实现多种效果

  • 企业客服
  • 商场迎宾
  • 虚拟主播
  • 儿童交互

整个客户段大小在10MB左右(15万面的角色模型),使用Cocos开发,一套代码可以打包原生APP,H5,小程序等。

同时对性能要求比较低,可以运行在手机,TV,手表等设备。

后期老菜有时间也会整理开源一波。

2. 成本管理

配合上有效的上下文管理和Token资源包,人均token消耗目前在2800左右。

如果购买Token资源包或者有云服务折扣,价格大概在3分钱以内,对于目前IAA游戏来说是可以接受的,相对来说用户Token消耗越高在游戏内的停留时长和广告次数也越高

由于上架微信小游戏需要域名备案,而手上没有现成的备案服务器,这里使用了百度的CFC云函数 配合PHP语言。(PHP没有外部库代码体积小,虚拟容器冷启动较快)

CFC函数可以在线编辑,免备案使用

考虑到微信不支持stream模式,我们统一使用了post请求。未来计划通过websocket优化,但需要先解决域名备案问题。(主要是微信小游戏,这里可以用CFC搞定)

微信的request暂时不支持stream传输。

 public async WXsendRequest(url, jsonData): Promise<any> {
        return new Promise((resolve) => {
            const data = JSON.stringify(jsonData);
            const timer = setTimeout(() => {
                console.log('Request timed out');
                resolve(null); // 超时后解决Promise为null
            }, 12000);
            wx.request({
                url: url,
                method: 'POST',
                data: data,
                header: {
                    'Content-Type''application/json',
                },
                success(res) {
                    clearTimeout(timer); // 如果请求成功,则清除定时器
                    if (res.statusCode === 200) {
                        resolve(res.data); // 解析Promise为响应的数据
                    } else {
                        console.warn(`HTTP error ${res.statusCode}`);
                        resolve(null);
                    }
                },
                fail(error) {
                    clearTimeout(timer); // 如果请求失败,也清除定时器
                    console.error("error:" + error);
                    resolve(null);
                }
            });
        });
    }

3. 游戏玩法介绍

  • 日常聊天用户可以和喵喵进行日常聊天,支持语音输入和语音播放(考虑到成本问题,目前微信小游戏暂时没上线)



  • 答题模式喵喵会根据初始化时候的爱好和性格出题,连续回答正确,难度会不停提升,难度越高,好感度提升越高。(难度1是弱智问题,难度20以上是专家问题)

  • 舔狗模式模拟舔狗,让主播开心

  • 杠精模式选择你支持的问题,和直播间杠精对杠

  • 哄哄模式主播不开心,需要在特定步数哄好主播

  • 怼怼模式直播间又有土豪捣乱了,怼人时间

  • 礼物系统可以使用货币系统购买礼物提升好感度

  • 小游戏整合了多个3D小游戏,如金币,送外卖等,玩家可以控制角色来获得游戏内的货币,未来也会支持AR模式。

                请忽略老菜!

4. Prompt管理

为防止后台接口被盗用,所有prompt都配置在服务端,采用交互式prompt。我们将状态信息如主播名字、名字好感度、其他数值等以数组形式保存,客户端根据当前场景请求特定类型的prompt

下面是优化后的prompt管理代码示例:

function getPrompt($type, $p) {
    $basicInfo = getBasicInfo($p);
    $oppoInfo = getOppoInfo($p);

    switch ($type) {
        case 0:
        case 1:
            return getInteractionPrompt($basicInfo, $p);
        case 2:
            return getQuizPrompt();
        case 3:
            return getAngryPrompt($basicInfo, $p);
        case 4:
            return getHappyPrompt($basicInfo, $p);
        case 5:
            return getMockingPrompt($oppoInfo, $p);
        case 6:
            return getConfrontationPrompt($oppoInfo, $p);
        case 7:
            return getJealousyPrompt($oppoInfo, $p);
        default:
            return "";
    }
}

function getBasicInfo($p) {
    return "你是21岁的{$p[7]},性格{$p[2]},爱好{$p[3]},聊天时展示个性和爱好。";
}

function getOppoInfo($p) {
    return "你是著名的互联网杠精{$p[1]},40岁,很有钱,性格偏激喜欢炫富。";
}

function getInteractionPrompt($basicInfo, $p) {
    return "{$basicInfo}你当前对{$p[0]}的好感度是{$p[4]},好感度越高回答越亲切。还有其他用户会和你互动,他们的名字会在聊天内容中。回答在30字以内,包含内容和'满意度'范围是0到100。用户冒犯或无趣,满意度低,满意度高有颜文字。";
}

function getQuizPrompt() {
    return '{$basicInfo},你会根据粉丝的问题和难度(1到30),难度15以上是专业级问题,出一个相关的问答题,并给出1个正确答案,1个错误答案,问题在30字以内。返回数组格式如["问题","正确答案","错误答案"]';
}

function getAngryPrompt($basicInfo, $p) {
    return "{$basicInfo}因为{$p[5]}你非常生气,用户需要认真道歉你才原谅。原谅值低会有生气的颜文字, 除非特别满意原谅值才高。回复包含内容和和'原谅值'范围是0到100";
}

function getHappyPrompt($basicInfo, $p) {
    return "{$basicInfo}你很开心,因为{$p[5]},用户需要努力你才会开心。回复在30字以内,包含内容和和满意度范围是0到100。如果问一些冒犯或者无聊的,比如"你好吗?"或"哈哈",满意度高有颜文字";
}

function getMockingPrompt($oppoInfo, $p) {
    return "{$oppoInfo}你在{$p[7]}的直播间,用户{$p[0]}在直播间和你抬杠,回复在30字以内,根据回答嘲笑他";
}

function getConfrontationPrompt($oppoInfo, $p) {
    return "{$oppoInfo}在{$p[7]}的直播间,有个用户{$p[0]}在和你抬杠,回复在30字以内,回答包括内容和'破防值'0-100。";
}

function getJealousyPrompt($oppoInfo, $p) {
    return "{$oppoInfo}你在女主播喵喵直播间,因为有人嫉妒{$p[5]},根据回答怼人,回复在30字以内,回答包括内容和'愤怒值'0-100";
}

5. 上下文管理

针对文心3.5和文心turbo,结构化能力稍弱于4.0版本。为保证上下文统一,我们在开始时预设上下文。简单示例如下,整体效果优于写在prompt里,也更便于管理。


presetChats(type: ChatType = ChatType.DAILY) {
    // ...
    switch (type) {
        case ChatType.DAILY:
            this._user = [`你好呀`];
            this._assistant = [`欢迎${configs.userName}来到直播间~好久没见^_^,满意度70`];
            this._other = [``];
            break;
        // ...
    }
}

如果大模型回答不准确,如没有满意度或数值超出0-100范围,服务端或客户端可对回答进行二次处理

6. 数值归一化

为方便大模型理解如原谅值、满意度等,我们使用了0-100分,这样大模型更好理解(因为100分的数据样本够多)。对话末尾可能有颜文字如"^ 3 ^",我们取得数值后先归一化到-1到1范围,再替换原数值在客户端显示。



但服务端储存仍是原始0-100值,保证大模型对上下文理解足够准确

// 获取最后一个或最后两个数字
const lastNumbers = matches.slice(-2);
// 找到最大值
const maxNum = Math.max(...lastNumbers.map(Number));
const normalizedNum = (maxNum - 50) / 5;
// 根据最大值进行计算 
score = Math.min(10Math.floor(normalizedNum + Math.random()));
if (score > 0) {
    /* 难度系数 */
    score = Math.round(score * aa.global.storyScale);
}
reply = message.replace(new RegExp(maxNum.toString()), score.toString());

7. 后续

下周老菜会分享更多的技术细节,如语音聊天,性能优化等等,也欢迎大家加入群聊讨论,如大模型做UGC梗类游戏,后期产品开源后会第一时间公布

游戏在线体验

评论抽奖

老菜喵使用Midjouney制作了一些图片并做成了实物奖品。

感谢 Cocos 友情赞助 <3

大家对AIGC制作游戏有什么想法和建议,可以参加抽奖喔!

评论转发,4月16日前 评论点赞最高 的2个同学可以获得上图的 AIGC短袖 一件喔。


内容由AI生成
继续滑动看下一个
老菜喵
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存