paint-brush
我可以构建一个生成式 AI 演示来帮助我在维加斯赢得大奖吗?经过@raymondcamden
603 讀數
603 讀數

我可以构建一个生成式 AI 演示来帮助我在维加斯赢得大奖吗?

经过 Raymond Camden6m2023/11/21
Read on Terminal Reader

太長; 讀書

一个失败的人工智能辅助演示结合了生成式人工智能,提示在纸牌游戏中提供策略建议。
featured image - 我可以构建一个生成式 AI 演示来帮助我在维加斯赢得大奖吗?
Raymond Camden HackerNoon profile picture
0-item


不,谢谢你,再见。


好吧,首先,我为点击诱饵风格的标题表示歉意。有时,当我有了一个演示的想法时,它却行不通。但有时,它并不会以一种有趣的方式进行,我认为无论如何分享它是一个好主意。 (而且,由于我做错了什么而导致失败的可能性总是很大!)我认为,今天的演示就是一个完美的例子。


今年早些时候,我使用 Alpine.js 和非常优秀的Deck of Cards API构建了一个Blackjack 游戏。昨天,我在思考这个游戏,我想知道如果我在玩游戏时使用生成式 AI 来寻求帮助会发生什么?举例来说,我去玩游戏并看到了以下内容:


二十一点游戏,庄家有 6 个牌,我有 2 个 J


在 Google 的 PaLM Makersuite 应用程序中,我写道:


我正在玩二十一点,庄家有 6 颗方块。我有一张梅花杰克和一张红桃杰克。我应该打还是应该留下?


并得到这样的回应:


你有20,这是一手好牌。庄家有16个,低于平均水平。如果你击中了,你就有可能拿到一张让你破产的牌。所以最好留下来,希望经销商破产。


好吧,这是非常明显的。你永远不会用两个 J 击中。但我喜欢强化游戏原则的描述性回应。我想 - 如果我在游戏中添加一个按钮让你向 GenAI 寻求帮助会怎么样?我是这样做的:


前端

在前端,我将 UI 更改保持在很小的范围内。我首先添加一个简单的按钮:


带有“寻求帮助!”的游戏用户界面添加按钮。


单击此按钮需要执行两件重要的事情。首先,它需要将游戏状态“翻译”为提示;然后,它需要将其传递给将处理gen AI调用的服务。我创建了一个新函数askForHelp来处理它:


 async askForHelp() { this.aiHelp = '<i>Asking our AI friend...</i>'; // first, "translate" the cards to English let q = `I'm playing blackjack and the dealer currently has ${this.pcCards[1].value} of ${this.pcCards[1].suit.toLowerCase()}. I've got a ${this.playerCards[0].value} of ${this.playerCards[0].suit.toLowerCase()} and a ${this.playerCards[1].value} of ${this.playerCards[1].suit.toLowerCase()}. Should I hit or should I stay?`; console.log(q); let resp = await fetch(`https://eo8dkukowewth66.m.pipedream.net?text=${encodeURIComponent(q)}`); let help = await resp.json(); /* note that help has line breaks and stuff in and in theory we should map to br or something, but im fine ignoring. */ this.aiHelp = ''; alert(help); },


我将玩家和 PC 卡存储在两个变量中,其中包含代表他们手牌的卡牌数组。每张卡都有一个“值”,可以是数字,也可以是名称,例如杰克。每张卡还有一套套装。从理论上讲,这可能不是关键信息,但我认为这不会有什么坏处。这是游戏生成的示例提示:


 I'm playing blackjack and the dealer currently has 8 of clubs. I've got a 7 of spades and a QUEEN of hearts. Should I hit or should I stay?


这被传递到我的后端服务(稍后会详细介绍),然后结果显示在 JavaScript 警报中,这是 100% 糟糕的用户体验,但由于这是一个实验,我认为它已经足够好了。


如果您好奇,这就是回复:


停留。你总共有 17 点,这是一手好牌。庄家的 8 并不是一张高牌,所以如果你留下来,你输的可能性不大。

后端

对于我的后端,我创建了一个快速的Pipedream工作流程。我的工作流程实际上只包含三个步骤。


第一个是我的触发器,一个 HTTP 端点。你可以在上面的前端代码中看到URL。


第二步是内置的 Google PaLM API 操作。我所要做的就是告诉它使用什么作为提示: {{steps.trigger.event.query.text}}


我的最后一步只是返回结果:


 export default defineComponent({ async run({ steps, $ }) { await $.respond({ status: 200, headers: { "Content-Type":"application/json" }, body: JSON.stringify(steps.generate_text.$return_value[0].candidates[0].output), }) }, })

是时候获胜了,对吗?

嗯是的。我的前几次测试效果很好,然后……事情就偏离了轨道。这是一个例子。庄家有一张红心七。我有一张黑桃皇后和一张方块八。当我寻求帮助时,我得到:


庄家的明牌是 7,这是“硬”17。这意味着无论您做什么,庄家都必须停牌。你有一个“软”19,这意味着你有一张 A 可以算作 1 或 11。你应该留下来。


好吧,当然,我应该留下来,但实际上呢?我有19个?经销商有17?而且情况会变得更好。有一次,当我有 18 场演出时,我得到了以下信息:


我建议打。总共有 18 点,您距离 21 点(21 点获胜手牌)仅差一分。庄家的红心七给了他们总共 17 点,低于 21 点的阈值。因此,如果庄家击中,很有可能爆牌,这将使您获胜。然而,如果你留下来,你将无法提高你的手牌,并且只能希望庄家破产。


击中 18。我不是职业赌徒,但我很确定这是个坏建议。


这让我更多地思考我的提示。我做了一些调整,比如把西装改小写,因为我担心它可能会让人工智能感到困惑。我迭代了 Makersuite 中的一些选项,并且始终发现,它有时似乎在基础数学方面遇到困难。即使我明确表示:


我有一张梅花杰克(价值十)和一张红心八(价值八)。


它仍然认为我有 19。我确实有更好的运气:


我有一张梅花杰克(价值十)和一张红心八(价值八)。我的手牌总数是18。


我也尝试过这个:


我有一张梅花 A 和一张红心 8。我的手牌总数是 9 或 19。


这似乎始终正确地工作。因此,考虑到这一点,我回到了我的即时生成并更新了我的逻辑。这是更新的版本:


 async askForHelp() { this.aiHelp = '<i>Asking our AI friend...</i>'; let totalOb = this.getCount(this.playerCards); let totalStr = 'My hand has a total of '; if(totalOb.lowCount === totalOb.highCount) { totalStr += totalOb.lowCount; } else { totalStr += `${totalOb.lowCount} or ${totalOb.highCount}`; } // first, "translate" the cards to English let q = `I'm playing blackjack and the dealer currently has ${this.pcCards[1].value} of ${this.pcCards[1].suit.toLowerCase()}. I've got a ${this.playerCards[0].value} of ${this.playerCards[0].suit.toLowerCase()} and a ${this.playerCards[1].value} of ${this.playerCards[1].suit.toLowerCase()}. ${totalStr}. Should I hit or should I stay?`; console.log(q); let resp = await fetch(`https://eo8dkukowewth66.m.pipedream.net?text=${encodeURIComponent(q)}`); let help = await resp.json(); console.log('RESP', help); /* note that help has line breaks and stuff in and in theory we should map to br or something, but im fine ignoring. */ this.aiHelp = ''; alert(help); },


我的 Blackjack 游戏有一个实用函数getCount ,它返回一个包含两个值的对象lowCount ,其中 A 被视为 1,以及highCount ,其中最多 1 个 A 被视为 11 个。这样,我就添加了有关总数的提示信息。


这确实很大帮助,但有时我仍然会返回妄想的回复。


那么...也许可以将其视为您在赌桌上喝醉的朋友提供建议?


我很乐意公开分享此版本的演示,当然,我也可以分享代码,但我将禁用 Pipedream 工作流程,这样我就不会为此付费。随意看一下这里的前端代码:


https://codepen.io/cfjedimaster/pen/QWYpQjY/905e31ed6d9e3539c041044b308f5f06?editors=1011


一如既往,让我知道你的想法!


也发布在这里