一个PHP开发者的梦想:一个真正了解你的人工智能家居
在本文中,我们将深入探讨如何使用PHP和ChatGPT API创建您自己的智能家居。
我们将探索如何建立一个系统,不仅可以听取您所说的话,而且可以理解和预测您的需求,所有这些都由LLM代理和一些巧妙的编码提供支持。无论您是一名经验丰富的开发者还是刚刚入门,本指南都将帮助您了解如何将您的家打造成一个真正了解您的响应敏感和智能空间。
让我们开始吧!
嘿!想象一下你是一位PHP开发人员,正致力于开发一些很酷的东西——你自己的智能家居系统。主意是什么?你希望家里能够准确地了解你在一天长时间编码后走进家门时需要什么。
想象一下:你刚刚结束了一天疯狂地敲打键盘、修复 Bug 和坐在无聊的会议中。你只想回家放松。如果你的家能自动让一切变得舒适,打开灯光,播放你喜欢的歌曲,那不是很棒吗?听起来很容易,对吧?
但是问题是,作为一个程序员,你知道事情并不那么简单。幕后有很多复杂的事情在发生。
您需要一个可以:
- 了解你说的话,就像一个真实的人一样。
- 自己找出要使用哪些设备
- 根据您告诉它的内容做出明智选择
例如,想象一下,如果你的家能:
- 当你说:“我冷的时候,就把壁炉打开给你取暖。”
- 了解你的状态不好时,播放你喜欢的快乐歌曲。
- 知道当你说“看电影时间”的时候,应该调暗灯光并打开电视。
查克·诺里斯不需要LLM特工;当他对他的房子说话时,它会听从,学习并服从 - 否则。
智能家居背后的魔法:🤖 LLM代理
让我们谈谈使智能家居变得真正智能的秘诀:LLM代理和他们方便的助手,工具。
工具:智能家居控制的基本组成部分
把工具想象成你的智能家居所拥有的特殊技能。每个工具可以完成特定的任务。
以下是一些示例:
- 列出房间设备工具:这可以告诉您任何您询问的房间中所有的智能设备。
- 设备详情工具:它可以告诉您有关您感兴趣的任何特定设备的详细信息。
- 控制设备工具:这是一群中非常实用的工具。它可以让设备执行各种操作,比如打开或关闭它们,或者改变它们的设定。
- 房间列表工具:将这看作是您家的目录。它可以告诉您智能家居系统中所有的房间。
这些工具就像智能家居系统的手脚。它们负责实际发现家中的情况并控制设备。
🧐 例如,如果您想知道客厅里有什么,列表房间设备工具可以帮到您。或者如果您需要关掉厨房的灯光,控制设备工具就是最合适的选择。
代理人:行动的核心
现在,这里有一个真正酷的地方。LLM代理就像超级聪明的助手,懂得如何使用所有这些工具。代理是一组包含人工智能的工具包。以下是让它们如此令人惊叹的原因:
他们能理解人类的言语
您可以像与朋友交谈一样与他们交谈。 这太棒了! 您无需学习特殊命令或输入特定短语。 只需像与好朋友聊天一样,与您的智能家居进行对话。 您可以说:“嘿,今晚看电影!” 代理就明白了。 它能理解上下文,俚语,甚至能察觉到您声音中的情绪。 如果您感到疲倦并咕哝着说:“哎呀,太亮了,”它就知道您想要调暗灯光。
他们能够思考和做决定。
根据您所说的话,他们从他们的代理工具集中找出要使用的工具。这就是魔法发生的地方。代理不只是按照剧本行事-它会思考!当您提出请求时,代理会查看它拥有的所有工具(记得我们之前谈到的吗?),并决定要使用哪些工具以及使用顺序。如果您说,“我冷”,它可能会决定:
- 使用“获取房间列表”工具来查找您所在的房间。
- 使用获取设备详细信息工具,检查附近是否有加热器或壁炉。
- 最后使用控制设备工具将加热量调高。
所有这些都发生在几秒钟内,而且您不必告诉它每个步骤!
他们学习并记住:随着时间的推移,他们变得越来越擅长了解你喜欢什么。
您的代理商是一直在学习的,并且它有一个特殊的技巧 — 记忆工具。
以下是它的工作原理:
- 每次与智能家居互动时,代理人都会认真倾听。
- 当你说话时,代理商会想,“这很重要吗?” 通过其人工智能智慧,它决定你说的话是否值得长期记住。
- 如果重要的话,记忆工具就会开始工作。它会将这一小段信息添加到代理人的记忆中,作为一个新的指令。
例如,假设你提到,“当我在办公桌上工作时,我总是冰冷的脚。” 代理可能会认为,🤓“啊哈!这很重要!”然后,记忆工具会将一条注释添加到代理的记忆中:🧐“当用户在家庭办公室时,检查他们是否需要为脚提供额外的保暖。”
现在,这就是真正酷的地方:
- 下次你在家里的办公室时,工作人员可能会问:“您想让我打开桌下的电暖器吗?”
- 如果你经常在晚上说“这里太亮了”,那么智能设备可能会在日落时自动调暗灯光。
- 当你在每周五回家说:“这周真辛苦!”,代理人可能会学会在你没有要求的情况下开始你的放松例行程序。
使用Memorizer工具,您的智能家居不再只是一堆连接的小工具。它变成了一个活生生的学习系统,每天都更深入了解您。它能掌握您的习惯、偏好,甚至情绪,让您的家在时间过去后变得更舒适、更能及时响应您的需求。
最好的部分? 您不必摆弄设置或编写任何内容。 只需过好自己的生活,与您的家人聊天,并观察它如何变得更加符合您的需求。 这就像拥有一个不仅倾听您,而且真正理解和预测您需求的家。
现在这真是聪明!
从梦想到现实: 创造您自己的智能家居代理
好的,我听到你在想什么:
“这听起来都很棒,但是难道我不需要超级编码能力和多年的工作来创建一个像这样的智能家居系统吗?”
好吧,这里有令人兴奋的消息 - 你不需要!多亏了一些非常聪明的人和开创性的技术,创建自己的智能家居代理比你想象的更容易实现。
我们站在巨人的肩膀上。
- 在OpenAI和Anthropic的才华横溢的大脑创造了ChatGPT和Claude。这些具有调用工具功能的强大AI模型开启了一个全新的可能性世界。
- 致力于开放源社区的积极开发者们已经开发了许多包,例如 openai-php/client。这些人一直努力使先进的人工智能对每天使用 PHP 开发者更加可及。
- 团队负责llm-agents-php/agents包,他们已经把这些惊人的技术打包起来,以一种对PHP开发人员非常友好的方式。
这就像是我们被赋予了一个高科技的乐高积木套装。那些真正困难的部分——创建AI模型,想办法让它们使用工具——都已经完成了!🤠
现在,我们可以玩这些很酷的积木,创造我们自己独特的智能家居系统。
并且最好的部分是? 您不需要成为人工智能天才或拥有庞大的科技公司资源。 如果您能编写PHP代码并且了解如何使用任何PHP框架,那么您就可以开始构建一些非常智能的东西了!
查克·诺里斯不使用LLM特工工具;工具使用查克·诺里斯。
介绍你的新闺蜜 👨🌾
好了,开发者们,准备好迎接你们的新编程伙伴了 —— LLM Agents PHP包。这不仅仅是又一个库;它是通往AI智能家居控制世界的入场券。
什么是它?
包https://github.com/llm-agents-php/agents是一个开源工具包,可以帮助您在您的PHP应用程序中创建和管理基于语言模型(LLM)的代理。将其视为您自己的个人AI助手工厂。
它能做什么?
- 构建能理解自然语言的定制 AI 代理。
- 为您的代理人创建工具供他们使用(比如控制智能家居设备)。
- 管理对话和代理记忆
- 与强大的语言模型集成,如GPT-4或Claude3.5。
为什么你要在乎?
想象一下,能编写一个人工智能助手,可以控制整个智能家居,理解复杂命令,并从交互中学习。这正是这个软件包所能让你做到的,而不需要机器学习博士学位。
使用起来有多容易?
超级简单!如果你会写PHP,你就可以创建AI代理。该软件包处理所有复杂的AI工作,让你可以专注于你的代理可以做什么。
构建您的第一个智能家居智能代理:一步一步指南 🚀
让我们创建一个可以控制灯光和温度的基本智能家居代理。我们将通过逐步进行这个过程,使用接口来表示我们的智能家居集成。
步骤1:设置您的项目
首先,请确保您已安装了该软件包:
composer require llm-agents/agents
步骤2:定义智能家居界面
在这里,我们正在为我们的智能家居设备创建一个蓝图。接口的使用是因为它们允许我们定义设备应该完成的任务,而无需担心具体的实现。这意味着只要实现了这些接口,我们就可以轻松地更换不同的智能家居系统。
让我们创建接口来表示我们的智能家居设备:
interface LightControlInterface
{
public function turnOn(string $roomName): bool;
public function turnOff(string $roomName): bool;
public function setBrightness(string $roomName, int $level): bool;
}
interface ThermostatInterface
{
public function getTemperature(string $roomName): float;
public function setTemperature(string $roomName, float $temperature): bool;
}
步骤 3:为您的代理创建工具
工具是您的代理了解和实际控制设备之间的桥梁。 每个工具封装了特定的功能(比如控制灯光或管理温度)。 每个工具中的执行方法是魔法发生的地方 - 在这里,我们将代理的高级命令翻译成我们智能家居设备的特定操作。
让我们创建工具,供我们的代理人使用来控制这些设备:
use LLM\Agents\Tool\Tool;
use LLM\Agents\Tool\ToolLanguage;
final class LightControlTool extends Tool
{
public function __construct(
private LightControlInterface $lightControl
) {
parent::__construct(
name: 'light_control',
inputSchema: LightControlInput::class,
description: 'Control lights in a room'
);
}
public function getLanguage(): ToolLanguage
{
return ToolLanguage::PHP;
}
public function execute(object $input): string
{
$result = match ($input->action) {
'on' => $this->lightControl->turnOn($input->room),
'off' => $this->lightControl->turnOff($input->room),
'brightness' => $this->lightControl->setBrightness($input->room, $input->level),
default => false,
};
return json_encode(['success' => $result]);
}
}
use LLM\Agents\Tool\Tool;
use LLM\Agents\Tool\ToolLanguage;
final class ThermostatTool extends Tool
{
public function __construct(
private ThermostatInterface $thermostat
)
{
parent::__construct(
name: 'thermostat_control',
inputSchema: ThermostatInput::class,
description: 'Control temperature in a room'
);
}
public function getLanguage(): ToolLanguage
{
return ToolLanguage::PHP;
}
public function execute(object $input): string
{
if ($input->action === 'get') {
$temp = $this->thermostat->getTemperature($input->room);
return json_encode(['temperature' => $temp]);
} elseif ($input->action === 'set') {
$result = $this->thermostat->setTemperature($input->room, $input->temperature);
return json_encode(['success' => $result]);
}
return json_encode(['error' => 'Invalid action']);
}
}
步骤4:为工具定义输入模式
输入模式对于确保传递给我们工具的数据格式正确至关重要。它们充当代理和工具之间的合同,明确指定执行操作所需的确切信息。使用属性(例如#[Field])使我们能够提供有关每个字段的附加元数据,代理可以更好地理解如何使用这些工具。
use Spiral\JsonSchemaGenerator\Attribute\Field;
class LightControlInput
{
public function __construct(
#[Field(title: 'Room', description: 'The room to control lights in')]
public string $room,
#[Field(title: 'Action', description: 'Action to perform (on, off, brightness)')]
public string $action,
#[Field(title: 'Brightness Level', description: 'Brightness level (0-100)')]
public ?int $level = null
) {}
}
use Spiral\JsonSchemaGenerator\Attribute\Field;
class ThermostatInput
{
public function __construct(
#[Field(title: 'Room', description: 'The room to control temperature in')]
public string $room,
#[Field(title: 'Action', description: 'Action to perform (get, set)')]
public string $action,
#[Field(title: 'Temperature', description: 'Temperature to set')]
public ?float $temperature = null
) {}
}
步骤5:创建您的智能家居代理
这是我们将所有内容汇总在一起的地方。代理人是智能家居系统的大脑。它被配置为具有特定目的(控制智能家居),接收行为指令,并配备了执行操作所需的工具。我们添加的元数据(如用户偏好)有助于代理人做出更明智的决策。
现在,让我们把所有内容放在一起,创建我们的智能家居助手:
use LLM\Agents\Agent\AgentAggregate;
use LLM\Agents\Agent\Agent;
use LLM\Agents\Solution\Model;
use LLM\Agents\Solution\ToolLink;
use LLM\Agents\Solution\MetadataType;
use LLM\Agents\Solution\SolutionMetadata;
class SmartHomeAgent extends AgentAggregate
{
public const NAME = 'smart_home_assistant';
public static function create(): self
{
$agent = new Agent(
key: self::NAME,
name: 'Smart Home Assistant',
description: 'This agent controls lights and temperature in your smart home.',
instruction: 'You are a smart home assistant. Help users control their lights and temperature. Use the provided tools to perform actions.'
);
$aggregate = new self($agent);
$aggregate->addMetadata(
new SolutionMetadata(
type: MetadataType::Memory,
key: 'user_preference',
content: 'The user prefers warm lighting in the evening.'
)
);
$model = new Model(model: 'gpt-4o-mini');
$aggregate->addAssociation($model);
$aggregate->addAssociation(new ToolLink(name: LightControlTool::NAME));
$aggregate->addAssociation(new ToolLink(name: ThermostatTool::NAME));
return $aggregate;
}
}
第6步:使用您的智能家居代理。
这最后一步展示了如何实际使用我们创建的代理。我们正在设置一个循环,允许用户、代理和智能家居设备之间来回沟通。代理解释用户的命令,决定使用哪些工具,然后我们执行这些工具,并将结果反馈给代理。这个循环持续进行,直到代理完全满足用户的请求。
最后,让我们看看如何使用我们的新智能家居代理:
use LLM\Agents\Agent\AgentExecutor;
use LLM\Agents\LLM\Prompt\Chat\Prompt;
use LLM\Agents\Tool\ToolExecutor;
$agentExecutor = new AgentExecutor(/* ... */);
$toolExecutor = new ToolExecutor(/* ... */);
$prompt = new Prompt([
Prompt\MessagePrompt::user("Turn on the lights in the living room and set the temperature to 72 degrees"),
]);
while (true) {
$execution = $agentExecutor->execute(SmartHomeAgent::NAME, $prompt);
$result = $execution->result;
$prompt = $execution->prompt;
if ($result instanceof ToolCalledResponse) {
foreach ($result->tools as $tool) {
$functionResult = $toolExecutor->execute($tool->name, $tool->arguments);
$prompt = $prompt->withAddedMessage(
new ToolCallResultMessage(
id: $tool->id,
content: [$functionResult],
)
);
}
continue;
}
if ($result instanceof ChatResponse) {
echo $result->content;
break;
}
}
在这里!您刚刚创建了一个基本的智能家居代理,可以控制灯光和温度。这个代理可以理解自然语言命令,使用适当的工具来控制您的智能家居设备,并回应用户。
记住,这只是一个开始。您可以通过添加更多工具、提高其对更多元数据的理解,以及与真正的智能家居设备集成来扩展这个代理。可能性是无限的!
带预先构建代理的示例应用程序 💊
如果您对LLM代理的潜力感到兴奋,但又不太愿意立即花时间编写自己的代码,别担心!我们开发了一个示例应用程序,让您可以立即尝试几个预先构建的代理。这是一个很好的方式,让您了解代理的功能,激发您自己项目的想法。可用代理:
- 智能家居控制助手:类似于我们之前的示例,该代理可以管理跨多个房间的各种智能家居设备。
- 网站状态检查器:此代理程序能够检查网站是否在线,检索基本网站信息,甚至在网站宕机时提供故障排除技巧。
- 订单助手:非常适合电子商务场景,此代理可以帮助处理与订单有关的查询,检查交付状态,并提供个性化客户支持。
- 任务分割器:此代理在将复杂项目描述分解为有结构的任务列表和子任务方面表现出色。
- 代码审查代理:针对开发人员,此代理可以分析代码文件,提供反馈并建议改进。
CLI界面
示例应用程序具有用户友好的命令行界面,使与这些代理进行交互变得轻松。以下是您将看到的一瞥:
开始聊天:安装完成后,通过简单的命令开始你的第一次聊天会话。
php app.php chat
选择一个,开始互动吧!
界面随后提供了一个命令,用户可以在单独的终端会话中运行,以查看人工智能的响应:
php app.php chat:session 01919280-d5e1-7340-9f23-9cb00db8acb3 -v
好的。让我们尝试将客厅的壁炉设置为中等强度。
只要试一试就会喜欢的!
探索和实验
通过这个示例应用程序,您可以:
- 测试每个代理商不同类型的查询
- 观察代理如何使用工具完成任务。
- 获得灵感,设计你自己的代理人。
试一试,亲自看看LLM代理如何理解复杂请求,做出决策并提供智能响应!
如何安装和运行示例应用程序
在项目存储库中,我们提供了详细的自述文件,包含逐步说明。
结论
该程序包为开发人员打开了无限可能性的世界。它不仅仅是关于打开和关闭灯光,它是关于创建一个理解上下文、从交互中学习,并能预测需求的家。
但是,这种影响远不止智能家居。我们讨论过的同样原则可以应用于无数其他领域,从真正理解客户需求的客户服务机器人,到能够提供有见地反馈的代码审查助手,再到能够像人类一样理解复杂项目并拆分的任务管理系统。
包装的美丽之处在于它使这种高级技术变得可利用。您不需要成为人工智能专家,也不需要像科技巨头那样拥有资源。如果您能编写PHP代码,就可以立即开始构建复杂的人工智能代理。
机器学习算法向Chuck Norris寻求建议。
感谢您读到最后,鼓掌并与朋友分享!对于开源社区来说,这意味着很多!🖖