# 一、基于【文心一言】的小游戏《数到30》
视频地址:www.bilibili.com/video/BV1MC…
游戏地址: aistudio.baidu.com/application…
1.游戏设定
轮流报数,每次至少报 1 个数,最多报 2 个数,从 1 到 30 按顺序连续报数,谁先报到 30,谁就获胜。
2.后台支撑
当然是文心一言4.0了,没二选,启用多轮对话。
3.效果
4. erniebot 应用举例
4.1快速安装
执行如下命令,快速安装Python语言的最新版本ERNIE Bot SDK(推荐Python >= 3.8)。
pip install --upgrade erniebot
4.2快速使用
大家使用ERNIE Bot SDK之前,请首先申请并设置鉴权参数,具体请参考认证鉴权。
** Python接口**
import erniebot
# List supported models
models = erniebot.Model.list()
print(models)
# ernie-bot 文心一言旗舰版
# ernie-bot-turbo 文心一言轻量版
# ernie-text-embedding 文心百中语义模型
# ernie-vilg-v2 文心一格模型
# Set authentication params
erniebot.api_type = "aistudio"
erniebot.access_token = "<access-token-for-aistudio>"
# Create a chat completion
response = erniebot.ChatCompletion.create(model="ernie-bot", messages=[{"role": "user", "content": "你好,请介绍下你自己"}])
print(response.result)
命令行接口(CLI)
# List supported models
erniebot api model.list
# Set authentication params for chat_completion.create
export EB_API_TYPE="aistudio"
export EB_ACCESS_TOKEN="<access-token-for-aistudio>"
# Create a chat completion (using ernie-bot, ernie-bot-turbo, etc.)
erniebot api chat_completion.create --model ernie-bot --message user "请介绍下你自己"
# Set authentication params for image.create
export EB_API_TYPE="yinian"
export EB_ACCESS_TOKEN="<access-token-for-yinian>"
# Generate images via ERNIE-ViLG
erniebot api image.create --model ernie-vilg-v2 --prompt "画一只驴肉火烧" --height 1024 --width 1024 --image-num 1
经典示例
对话补全(Chat Completion)
ERNIE Bot SDK提供具备对话补全能力的文心一言旗舰版模型ernie-bot和文心一言迅捷版模型ernie-bot-turbo。
旗舰版模型的效果更好,迅捷版模型的响应速度更快、推理时延更低,大家可以根据实际场景的需求选择合适的模型。
以下是调用文心一言旗舰版模型进行多轮对话的示例:
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = "<access-token-for-aistudio>"
response = erniebot.ChatCompletion.create(
model="ernie-bot",
messages=[{
"role": "user",
"content": "请问你是谁?"
}, {
"role": "assistant",
"content":
"我是百度公司开发的人工智能语言模型,我的中文名是文心一言,英文名是ERNIE-Bot,可以协助您完成范围广泛的任务并提供有关各种主题的信息,比如回答问题,提供定义和解释及建议。如果您有任何问题,请随时向我提问。"
}, {
"role": "user",
"content": "我在深圳,周末可以去哪里玩?"
}])
print(response)
语义向量(Embedding)
ERNIE Bot SDK提供用于提取语义向量的Embedding模型。
该模型基于文心大模型,使用海量数据训练得到,为文心百中系统提供关键能力。该模型可以将字符串转为384维浮点数表达的语义向量,语义向量具备极其精准的语义表达能力,可以用于度量两个字符串之间的语义相似度。
大家可以使用以下代码提取句子的语义向量。
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = "<access-token-for-aistudio>"
response = erniebot.Embedding.create(
model="ernie-text-embedding",
input=[
"我是百度公司开发的人工智能语言模型,我的中文名是文心一言,英文名是ERNIE-Bot,可以协助您完成范围广泛的任务并提供有关各种主题的信息,比如回答问题,提供定义和解释及建议。如果您有任何问题,请随时向我提问。",
"2018年深圳市各区GDP"
])
print(response)
大家可以登陆文心百中体验中心,体验更多大模型语义搜索的能力。
文生图(Image Generation)
ERNIE Bot SDK提供具备文生图能力的ERNIE-ViLG大模型。
该模型具备丰富的风格与强大的中文理解能力,支持生成多种尺寸的图片。
import erniebot
erniebot.api_type = "yinian"
erniebot.access_token = "<access-token-for-yinian>"
response = erniebot.Image.create(
model="ernie-vilg-v2",
prompt="雨后的桃花,8k,辛烷值渲染",
width=512,
height=512
)
print(response)
我们推荐两个撰写文生图Prompt提示词的文档,大家可以组合使用,创作出更加精美的图片。
大家也可登陆文心一格平台,体验更多AI艺术与创意辅助的能力。
函数调用(Function Calling)
ERNIE Bot SDK提供函数调用功能,即由大模型根据对话上下文确定何时以及如何调用函数。
借由函数调用,用户可以从大模型获取结构化数据,进而利用编程手段将大模型与已有的内外部API结合以构建应用。
以下是调用文心一言旗舰版模型进行函数调用的示例:
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = "<access-token-for-aistudio>"
response = erniebot.ChatCompletion.create(
model="ernie-bot",
messages=[
{
"role": "user",
"content": "深圳市今天气温如何?",
}, ],
functions=[{
"name": "get_current_temperature",
"description": "获取指定城市的气温",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称",
},
"unit": {
"type": "string",
"enum": ["摄氏度", "华氏度"],
},
},
"required": ["location", "unit"],
},
"responses": {
"type": "object",
"properties": {
"temperature": {
"type": "integer",
"description": "城市气温",
},
"unit": {
"type": "string",
"enum": ["摄氏度", "华氏度"],
},
},
},
}, ],
)
print(response)
二、实现
1.prompt概要
主要是交代游戏规则。
你将扮演一个游戏高手,和我轮流报数,每次至少报 1 个数,最多报 2 个数,从 1 到 30 按顺序连续报数,谁先报到 30,谁就获胜,我先开始。
2.界面设置
- 设置了对话框
- 输入框
- 发送按钮
- 清空按钮
with gr.Blocks(theme=gr.themes.Glass()) as demo:
with gr.Row():
gr.HTML(
"""<h1 align="center">我的穿越</h1>""")
with gr.Row():
gr.HTML(
"""<img align="center" src='https://ai-studio-static-online.cdn.bcebos.com/5f1287bbfeb04bcd8206076cf5726c2c4e500aab274a4d368b6aabf858d9521b' width='100%'> <br>""")
with gr.Row():
gr.HTML(
"""<h2 align="center">请和我一起数到30,谁先数到30谁获胜。</h2>""")
with gr.Row():
chatbot = gr.Chatbot()
with gr.Row():
msg = gr.Textbox(
value="你将扮演一个游戏高手,和我轮流报数,请严格按照规则进行,具体规则为:每次至少报 1 个数,最多报 2 个数,从 1 到 30 按顺序连续报数,谁先报到 30,谁就获胜,我先开始报数,下面是我的报数。")
with gr.Row():
submit = gr.Button("Submit")
clear = gr.Button("Clear")
msg.submit(predict, [msg, chatbot], [msg, chatbot])
submit.click(predict, [msg, chatbot], [msg, chatbot])
clear.click(lambda: None, None, chatbot)
3.对话
- 启用多轮对话
- ak、sk我打码了(需要的替换成自己的)
def predict(message, history):
# 从页面输入建立历史对话列表
mess_dict = []
if len(history) > 0:
for item in history:
tmp_user = {
"role": "user",
"content": item[0]
}
mess_dict.append(tmp_user)
tmp_assistant = {
"role": "assistant",
"content": item[1]
}
mess_dict.append(tmp_assistant)
# 将user输入加入对话列表
tmp_message = {
"role": "user",
"content": message
}
mess_dict.append(tmp_message)
# 千帆鉴权,由于aistudio送的100w token用完了,买的千帆的token,这里打码了。
erniebot.api_type = "qianfan"
erniebot.ak = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
erniebot.sk = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
chat_completion = erniebot.ChatCompletion.create(model="ernie-bot-4",
messages=mess_dict)
# 获取输出
result = chat_completion.result
history.append((message, result))
return "", history
4.完整代码
import os
os.system("pip install -U erniebot -i https://mirrors.aliyun.com/pypi/simple/")
import gradio as gr
import erniebot
def predict(message, history):
# 从页面输入建立历史对话列表
mess_dict = []
if len(history) > 0:
for item in history:
tmp_user = {
"role": "user",
"content": item[0]
}
mess_dict.append(tmp_user)
tmp_assistant = {
"role": "assistant",
"content": item[1]
}
mess_dict.append(tmp_assistant)
# 将user输入加入对话列表
tmp_message = {
"role": "user",
"content": message
}
mess_dict.append(tmp_message)
# 千帆鉴权
erniebot.api_type = "qianfan"
erniebot.ak = "xxxxxxxxxxxxxxxxxxx"
erniebot.sk = "xxxxxxxxxxxxxxxxxxx"
chat_completion = erniebot.ChatCompletion.create(model="ernie-bot-4",
messages=mess_dict)
# 获取输出
result = chat_completion.result
history.append((message, result))
return "", history
with gr.Blocks(theme=gr.themes.Glass()) as demo:
with gr.Row():
gr.HTML(
"""<h1 align="center">基于【文心一言】的小游戏《数到30》
</h1>""")
with gr.Row():
gr.HTML(
"""<img align="center" src='https://ai-studio-static-online.cdn.bcebos.com/5dfc4965f23f4a288f4a8ec7ad344a29b3fe89612cde4c8fab7c21f3ea48f5da' width='100%'> <br>""")
with gr.Row():
gr.HTML(
"""<h2 align="center">轮流报数,每次至少报 1 个数,最多报 2 个数,从 1 到 30 按顺序连续报数,谁先报到 30,谁就获胜。</h2>""")
with gr.Row():
chatbot = gr.Chatbot([], elem_id="chatbot", label="聊天记录")
with gr.Row():
msg = gr.Textbox(
value="你将扮演一个游戏高手,和我轮流报数,请严格按照规则进行,具体规则为:每次至少报 1 个数,最多报 2 个数,从 1 到 30 按顺序连续报数,谁先报到 30,谁就获胜,我先开始报数,下面是我的报数。",
label="用户输入")
with gr.Row():
submit = gr.Button("❤️❤️❤️Submit❤️❤️❤️")
clear = gr.Button("😍😍😍Clear😍😍😍")
msg.submit(predict, [msg, chatbot], [msg, chatbot])
submit.click(predict, [msg, chatbot], [msg, chatbot])
clear.click(lambda: None, None, chatbot)
if __name__ == '__main__':
demo.launch()
三、其他
- 如果大家有什么小游戏点子,可以提出来我转换过来一起玩。
- 我发布了一个视频,大家可以看看,文心一眼拟人能力很强,还回故意报错,但是也会自己纠正,很有趣。