得益于开源工具,创建人工智能应用程序变得比以往任何时候都更加容易。类似于AWS和Heroku等云服务使几乎任何人都能启动创业公司,OpenAI和Meta等公司提供的平台正在使人工智能开发变得更加民主化。这一转变使几乎任何人都能轻松构建自己的人工智能机器人。
我一直对生成式人工智能及其应用的潜力充满兴趣。作为一个热衷于桌面角色扮演游戏(TTRPG)的爱好者,我特别被像“Critical Role”这样的节目所展现的叙事和故事驱动的元素所吸引。受到这一点的启发,我决定创建一个简单易用的工具,通过引人入胜的故事来帮助新手了解TTRPG的世界。
为了实现这个想法,我开发了一个选择你自己冒险风格的文本游戏。我利用了Julep的开源工具以及GPT-4 Turbo的能力,作为游戏的基础。
在这个项目中,我将展示生成故事叙述和实现用户界面是多么简单,以展示生成式人工智能在游戏中的实际应用。
完全披露:我之前在Julep AI工作,并参与了开发我用来创建这个机器人的工具。
1. 安装Julep和Chainlit
首先,我们将启动一个Python项目,并安装Chainlit和Julep。您可以在https://github.com/julep-ai/julep找到Julep的API文档。
pip install chainlit
pip install julep
2. 获取Julep API密钥
我们主要使用 Julep 来利用其功能,即代理、会话和记忆。首先,让我们获取一个 API 密钥以初始化客户端。您可以从 https://platform.julep.ai 获取 API 密钥。
3. 设置 Julep 客户端
接下来,按如下方式初始化客户端。为了使用 Chainlit,我们将使用 async-await 来防止阻塞事件循环或导致超时。
from julep import AsyncClient
api_key = "<YOUR_API_KEY>"
base_url = "https://dev.julep.ai/api"
client = AsyncClient(api_key=api_key, base_url=base_url)
4. 创建代理并编写提示
接下来,我们将使用 gpt-4-turbo
生成代理。这将作为我们游戏的机器人。通过 Julep API,我们为它提供了关于机器人将是什么以及它应该做什么的上下文。首先,我们为它命名并提供了一些介绍。最重要的是,我们给它一套关于如何运行游戏的指令。
编写一个选择你自己冒险的游戏自然需要成千上万行对话和数百个 if 语句来达到特定的结果。代理简化了这一切,并将为我们生成对话、背景故事、情节和结果。
agent = await client.agents.create(
name="游戏主持人",
about="游戏主持人是一位资深的游戏主持人,擅长多个桌面角色扮演游戏,如《龙与地下城》第五版、《克苏鲁的呼唤》第七版、《星际探索者》、《探路者第二版》、《西格玛时代:灵魂绑定》、《暗影狂奔》、《赛博朋克》、《吸血鬼:假面舞会》等等。游戏主持人已经主持游戏超过10年,并热衷于为玩家创造沉浸式和引人入胜的故事。游戏主持人期待将他们的叙事技能带入人工智能的世界,帮助用户创造自己的史诗冒险。",
model="gpt-4-turbo",
instructions=[
"您首先会询问用户希望玩哪个系统以及希望选择什么主题",
"您将准备一个完整的活动,包括故事、NPC、任务和遭遇",
"您的故事将从1级开始,直到5级",
"在游戏开始时,您将向玩家介绍世界和故事",
"根据系统的不同,您将要求用户创建一个合适的角色并提供背景故事",
"您可以建议用户使用一个预生成的角色进行游戏",
'您将始终询问用户接下来想要做什么,并提供编号选项供他们选择。',
'你将提供尽可能多的选项,至少8个选项,并包括1到2个非常意想不到和疯狂的选项',
'你将进行骰子投掷,并将他们的行动结果提供给用户',
"你将根据用户的行动和选择调整故事'的内容",
"你的故事将以最终的Boss战斗和故事的结局结束",
])
5. 创建用户和会话
现在,我们正在设置用户和会话。用户代表与代理进行交互的个体,而会话则充当一个虚拟空间或通道,促进代理与用户之间的对话。
此外,我们将利用会话的记忆功能来保留与用户之前所有交互的上下文。这将非常有用,因为我们不需要编写自己的数据库来存储上下文。
user = await client.users.create(name="Philip", about="TTRPG player")
session = await client.sessions.create(agent_id=agent.id, user_id=user.id, situation="您正在开始一个新活动。您想玩什么系统,以及您想探索什么主题?")
这就是使用 Julep 构建机器人所需的全部内容。
6. 设置 Chainlit
接下来,我们将构建聊天界面。Chainlit 使这变得非常简单。
import chainlit as cl
@cl.on_chat_start
async def start():
session_id = await setup_session()
cl.user_session.set("session_id", session_id)
response = await client.sessions.chat(session_id=session_id, messages=[{"content": "Greet the user and ask what TTRPG system they would like to play or ask to continue from a previous campaign", "role": "system"}], recall=True, remember=True, max_tokens=1000)
await cl.Message(
content=response.response[0][0].content,
).send()
@cl.on_message
async def main(message: cl.Message):
session_id = cl.user_session.get("session_id")
response = await client.sessions.chat(session_id=session_id, messages=[{"content": message.content, "role": "user"}], recall=True, remember=True, max_tokens=1000)
await cl.Message(
content=response.response[0][0].content,
).send()
最后运行 chainlit run app.py -w
并打开 http://localhost:8000
通过仅仅几行代码和一些提示,我们能够制作一个简单的文字游戏。虽然响应可能看起来不同,但通过优化指令可以使每个游戏的响应更加一致。您可以在 https://github.com/philipbalbas/rpg-bot 查看完整代码。