Agent
python
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
# 1. 初始化模型
model = init_chat_model("gpt-4o-mini", model_provider="openai")
# 2. 创建 agent(一步完成)
agent = create_agent(
model=model,
tools=[tool1, tool2],
system_prompt="Agent 的行为指令" # 可选
)
# 3. 调用
result = agent.invoke({
"messages": [{"role": "user", "content": "问题"}]
})
Agent模型的传入方式
在 LangChain 1.2 中,create_agent 是构建智能体的核心入口,底层基于 LangGraph 实现 。它接收模型、工具、系统提示词等参数,其中模型是 Agent 的"大脑",负责决策与推理。
无论你用哪种方式传模型,create_agent(...) 返回的都是同一个类型:
python
<class 'langgraph.graph.state.CompiledStateGraph'>
也就是说 Agent 本质是 LangGraph 的 CompiledStateGraph 实例,底层是一张图结构。你可以用下面这行把它的流程图可视化出来:
python
from IPython.display import Image, display
display(Image(agent.get_graph().draw_mermaid_png()))
方式一:传入模型字符串(最省事)
python
from langchain.agents import create_agent
agent = create_agent("deepseek-v4-flash")
直接把模型名当字符串 丢进去,由 Agent 内部自主创建模型对象。
-
优点:一行搞定,零配置。
-
局限:走默认配置,无法自定义 api_key、base_url 等。
-
适用:Demo、快速验证。
方式二:传入模型对象(更可控,生产推荐)
先把模型实例化好,再传给 create_agent。实例化有两种等价写法:
python
from langchain.chat_models import init_chat_model
import os
from dotenv import load_dotenv
load_dotenv(override=True)
# 写法A:通用工厂函数(可指定 provider / api_key / base_url)
model = init_chat_model(
model="gpt-5.4-mini",
model_provider="openai",
api_key=os.getenv("CLOSEAI_API_KEY"),
base_url=os.getenv("CLOSEAI_BASE_URL"),
)
# 写法B:直接用某厂商的封装类
# from langchain_deepseek import ChatDeepSeek
# model = ChatDeepSeek(model="deepseek-v4-flash")
agent = create_agent(model)
这种方式能精细控制 api_key、base_url、provider、温度等配置------需要走自定义网关(如前面用到的 CloseAI 兼容地址)时,必须用它。
agent的调用
agent.invoke() 是 Agent 最基本的同步调用方法,会阻塞程序执行直到返回最终结果。
输入 传入一个字典 ,通过 messages 字段传递消息列表:
python
response = agent.invoke({"messages": [...]})
消息列表中的每条消息通常包含 role("system" / "user" / "assistant" / "tool")和 content。传纯字符串时默认会被当成 HumanMessage。
也可以在开头加入 system 角色来定义 Agent 的人设和行为,例如"你是一个小学数学老师"。
python
resp = agent.invoke( {
"messages": [
{"role": "system", "content": "你是一个小学数学老师,耐心,幽默,讲解深入浅
出"},
{"role": "user", "content": "100加上50等于多少?"}
]
})
输出 返回的也是一个字典,包含完整的消息列表:
python
{
"messages": [
HumanMessage(...), # 用户问题
AIMessage(...), # AI 工具调用(如有)
ToolMessage(...), # 工具返回结果(如有)
AIMessage(...) # 最终回答 ← 通常取这个
]
}
获取最终回答:
python
final_answer = response["messages"][-1].content
调用 Agent 就是:传入 {"messages": [...]},拿到 {"messages": [...]},最后一条 AIMessage 的 content 就是最终答案。 底层可能经历多轮"AI 调用工具 → 工具返回 → AI 再回答"的循环,但 invoke() 会等全部跑完才一次性返回。
Agent 工具的使用
只有给 Agent 接入了工具 ,create_agent 的创建才算真正完整。工具可以是 LangChain 内置的 ,也可以自己自定义 ;绑定方式分静态绑定 (本节)和动态绑定(需中间件,后讲)。
一、怎么接入:统一塞进 tools=[...]
所有工具都在 create_agent(model=..., tools=[...]) 的 tools 列表里传入,可绑一个或多个。
① 自定义工具(@tool 装饰器)
python
@tool(parse_docstring=True)
def get_weather(city: str) -> str:
"""天气查询工具
Args:
city: 城市名称
"""
return f"{city}的天气为晴朗,25°C。"
agent = create_agent(model=model, tools=[get_weather])
配合 system_prompt 限定人设(如"只回答天气相关问题"),问"北京天气"时模型自动 tool_calls → 执行工具 → 返回 ToolMessage → 给出最终答案。
② 内置工具(如 TavilySearch 联网搜索) 先在官网申请 API-KEY 写入 .env(TAVILY_API_KEY),实例化后可直接 .invoke() 单测,也能直接塞进 tools:
python
# 1. 去 tavily.com 注册,拿到 API Key,写进 .env:TAVILY_API_KEY=xxx
from langchain_community.tools.tavily_search import TavilySearch
# 2. 实例化内置工具
search_tool = TavilySearch(max_results=2)
# 3. 当普通工具单测
search_tool.invoke("北京今天的天气")
# 4. 或直接绑进 Agent,让它自主决定何时联网查
agent = create_agent(model=model, tools=[search_tool])
agent.invoke({"messages": ["帮我查一下最新的大模型新闻"]})
例如:
python
# 2.工具实例化
web_search = TavilySearch(max_results=2)
# 3.创建Agent
agent = create_agent(
model=model,
tools=[web_search],
#system_prompt="你是一名多才多艺的智能助手,可以调用工具帮助用户解决问题。"
)
# 4.运行Agent获得结果
result = agent.invoke(
{"messages": [{"role": "user", "content": "请帮我查询2024年诺贝尔物理学奖得主
是谁?"}]}
)
③ 绑多个工具
python
agent = create_agent(model, tools=[get_weather, get_news])
模型会自主判断调哪个、甚至一次并行调多个 (例中同时返回 get_weather、get_news 两个 tool_calls)。
Tavily 是什么
一句话:Tavily 是专为 AI Agent 打造的"实时联网搜索 API" ------ 官网自我定位是 "the real-time search engine for AI agents"(AI 智能体的实时搜索引擎)。它不是给人用的搜索引擎,而是给大模型 / Agent 用的"联网能力层"。
解决的问题: 大模型有两个硬伤:知识有截止日期 、会幻觉 。让 Agent 接入 Tavily,就等于给它接上"实时查网 + 把网页内容清洗成结构化片段"的能力,让它能基于最新、可溯源的真实信息来回答,而不是凭记忆瞎编。JetBrains 的案例就提到:模型本来会"自信地编出不存在的库方法",接入 Tavily 实时搜索后立刻解决。
ReAct 结构
Agent 接入工具后,运行时到底是怎么"一圈一圈"跑起来的。 答案是经典的 ReAct 结构。
LangChain 的 Agent 把"模型"和"工具"缝合成一个整体,背后由一个基于 LangGraph 的图结构来编排执行流程。
-
用户抛出复杂需求后,Agent 像人一样:先理解任务 → 规划步骤 → 选合适的工具(搜索网络、查数据库、做计算等)去拿信息;
-
然后在一个循环里反复调用模型和工具;
-
终止条件 :当某一次模型输出里不再包含工具调用时,循环结束,模型综合所有已获得信息给出最终答案。