乐于分享
好东西不私藏

AI Agent 入门

AI Agent 入门

大模型很聪明,但它只会说,不会做。Agent 就是给它装上手脚,让它自己决定该做什么、怎么做,这个概念是从去年开始火起来的,2025 年底发布的 OpenClaw 本质上也是一个 Agent。
大模型(如 GPT、GLM、Qwen)可以类比成只会聊天的大脑。你问它问题,它给你答案,但它没法真正去做什么事情,不能帮你查天气、不能查数据库、不能跑分析脚本。
Agent(智能体)= 大脑 + 工具 + 自主决策
具体来说:大脑就是大模型本身,负责理解、推理、生成。工具则是我们提供给它的外部能力,比如搜索引擎、计算器、数据库查询、分析脚本等。最关键的是自主决策,不是我们告诉 AI 现在该用搜索工具了,而是 AI 自己判断什么时候该用什么工具。
举个例子:你对 Agent 说“帮我查一下北京今天的天气,然后推荐穿搭”。Agent 会:
1.思考:我需要先知道天气 → 我应该调用天气查询工具。
2.行动:调用天气工具,拿到“北京,晴,15-26℃”。
3.再思考:拿到天气了,现在可以推荐穿搭了。
4.回答:今天北京晴天,温差较大,建议外搭一件薄外套。
这个 想一想→做一做→再想想 的循环,就是 Agent 的核心工作模式。它有个正式的名字:ReAct(Reason + Act),也就是“推理 + 行动”。
ReAct 的行为模式非常重要。因为在这之前,AI 要么只会想(纯推理,容易胡说八道),要么只会做(盲目执行,不会变通)。ReAct 把两者结合起来:先想清楚再动手,拿到结果后再想想对不对,不对就换个方法。这和我们人类解决问题的方式很像。
我日常工作中使用 LangGraph 比较多,所以推荐用它来搭建 Agent。LangGraph 的核心理念是用图来描述 Agent 的工作流程。这张图由以下几个核心概念组成:
1.State(状态):Agent 在工作过程中的短期记忆,记录着当前对话的所有信息:用户说了什么、AI 回了什么、调用了什么工具、工具返回了什么结果,可以用一个简单的 TypedDict 来定义它。
2.Node(节点):每个节点就是一个 Python 函数,它接收当前 State,返回更新后的 State,比如“调用大模型思考”是一个节点,“执行工具”是另一个节点。
3.Edge(边):普通边定义了固定的执行顺序,Conditional Edge(条件边)则根据情况选择走哪条路,这就是 ReAct 的关键,大模型回复之后,我们检查它是否需要调用工具,如果需要,就走工具节点,如果不需要,就结束对话。
4.Tool(工具):你希望 AI 能调用的功能。通过 LangChain 的 @tool 装饰器可以定义,注意工具里的描述要写得清晰准确,因为 AI 会根据这段描述来判断什么时候该用这个工具。
下面是一个完整的 LangGraph Agent 示例,具备 ReAct 能力。它会自己决定先查天气、再推荐穿搭。
import osfrom typing import Annotated, TypedDictfrom langchain.tools import toolfrom langchain.chat_models import init_chat_modelfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.graph.message import add_messagesfrom langgraph.prebuilt import ToolNode# ========== 1. 定义工具 ==========@tooldef get_weather(city: str) -> str:    """查询指定城市的实时天气信息,包括温度、天气状况等"""    # 实际项目中这里会调用天气 API,这里用模拟数据演示    weather_data = {        "北京""晴,15-26°C,北风3级",        "上海""多云,18-24°C,东风2级",        "广州""小雨,22-28°C,南风1级",    }    return weather_data.get(city, f"暂无{city}的天气数据")@tooldef get_clothing_advice(weather: str) -> str:    """根据天气信息推荐今日穿搭建议"""    if "雨" in weather:        return "建议带伞,穿防水外套,搭配短靴"    elif "晴" in weather:        return "阳光好,建议穿轻薄长袖,外搭薄外套应对温差"    else:        return "天气多变,建议穿着舒适的休闲装,备一件外套"tools = [get_weather, get_clothing_advice]# ========== 2. 初始化大模型 ==========# 请将你的 API Key 配置在环境变量 MODELSCOPE_API_KEY 中llm = init_chat_model(    model="glm-4-flash",    model_provider="openai",    api_key=os.environ.get("MODELSCOPE_API_KEY""your-key-here"),    base_url="https://open.bigmodel.cn/api/paas/v4",)# 关键:把工具绑定给大模型,让它知道有哪些工具可用llm_with_tools = llm.bind_tools(tools)# ========== 3. 定义 State ==========class State(TypedDict):    messages: Annotated[list, add_messages]# ========== 4. 定义节点 ==========def chatbot(state: State):    """大模型节点:思考并决定是否调用工具"""    return {"messages": [llm_with_tools.invoke(state["messages"])]}def route_tools(state: State):    """条件边:检查是否需要调用工具"""    last_message = state["messages"][-1]    # 如果最后一条消息包含 tool_calls 属性且非空,就去执行工具    if hasattr(last_message, "tool_calls"and last_message.tool_calls:        return "tools"    return END# ========== 5. 构建图 ==========graph_builder = StateGraph(State)# 添加节点graph_builder.add_node("chatbot", chatbot)graph_builder.add_node("tools", ToolNode(tools))  # LangGraph 内置的工具执行节点# 添加边graph_builder.add_edge(START, "chatbot")           # 入口 → 大模型graph_builder.add_conditional_edges(                # 大模型 → 工具 or 结束    "chatbot", route_tools,    {"tools""tools", END: END})graph_builder.add_edge("tools""chatbot")          # 工具 → 回到大模型(继续思考)# 编译agent = graph_builder.compile()# ========== 6. 运行 ==========if __name__ == "__main__":    result = agent.invoke({        "messages": [{"role""user""content""帮我查一下北京今天的天气,然后推荐穿搭"}]    })    # 打印最终回复    print(result["messages"][-1].content)
运行这段代码,Agent 会自主完成:思考 → 调用 get_weather → 拿到天气 → 调用 get_clothing_advice → 生成最终建议。
整个 LangGraph Agent 的运行流程可以用一张图概括:
这就是一个最经典的 ReAct Agent 图结构。LangGraph 的强大之处在于:你可以在这个基础上自由添加更多节点和分支,比如加一个“人工审核”节点或者加一个“错误重试”分支。
另外要注意,Agent 的核心不是工具多不多,而是 AI 能不能自主地、合理地使用工具。
一个好的 Agent 应该像一个靠谱的助手:你告诉它目标,它自己想办法完成,遇到问题会换个方法再试,而不是需要你手把手指挥每一步。
如果你想开始构建自己的 Agent,我的建议是:先跑通一个最小示例,理解 ReAct 的思考-行动循环,然后逐步增加复杂度,多工具、多步骤、加记忆、加人工审核······
LangGraph 的文档和教程都很完善,推荐从官方文档开始学习:
https://langgraph.com.cn/agents/agents.1.html