Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型,快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程,将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

原文出处来自作者于 2024 年 8 月在 community.aws 发表的博客:

“From Concept to Playable in seconds:Creating the Greedy Snake Game with Amazon Bedrock”:https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct?trk=cndc-detail

概述

在软件开发领域演进的历史长河中,开发者投入的时间一直是一种非常宝贵的资源。作为开发者,我们一直在不断地寻求创新的方法来简化工作流程、减少技术债务,并希望以提升开发的速度和效率将想法快速付诸实践。而生成式 AI(Generative AI)正是这一游戏规则的改变者,它有望彻底革新我们进行编码和解决问题的方式。

想象一下,你能够快速进行原型开发和概念验证,这已经是 Amazon Bedrock 这种生成式 AI 平台所能提供的现实了。通过利用在海量数据上训练的大型语言模型的强大能力,我们可以加速开发周期,并评估提示词的质量以获得最佳结果。

在这篇博客文章中,我将探讨如何利用 Amazon Bedrock,使用自然语言从零开始创建经典的贪吃蛇游戏。此外,我还将探讨如何进一步利用 Amazon Bedrock 上的大模型来评估和改进我的提示词,确保更高质量的代码输出。通过结合正确的提示词和合适的大模型,我们将目睹一个从创新想法到可玩游戏的完整生成之旅,而这一切只需几秒钟,这都归功于 Amazon Bedrock 能够简化原型设计,并实现快速概念验证。

让我们开始这段愉快的自然语言直接编写贪吃蛇游戏之旅吧!

使用的大型语言模型

我用于生成游戏代码的大型语言模型,采用了在 Amazon Bedrock 上的 Meta Llama 3.1 70B Instruct。

Amazon Bedrock 是一个强大的生成式 AI 平台,允许开发者为各种用例(包括代码生成等)创建和微调大型模型。而 Meta Llama 3.1 70B Instruct 模型专门用于遵循指令和生成高质量代码。你可以在 Hugging Face 上参考模型卡片以了解更多详情:https://huggingface.co/meta-llama/Meta-Llama-3.1-70B-Instruct?trk=cndc-detail

提示工程方法

成功使用生成式 AI 的关键之一在于提示工程(Prompt Engineering):即创建清晰、具体的提示词,以指导模型精确生成所需的输出。

以下是我用来生成贪吃蛇游戏代码的提示词:

“Write a short and high-quality python script for the following task, something a very skilled python expert would write. You are writing code for an experienced developer so only add comments for things that are non-obvious. Make sure to include any imports required.

NEVER write anything before the python block. After you are done generating the code and after the python block, check your work carefully to make sure there are no mistakes, errors, or inconsistencies.

If there are errors, list those errors in tags, then generate a new version with those errors fixed. If there are no errors, write "CHECKED:NO ERRORS" in tags.

Here is the task:write a greedy snake game.

Double check your work to ensure no errors or inconsistencies.”

正如你所看到的,这个提示词为游戏的功能、要使用的库以及其他实现细节提供了详细的要求。提供这种程度的明确性对于从生成式 AI 模型获得高质量的代码输出至关重要。

在 Amazon Bedrock Chat Playground 中,单击“Run”以将上述提示词提交给 Meta Llama 3.1 70B Instruct 模型,然后等待几秒钟模型的响应。如下截图所示:

image.png

输出:贪吃蛇游戏代码

输入提示词后,Amazon Bedrock 上的 Llama 3.1 70B Instruct 模型,在几秒内迅速生成了以下的 Python 代码,该代码基本实现了一个功能齐全的贪吃蛇游戏。生成的完整代码如下:

import pygame
import sys
import random# Initialize Pygame
pygame.init()# Set up some constants
WIDTH, HEIGHT = 800, 600
BLOCK_SIZE = 20
SPEED = 10# Set up some colors
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)# Set up the display
screen = pygame.display.set_mode((WIDTH, HEIGHT))# Set up the font
font = pygame.font.Font(None, 36)# Set up the snake and food
snake = [(200, 200), (220, 200), (240, 200)]
food = (400, 300)# Set up the direction
direction = 'RIGHT'# Game loop
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP and direction != 'DOWN':direction = 'UP'elif event.key == pygame.K_DOWN and direction != 'UP':direction = 'DOWN'elif event.key == pygame.K_LEFT and direction != 'RIGHT':direction = 'LEFT'elif event.key == pygame.K_RIGHT and direction != 'LEFT':direction = 'RIGHT'# Move the snakehead = snake[-1]if direction == 'UP':new_head = (head[0], head[1] - BLOCK_SIZE)elif direction == 'DOWN':new_head = (head[0], head[1] + BLOCK_SIZE)elif direction == 'LEFT':new_head = (head[0] - BLOCK_SIZE, head[1])elif direction == 'RIGHT':new_head = (head[0] + BLOCK_SIZE, head[1])snake.append(new_head)# Check if the snake has eaten the foodif snake[-1] == food:food = (random.randint(0, WIDTH - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE,random.randint(0, HEIGHT - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE)else:snake.pop(0)# Check if the snake has hit the edge or itselfif (snake[-1][0] < 0 or snake[-1][0] >= WIDTH orsnake[-1][1] < 0 or snake[-1][1] >= HEIGHT orsnake[-1] in snake[:-1]):pygame.quit()sys.exit()# Draw everythingscreen.fill(WHITE)for pos in snake:pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], BLOCK_SIZE, BLOCK_SIZE))pygame.draw.rect(screen, RED, pygame.Rect(food[0], food[1], BLOCK_SIZE, BLOCK_SIZE))text = font.render(f'Score:{len(snake)}', True, (0, 0, 0))screen.blit(text, (10, 10))# Update the displaypygame.display.flip()# Cap the frame ratepygame.time.delay(1000 // SPEED)

该代码的主要功能实现包括:初始化 Pygame,设置游戏的尺寸、块大小和速度等常量、定义显示元素的颜色、初始化显示屏幕等等。代码还设置了用于显示得分(贪吃蛇每吃到一个食物将获得一分)的字体,初始化了蛇和食物的位置,以及设置了蛇移动的初始方向等游戏要素。

游戏会循环持续检查用户输入事件,如用户退出了游戏,或者使用了方向键改变蛇的运动方向等。游戏主要逻辑将根据用户输入以及蛇的当前方向,来更新蛇的位置,并同时检查与食物或边界的是否碰撞,从而决定是否更新相应分数等。此外,游戏的循环代码还处理了在屏幕上渲染游戏元素,并限制帧率。

以下图像显示了我实际调试代码的场景。以代码片段作为背景,前景是正在运行的游戏截图:

image.png

值得一提的是,这个全面且可执行的代码是根据一段文本提示词生成的,没有提供任何补充示例或训练数据。这展示了 Amazon Bedrock 上的该大语言模型(Llama 3.1 70B Instruct)具有将自然语言描述直接转化为完整代码的出色能力,从而节省了游戏开发者相比于从头开始编写游戏代码所需的大量时间。

当然生成的代码并非完美无缺,可能需要增强或扩展一些额外功能。但它确实为开发者提供了一个坚实的基础。

评估提示词的质量

虽然我们已经成功生成了贪吃蛇游戏的一份完整代码,但我还是想客观地评估使用的提示词质量,因为我考虑未来是否可以更好地使用 AI 来生成代码。

我所参考的标准来自《Generative AI on AWS》一书中总结的 16 项提示工程最佳实践。我已将这 16 项最佳实践纳入我的评估提示词中,以评估之前用于生成贪吃蛇游戏的提示词质量。

完整的评估提示词如下:

Here are the key prompt-engineering best practices discussed in Chapter 2 of the book “Generative AI on AWS”:

  • Be clear and concise in your prompts. Avoid ambiguity.

  • Move the instruction to the end of the prompt for large amounts of input text.

  • Clearly convey the subject using who, what, where, when, why, how etc.

  • Use explicit directives if you want output in a particular format.

  • Avoid negative formulations if a more straightforward phrasing exists.

  • Include context and few-shot example prompts to guide the model.

  • Specify the desired size of the response.

  • Provide a specific response format using an example.

  • Define what the model should do if it cannot answer confidently (e.g. respond "I don't know").

  • Ask the model to "think step-by-step" for complex prompts requiring reasoning.

  • Add constraints like maximum length or excluded information for more control.

  • Evaluate the model's responses and refine prompts as needed.

  • Use disclaimers or avoid prompts the model should not answer for sensitive domains.

  • Use XML/HTML tags to create structure within the prompt.

  • Focus the model on specific parts of the input text.

  • Mask personally identifiable information from the model's output.

Based on the above 16 prompt-engineering best practices, please evaluate the following prompts I used to generate a Greedy Snake Game:

“Write a short and high-quality python script for the following task, something a very skilled python expert would write. You are writing code for an experienced developer so only add comments for things that are non-obvious. Make sure to include any imports required.

NEVER write anything before the python block. After you are done generating the code and after the python block, check your work carefully to make sure there are no mistakes, errors, or inconsistencies.

If there are errors, list those errors in tags, then generate a new version with those errors fixed. If there are no errors, write "CHECKED:NO ERRORS" in tags.

Here is the task:write a greedy snake game.

Double check your work to ensure no errors or inconsistencies.”

我在 Amazon Bedrock Chat Playground 中提交了上述提示词,如下图所示:

image.png

几秒钟后,收到了以下模型的完整评估输出:

模型输出提供了对我的提示词优点,以及潜在改进空间等非常有价值的见解。

首先,它在“优点”部分承认了我的提示语的优势:

  1. 明确简洁:你的提示语结构清晰,易于理解。

  2. 具体指示:你明确要求输出 Python 脚本格式和对高级别 Python 专家的期望水平。

  3. 上下文和少量示例提示语:你提供了一个明确的任务描述(贪吃蛇游戏)并指出了预期输出(高质量 Python 脚本)。

  4. 要求响应的大小:你要求一个“简短”的脚本。

  5. 具体响应格式:你使用python块来指示预期格式。

  6. 错误处理:你指示模型检查其工作并列出错误,或者如果没有错误则写“CHECKED:NO ERRORS”。

此外模型还建议如“缺陷”部分所示,提出一些改进提示语的建议:

  1. 含糊不清:虽然你的提示语总体很清楚,但“一个非常熟练的 Python 专家会写的东西”这句话可能有些主观和含糊不清。

  2. 否定表述:你用了“千万不要在python块之前写任何内容”,可以改为正面说法,例如“只能在python块中写代码”。

  3. 缺乏约束条件:你没有具体说明脚本的长度、复杂度或特定要求(如游戏功能、难度等级)的限制。

  4. 缺乏免责声明:你没有提及任何敏感领域或游戏内容可能存在的问题。

模型还提供了以下详细的代码修改具体建议:

  1. 考虑将“一个非常熟练的 Python 专家会写的东西”改为更客观的要求,如“遵循 Python 编码的最佳实践”。

  2. 用更积极的指示替换“千万不要在python块之前写任何内容”,比如“只能在python块中写代码”。

  3. 添加约束条件,例如“脚本不应超过 200 行代码”或“游戏应至少有 3 个等级”。

  4. 考虑添加一个免责声明,如“请确保游戏内容适合所有年龄段,不含任何令人反感的材料”。

总结

生成式 AI 彻底改变软件开发的潜力是巨大的。通过利用 Amazon Bedrock 和大型语言模型,开发者目前已经可以继续简化工作流程,快速构建原型并验证伟大的想法,这将加快软件开发迭代速度,以前所未有的效率将想法变为现实。

贪吃蛇游戏的例子展示了生成式 AI 将一个简单的提示词,转化为可运行游戏代码的惊人能力。然而,我们必须认识到:虽然生成的代码可以提供一个良好的基础,但可能需要进一步的完善和优化。

随着生成式 AI 的不断发展,我们可以期待更先进的模型、更好的提示词技术,以及与开发工具的更紧密集成。提前拥抱这一技术将获得重大的竞争优势。

最后,生成式 AI 并不是要取代人类开发者,而是增强他们能力的强大工具。通过将人类创造力与人工智能相结合,我们可以开启创新的软件开发新前景,创造更加非凡的软件产品和解决方案。

注:本文封面图像使用了 Amazon Bedrock 上的 Stable Diffusion XL 1.0 模型生成。提示词如下:

“A stylized digital illustration with a futuristic and technology-inspired design, depicting a large coiled snake made of sleek metallic materials and circuit board patterns. The snake's body forms the shape of the Amazon Bedrock logo in the center. Surrounding the snake are various coding elements, such as code snippets, programming symbols, and binary patterns, arranged in an abstract and visually striking way. The overall image should convey a sense of innovation, artificial intelligence, and the fusion of technology and creativity”

文章来源:Amazon Bedrock 实践:零基础创建贪吃蛇游戏

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# UserControl、Dockpanel和DockContent、Cursor、

一、UserControl类 UserControl 是 .NET 中的一个基类&#xff0c;用于创建自定义控件&#xff0c;主要用于 Windows Forms 和 WPF。通过继承 UserControl&#xff0c;你可以设计和实现具有特定界面和功能的控件组件。UserControl 允许你将多个标准控件组合在一起&#xff0c;…

网络层 III(划分子网和构造超网)【★★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、网络层转发分组的过程 分组转发都是基于目的主机所在网络的&#xff0c;这是因为互联网上的网络数远小于主机数&#xff0c;这样可以极大地压缩转发表的大小。…

C++和QT

引用 概念 引用是个别名 格式 数据类型 &引用名 同类型的变量名 &#xff08;&引用符号&#xff09; 数据类型 &引用名 同类型的变量名 &#xff08;&引用符号&#xff09;int a 10;int &b a; //给a取个别名叫b, b引用a 数组引用 int a;a10;int &…

【AI绘画】Midjourney前置指令/describe、/shorten详解

文章目录 &#x1f4af;前言&#x1f4af;Midjourney前置指令/describe使用方法1️⃣2️⃣3️⃣4️⃣&#xff08;选择对应提示词生成图片&#xff09;&#x1f504;&#xff08;重新识别生成提示词&#xff09;&#x1f389;Imagine all&#xff08;一次性生成所有&#xff09…

BERT:Pre-training of Deep Bidirectional Transformers forLanguage Understanding

个人觉着BERT是一篇读起来很爽的论文 摘要 我们引入了一种新的语言表示模型BERT&#xff0c;它代表Bidirectional Encoder Representations from Transformers。与最近的语言表示模型不同(Peters et al.&#xff0c; 2018a;Radford et al.&#xff0c; 2018)&#xff0c; BER…

Prometheus+Grafana的安装和入门

概念 什么是Prometheus? Prometheus受启发于Google的Brogmon监控系统&#xff08;相似kubernetes是从Brog系统演变而来&#xff09;&#xff0c; 从2012年开始由google工程师Soundclouds使用Go语言开发的开源监控报警系统和时序列数据库(TSDB)。&#xff0c;并且与2015年早起…

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

18959 二叉树的之字形遍历

### 思路 1. **输入读取**&#xff1a; - 读取输入字符串&#xff0c;表示完全二叉树的顺序存储结构。 2. **构建二叉树**&#xff1a; - 使用队列构建二叉树&#xff0c;按层次顺序插入节点。 3. **之字形层序遍历**&#xff1a; - 使用双端队列进行层序遍历&…

【开端】基于nginx部署的具有网关的web日志分析

一、绪论 基于nginx部署的具有网关的web日志分析&#xff0c;我们可以分析的日志有nginx的access.log &#xff0c;网关的日志和应用的日志 二、日志分析 1、nginx日志 参数 说明 示例 $remote_addr 客户端地址 172.17.0.1 $remote_user 客户端用户名称 -- $time_lo…

简化WPF开发:CommunityToolkit.Mvvm在MVVM架构中的实践与优势

文章目录 前言一、CommunityToolkit.Mvvm1.特点2.优点3.缺点 二、WPF项目应用1.引入到 WPF 项目2.使用示例 总结 前言 CommunityToolkit.Mvvm 是 Microsoft 提供的一个社区工具包&#xff0c;专为 MVVM&#xff08;Model-View-ViewModel&#xff09;模式设计&#xff0c;旨在帮…

RabbitMQ练习(Topics)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》和《RabbitMQ练习&#xff08;Work Queues&#xff09;》。 确保RabbitMQ、Sender、Receiver、Receiver2容器…

“重启就能解决一切问题”,iPhone重启方法大揭秘

随着iPhone不断更新换代&#xff0c;其设计与操作方式也在不断进化。从最初的实体Home键到如今的全面屏设计&#xff0c;iPhone的操作逻辑也随之发生了改变。 对于那些习惯了传统安卓手机操作的用户来说&#xff0c;iPhone的重启方式可能会显得有些不同寻常。下面我们就来一起…

SQL血缘解析

Druid 作为使用率特别高的的数据库连接池工具,在具备完善的连接池管理功能外,同时Druid 的 SQL解析功能可以用来防止 SQL注入等安全风险。通过对 SQL 语句进行解析和检查,Druid 可以识别并阻止潜在的恶意 SQL 语句执行,黑名单(阻止特定的 SQL 语句执行)、白名单(仅允许特…

★ 算法OJ题 ★ 力扣11 - 盛水最多的容器

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--盛水最多的容器~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法1&#xff1a;暴力枚举 …

文本数据分析-(TF-IDF)(1)

文章目录 一、TF-IDF简介1.意义2.TF与IDF1).TF&#xff08;Term Frequency&#xff09;2).IDF&#xff08;Inverse Document Frequency&#xff09;3).TF-IDF 二、应用三、代码实现1.文件读取2.数据预处理3.排序和输出4.全部代码 一、TF-IDF简介 1.意义 TF-IDF&#xff08;Te…

28 TreeView组件

Tkinter ttk.Treeview 组件使用指南 ttk.Treeview 是 Tkinter 的一个高级控件&#xff0c;用于显示和管理层次化数据。它类似于电子表格或列表视图&#xff0c;但提供了更丰富的功能&#xff0c;如可展开的节点、多列显示等。ttk 模块是 Tkinter 的一个扩展&#xff0c;提供了…

Golang | Leetcode Golang题解之第382题链表随机节点

题目&#xff1a; 题解&#xff1a; type Solution struct {head *ListNode }func Constructor(head *ListNode) Solution {return Solution{head} }func (s *Solution) GetRandom() (ans int) {for node, i : s.head, 1; node ! nil; node node.Next {if rand.Intn(i) 0 { …

《机器学习》数据分析之关键词提取、TF-IDF、项目实现 <下>

目录 一、内容回顾 1、核心算法 2、算法公式 3、拆分文本 二、再次操作 1、取出每一卷的地址和内容 得到下列结果&#xff1a;&#xff08;此为DF类型&#xff09; 2、对每一篇文章进行分词 3、计算TF-IDF值 得到以下数据&#xff1a; 三、总结 1、关键词提取 1&a…

数据挖掘之分类算法

分类算法是数据挖掘中常用的一类算法&#xff0c;其主要任务是根据已知的训练数据&#xff08;即带有标签的数据&#xff09;构建模型&#xff0c;然后利用该模型对新的数据进行分类。分类算法广泛应用于金融、医疗、市场营销等领域&#xff0c;用于预测、决策支持等任务。以下…

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压&#xff1a;PC0、PA1和PA2。本测试将ADC1_IN6映射到PC0引脚&#xff0c;ADC12_IN2映射到PA1引脚&#xff0c;ADC1_IN3映射到PA2引脚。 1、ADC输入 ADC输入电压范围&#xff1a;Vref– ≤ VIN ≤ Vref ADC支持“单端输入…