使用ERNIE Bot SDK和一条核心prompt开发AI“划拳“游戏!

news2024/11/27 2:27:27

项目背景

划拳是汉族民间饮酒时一种助兴取乐的游戏,起源于汉代。
游戏规则如下:
两人同时伸出一只手,先攥起拳头,代表财不外露。再伸出一到五个手指,表示从零到五之间的数字,同时嘴里大声喊出两人所出数字之和。
两人都猜对或都猜错,则划拳继续。直到一方猜对才为赢家,而猜错方为输家,要罚酒。
这套酒令完整的说法是:"一条龙、哥俩好、三星照、四喜财、五魁首、六六六、七个巧、八匹马、九连环和十全有"。
在游戏中,我们借助大模型的强大能力,让大模型扮演你的划拳对手,玩家可以通过简单的操作与大模型进行划拳。
希望在你独自一人喝酒的时候,能通过这款游戏找到乐趣。

项目方案

划拳游戏的流程如下:
开始阶段: 两位玩家同时伸出一只手,用攥起的拳头和伸出一到五个手指表示从零到五这几个数字。 与此同时,两位玩家嘴里喊出从0到10的数字。
判断阶段: 比较两位玩家伸出的手指表示的数字相加的和与其中一位玩家嘴里喊出的数字是否相同。 如果相同,则喊出该数字的玩家获胜;如果不同,则继续下一轮。
惩罚阶段: 输的玩家需要按照规则喝酒或其他约定的惩罚。
我们希望模型扮演一个划拳游戏的玩家,核心是希望模型输出两个数字:出拳数字和猜拳数字。 核心prompt设计如下:

# 核心prompt
game_prompt = ("你现在在陪我玩划拳游戏,我已经出拳了,现在到你了。你的任务如下:"
               "1.输出一个0-5之前的数字,表示你的出拳数字;"
               "2.输出一个0-10之间的数字,表示你的猜拳数字;"
               "3.将两个数字以{'gesture':'','predict':''}的JSON格式返回,其中gesture表示你的出拳数字,predict表示你的猜拳数字。"
               "注意: 除了JSON格式数字以外,不要返回其他任何内容。")

代码实现

1. 安装项目依赖

In [1]

# 安装依赖
! pip install -U erniebot
Looking in indexes: https://mirror.baidu.com/pypi/simple/, https://mirrors.aliyun.com/pypi/simple/
Collecting erniebot
  Downloading https://mirrors.aliyun.com/pypi/packages/b8/82/8bcbb280e13da2dd67667423d6ba34cb72f54c4201fb18816adc7de4914f/erniebot-0.5.3-py3-none-any.whl (65 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 65.9/65.9 kB 1.0 MB/s eta 0:00:00a 0:00:01
Requirement already satisfied: aiohttp in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from erniebot) (3.9.1)
Requirement already satisfied: bce-python-sdk in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from erniebot) (0.8.98)
Requirement already satisfied: colorlog in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from erniebot) (6.8.0)
Requirement already satisfied: jsonschema>=4.19 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from erniebot) (4.20.0)
Requirement already satisfied: requests>=2.20 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from erniebot) (2.31.0)
Collecting tenacity (from erniebot)
  Downloading https://mirrors.aliyun.com/pypi/packages/f4/f1/990741d5bb2487d529d20a433210ffa136a367751e454214013b441c4575/tenacity-8.2.3-py3-none-any.whl (24 kB)
Requirement already satisfied: typing-extensions>=4.8.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from erniebot) (4.9.0)
Requirement already satisfied: attrs>=22.2.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from jsonschema>=4.19->erniebot) (23.1.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from jsonschema>=4.19->erniebot) (2023.11.2)
Requirement already satisfied: referencing>=0.28.4 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from jsonschema>=4.19->erniebot) (0.32.0)
Requirement already satisfied: rpds-py>=0.7.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from jsonschema>=4.19->erniebot) (0.15.2)
Requirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from requests>=2.20->erniebot) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from requests>=2.20->erniebot) (3.6)
Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from requests>=2.20->erniebot) (2.1.0)
Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from requests>=2.20->erniebot) (2023.11.17)
Requirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from aiohttp->erniebot) (6.0.4)
Requirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from aiohttp->erniebot) (1.9.4)
Requirement already satisfied: frozenlist>=1.1.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from aiohttp->erniebot) (1.4.1)
Requirement already satisfied: aiosignal>=1.1.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from aiohttp->erniebot) (1.3.1)
Requirement already satisfied: async-timeout<5.0,>=4.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from aiohttp->erniebot) (4.0.3)
Requirement already satisfied: pycryptodome>=3.8.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from bce-python-sdk->erniebot) (3.19.0)
Requirement already satisfied: future>=0.6.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from bce-python-sdk->erniebot) (0.18.3)
Requirement already satisfied: six>=1.4.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages (from bce-python-sdk->erniebot) (1.16.0)
Installing collected packages: tenacity, erniebot
Successfully installed erniebot-0.5.3 tenacity-8.2.3

2.实现调用ERNIE API的方法

In [2]

import erniebot
# 调用ErnieBotSDK,实现智能对话
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

3.设计核心prompt

输入为空,输出为JSON格式的两个数字

In [3]

# 核心prompt
game_prompt = ("你现在在陪我玩划拳游戏,我已经出拳了,现在到你了。你的任务如下:"
               "1.输出一个0-5之前的数字,表示你的出拳数字;"
               "2.输出一个0-10之间的数字,表示你的猜拳数字;"
               "3.将两个数字以{'gesture':'','predict':''}的JSON格式返回,其中gesture表示你的出拳数字,predict表示你的猜拳数字。"
               "注意: 除了JSON格式数字以外,不要返回其他任何内容。")

4.获取模型输出并提取JSON字段

In [6]

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"]

5.设计字典保存数字与酒令口号的映射关系,增加趣味性

In [11]

# 保存酒令口号与数字的映射关系
alias_dict = {
    '一条龙': 1,
    '哥俩好': 2,
    '三星照': 3,
    '四喜财': 4,
    '五魁首': 5,
    '六六六': 6,
    '七个巧': 7,
    '八匹马': 8,
    '九连环': 9,
    '十全有': 10
}
# 保存数字与酒令口号的映射关系
alias_dict_reverse = {v: k for k, v in alias_dict.items()}

6.实现判断游戏胜负的逻辑并进行测试

In [9]

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

In [13]

# 核心逻辑测试
print(game_process("替换为你的token",5,"八匹马"))
'ernie-bot' will be deprecated in the future. Please use 'ernie-3.5' instead.
指数之和:8
用户预测:8
模型预测:7
('我输了,自罚一杯!', '七个巧', 3)

7.利用gradio开发游戏原型

利用Comate进行辅助,参考代码如下

In [ ]

with gr.Blocks(title="划拳游戏", theme="soft") as game:
    gr.Markdown("<center><h1>中国传统游戏--划拳</h1></center>")
    gr.Markdown("""<center><p1>
    中国传统酒令游戏“划拳”是两人同时伸出一只手,先攥起拳头,代表财不外露。再伸出一到五个手指,表示从零到五之间的数字,同时嘴里大声喊出两人所出数字之和。
两人都猜对或都猜错,则划拳继续。直到一方猜对才为赢家,而猜错方为输家,要罚酒的。唐朝人称划拳为"拇战"、"招手令"或"打令"等。一般都是从一开始,数到十结束。
这套酒令完整的说法是:"一条龙、哥俩好、三星照、四喜财、五魁首、六六六、七个巧、八匹马、九连环和十全有"。</p1>
</center>""")
    token = gr.Textbox(label="AccessToken")
    with gr.Row():
        with gr.Column():
            user_gesture = gr.Number(label="出拳(0-5之间的数字)", value=3)
            user_predict = gr.Dropdown(label="猜拳",
                                       choices=['一条龙', '哥俩好', '三星照', '四喜财', '五魁首', '六六六', '七个巧',
                                                '八匹马', '九连环', '十全有'])
            submit_button = gr.Button(value="Go!")
        with gr.Column():
            model_gesture = gr.Textbox(label="文心出拳")
            model_predict = gr.Textbox(label="文心猜拳")
    with gr.Row():
        result = gr.Textbox(label="本轮结果")

    submit_button.click(game_process, [token, user_gesture, user_predict], [result, model_predict, model_gesture])
    

comate 提效

星河社区最近上线支持在VSCode中一键启动Comate。在本项目代码编写过程中,我也体验了使用Comate辅助进行代码编写,极大提高了编码效率,给aistudio点赞👍。 具体的使用方法可以参考下面的链接:智能代码助手Comate上线星河社区
下面分享一下我使用comate的例子:

  1. 生成较为复杂的python字典

  2. 反转字段key、value

  3. 生成初步的gradio app页面

可以看到,生成的代码相当不错!我也是最近刚开始接触comate,更多使用方法让我们一起探索!

效果展示

 游戏体验地址: https://aistudio.baidu.com/application/detail/24086

总结

通过ERNIE Bot SDK调用文心大模型的能力开发大模型应用是不是超简单?只需要将你的想法转化为合适的prompt,任何想法都能轻易实现!
不会写prompt?没关系!免费课程教你:https://aistudio.baidu.com/education/group/info/28604 快动动脑筋,行动起来吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1845364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建智慧高速公路:软件管理平台业务架构解析

随着交通网络的不断完善和技术的快速发展&#xff0c;智慧高速公路正成为交通领域的重要发展方向。在智慧高速公路系统中&#xff0c;软件管理平台扮演着关键的角色&#xff0c;它不仅是管理各种设备和系统的核心&#xff0c;还承担着数据监控、故障诊断、维护管理等重要任务。…

Linux 一键部署Nginx+ModSecurity

前言 ModSecurity 是 Apache 基金会的一个开源、高性能的 Web 应用程序防火墙(WAF),它提供了强大的安全规则引擎,用于检测和阻止各种攻击行为,如 SQL 注入、XSS 跨站点脚本攻击等。而 nginx 是一个高性能的 Web 服务器,常用于处理大量的并发请求,具有很高的负载均衡能力…

智慧在线医疗在线诊疗APP患者端+医生端音视频诊疗并开处方

智慧在线医疗&#xff1a;音视频诊疗新纪元 &#x1f310; 智慧医疗新篇章 随着科技的飞速发展&#xff0c;智慧医疗正逐步走进我们的生活。特别是在线医疗&#xff0c;凭借其便捷、高效的特点&#xff0c;已成为许多患者的首选。而其中的“智慧在线医疗患者端医生端音视频诊疗…

SQLCMD完全指南:掌控 SQL Server

SQL Server 拥有被广泛认可的一流管理工具——SQL Server Management Studio&#xff08;简称 SSMS&#xff09;。它提供了丰富的功能&#xff0c;极大地简化了开发人员和数据库管理员&#xff08;DBA&#xff09;的工作。 目录 SQLCMD 入门使用 SQLCMD 连接 SQL ServerSQLCMD …

[信号与系统]有关滤波器的一些知识背景

前言 最近在看FIR和IIR&#xff0c;本文作为前置&#xff0c;需要在理解这两种滤波器之前阅读。 本文内容会详细讲述一下有关滤波器的技术要求。 选频滤波器的频率响应 选频滤波器&#xff08;Selective Frequency Filter&#xff09;的频率响应是描述该滤波器在不同频率下…

浙江保融科技2025实习生校招校招笔试分享

笔试算法题一共是有4道&#xff0c;第一道是手搓模拟实现一个ArrayList&#xff0c;第二道是判断字符串是否回文&#xff0c;第三道是用代码实现1到2种设计模式。 目录 一.模拟实现ArrayList 二.判断字符串是否回文 ▐ 解法一 ▐ 解法二 ▐ 解法三 三.代码实现设计模式 一…

文件扫描工具哪个好?便捷的文件扫描工具推荐

对于初入职场的大学毕业生&#xff0c;申请就业补贴是一项不可忽视的福利。 它不仅能够为新生活带来经济上的缓解&#xff0c;也有助于职业生涯的顺利起步。面对申请过程中需提交的文件&#xff0c;如纸质劳动合同&#xff0c;不必烦恼。市面上众多文件扫描软件能助你一臂之力…

C#使用NPOI库实现Excel的导入导出操作——提升数据处理效率的利器

文章目录 一、NPOI库简介二、安装与引入三、Excel的导入操作1.CSV格式导入2.XLS格式导入3. XLSX格式导入 四、Excel的导出操作1. CSV格式导出2. XLS格式导出3. XLSX格式导出 五、NPOI库的应用优势与改进方向总结 在日常工作学习中&#xff0c;我们经常需要处理Excel文件&#x…

测绘行业解决方案

应用场景 - 地籍测量 业务挑战 • 人工地籍测量速度慢&#xff0c;效率低&#xff0c;工程周期长 • 外业工作量大&#xff0c;人力成本高 • 传统测绘成果限于数字线划图&#xff0c;无法直观展示地块实景效果 无人机优势 • 可实现 1:500 免像控测绘 • 高效作业&…

CVE-2023-38836(文件上传+命令执行)

简介 BoidCMS v.2.0.0 存在文件上传漏洞&#xff0c;远程攻击者可通过添加 GIF 头部绕过 MIME 类型检查&#xff0c;执行任意代码。 过程 打开靶场 对网站进行目录扫描 发现后台&#xff0c;登录弱口令账号密码 admin/password 发现文件上传位置 根据简介提示&#xff0c;…

C# 实现去除多行文本框光标闪烁,并设置行距

一、前言 本篇主要通过继承RichTextBox 的方式实现去除多行文本框的光标闪烁&#xff0c;以及能够设置行距大小&#xff0c;这是因为C#提供的TextBox 和 RichTextBox 本身无这样的功能 二、代码 封装 RichTextBox 为CustomTextBox using System; using System.Collections.Ge…

惠海H4120 降压IC 40V 36V 30V降压5V3A 9V3A 12V3A 动态响应优异,低纹波

H4120是一款功能优良的异步降压型DC-DC转换器。它的主要特性和优势如下&#xff1a; 产品特性&#xff1a; 内置40V耐压MOS&#xff1a;内置的高耐压MOS使得H4120能够处理更多种的输入电压范围&#xff0c;增强了其适用性和可靠性。 宽输入范围&#xff1a;输入电压可在5V至…

【python】PyQt5初体验,窗口等组件开发技巧,面向对象方式开发流程实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

docker换源

文章目录 前言1. 查找可用的镜像源2. 配置 Docker 镜像源3. 重启 Docker 服务4. 查看dock info是否修改成功5. 验证镜像源是否更换成功注意事项 前言 在pull镜像时遇到如下报错&#xff1a; ┌──(root㉿kali)-[/home/longl] └─# docker pull hello-world Using default …

hive优化之逻辑类似重复

今天拿到一个二次开发的需求&#xff0c;只是增加一个业务类型&#xff0c;开发起来倒是也蛮轻松。 但是&#xff0c;对自己的要求不难这么低&#xff0c;否则可替代性也太高了。 除了完成自己的那部分开发&#xff0c;当然展现自己实力的&#xff0c;可以是优化。 1&#x…

Java基础学习-数组

目录 数组定义 注意点&#xff1a; 地址值是数组在内存中实际存储的地址。 案例遍历&#xff1a;遍历数组得到每一个元素&#xff0c;求数组里面所有数据和 案例&#xff1a;定义数组&#xff0c;遍历能被3整除的数字 案例&#xff1a;遍历一个数组&#xff0c;奇数将当前…

MacOS设备远程登录配置结合内网穿透实现异地ssh远程连接

文章目录 前言1. MacOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接MacOS3.1 MacOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接MacOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

Oracle最终还是杀死了MySQL

起因 大约15年前&#xff0c;Oracle收购了Sun公司&#xff0c;从而也拥有了MySQL&#xff0c;互联网上关于Oracle何时会“扼杀MySQL”的讨论此起彼伏。 当时流传着各种理论&#xff1a;从彻底扼杀 MySQL 以减少对 Oracle 专有数据库的竞争&#xff0c;到干掉 MySQL 开源项目&…

团队管理五个基本法则,帮你打造高效团队

团队管理是一项至关重要的工作&#xff0c;作为一名管理者&#xff0c;应该如何在团队管理中发挥作用呢&#xff1f;以下是团队管理的五个基本原则&#xff0c;它们能够帮助你打造出一个高效协作的团队。 一、以身作则 团队要保持超强的执行力&#xff0c;管理者必须以身作则…

【初阶数据结构】深入解析带头双向循环链表:探索底层逻辑

&#x1f525;引言 本篇将介绍带头双向循环链表底层实现以及在实现中需要注意的事项&#xff0c;帮助各位在使用过程中根据底层实现考虑到效率上问题和使用时可能会导致的错误使用 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔…