
本文介绍如何通过提示工程与函数调用机制,使本地部署的大语言模型(如ollama中的模型)理解用户指令、结构化提取意图与参数,并联动api执行真实操作(如开关灯光),无需微调即可实现可控、可解释的智能家居交互。
本文介绍如何通过提示工程与函数调用机制,使本地部署的大语言模型(如ollama中的模型)理解用户指令、结构化提取意图与参数,并联动api执行真实操作(如开关灯光),无需微调即可实现可控、可解释的智能家居交互。
在构建能执行动作的智能助手时,关键不在于“训练模型去写代码”,而在于设计可预测的输出协议 + 构建可靠的执行桥接层。以“打开客厅灯光”为例,真正需要完成的是三步闭环:① 理解用户意图;② 提取结构化指令(动作类型、设备标识、参数);③ 调用对应API完成物理操作。现代LLM(尤其是支持结构化输出的模型,如Phi-3、Llama 3、Qwen2)完全可通过高质量提示(Prompt Engineering)稳定达成前两步,无需昂贵且易过拟合的全量微调。
✅ 推荐方案:结构化输出提示 + JSON解析 + API桥接
最轻量、可复现、适合Ollama环境的实践路径如下:
-
定义明确的响应协议(系统级提示):
向模型强制约定输出格式为标准JSON,仅包含action和device字段,避免自由文本干扰解析:
你是一个智能家居控制代理。请严格按以下JSON格式响应,不得添加任何额外字符、说明或换行:
{
"action": "turn-on-light | turn-off-light | set-temperature",
"device": "living-room-light | bedroom-ac | kitchen-fan"
}
示例输入:打开客厅的灯
示例输出:{"action": "turn-on-light", "device": "living-room-light"}
现在请处理以下指令:
-
解析并执行(Python示例,结合Ollama API):
使用json.loads()安全解析模型输出,并映射到本地设备控制逻辑:
import json
import requests
from ollama import Client
def control_device(action: str, device: str):
# 映射动作到实际API调用(此处为伪代码)
mapping = {
"turn-on-light": lambda d: requests.post(f"http://smart-home/api/light/{d}/on"),
"turn-off-light": lambda d: requests.post(f"http://smart-home/api/light/{d}/off"),
"set-temperature": lambda d: requests.put(f"http://smart-home/api/ac/{d}", json={"temp": 26})
}
if action in mapping:
return mapping[action](device)
raise ValueError(f"Unsupported action: {action}")
# 调用Ollama模型(如llama3)
client = Client()
response = client.chat(
model='llama3',
messages=[{
'role': 'user',
'content': '关闭卧室的空调'
}],
options={'temperature': 0.1} # 降低随机性,提升结构化输出稳定性
)
try:
output = json.loads(response['message']['content'].strip())
print(f"执行指令:{output}")
control_device(output['action'], output['device'])
print("✅ 设备已控制")
except json.JSONDecodeError:
print("❌ 模型未返回有效JSON,请检查提示词或更换更强模型")
except KeyError as e:
print(f"❌ 缺失必要字段:{e}")
⚠️ 关键注意事项
- 模型能力优先级高于微调:Ollama中推荐选用 llama3:8b-instruct、phi3:medium-128k-instruct 或 qwen2:7b-instruct 等原生支持工具调用/结构化输出的模型。低参数量模型若无法稳定输出JSON,换模型比微调更高效。
- 绝不信任原始LLM输出:始终使用json.loads()配合try/except校验,禁止直接eval()或exec();对device字段需白名单校验(如预定义设备ID列表),防止注入攻击。
- 系统消息(System Prompt)比微调更可控:微调会固化行为,难以动态更新设备列表或动作集;而提示词可在运行时灵活注入最新设备信息(如“当前可用设备:living-room-light, kitchen-fan, bedroom-ac”)。
- 进阶可集成LangChain + Pydantic:如需强类型保障,可用Pydantic定义DeviceCommand模型,配合LangChain的JsonOutputParser自动校验与转换,进一步提升鲁棒性。
综上,面向智能硬件的动作执行,核心是“用提示词做协议设计,用代码做安全执行”。只要模型具备基础推理与格式遵循能力,搭配严谨的解析与防护逻辑,就能在Ollama等轻量环境中快速落地高可用的语音/文本控制能力——这正是当前LLM应用工程化的典型范式:少训练、重编排、强集成。










