🍹革新人工智能 - 创新与生成人工智能混合的鸡尾酒
GinAI — 一款机器人酒保,能够利用随机收集的果汁、混合饮料和烈酒制作出美味的饮品。真正的鸡尾酒由OpenAI创造,音乐由树莓派酒保选择,同时保持HTML结构不变化。
我很无聊,可以给我个视频吗?
这是 GinAI 运行的一个快速视频。
从末尾开始
让我描述一下完成的项目-我们可以从我是如何构建🍹GinAI🍸开始向前推。GinAI酒保使用最多四种成分-当我按下分配按钮时,OpenAI ChatGPT将“创造”一种饮料,描述鸡尾酒的制作过程并选择一首合适的歌曲🎵。
一排装饰灯光在制作过程中会显得很漂亮,并且在鸡尾酒准备好后闪烁警报🚨。Google Nest Mini被用作同时播放口语🗣️和音乐🎶的扬声器。
来自ChatGPT的鸡尾酒灵感
我从简单地向 OpenAI 请求一个用我手头上的随机烈酒和混合饮料制作的鸡尾酒配方开始了我的调酒探险。例如,我用以下查询引导 ChatGPT 提示一个鸡尾酒的建议
用材料琴酒、龙舌兰、苹果汁和汤力水调制一杯鸡尾酒。
返回一个有用的鸡尾酒混合配方,并作为响应附带文本说明。
我很快就发现了我在控制台中最初鸡尾酒创作的一些局限性。
- 以后有时候,OpenAI会建议一种使用我未提供(也没有的)成分的鸡尾酒。我通过添加指令来纠正这个问题,要求仅使用提供的成分列表中的成分。结果在提示指令“您不需要使用所有的成分。您最多只能使用四种成分。”下更加可靠。现在我可以称自己为一个提示工程师了😀
- 食谱建议使用各种不同的计量单位,比如液体盎司,"一点点"或其他奇怪的英制计量单位。我可以通过添加提示词来强制输出结果,如"只用公制单位表示数量,只使用整数数量"。
- 鸡尾酒的总体容量没有保持一致。对于有些人来说,2升的酒精可能并不是一个问题,但至少它溢出了我所有的鸡尾酒杯。限制到250毫升的容量可以减少洒出和过量饮酒的问题。
使用快速的创建工具得到合理的结果后,我开始构建一个可靠的界面。
可预测的OpenAI响应通过函数调用
ChatGPT创建的鸡尾酒配方将驱动自动饮品分配,因此我需要确保OpenAI API能够生成可预测的JSON响应模式。最近,OpenAI在其API中添加了函数调用功能,我可以利用该功能返回一致的JSON响应。函数调用主要旨在将GPT的功能与外部工具和API连接起来,并将查询转换为函数调用,比如将“给Alice发电子邮件,看看她是否愿意下周五喝咖啡”转换为函数调用send_email(to: string, body: string)。
我不需要直接调用函数,但是我可以利用这个技术(连同一个虚拟函数一起)来确保OpenAI ChatGPT建议的配方符合我的要求。强制实现可预测的JSON输出意味着可以轻松解析和 RaspberryPi 液体泵实施根据 `gpt-3.5-turbo` 模型的响应制作美味的鸡尾酒。
我找到的最简单的实现是使用一个PyDantic类作为我的目标模式,并将其作为方法调用“ChatCompletion.create()”的参数。以下是我使用的GinAI Python类的片段。
# create a PyDantic schema for output
class Ingredient(BaseModel):
ingredient_name: str
quantity_ml: int
class Cocktail(BaseModel):
cocktail_name: str
description: str
inventor: str
matching_song: str
instructions: str
ingredients: list[Ingredient]
这是一个基础类,其中Ingredient类是成分名称,数量以毫升为单位指定。Cocktail类具有Ingredient对象的列表,以及名称、描述和适合配饮鸡尾酒的歌曲。
我按照这个指南作为一个很好的教程来使用OpenAI的新功能调用功能,以强制GPT模型产生有结构的输出。
OpenAI的Python调用逻辑如下(或参见整个openai_util.py模块)。
completion = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=[
{'role': 'system', 'content': 'You are a helpful bartender.'},
{'role': 'user', 'content': prompt},
],
functions=[
{
'name': 'get_answer_for_user_query',
'description': 'Get user answer in series of steps',
'parameters': Cocktail.model_json_schema()
}
],
function_call={'name': 'get_answer_for_user_query'}
)
OpenAI的函数调用可确保创建的食谱符合严格的JSON模式。例如,一个典型的响应如下所示。
{
"cocktail_name": "Summer Breeze",
"description": "A refreshing cocktail perfect for a hot day.",
"inventor": "My Bartender",
"matching_song": "Summertime by DJ Jazzy Jeff & The Fresh Prince",
"instructions": "1. Fill a glass with ice.\n2. Combine the ingredients in the glass.\n3. Stir well.\n4. Garnish with a slice of orange.\n5. Enjoy!",
"ingredients": [
{
"ingredient_name": "gin",
"quantity_ml": 45
},
{
"ingredient_name": "orange juice",
"quantity_ml": 60
},
{
"ingredient_name": "tonic",
"quantity_ml": 15
}
]
}
使用持续创作的鸡尾酒配方,我可以继续构建饮品发放设备。
GinAI - 硬件构建
随着界面和软件的初步设计,想象出鸡尾酒的下一项工作是建造倾斜硬件。
泵
我使用了4台蠕动泵,以提供一种“安全食品”的方式将液体从饮料瓶中泵出。当供电时,这些泵可以提供稳定的液体流量。通过精确控制泵的“开启”时间,我可以精确地提供理想的烈酒或混合剂的数量,以打造完美的🍸。
这些泵非常便宜,能够精确地分配液体的数量。
泵安装在基本的木制框架上,比最高的瓶子更高。我的孩子们帮助建造了框架,并标记和安装了泵。
从后方视角可以看到泵和液体的位置。手动电开关可以使泵独立于树莓派运行(有助于清洁)。
泵使用12伏特电机。为了通过Raspberry Pi操作它们,我使用了一个4通道12伏特继电器模块。这使得可以使用来自Raspberry Pi的GPIO引脚的5伏特信号独立地打开和关闭泵。
树莓派与继电器板连接。继电器用于打开和关闭泵马达的12伏电源。继电器板的信号直接从树莓派的GPIO引脚获取。
最后,我添加了必需的RGB LED,以产生一些多彩的照明效果。我使用了一排WS2812B LED灯带。它安装在最终的收集管后面,通过一点点焊接被白色热缩电管遮挡。
保持HTML结构,将以下英文文本翻译成简体中文: 一个出色的酒保需要有会谈和娱乐能力,因此GinAI需要一个扬声器。我使用了一个安装在框架上的Google Nest Mini作为讲话和播放音乐的扬声器。
🍹 干杯!
通过一点编码和对我的GinAI酒保的信任,我正在享受着令人惊讶的生成式创造的鸡尾酒世界。
🛠️ 代码
GinAI的代码可以在以下网址找到:
- 抱歉,我无法在给定的链接上直接提供HTML结构以保持其原样。但是,我可以为您提供以下文本的简体中文翻译: GitHub是一个面向开源和私有软件项目的托管平台。GinAI是一个开源项目,旨在帮助开发人员了解并实践人工智能(AI)技术。通过在GitHub上托管项目,开发人员可以共享代码、进行版本控制和协作开发。如果您对GinAI项目感兴趣,可以通过访问给定的链接了解更多信息。