前面我们基于原生LangGraph完成了基础React的设置与使用,从工具定义、节点逻辑到图结构搭建都需要手动配置,可以看到,采用全手动实现虽然能精准控制流程,但步骤相对烦琐。
为我们后续的智能体开发提供了更高效的捷径。而LangGraph中的create_agent模块已封装ReAct模式的核心循环(思考-行动-观察),内置了工具调用、状态管理等关键逻辑,无须再手动定义节点衔接和条件判断,能快速实现具备工具调用能力的智能体,大幅简化开发流程的同时,保留了灵活扩展的特性。
5.3.1 creat_agent的基础使用
在创建和使用上,LangChain的create_agent是构建智能体的核心接口,它封装了大模型与工具调用的联动逻辑,能快速实现"接收指令-分析需求-生成响应"的基础能力。需要注意的是,该接口的完整调用需包含大模型实例、工具列表(可选,无工具时为纯对话智能体)、智能体类型等关键参数,仅传入模型会导致初始化失败。下面我们从基础对话智能体入手,逐步掌握其使用方法。
1. 基础对话智能体:最小化实现
若仅需构建"无工具"的纯对话智能体,需确保传入 model(大模型实例)和 agent_type(智能体类型,指定为纯对话模式)。以下是完整的基础实现代码:
from langchain.agents import create_agent
import bigmodel
agent = create_agent(
model=bigmodel.llm
)
reply = agent.invoke({"messages":"你好"})
print(reply["messages"][-1].content)
在以上代码中,我们使用create_agent调用了大模型并进行封装和整合,直接借助大模型的语义理解能力生成回复。
2. 添加工具支持的智能体
除了上面的纯对话智能体外,我们还可以通过对create_agent智能体绑定实用工具(如天气查询、计算器等),让其从"纯对话"升级为"能办事"的智能体。以下是添加"天气查询工具"的完整示例:
from langchain_core.tools import tool
2. 定义工具(Tools)
@tool("get_weather_info")
def get_weather_info(city: str) -> str:
"""
根据城市名称查询当前天气状况
Args:
city (str): 城市的中文全称
"""
weather_data = {
"上海": "城市:上海 | 天气:晴 | 温度:18℃ | 风向:东南风 | 湿度:65%",
"南京": "城市:南京 | 天气:多云 | 温度:15℃ | 风向:北风 | 湿度:70%",
"杭州": "城市:杭州 | 天气:小雨 | 温度:12℃ | 风向:西北风 | 湿度:80%",
}
return weather_data.get(city, f"未查询到{city}的天气信息")
@tool
def get_weather_tips(city: str) -> str:
"""
根据城市名称返回3条天气相关的生活建议
Args:
city (str): 城市的中文全称
"""
tips_data = {
"上海": "天气晴朗,适合户外活动;紫外线较强,注意防晒;早晚温差大",
"南京": "多云天气,适宜出行;风力不大,适合晾晒衣物;空气较干燥",
"杭州": "有小雨,出门记得带伞;路面湿滑,注意行车安全;气温较低,适当添衣",
}
return tips_data.get(city, f"暂无{city}的相关天气建议")
from langchain.agents import create_agent
import bigmodel
agent = create_agent(
model=bigmodel.llm,
system_prompt="你需要回答来自于用户的提问, 在需要的时候还可以使用工具帮助你完成这些任务。",
tools=[get_weather_info, get_weather_tips]
)
result = agent.invoke({"messages":"上海的天气是什么?"})
result = result["messages"][-1].content
print(result)
在以上代码中,我们在使用create_agent时,除了原有的注入模型外,还额外添加了系统定义提示词system_prompt以及tools工具的定义,从而在使用时可以对其进行直接调用,输出结果如下:
上海当前的天气是晴天,气温为18℃,风向为东南风,湿度为65%。
读者可以自行尝试运行。
5.3.2 使用create_agent构建React
在5.2.2节中,我们通过手动定义工具节点、思考节点、条件判断逻辑,完整搭建了一个遵循React模式的智能体------整个过程需要手动串联"接收需求→判断是否调用工具→执行工具→整合结果"的全流程,虽能清晰理解React的核心原理,但开发效率较低。
而LangChain的create_agent接口恰好解决了这一问题:它内置了React模式的核心逻辑,能自动完成"需求分析→工具决策→结果整合"的闭环,我们只需传入大模型、工具列表等核心组件,即可快速构建出具备工具调用能力的React智能体,大幅简化了开发流程。
下面是使用create_agent构建天气查询React智能体的完整实现,代码保留了工具定义与智能体核心配置,可直接用于调试:
from langchain_core.tools import tool
2. 定义工具(Tools)
@tool("get_weather_info")
def get_weather_info(city: str) -> str:
"""
根据城市名称查询当前天气状况
Args:
city (str): 城市的中文全称
"""
weather_data = {
"上海": "城市:上海 | 天气:晴 | 温度:18℃ | 风向:东南风 | 湿度:65%",
"南京": "城市:南京 | 天气:多云 | 温度:15℃ | 风向:北风 | 湿度:70%",
"杭州": "城市:杭州 | 天气:小雨 | 温度:12℃ | 风向:西北风 | 湿度:80%",
}
return weather_data.get(city, f"未查询到{city}的天气信息")
@tool
def get_weather_tips(city: str) -> str:
"""
根据城市名称返回3条天气相关的生活建议
Args:
city (str): 城市的中文全称
"""
tips_data = {
"上海": "天气晴朗,适合户外活动;紫外线较强,注意防晒;早晚温差大",
"南京": "多云天气,适宜出行;风力不大,适合晾晒衣物;空气较干燥",
"杭州": "有小雨,出门记得带伞;路面湿滑,注意行车安全;气温较低,适当添衣",
}
return tips_data.get(city, f"暂无{city}的相关天气建议")
from langchain.agents import create_agent
import bigmodel
agent = create_agent(
model=bigmodel.llm,
system_prompt="你是一个智能体,可以使用工具完成任务,现在处理发来的信息内容。在需要的时候可以使用工具,在获得答案时需要对信息进行进一步处理。",
tools=[get_weather_info, get_weather_tips]
)
result = agent.invoke({"messages":"上海天气怎么样,有什么生活建议吗?"})
result = result["messages"][-1].content
print(result)
对比5.2.2节的手动实现示例,本示例中create_agent的价值主要体现在以下三点:
- 无须手动定义思考节点:智能体自动封装大模型的"思考逻辑",无须像手动实现时那样编写run_llm函数判断工具调用时机。
- 自动管理工具调用流程:支持多工具联动调用,无须手动编写工具执行后的跳转逻辑(如5.2.2节的should_continue条件函数)。
- 结果整合更智能:大模型会根据system_prompt的要求,将多个工具的返回结果整合为连贯的自然语言,无须手动处理结果拼接。
输出结果如下:
上海当前天气晴朗,气温为18℃,东南风,湿度65%。以下是几条生活建议:
-
适合户外活动:天气晴好,可以安排散步、运动或郊游。
-
注意防晒:紫外线较强,外出时建议涂抹防晒霜、戴帽子或太阳镜。
-
应对温差:早晚温差较大,建议适当增减衣物,避免着凉。
希望这些建议对您有帮助!
create_agent构建的智能体在使用中还需要注意以下两点。
- 消息格式规范:代码中直接传入字符串"上海天气怎么样......"不符合LangChain规范,会导致报错。正确用法是将其封装为HumanMessage对象,即{"messages": [HumanMessage(content="上海天气怎么样,有什么生活建议吗?")]},这样才能被智能体正确识别为用户需求。
- 内置的React循环:调用后智能体会自动完成React流程------先分析需求(用户需要上海的天气和建议,需调用两个工具),再依次调用工具获取结果,最后整合结果生成自然语言回复,整个过程无须手动干预。
