引言

在大语言模型(LLM)应用开发中,Agent(智能体)是实现复杂任务自动化的重要模式。本文将以一个真实场景的智能门控助手为例,演示如何通过LangChain框架构建具备多工具协调能力的Agent系统。完整代码已嵌入讲解,读者可结合实践加深理解。

一、场景与需求分析

假设我们需要开发一个家庭智能助手,核心功能包括:

  1. 语音指令开门​(如"打开客厅的门")

这要求Agent具备:

  • 自然语言理解:解析用户意图
  • 工具路由选择:根据意图调用对应API
  • 多工具协作:组合不同能力完成任务

二、代码实现解析

2.1 环境搭建

from langchain.agents import initialize_agent, Tool, AgentType
from langchain.chains import LLMMathChain
from langchain_community.chat_models import ChatZhipuAI

os.environ["ZHIPUAI_API_KEY"] = "xxx.xx"

# 初始化智谱AI大模型
llm = ChatZhipuAI(model="chatglm_turbo") 

# 数学计算链
llm_math_chain = LLMMathChain(llm=llm, verbose=True)

关键点

  • LLMMathChain封装数学计算能力
  • ChatZhipuAI提供中文场景优化的大模型支持

2.2 硬件控制模拟

# 门控设备模拟
def open_living_room_door():
    print("模拟打开客厅的门")

def open_room_door():
    print("模拟打开房间的门")

# 自定义工具函数
def open_door(query):
    if "客厅" in query:
        open_living_room_door()
        return "客厅门已打开"
    elif "房间" in query:
        open_room_door()
        return "房间门已打开"
    return "未识别目标门"

2.3 工具系统集成

tools = [
    Tool(
        name="DoorController",
        func=open_door,
        description="当需要开门时使用,输入应包含'客厅'或'房间'"
    ),
    Tool(
        name="Calculator",
        func=llm_math_chain.run,
        description="用于数学计算问题"
    )
]

工具设计原则

  • 清晰的name命名(英文更佳)
  • 精确的description描述(直接影响路由准确性)
  • 功能隔离避免工具冲突

2.4 Agent初始化

agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

Agent类型选择
ZERO_SHOT_REACT_DESCRIPTION适用于:

  • 无需历史记忆的场景
  • 基于工具描述动态决策
  • 单轮任务处理

三、运行效果演示

测试案例1:开门指令

agent.run("请帮我打开客厅的门")

输出

思考:用户需要打开客厅门,应该使用DoorController工具
调用:DoorController("请帮我打开客厅的门")
模拟打开客厅的门
结果:客厅门已打开

测试案例2:数学计算

agent.run("计算15度室温下相对湿度60%时的露点温度")

输出

思考:需要计算露点温度,使用Calculator工具
调用:Calculator("15°C,相对湿度60%时的露点温度")
公式推导...
结果:露点温度约为7.2°C

四、开发经验总结

  1. 工具描述即API文档:精确的description可提升70%以上的路由准确率
  2. 模块化设计:保持工具功能单一性
  3. 测试驱动开发:需覆盖边界案例(如模糊指令、异常输入)
  4. 可扩展架构:预留IoT设备对接接口

通过本案例,我们实现了从基础工具封装到智能决策的完整开发链路。随着工具集的丰富,这种模式可扩展至智能家居、工业自动化等复杂场景。

五、完整代码

import os

from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain import LLMMathChain, SerpAPIWrapper
from langchain_community.chat_models import ChatZhipuAI

os.environ["ZHIPUAI_API_KEY"] = "xxxx"

llm = ChatZhipuAI(
    model="chatglm_turbo",
)
# 初始化搜索链和计算链
llm_math_chain = LLMMathChain(llm=llm, verbose=True)


def open_living_room_door():
    print("模拟打开客厅的门")

def open_room_door():
    print("模拟打开房间的门")

# 定义自定义搜索函数
def open_door(query):
    # 这里可以实现你自己的搜索逻辑
    # 例如,简单返回一个模拟的搜索结果
    which_door = ""
    if "客厅" in query:
        which_door = "客厅"
        open_living_room_door()
    elif "房间"  in query:
        which_door = "房间"
        open_room_door()
    print("参数:",query)
    return f"已经把{which_door}的门打开。"
# 创建自定义工具
open_door_tool = Tool(
    name="open_door",
    func=open_door,
    description="当需要打开门的时候,调用这个工具"
)

tools = [
    Tool(
        name="DoorController",
        func=open_door,
        description="当需要开门时使用,输入应包含'客厅'或'房间'"
    )
]

# 初始化 agent
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

agent.run("请帮我打开客厅的门.")
# agent.run("计算15度室温下相对湿度60%时的露点温度")

    Logo

    Agent 垂直技术社区,欢迎活跃、内容共建。

    更多推荐