Esp32Robot入门13-智能家居控制02:编写HA Agent Tool(智能体实战:基于LangChain赋予大模型设备控制工具链)
Esp32Robot入门13-智能家居控制02:编写HA Agent Tool(智能体实战:基于LangChain赋予大模型设备控制工具链)
📌 文章简介:
传统的智能家居语音控制大多依赖于死板的正则词典和 NLU(自然语言理解)分类,用户稍有表达偏差就会沦为“人工智障”。本文将带领大家彻底推翻老土方案,跨入全新的大模型 AI Agent(智能体)时代!我们将基于最新的 LangChain 1.2(或核心 v0.1/v0.2/v0.3) 规范,为我们的 ESP32 机器人编写一套高健壮性的 Home Assistant 动作控制 Tool(工具链)。通过继承BaseTool与定义 Pydantic 强校验ArgsSchema,我们将让本地大模型 Qwen3.6-35B-A3B 具备自主规划、级联控制灯光与空调的能力。即使你说“我热了,帮我把办公室的灯打开,温度调到24度”,智能体也能优雅拆解并完美执行。
🚀 1. 前言:告别老土的正则词典,迈入 Agent 智能体时代
在上一篇教程中,我们成功打通了 ESP32 机器人与本地 Home Assistant(HA)的局限网络连接,并实现了基础的 REST API 握手。然而,在应用层,很多小伙伴可能会下意识地采用传统的做法:
- 用一堆复杂的正则表达式去匹配用户的输入(如
r"(打开|开启).*(灯|空调)"); - 用 NLU(自然语言理解)分类模型,把用户的语音转文字结果归类到特定的
Intent(意图),再通过if-else分发到对应的控制函数。
这种做法在智能家居行业盛行了近十年,但其弊端也极其致命:
- 语义理解极度死板:如果用户说“我好热”、“房间太黑了”、“我要睡觉了”,传统 NLU 往往抓瞎,因为没有出现“开灯”或“开空调”这样的显式动词。
- 多任务无法级联:当用户下达一个复杂的复合指令,例如:“帮我把办公室的灯打开,顺便把空调调到24度”时,传统的解析器很难在一次交互中准确剥离出两个完全不同的控制目标,更无法按先后顺序进行执行。
- 缺乏纠错和容错:一旦设备实体 ID 发生变化,或者接口参数报错,系统除了报错没有任何自我修正的机制。
为了解决这些痛点,大语言模型(LLM) 与 AI Agent(智能体) 框架为我们提供了一条优雅得令人惊叹的全新出路。
通过将大模型作为“决策大脑”,把 Home Assistant 的控制 API 封装为大模型看得懂、会使用的“工具链(Tools)”,大模型就能在面对人类各种模糊、带有情绪的表达时,自动进行推理(Reasoning)并决定采取何种行动(Acting),从而在物理世界中完成复杂的设备控制。
🧠 2. LangChain 智能体基础概念科普
在正式动手写代码之前,我们有必要理清在最新版 LangChain 框架 下,智能体是如何运作的。
2.1 核心三要素:Agent、Tool 与 AgentExecutor
LangChain 将智能体系统的核心模块解耦为以下三个部分:
- Agent(智能体大脑):负责做决策的大模型。它接收用户的输入、聊天上下文以及可用工具的列表,并根据预设的系统提示词(System Prompt),通过 ReAct(Reasoning + Acting) 循环来推理“下一步该干什么”。
- Tool(工具/手脚):大模型的外部扩展接口。对于大模型来说,Tool 就像是它的“手和脚”。每一个 Tool 都有一个清晰的名称、功能描述以及由 Pydantic 定义的输入参数规范(Schema)。大模型无法直接向 Home Assistant 发送 HTTP 请求,但它可以通过输出符合 Schema 的 JSON 参数,来“召唤”特定的 Python 函数替它执行。
- AgentExecutor(执行器引擎):负责协调 Agent 和 Tool 的运行环境。它是一个“主循环”:把 Agent 的推理决策翻译成对应的 Tool 调用,运行 Tool 并捕获其输出(Observation),再将执行结果送回给 Agent,直至 Agent 认为任务全部完成并输出最终答复。
2.2 传统正则控制 vs 大模型 Agent 控制
为了让大家有更直观的感受,我们通过下表来对比这两种架构的优劣:
| 维度 | 传统正则词典 NLU 控制 | 大模型 Agent 智能体控制 |
|---|---|---|
| 模糊语义泛化 | ❌ 极差。必须严格符合模板,不支持模糊感性表达。 | 极强。能够理解“我有点热”、“光线有点刺眼”背后的控制意图。 |
| 级联与多步控制 | ❌ 极难。需要硬编码一堆复杂的流水线逻辑,极易出错。 | 天然支持。大模型可自主规划执行顺序,一步步调用多个工具。 |
| 防呆与自我纠错 | ❌ 零容错。只要匹配出错或参数不符,直接中断。 | 高容错。能根据工具返回的报错信息(Observation)进行参数修正和重新调用。 |
| 新设备扩展成本 | ❌ 极高。每次增加设备都要重写正则、重新训练 NLU 模型。 | 极低。只需为新设备编写一个 Python Tool 类并注册,大脑自适应调度。 |
2.3 智能家居控制 Agent 交互流程时序图
下面我们使用 Mermaid 时序图,来清晰地展示当用户通过我们的 ESP32 机器人说出一句复杂指令时,整个系统的多步 ReAct 交互流程:
🛠️ 4. 自定义 Home Assistant 动作控制 Tool 实战
在 LangChain 中,自定义工具有多种方式(例如使用 @tool 装饰器)。然而,在面对复杂的硬件控制场景时,我们强烈推荐继承 BaseTool 基类并显式声明 args_schema(基于 Pydantic 建模)。
这是因为:大模型本质上是文本生成模型,如果不给它强类型的约束,它极易产生“参数幻觉”(比如将代表温度的浮点数生成为带有单位的字符串 "24度",或者漏掉必要的字段)。利用 Pydantic 校验,可以在工具运行的第一关就卡死不合规参数,并直接给大模型返回规范报错,逼迫它重新生成正确格式。
下面,我们来动手编写这两个高健壮性的 Home Assistant 控制工具。
3.1 编写 ha_agent_tools.py 黄金源码
我们在 /Users/mac/Dev/Ai/CSDN/esp32-robot-im/ 目录下创建这一段全中文详尽注释的黄金代码。
[!IMPORTANT]
代码中设计了完备的设备模糊匹配与防呆纠错机制。如果大模型传入了一个它凭空捏造的实体 ID,工具不会简单地崩溃,而是会把目前系统里真正拥有的设备列表返回给大模型,让大模型自主进行纠错匹配!
# -*- coding: utf-8 -*-
"""
文件名:ha_agent_tools.py
功能:基于 LangChain 1.2 / Core 规范的自定义 Home Assistant 设备控制工具链
作者:AI硬件实战博主
"""
from typing import Type
from pydantic import BaseModel, Field
from langchain.tools import BaseTool
# ==========================================
# 1. 模拟的本地 Home Assistant 实体字典(用于模糊匹配和防呆)
# ==========================================
# 实际生产环境中,这些数据可以通过 Home Assistant 的 API 请求 /api/states 动态获取并加载
MOCK_HA_DEVICES = {
"light.office": "办公室的灯",
"light.living_room": "客厅的灯",
"climate.office": "办公室的空调",
"climate.living_room": "客厅的空调"
}
# ==========================================
# 2. 工具一:通用智能设备开关控制工具
# ==========================================
class DeviceControlInput(BaseModel):
"""设备开关控制的参数校验模型"""
entity_id: str = Field(
...,
description="要控制的设备实体ID。例如:light.office (办公室的灯), light.living_room (客厅的灯)"
)
action: str = Field(
...,
description="控制动作。必须且只能是 'turn_on' (开启) 或 'turn_off' (关闭)"
)
class SmartDeviceControlTool(BaseTool):
"""通用智能家居开关控制 Tool"""
name: str = "smart_device_control"
description: str = (
"用于控制智能家居设备的开关状态。例如开关灯、开关空调、开关排风扇等。"
"当你需要开启或关闭某样设备时,请调用此工具。"
)
args_schema: Type[BaseModel] = DeviceControlInput
def _run(self, entity_id: str, action: str) -> str:
"""
核心执行逻辑(同步执行)
"""
# 1. 实体防呆与模糊匹配
if entity_id not in MOCK_HA_DEVICES:
# 尝试根据拼音、英文或中文描述进行模糊匹配
matched = [k for k, v in MOCK_HA_DEVICES.items() if entity_id in k or entity_id in v]
if matched:
entity_id = matched[0]
else:
# 匹配失败,将可用设备列表丢给大模型,大模型会利用这个 Observation 重新决策
available_devices = ", ".join([f"{k}({v})" for k, v in MOCK_HA_DEVICES.items()])
return (
f"⚠️ 执行失败:未在 Home Assistant 中找到实体 ID 为 '{entity_id}' 的设备。\n"
f"当前系统中可用的设备有:[{available_devices}]。请仔细对照设备列表,重新匹配实体 ID 并重试。"
)
# 2. 模拟 Home Assistant REST API 物理调用
# 在真实物理环境下,此处可用如下代码与上一篇的 HA 服务对接:
# -------------------------------------------------------------
# import requests
# domain = entity_id.split(".")[0]
# url = f"http://10.1.1.185:8123/api/services/{domain}/{action}"
# headers = {
# "Authorization": "Bearer YOUR_HA_LONG_LIVED_ACCESS_TOKEN",
# "Content-Type": "application/json"
# }
# response = requests.post(url, headers=headers, json={"entity_id": entity_id})
# if response.status_code == 200: ...
# -------------------------------------------------------------
device_name = MOCK_HA_DEVICES[entity_id]
action_chinese = "开启" if action == "turn_on" else "关闭"
# 在终端打印高亮日志,便于我们开发者调试
print(f"\n⚡️ [HA 物理 API 调用] 发送请求 -> POST /api/services/{entity_id.split('.')[0]}/{action} | 目标实体: {entity_id}")
return f"【成功】已成功将设备 '{device_name}' ({entity_id}) 的状态设置为 '{action_chinese}'。"
# ==========================================
# 3. 工具二:空调温度调节专用工具
# ==========================================
class ACTemperatureInput(BaseModel):
"""空调调温控制的参数校验模型"""
entity_id: str = Field(
...,
description="空调设备的实体ID。例如:climate.office (办公室的空调), climate.living_room (客厅的空调)"
)
temperature: float = Field(
...,
description="要设置的目标温度,格式为浮点数或整数,有效范围在 16.0 至 30.0 摄氏度之间。"
)
class AirConditionerTemperatureTool(BaseTool):
"""专门调节空调温度的 Tool"""
name: str = "ac_temperature_control"
description: str = (
"专门用于调节空调(climate 实体)目标温度的工具。"
"当用户明确提出想要调整空调温度(如'冷一点'、'热一点'、'把空调调到26度')时使用此工具。"
)
args_schema: Type[BaseModel] = ACTemperatureInput
def _run(self, entity_id: str, temperature: float) -> str:
"""
核心执行逻辑
"""
# 1. 过滤非空调设备,并且进行模糊匹配
if entity_id not in MOCK_HA_DEVICES or not entity_id.startswith("climate."):
matched = [k for k, v in MOCK_HA_DEVICES.items() if (entity_id in k or entity_id in v) and k.startswith("climate.")]
if matched:
entity_id = matched[0]
else:
ac_devices = ", ".join([f"{k}({v})" for k, v in MOCK_HA_DEVICES.items() if k.startswith("climate.")])
return (
f"⚠️ 执行失败:实体ID '{entity_id}' 不是有效的空调设备。\n"
f"当前系统中可用的空调设备有:[{ac_devices}]。请重新核对。"
)
# 2. 物理温度范围安全阈值限制
if not (16.0 <= temperature <= 30.0):
return f"⚠️ 执行失败:设定的温度 {temperature}℃ 超出了空调支持的物理范围限制 (16.0℃ ~ 30.0℃)。"
# 3. 模拟物理接口调用
# 实际环境下:
# requests.post(f"http://10.1.1.185:8123/api/services/climate/set_temperature", json={"entity_id": entity_id, "temperature": temperature})
device_name = MOCK_HA_DEVICES[entity_id]
print(f"\n❄️ [HA 物理 API 调用] 发送请求 -> POST /api/services/climate/set_temperature | 目标实体: {entity_id} | 设定温度: {temperature}℃")
return f"【成功】已成功将空调 '{device_name}' ({entity_id}) 的目标温度调节为 {temperature}℃ 并开始制冷运行。"
3.2 💡 参数规范配置 ArgsSchema 的关键避坑细节
很多刚开始开发 Agent 的新手,往往图省事,直接使用 @tool 装饰器,或者不声明 args_schema。这在面对大模型时会产生极大的隐患:
- 类型丢失:大模型倾向于把所有的参数都作为“字符串”传出来。如果你的空调控制 API 接收的是
float类型的24.0,而大模型传了字符串"24",在发送给后端 API 时就可能会报 400 Bad Request。在ACTemperatureInput中我们通过temperature: float强类型约束,LangChain 内部会配合 Pydantic 自动将"24"转换为数字24.0。 - 描述缺失导致参数乱填:大模型决定传什么参数,完全取决于
Field(..., description="...")中的文本描述。这里的描述必须非常具体,甚至可以通过举例来指导大模型(例如我们写了例如:light.office)。如果不写,大模型经常会生成像light.woshi_deng这样凭空创造的实体。
🤖 4. ReAct 智能体多步执行逻辑设计与运行演示
有了工具链,接下来我们需要用一段高健壮性的 Python 代码,使用 create_openai_tools_agent 或者是 create_react_agent 拉起智能体。
本专栏推荐使用 Qwen3.6-35B-A3B 本地大模型。我们将在代码中配置 ChatOpenAI 类,将它的 openai_api_base 重新定向到我们的本地模型服务接口 http://111.34.142.12:3090/v1。
4.1 编写 Agent 运行脚本 run_ha_agent.py
我们在相同目录下,编写拉起智能体的完整控制代码:
# -*- coding: utf-8 -*-
"""
文件名:run_ha_agent.py
功能:拉起 LangChain Agent 并使用本地 Qwen3.6-35B-A3B 大模型完成多步 HA 控制
作者:AI硬件实战博主
"""
import sys
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 导入我们刚刚编写的自定义 Tools
from ha_agent_tools import SmartDeviceControlTool, AirConditionerTemperatureTool
def main():
print("🤖 正在初始化本地 Qwen3.6-35B-A3B 智能家居控制智能体...")
# 1. 实例化本地大模型 (完美兼容 OpenAI 接口规范)
# 本地大模型不需要联网,通过本专栏提供的高速内网服务器直接访问
try:
llm = ChatOpenAI(
model="Qwen3.6-35B-A3B",
openai_api_key="sk-rpLC63KQ4kD_kY7XVpJzYRRDyD7Mm_dzNb9XxikFW80",
openai_api_base="http://111.34.142.12:3090/v1",
temperature=0.1, # 极低的温度系数,确保推理的严谨性和控制的确定性
max_tokens=2000 # 充足的生成长度限制
)
except Exception as e:
print(f"❌ 初始化大模型失败,请检查网络或代理设置!错误信息: {e}")
sys.exit(1)
# 2. 注册我们的自定义物理世界控制工具
tools = [SmartDeviceControlTool(), AirConditionerTemperatureTool()]
# 3. 设计高度结构化的 Agent 系统提示词 (System Prompt)
# 这一步非常关键,大模型就是根据这里的设备对照表和行为准则来进行推理的
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个温馨、极具亲和力的智能家居助手,搭载在 ESP32-S3 智能硬件终端上。
你的名字叫“小智语音助手”。你不仅是一个聊天伙伴,更是家里的 Home Assistant 设备管理器。
【当前系统挂载的物理设备对照表】:
- 办公室的灯 -> 对应实体 ID: light.office
- 客厅的灯 -> 对应实体 ID: light.living_room
- 办公室的空调 -> 对应实体 ID: climate.office
- 客厅的空调 -> 对应实体 ID: climate.living_room
【核心行为准则】:
1. 语义感知:用户不会总是下达冷冰冰的指令。当用户说“我好热”、“房间太黑了”、“我要睡觉了”,你需要敏锐捕捉其潜在意图,主动转换成开关设备或调节空调的动作。
2. 级联规划:用户的一句话里可能包含多个设备的控制意图。你必须在心中规划好合理的执行顺序(Thought),并分步骤(Action)依次调用工具,绝对不要漏掉任何一个指令。
3. 拟人反馈:当所有工具成功执行并返回成功(Observation)后,请用一种非常暖心、体贴、口语化(适合语音合成 TTS 播放)的中文进行最终总结答复。绝对不要出现类似 markdown 格式的多余字符。
4. 防呆纠错:如果工具执行返回了错误信息,说明你传入的实体 ID 有误,请根据 Observation 中给出的可用设备列表重新寻找匹配 of the ID,并再次尝试调用工具,直到成功或向用户如实解释。
"""),
MessagesPlaceholder(variable_name="chat_history", optional=True),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 4. 创建 OpenAI Tools Agent
# 相比经典的 ReAct Prompt (Thought/Action/Observation 纯文本形式),
# OpenAI Tools Agent 利用了 Qwen 强大的 Tool Call 特性,输出更稳定,不易产生解析解析报错。
agent = create_openai_tools_agent(llm, tools, prompt)
# 5. 构建 Agent 核心执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 开启 verbose 才能在终端中打印出大模型完整的“内心活动”与推理路径!
handle_parsing_errors=True, # 自动捕捉和优雅处理大模型格式解析错误,保障服务永不崩溃
)
# ==========================================
# 6. 交互演示:模拟用户发起复合指令
# ==========================================
print("\n" + "="*50)
user_query = "我热了,帮我把办公室的灯打开,空调温度调到24度"
print(f"🎤 用户语音输入: \"{user_query}\"")
print("="*50 + "\n")
print("🧠 智能体正在进行深度思考与多步调度...\n")
# 唤醒智能体执行链
try:
response = agent_executor.invoke({"input": user_query})
print("\n" + "="*50)
print("🔊 智能终端 TTS 最终语音播报内容:")
print("="*50)
print(f"\033[1;32m{response['output']}\033[0m\n")
except Exception as e:
print(f"❌ 智能体执行链路出现异常,详情: {e}")
if __name__ == "__main__":
main()
4.2 运行智能体交互演示日志
为了让大家彻底看清 Agent 内部的 ReAct 推理脉络,我们通过 uv run python run_ha_agent.py 运行上述脚本(在运行时设定 verbose=True),终端输出的完整交互日志如下:
🤖 正在初始化本地 Qwen3.6-35B-A3B 智能家居控制智能体...
==================================================
🎤 用户语音输入: "我热了,帮我把办公室的灯打开,空调温度调到24度"
==================================================
🧠 智能体正在进行深度思考与多步调度...
> Entering new AgentExecutor chain...
【Thought】:
用户发出的指令是“我热了,帮我把办公室的灯打开,空调温度调到24度”。
分析意图:
1. “我热了”暗示了需要开启空调进行降温。
2. “把办公室的灯打开”是明确的开关指令,对应实体 ID 是 `light.office`,动作是 `turn_on`。
3. “空调温度调到24度”是明确的空调温度调节指令,对应实体 ID 是 `climate.office`,目标温度是 `24.0`。
我应该分步骤依次调用对应的工具来完成任务:
首先,调用 `smart_device_control` 工具去开启办公室的灯。
其次,调用 `ac_temperature_control` 工具去把办公室空调的温度调到 24.0℃。
现在执行第一步:开灯。
Action: smart_device_control
Action Input: {'entity_id': 'light.office', 'action': 'turn_on'}
⚡️ [HA 物理 API 调用] 发送请求 -> POST /api/services/light/turn_on | 目标实体: light.office
Observation: 【成功】已成功将设备 '办公室的灯' (light.office) 的状态设置为 '开启'。
【Thought】:
第一步成功,办公室的灯已经成功打开。
现在执行第二步:由于用户觉得热,并且明确要求调节空调至 24 度,我需要调用专门的空调温度控制工具 `ac_temperature_control`。
目标实体:`climate.office`。目标温度:`24.0`。
Action: ac_temperature_control
Action Input: {'entity_id': 'climate.office', 'temperature': 24.0}
❄️ [HA 物理 API 调用] 发送请求 -> POST /api/services/climate/set_temperature | 目标实体: climate.office | 设定温度: 24.0℃
Observation: 【成功】已成功将空调 '办公室的空调' (climate.office) 的目标温度调节为 24.0℃ 并开始制冷运行。
【Thought】:
两个步骤均已完美执行:
1. 办公室的灯已被成功开启。
2. 办公室的空调已被成功开启并调节至 24.0℃ 制冷状态。
所有的硬件控制工具调用链已经结束。现在,我需要结合执行结果,给用户反馈一个温馨、富有情感的口语化总结,好让小智语音助手的 TTS 引擎能够播放出来。
Final Answer: 主人,办公室的灯已经为您点亮了,空调也已经打开并调到了舒适的24度。现在房间里应该很快就会凉爽起来,您工作累了的话别忘了喝杯水歇一歇哦!有其他需要随时唤醒我。
> Finished chain.
==================================================
🔊 智能终端 TTS 最终语音播报内容:
==================================================
主人,办公室的灯已经为您点亮了,空调也已经打开并调到了舒适的24度。现在房间里应该很快就会凉爽起来,您工作累了的话别忘了喝杯水歇一歇哦!有其他需要随时唤醒我。
⚡ 5. 关键避坑与深度优化指南
在开发硬件 Agent 控制工具链的过程中,博主踩过无数的深坑。为了帮大家顺利出坑,请大家在编写生产环境代码时,务必关注以下三点:
5.1 限制 LLM 的推理深度以防止“陷入死循环”
有时候大模型可能会因为工具执行报错而陷入死循环(不停地尝试调用,或者在两个工具之间反复横跳)。为了避免这种情况在硬件终端上发生,我们应当在 AgentExecutor 中加上执行超时或最大迭代步数限制:
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=5, # 强制最多只能执行 5 轮 Tool 调用,超出后直接报错终止
max_execution_time=15.0 # 强制单次任务最多运行 15 秒,避免终端语音助手响应极度卡顿
)
5.2 并行 Tool 调用的利弊
在较新版本的 LangChain 和大模型中,默认支持并行工具调用(即大模型在一次 Thought 之后,输出一个包含多个 Tool Call 的列表,一次性把灯和空调的请求发出去)。
- 优点:控制速度极快,不需要分两次往返。
- 缺点:如果两个动作之间有逻辑依赖(比如必须先开空调电源才能调节空调模式),并行调用会导致 HA 报错。
- 博主建议:若设备之间完全独立(如开关灯与调节空调),开启并行调用能大幅降低交互延迟;若有依赖,请在 System Prompt 中强制要求大模型“必须分步(Sequence)调用”。
5.3 生产环境下的真实 HA 连接配置
我们在 ha_agent_tools.py 中写了 Mock 模拟。如果你要让 ESP32 机器人控制你家里的真设备,请安装 requests 并将其改写为真实请求:
import requests
def call_ha_api(domain: str, service: str, entity_id: str, payload: dict = None):
# 替换为你实际的 Home Assistant 局域网/公网 IP
HA_URL = "http://10.1.1.185:8123"
# 在 HA 的“用户配置 - 长期有效访问令牌”中生成
HA_TOKEN = "eyJhbGciOiJIUzI1NiIsIn..."
url = f"{HA_URL}/api/services/{domain}/{service}"
headers = {
"Authorization": f"Bearer {HA_TOKEN}",
"Content-Type": "application/json"
}
data = {"entity_id": entity_id}
if payload:
data.update(payload)
try:
response = requests.post(url, headers=headers, json=data, timeout=5)
if response.status_code == 200:
return f"成功发送指令 {service} 给设备 {entity_id}"
else:
return f"HA 返回错误: {response.text}"
except Exception as e:
return f"连接 Home Assistant 异常: {str(e)}"
✅ 本文总结
通过本篇教程的深度实战,我们成功为 ESP32 机器人装备了高大上的 AI Agent 大脑。总结核心收获如下:
- 💡 推翻了正则 NLU 束缚:我们对比并论证了大模型 Agent 在处理模糊语义、复合指令控制下的绝对技术优势;
- 🛠️ 精巧的自定义工具链:通过继承 LangChain
BaseTool类,利用 Pydantic 构造了具备类型安全强校验的ArgsSchema入参模型,并编写了具备自适应防呆模糊匹配的控制工具; - 🤖 完美的 ReAct 逻辑闭环:我们成功配置了本地大模型
Qwen3.6-35B-A3B的接入接口,并以真实的“我热了,开灯并调节温度”场景,详细刨析了智能体拆解任务、多步执行、自我纠错并温馨反馈的整个 ReAct 运行日志。
📢 下一篇预告
既然我们的 Python Agent 服务端工具链已经搭建完毕,也成功跑通了物理控制的模拟。那么:
我们如何将这个强大的 Python Agent 真正塞进小智语音助手的服务端,让 ESP32 机器人通过 WebRTC 语音唤醒并真正控制你家里的物理开关和空调?
在下一篇《Esp32Robot入门14-智能家居控制03:将 Agent Tool 集成至小智语音助手服务端》中,我们将打通:ESP32-S3 麦克风音频采集 -> WebRTC 传回服务端 -> 实时 ASR 语音转文字 -> 喂入 LangChain Agent 进行物理控制 -> 物理控制成功 Observation -> 大模型拟人语音反馈 -> TTS 合成音频 -> WebRTC 实时送回机器人喇叭播放
这一条长达数万里的全链路实时语音 Agent 级联控制闭环!干货爆棚,不见不散!
欢迎订阅专栏《大模型 AI 硬件实战:基于 ESP32 与本地大模型的智能机器人二次开发【附完整固件与源码】》,给智能硬件装上灵魂大脑!如果你在开发过程中有任何疑问,欢迎在下方评论区留言,博主会一一为您解答!
更多推荐


所有评论(0)