大家好!
这是我一系列开发博客的第一篇文章,如果您想知道这是什么,您可以查看我以前的文章Development Blog #0。
OSR TTRPG游戏有很多参考表,例如地方,怪物,武器,在本文中,我将尝试使用OpenAI作为地形表制作自动化内容。
我想生成以下地形的描述:
- 山谷
- 森林
- 山
- 草原
- 沙漠
- 沼泽
描述可能会因白天还是晚上的不同而有所不同。
为此,我将使用python使用lambda函数,因此我创建了一个名为:RandomTableGenerator
使用Pyhton 3.8版本的函数。
出于本文的目的
我们需要做的第一件事是添加一个返回随机数和两个变量以获取骰子的函数。
import random
terrains_table = [
"Valley",
"Forest",
"Mountains",
"Grasslands",
"Desert",
"Swamp"
]
time_table = [
"day",
"night"
]
def roll_dice(number):
result = random.randint(1, number)
return result
def lambda_handler(event, context):
terrain_id = roll_dice(6)
time_id = roll_dice(2)
terrain = terrains_table[terrain_id -1]
time = time_table[time_id -1]
print(terrain)
print(time)
现在我们拥有地形价值和时间值,如果项目已经存在,我们将在DynamoDB表中查看。
为此,我将使用terrain_id作为partition_key和time_id创建一个Terrains
dynamodb表作为sort_key,这样我就可以使用这两个值获得该项目。
现在,我们需要添加代码以查找项目并在这些项目不存在的情况下创建项目。
import random
import boto3
def generate_terrain_description(terrain, time):
# code
def get_terrain_by_time(terrain_id, time_id):
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Terrains')
response = table.get_item(
Key={
'terrain_id': terrain_id,
'time_id': time_id
}
)
item = response.get('Item')
if not item:
return False
return item
def lambda_handler(event, context):
terrain_id = roll_dice(6)
time_id = roll_dice(2)
terrain = terrains_table[terrain_id -1]
time = time_table[time_id -1]
item = get_terrain_by_time(terrain_id, time_id)
if not item:
# item doesn't exist
return item
现在我们将创建一个用于创建项目的新功能。
import random
import boto3
def generate_terrain_description(terrain, time):
# code
def get_terrain_by_time(terrain_id, time_id):
# code
def create_terrain(terrain_id, time_id, name, time, description):
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Terrains')
item = {
'terrain_id': terrain_id,
'time_id': time_id,
'terrain': name,
'time': time,
'description': description
}
response = table.put_item(Item=item)
if response['ResponseMetadata']['HTTPStatusCode'] == 200:
return item
else:
return None
def lambda_handler(event, context):
terrain_id = roll_dice(6)
time_id = roll_dice(2)
terrain = terrains_table[terrain_id -1]
time = time_table[time_id -1]
description = ""
item = get_terrain_by_time(terrain_id, time_id)
if not item:
item = create_terrain(terrain_id, time_id, name, time, description)
return item
现在,如果我们要寻找的项目不存在,它将创建项目并返回。
在下一步中,我们将根据我们的输入使用OpenAI生成一些描述。
注意:AWS lambda中无法使用OpenAi软件包,因此我们需要添加包含OpenAI软件包及其依赖项的lambda层,幸运的是GitHub用户:erenyasarkurt(对他进行枪击),创建了一个由发行版创建的储存库在此lambda层中,您可以在以下github存储库中找到这些释放:erenyasarkurt/OpenAI-AWS-Lambda-Layer。
下载用于Python版本的版本,并在Lambda中创建一个新图层,然后更新您的lambda函数以使用该层。
现在转到配置 /环境变量并创建一个名为OPENAI_API_KEY
的新变量,并将您的密钥添加为值。< / p>
如果您没有OpenAI API键,则可以注册并创建一个键,也可以关注此OpenAI Introduction。
现在我们拥有OpenAI层和键,在环境变量中,我们可以继续使用代码。
下一步是创建一个新的funciont,该新的funciont将基于terrain
和time
。
import os
import random
import boto3
import openai
def generate_terrain_description(terrain, time):
# code
def get_terrain_by_time(terrain_id, time_id):
# code
def generate_terrain_description(terrain, time):
openai_api_key = os.environ.get("OPENAI_API_KEY")
prompt_template = """I am scene description Game Master.
You can give me description criteria and I will describe the scene only with the given description criteria.
My answer will be a paragraph no longer than 4 lines and will use a description in a Game Master Syle.
\n
\nDescription criteria:
\n- Terrain: _terrain_
\n- Time of the day: _time_
\n"""
my_prompt = prompt_template.replace("_terrain_", terrain)
my_prompt = my_prompt.replace("time", time)
response = openai.Completion.create(
model="text-davinci-003",
prompt=my_prompt,
temperature=0,
max_tokens=100,
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["\n"]
)
return response.choices[0]["text"]
def create_terrain(terrain_id, time_id, name, time, description):
# code
def lambda_handler(event, context):
terrain_id = roll_dice(6)
time_id = roll_dice(2)
terrain = terrains_table[terrain_id -1]
time = time_table[time_id -1]
item = get_terrain_by_time(terrain_id, time_id)
if not item:
description = generate_terrain_description(terrain, time)
item = create_terrain(terrain_id, time_id, terrain, time, description)
return item
如果一切顺利,您将在lambda函数中具有以下输出:
{
"terrain_id": 2,
"time_id": 2,
"description": "The forest is shrouded in darkness, the only light coming from the stars and the moon. The trees stand tall and silent, their branches swaying gently in the night breeze. The air is still and the only sound is the occasional chirp of a night bird.",
"terrain": "Forest",
"time": "night"
}
因此,这就是本文的全部,在下一个我打算使用dall-e-2生成图像并在github存储库中添加所有代码的图像。
请继续关注!