作者晓飞好,飞桨星河社区开发者,金融行业软件开发工程师,对大模型应用开发比较感兴趣。个人主页链接:https://aistudio.baidu.com/personalcenter/thirdview/48323
技术的迅速发展为我们带来了无限的创新可能,大模型技术也极大地降低了AI技术落地的门槛。
本项目将使用ERNIE SDK和智能代码助手Comate开发一个中国传统游戏——划拳。在游戏中,我们借助大模型的强大能力,让大模型扮演你的划拳对手,玩家可以通过简单的操作与大模型进行游戏。
划拳是汉族民间饮酒时一种助兴取乐的游戏,起源于汉代,以其简单、有趣的特点深受人们喜爱。
划拳的游戏规则如下:
1. 两人同时伸出一只手,先攥起拳头,代表财不外露。再伸出一到五个手指,表示从零到五之间的数字,同时嘴里大声喊出两人所出数字之和。
2. 两人都猜对或都猜错,则划拳继续。直到一方猜对才为赢家,而猜错方为输家,要罚酒。
这套酒令完整的说法是:“一条龙、哥俩好、三星照、四喜财、五魁首、六六六、七个巧、八匹马、九连环和十全有”。
希望在你独自一人喝酒的时候,能通过这款游戏找到乐趣。
项目方案
图片来源:https://baike.baidu.com/item/划拳/4430188
玩划拳游戏需要玩家手口并用,具体流程如下:
1.开始阶段:两位玩家同时伸出一只手,用攥起的拳头(表示零)和伸出一到五个手指表示从零到五这几个数字。与此同时,两位玩家嘴里喊出从0到10的数字。
2.判断阶段:比较两位玩家伸出的手指表示的数字相加的和与其中一位玩家嘴里喊出的数字是否相同。如果相同,则喊出该数字的玩家获胜;如果不同,则继续下一轮。
3.惩罚阶段:输的玩家需要按照规则喝酒或其他约定的惩罚。
实现上述的流程的关键是设计合适的prompt,我们希望模型扮演一个划拳游戏的玩家,核心是希望模型输出两个数字:出拳数字和猜拳数字,并且返回内容必须必须是JSON格式的,不能有任何额外的信息。
核心prompt设计如下:
game_prompt = ("你现在在陪我玩划拳游戏,我已经出拳了,现在到你了。你的任务如下:"
"1.输出一个0-5之前的数字,表示你的出拳数字;"
"2.输出一个0-10之间的数字,表示你的猜拳数字;"
"3.将两个数字以{'gesture':'','predict':''}的JSON格式返回,其中gesture表示你的出拳数字,predict表示你的猜拳数字。"
"注意: 除了JSON格式数字以外,不要返回其他任何内容。")
代码实现:
# 安装依赖
! pip install -U erniebot
# 实现调用ERNIE SDK接口的方法
import erniebot
# 调用ERNIE SDK,实现智能对话
class ErnieLLM():
def __init__(self, token):
erniebot.api_type = 'aistudio'
erniebot.access_token = token
def predict(self, txt):
model = 'ernie-bot'
messages = [{'role': 'user', 'content': txt}]
response = erniebot.ChatCompletion.create(
model=model,
messages=messages,
)
return response.result
# 核心prompt
game_prompt = ("你现在在陪我玩划拳游戏,我已经出拳了,现在到你了。你的任务如下:"
"1.输出一个0-5之前的数字,表示你的出拳数字;"
"2.输出一个0-10之间的数字,表示你的猜拳数字;"
"3.将两个数字以{'gesture':'','predict':''}的JSON格式返回,其中gesture表示你的出拳数字,predict表示你的猜拳数字。"
"注意: 除了JSON格式数字以外,不要返回其他任何内容。")
import json
# 实现获取模型出拳和猜拳数字的方法
def predict_gesture(token):
# 请求文心一言模型的API
llm = ErnieLLM(token)
result = llm.predict(game_prompt)
# 提取JSON部分
start_index = result.find('{')
end_index = result.rfind('}') + 1
json_str = result[start_index:end_index]
# 将JSON字符串转换为Python字典
json_obj = json.loads(json_str)
return json_obj["gesture"], json_obj["predict"]
# 保存酒令口号与数字的映射关系
alias_dict = {
'一条龙': 1,
'哥俩好': 2,
'三星照': 3,
'四喜财': 4,
'五魁首': 5,
'六六六': 6,
'七个巧': 7,
'八匹马': 8,
'九连环': 9,
'十全有': 10
}# 保存数字与酒令口号的映射关系
alias_dict_reverse = {v: k for k, v in alias_dict.items()}
# 实现判断游戏胜负的逻辑
def game_process(token, user_gesture, user_predict):
# 用户输入的出拳数字
user_num = int(user_gesture)
# 用户输入的猜拳数字
user_predict = int(alias_dict[user_predict])
# 调用模型进行预测
model_gesture, model_predict = predict_gesture(token)
# 计算双方手指数之和
total_fingers = user_num + int(model_gesture)
print(f"指数之和:{total_fingers}")
print(f"用户预测:{user_predict}")
print(f"模型预测:{model_predict}")
# 胜负判定
if user_predict == total_fingers and model_predict != total_fingers:
result = "我输了,自罚一杯!"
elif user_predict != total_fingers and model_predict == total_fingers:
result = "哈哈,你输了!请自罚一杯!"
else:
result = "平局!再来!"
return result, alias_dict_reverse[model_predict], model_gesture
# 核心逻辑测试
print(game_process("替换为你的token",5,"八匹马"))
'ernie-bot' will be deprecated in the future. Please use 'ernie-3.5' instead.
指数之和:8
用户预测:8
模型预测:7
('我输了,自罚一杯!', '七个巧', 3)
Comate 提效
飞桨星河社区最近上线支持在VSCode中一键启动Comate。在本项目代码编写过程中,我也体验了使用Comate辅助进行代码编写,极大提高了编码效率,给飞桨星河社区点赞。
具体的使用方法可以参考下面的链接:智能代码助手Comate上线星河社区(https://aistudio.baidu.com/activitydetail/1503019315)下面分享一下我使用Comate的例子:
1、生成较为复杂的Python字典
2、反转字段key、value
3、生成初步的Gradio App页面
可以看到,生成的代码质量相当不错,稍微改一下就能用啦!除了生成代码,Comate还有代码补全、自动注释等其他功能,这些功能和更多使用技巧读者可以自行探索!
效果展示
游戏体验地址:https://aistudio.baidu.com/application/detail/24086
总结
通过ERNIE SDK调用文心大模型的能力开发大模型应用是不是超简单?只需要将你的想法转化为合适的prompt,任何想法都能轻易实现!
不会写prompt?没关系!免费课程教你:
https://aistudio.baidu.com/education/group/info/28604
快动动脑筋,行动起来吧!
参考资料
1.划拳游戏介绍:
https://baike.baidu.com/item/%E5%88%92%E6%8B%B3/4430188?fr=ge_ala
2.ERNIE SDK文档:
https://ernie-bot-agent.readthedocs.io/zh-cn/latest/
3.ERNIE SDK的具体使用教程参考:
https://aistudio.baidu.com/projectdetail/6779542?channelType=0&channel=0
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~