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(10, Math.floor(normalizedNum + Math.random()));
if (score > 0) {
/* 难度系数 */
score = Math.round(score * aa.global.storyScale);
}
reply = message.replace(new RegExp(maxNum.toString()), score.toString());
那么,如何系统的去学习大模型LLM?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~
篇幅有限,部分资料如下:
👉LLM大模型学习指南+路线汇总👈
💥大模型入门要点,扫盲必看!
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。
👉大模型入门实战训练👈
💥光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉国内企业大模型落地应用案例👈
💥《中国大模型落地应用案例集》 收录了52个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
💥《2024大模型行业应用十大典范案例集》 汇集了文化、医药、IT、钢铁、航空、企业服务等行业在大模型应用领域的典范案例。
👉LLM大模型学习视频👈
💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
👉640份大模型行业报告👈
💥包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
👉获取方式:
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓