大模型学习指南从小白到精通收藏这份实战教程本文深入浅出地介绍了Tool Calling Agent的局限性并引入了Full Autonomous自治循环代理架构作为解决方案。重点解析了LangGraph中ReAct代理的构建原理包括ToolNode、Router Agent等组件的作用以及如何通过create_react_agent方法构建和可视化ReAct代理工作流。文章通过实时天气数据查询和管理的实例展示了如何在复杂应用中有效整合不同功能体现了LangGraph框架下ReAct代理模式带来的开发便捷性和可扩展性。对于想要学习和应用大模型的程序员尤其是初学者本文提供了宝贵的实践指导和思路启发。Tool Calling Agent的局限性又在于虽然它可以自主选择工具但在其架构中每次仅能执行一次函数调用无论是单个外部函数还是多个外部函数**。因此当任务需要依次执行 A 工具、B 工具和 C 工具时它无法支持这种自主控制的过程。因此面对这种更复杂的需求就需要引入了Full Autonomous自治循环代理架构即如下图所示Full Autonmonous以两种主要的方式去扩展了Agent对工作流的控制分别是• 多步骤决策Agent可以控制一系列决策而不仅仅是一个决策。• 工具访问Agent可以选择并使用多种工具来完成任务。满足上述两个条件典型且通用的代理架构就是基于ReAct思想而形成的代理模式。ReAct的核心理念还是在于为大模型配备足够丰富的外部工具使用合适的提示词引导大模型在接收到用户输入后进入自主思考和循环执行的状态以实现最终目标。1、LangGraph中ReAct的构建原理在LangGraph开发框架中有一些预构建的组件。上节课介绍的ToolNode是其中一个它用于处理外部函数调用其内部结合了LangGraph底层的图结构能够接收JSON Schema形式的数据执行工具函数并返回结果。除此之外LangGraph的预构建组件中还包含了ReAct代理架构该架构与我们在《ReAct 智能应用架构深度剖析》中手动实现的思路和流程基本一致。不同之处在于在LangGraph框架中ReAct组件被改造成适配图结构的循环代理其具体过程是大模型可以在一个while循环中被重复调用。每一步代理来自主决定调用哪些工具及其输入然后执行这些工具并将输出作为观察结果反馈给大模型。当代理判断不再需要调用更多工具时while循环便会终止输出最终的结果。因此我们需要理解的关键概念是LangGraph预构建的ReAct组件其实就是通过接入大模型搭配着Tool Calling Agent再结合Router Agent共同构建起来的图这个图以自治循环代理的架构形式提供服务。其图结构如下图所示这种代理实现的机制表明了在LangGraph中实现的预构建ReAct代理结构它支持•Tool calling 允许大模型根据需要选择和使用各种工具。•Memory使代理能够保留和使用先前步骤中的信息。•Planning 授权大模型制定并遵循多步骤计划以实现目标。而其在图结构中的具体构建的工作流如下图所示如图所示Agent节点使用消息列表的形式来调用大语言模型Messages Modifier指的是在传递到大模型之前修饰用户的原始输入内容可以是SystemMessage作为背景信息添加的消息列表的开头、Runnable可运行等不同状态如果生成的AIMessage包含tool_calls则该图将调用tools。tools节点执行工具每个tool_call1 个工具并且将响应作为ToolMessage对象添加到消息列表。然后Agent节点再次调用大语言模型。重复该过程直到响应中不再存在tool_calls最终由Agent节点将完整的消息列表作为包含键messages的字典返回。那么如何实现上述这个非常复杂的过程呢非常简单既然我们一直提到的是预构建组件则说明整个过程已经由LangGraph内部封装好了其提供给开发者使用的接口就是create_react_agent方法。在这个案例中我们将通过一个多工具场景需求来测试LangGraph中ReAct代理的构建方法和效果。我们设计了几个工具以实现实时数据的查询和管理。首先用户可以通过一个工具根据城市名称实时获取当前天气信息。接着如果用户希望将查询到的天气数据保存到本地数据库中可以使用另一个工具完成数据的插入操作。此外我们还提供了一个工具允许用户基于本地数据库中的天气数据进行提问数据进行提问。通过这些工具的组合我们能够快速验证如何在复杂的应用场景中有效地整合不同功能并实际的感知LangGraph框架下ReAct代理模式带来的开发便捷性和可扩展性。首先我们接入实时天气数据查询的在线API代码定义如下OpenWeather API的注册与使用注册地址https://openweathermap.org/import requests import json def get_weather(loc): Function to query current weather. :param loc: Required parameter, of type string, representing the specific city name for the weather query. \ Note that forcitiesin China, the corresponding English city name should be used. For example, to query the weather for Beijing, \ the loc parameter should be input as Beijing. :return: The result of the OpenWeather API query for current weather, with the specific URL request address being: https://api.openweathermap.org/data/2.5/weather. \ The returntype is a JSON-formatted object after parsing, represented as a string, containing all important weather information. # Step 1.构建请求 url https://api.openweathermap.org/data/2.5/weather# Step 2.设置查询参数 params {q: loc, appid:xxxxxxxxxxxxxxxxxxxxxxxx, # 替换为自己的API keyunits:metric, # 使用摄氏度而不是华氏度lang:zh_cn# 输出语言为简体中文}# Step 3.发送GET请求 response requests.get(url, paramsparams)# Step 4.解析响应 data response.json()return json.dumps(data)测试一下get_weather函数的有效性正常情况下可以得到输入城市名的实时天气信息。测试代码如下所示从返回的结果是Json数据类型包含了非常丰富的实时天气数据如天气条件、温度、湿度、风速、天气描述等信息这里我们选择一些重要的数据参数进行存储操作存储至Mysql数据库中。提取的参数如下字段名称描述city_id城市的唯一标识符city_name城市名称main_weather主要天气状况description天气的详细描述temperature当前温度feels_like体感温度temp_min最低温度temp_max最高温度接下来设计一个用于存储实时天气信息的表。这里我们定义一个新的模型Weather并包括上述所提取出来的的字段。连接Mysql数据库及创建表的代码如下所示from sqlalchemy import create_engine, Column, Integer, String, Float from sqlalchemy.orm import sessionmaker, declarative_base # 创建基类 Base declarative_base()# 定义 WeatherInfo 模型 class Weather(Base): __tablename__ weather city_id Column(Integer, primary_keyTrue)# 城市ID city_name Column(String(50))# 城市名称 main_weather Column(String(50))# 主要天气状况 description Column(String(100))# 描述 temperature Column(Float)# 温度 feels_like Column(Float)# 体感温度 temp_min Column(Float)# 最低温度 temp_max Column(Float)# 最高温度# 数据库连接 URI这里要替换成自己的Mysql 连接信息以下是各个字段的对应解释# gptMySQL 数据库的用户名。# gptMySQL 数据库的密码。# localhostMySQL 服务器的 IP 地址。# langgraph要连接的数据库的名称。# charsetutf8mb4设置数据库的字符集为 utf8mb4支持更广泛的 Unicode 字符 DATABASE_URI mysqlpymysql://gpt:gptlocalhost:20100/langgraph?charsetutf8mb4 engine create_engine(DATABASE_URI)# 如果表不存在则创建表 Base.metadata.create_all(engine)# 创建会话 Session sessionmaker(bindengine)接下来使用LangChain的tool装饰器将普通的函数注册为LangGraph中支持的工具服务根据需求的设计我们要依次创建三个外部函数分别是get_weather工具用于根据城市名称实时查询该城市的当前天气数据。insert_weather_to_db工具如果用户想要把查询到的天气数据插入到数据库的表中则使用此函数完成数据库的插入操作。query_weather_from_db工具如果用户想基于本地数据库的天气数据直接进行提问则使用此函数完成数据库的查询操作。from langchain_core.tools import tool from typing import Union, Optional from pydantic import BaseModel, Field import requests ## 第一个工具 class WeatherLoc(BaseModel): location: str Field(descriptionThe location name of the city) class WeatherInfo(BaseModel): Extracted weather information for a specific city. city_id: int Field(..., descriptionThe unique identifier for the city) city_name: str Field(..., descriptionThe name of the city) main_weather: str Field(..., descriptionThe main weather condition) description: str Field(..., descriptionA detailed description of the weather) temperature: float Field(..., descriptionCurrent temperature in Celsius) feels_like: float Field(..., descriptionFeels-like temperature in Celsius) temp_min: float Field(..., descriptionMinimum temperature in Celsius) temp_max: float Field(..., descriptionMaximum temperature in Celsius) tool(args_schemaWeatherLoc) def get_weather(location): Function to query current weather. :param loc: Required parameter, of type string, representing the specific city name for the weather query. \ Note that forcitiesin China, the corresponding English city name should be used. For example, to query the weather for Beijing, \ the loc parameter should be input as Beijing. :return: The result of the OpenWeather API query for current weather, with the specific URL request address being: https://api.openweathermap.org/data/2.5/weather. \ The returntype is a JSON-formatted object after parsing, represented as a string, containing all important weather information. # Step 1.构建请求 url https://api.openweathermap.org/data/2.5/weather# Step 2.设置查询参数 params {q: location, appid:5c939a7cc59eb8696f4cd77bf75c5a9a, # 输入API keyunits:metric, # 使用摄氏度而不是华氏度lang:zh_cn# 输出语言为简体中文}# Step 3.发送GET请求 response requests.get(url, paramsparams)# Step 4.解析响应 data response.json()return json.dumps(data)## 第二个工具 tool(args_schemaWeatherInfo) def insert_weather_to_db(city_id, city_name, main_weather, description, temperature, feels_like, temp_min, temp_max): Insert weather information into the database. session Session()# 确保为每次操作创建新的会话 try: # 创建天气实例 weather Weather(city_idcity_id, city_namecity_name, main_weathermain_weather, descriptiondescription, temperaturetemperature, feels_likefeels_like, temp_mintemp_min, temp_maxtemp_max )# 使用 merge 方法来插入或更新如果已有记录则更新 session.merge(weather)# 提交事务 session.commit()return{messages:[f天气数据已成功存储至Mysql数据库。]} except Exception as e: session.rollback()# 出错时回滚return{messages:[f数据存储失败错误原因{e}]} finally: session.close()# 关闭会话## 第三个工具 class QueryWeatherSchema(BaseModel): Schema for querying weather information by city name. city_name: str Field(..., descriptionThe name of the city to query weather information) tool(args_schemaQueryWeatherSchema) def query_weather_from_db(city_name: str): Query weather information from the database by city name. session Session() try: # 查询天气数据 weather_data session.query(Weather).filter(Weather.city_name city_name).first()if weather_data: return{city_id: weather_data.city_id, city_name: weather_data.city_name, main_weather: weather_data.main_weather, description: weather_data.description, temperature: weather_data.temperature, feels_like: weather_data.feels_like, temp_min: weather_data.temp_min, temp_max: weather_data.temp_max } else: return{messages:[f未找到城市 {city_name} 的天气信息。]} except Exception as e: return{messages:[f查询失败错误原因{e}]} finally: session.close()# 关闭会话然后定义实时联网检索外部工具通过该函数获取最新的网络数据信息。## 第四个工具 class SearchQuery(BaseModel): query: str Field(descriptionQuestions for networking queries) tool(args_schema SearchQuery) def fetch_real_time_info(query): Get real-time Internet information url https://google.serper.dev/search payload json.dumps({q: query, num:1, }) headers {X-API-KEY:22a84d67009121271e4a5eb21d809e11d3bc8d45, Content-Type:application/json} response requests.post(url, headersheaders, datapayload) data json.loads(response.text)# 将返回的JSON字符串转换为字典iforganicin data: return json.dumps(data[organic], ensure_asciiFalse)# 返回organic部分的JSON字符串 else: return json.dumps({error:No organic results found}, ensure_asciiFalse)# 如果没有organic键返回错误信息然后把所有定义的工具存储在一个列表中如下代码所示tools [fetch_real_time_info, get_weather, insert_weather_to_db, query_weather_from_db] tools定义模型import getpass import os from langchain_openai import ChatOpenAI from dotenv import load_dotenv load_dotenv()keyos.getenv(DASHSCOPE_API_KEY)base_urlos.getenv(DASHSCOPE_API_BASE) llm ChatOpenAI(modelqwen-plus, api_keykey,base_urlbase_url,temperature0)当有了工具列表和模型后就可以通过create_react_agent这个LangGraph框架中预构建的方法来创建自治循环代理ReAct的工作流其必要的参数如下model 支持工具调用的LangChain聊天模型。tools 工具列表、ToolExecutor 或 ToolNode 实例。state_schema图的状态模式。必须有messages和is_last_step键。默认为定义这两个键的Agent State。from langgraph.prebuilt import create_react_agent graph create_react_agent(llm, toolstools) from IPython.display import Image, display display(Image(graph.get_graph().draw_mermaid_png()))2.构建步骤解析我们可以逐步的分析和解释一下这一行代码中涉及的图构建过程2.1 Step 1. 定义图状态模式LangGraph中的主要图类型是StateGraph。每个节点通过State中的参数获取有效信息执行完节点的内部逻辑后更新该State状态中的值。不同的状态模式可以通过注释设置状态的特定属性例如覆盖现有值或添加到现有属性。伪代码如下from typing import Annotated from typing_extensions import TypedDict from langgraph.graph.message import add_messages class State(TypedDict): messages: Annotated[list, add_messages]2.2 Step 2. 定义Router Function设置边缘条件有条件的原因是根据节点的输出可以采用多个路径之一。在该节点运行之前所采用的路径是未知的由大模型决定。• 条件边缘调用代理后如果代理说要采取行动那么应该调用调用工具的函数。如果代理说已经完成那么就应该完成。• 正常边调用工具后它应该始终返回给代理来决定下一步做什么。伪代码如下# 定义决定是否继续执行任务的路由函数 def should_continue(state: State): messages state[messages] last_message messages[-1]# 如果不是工具调用则结束if not last_message.tool_calls: return END # 如果是的话则进入工具库中选择函数执行 else: returntools2.3 Step 3. 定义大模型的交互函数接下来需要通过一个节点函数加载我想要使用的大模型。它需要满足两个标准• 应该与消息一起使用因为图的状态主要是消息列表聊天历史记录。• 需要与工具调用一起使用其内部使用的是预构建的ToolNode。伪代码如下from typing import Literal from langchain_core.runnables import RunnableConfig # 定义大模型交互的节点函数 async def call_model(state: State, config: RunnableConfig): messages state[messages] response await model.ainvoke(messages, config)# 将调用大模型后得到的响应追加到消息列表中return{messages: response}2.4 Step 4. 构建图结构最后把上述所有的组件放在一起构建图结构这与我们手动构建图的方式基本一致伪代码如下from langgraph.graph import END, START, StateGraph # 定义一个新图 workflow StateGraph(State)# 添加两个节点 workflow.add_node(agent, call_model) workflow.add_node(tools, tool_node)# 设置起始节点为 agent workflow.add_edge(START, agent)# 添加条件边 -- Router Agent workflow.add_conditional_edges(agent, should_continue, [tools, END], )# 添加回调边 workflow.add_edge(tools, agent)# 编译图 app workflow.compile()理解了上面的create_react_agent方法内部的构建原理后其实就能明白当通过create_react_agent(llm, toolstools)一行代码的执行现在得到的已经是一个编译后、可执行的图了。我们可以通过mermaid方法来可视化经过create_react_agent方法构造出来的图结构代码如下所示from IPython.display import Image, display display(Image(graph.get_graph().draw_mermaid_png()))返回的是编译好的LangGraph可运行程序可直接用于聊天交互。调用方式则和之前使用的方法一样我们可以依次针对不同复杂程度的需求依次进行提问。首先是测试是否可以不使用工具直接调用大模型生成响应。finan_response graph.invoke({messages:[你好请你介绍一下你自己]}) finan_response最后近期科技圈传来重磅消息行业巨头英特尔宣布大规模裁员2万人传统技术岗位持续萎缩的同时另一番景象却在AI领域上演——AI相关技术岗正开启“疯狂扩招”模式据行业招聘数据显示具备3-5年大模型相关经验的开发者在大厂就能拿到50K×20薪的高薪待遇薪资差距肉眼可见业内资深HR预判不出1年“具备AI项目实战经验”将正式成为技术岗投递的硬性门槛。在行业迭代加速的当下“温水煮青蛙”式的等待只会让自己逐渐被淘汰与其被动应对不如主动出击抢先掌握AI大模型核心原理落地应用技术项目实操经验借行业风口实现职业翻盘深知技术人入门大模型时容易走弯路我特意整理了一套全网最全最细的大模型零基础学习礼包涵盖入门思维导图、经典书籍手册、从入门到进阶的实战视频、可直接运行的项目源码等核心内容。这份资料无需付费免费分享给所有想入局AI大模型的朋友扫码免费领取全部内容部分资料展示1、 AI大模型学习路线图2、 全套AI大模型应用开发视频教程从入门到进阶这里都有跟着老师学习事半功倍。3、 大模型学习书籍文档4、AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5、大模型大厂面试真题整理了百度、阿里、字节等企业近三年的AI大模型岗位面试题涵盖基础理论、技术实操、项目经验等维度每道题都配有详细解析和答题思路帮你针对性提升面试竞争力。6、大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。学会后的收获• 基于大模型全栈工程实现前端、后端、产品经理、设计、数据分析等通过这门课可获得不同能力• 能够利用大模型解决相关实际项目需求 大数据时代越来越多的企业和机构需要处理海量数据利用大模型技术可以更好地处理这些数据提高数据分析和决策的准确性。因此掌握大模型应用开发技能可以让程序员更好地应对实际项目需求• 基于大模型和企业数据AI应用开发实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能 学会Fine-tuning垂直训练大模型数据准备、数据蒸馏、大模型部署一站式掌握• 能够完成时下热门大模型垂直领域模型训练能力提高程序员的编码能力 大模型应用开发需要掌握机器学习算法、深度学习框架等技术这些技术的掌握可以提高程序员的编码能力和分析能力让程序员更加熟练地编写高质量的代码。扫码免费领取全部内容这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】