在LangChain 1.0中,框架核心更聚焦于构建生产级Agent(智能体), 本节就来创建一个最简单的Agent。
1.理解LangChain Agent
在 1.0 版本中,Agent 的实现发生了一个范式转移:从AgentExecutor转向LangGraph。
旧版本 (Legacy):依赖于一个黑盒的AgentExecutor类,很难修改其中间逻辑。
1.0 版本:所有的 Agent 现在底层都是一个 状态机 (State Machine)。
- • 状态管理:Agent 现在的执行是持久化的,可以中断和恢复。
- • 图结构:Agent 被建模为有向图,
Node是动作,Edge是决策路径。
Agent 是“大脑” ,它自主决定:
- 现在需要执行哪个动作?
- 该动作的参数是什么?
- 观察结果后,下一步是继续还是结束?
要构建一个 1.0 Agent,开发者只需要关注这三个部分:
| 组件 | 开发者职责 | 解释 |
|---|---|---|
| LLM (Reasoning) | 选择具有 Tool Calling 能力的模型 | 它是决策中心,负责解析意图并决定调用哪个工具。 |
| Tools (Capabilities) | 定义StructuredTool或@tool | Agent 能做的所有事情(查数据库、发邮件、搜索网络)。 |
| Prompt (Instructions) | 编写系统提示词 | 告诉 Agent 它的身份、行为准则以及如何处理失败。 |
2.创建智能体
chapter04/agent.py
from langchain.agents import create_agentfrom langchain.chat_models import init_chat_modelif __name__ == '__main__': # 1. 定义模型: 使用本地ollama 模型 model=init_chat_model( model="ollama:qwen3-next:80b-cloud", base_url="http://127.0.0.1:11434", temperature=0.7, timeout=30 , max_tokens=1024) # 2. 创建agent agent=create_agent( model=model ) # print(f"类型:{type(agent)} , 对象结构:{dir(agent)}") # nodes属性 nodes=agent.nodes print(f"nodes属性类型:{type(nodes)}") prompt={ "messages": [ {"role": "user", "content": "你好,今天北京天气如何?"} ] } # 3. 调用agent result=agent.invoke(prompt) print(result)执行输出:
类型:<class 'langgraph.graph.state.CompiledStateGraph'> , 对象结构:[...,nodes,...]nodes属性类型:<class 'dict'>{'messages': [HumanMessage(content='你好,今天北京天气如何?', additional_kwargs={}, response_metadata={}, id='a3ab7ff3-4452-4880-8306-6fb3382c6a15'), AIMessage(content='\n\n您好!我无法实时获取天气数据,但您可以通过以下方式查询最新情况: \n1️⃣ 打开手机天气应用(如苹果天气、墨迹天气等) \n2️⃣ 访问中国天气网(www.weather.com.cn) \n3️⃣ 在搜索引擎中输入“北京天气” \n\n目前北京正值夏季(6-8月),通常气温在25-35℃之间,午后可能有阵雨或雷阵雨,建议出门带伞并注意防暑降温哦~ 🌞☔️', additional_kwargs={}, response_metadata={'model': 'qwen3-next:80b-cloud', 'created_at': '2026-01-03T04:00:05.456202317Z', 'done': True, 'done_reason': 'stop', 'total_duration': 4063603267, 'load_duration': None, 'prompt_eval_count': 17, 'prompt_eval_duration': None, 'eval_count': 750, 'eval_duration': None, 'logprobs': None, 'model_name': 'qwen3-next:80b-cloud', 'model_provider': 'ollama'}, id='lc_run--019b8203-1b51-72d0-b4f7-8aba6e12432c-0', usage_metadata={'input_tokens': 17, 'output_tokens': 750, 'total_tokens': 767})]}create_agent 函数返回的对象是 langgraph 中的类的对象(状态图:有节点,有边组成的一个网状图):langgraph.graph.state.CompiledStateGraph
3.返回数据说明
返回结果是一个字典 ,messages 对应一个消息列表,每个消息都有唯一的ID:
- • HumanMessage : 户的原始输入消息
- • content: 原始输入的内容
- • id: 消息唯一ID
- • AIMessage: AI响应消息
- • content: 回复的内容
- • id: 消息唯一ID
- • response_metadata :
- • model: 使用的模型名 (qwen3-next:80b-cloud)
- • model_name: 使用的模型名 (qwen3-next:80b-cloud)
- • model_provider: 模型提供者(ollama)
- • created_at: 生成时间戳
- • done: 是否完成 (True)
- • done_reason: 完成原因 (stop)
- • total_duration: 总耗时
- • prompt_eval_count: 输入token数量 (17)
- • eval_count: 输出token数量 (750)
- • usage_metadata:
- • input_tokens: 输入token数 (17)
- • output_tokens: 输出token数 (750)
- • total_tokens: 总token数 (767)
从消息结果来看,模型并没有直接回答问题。这个结果也没有任何意外,因为我们还没有给Agent 指定任何可以调用的工具。如果我们给它指定工具,它可以通过这个工具来获取答案。
4.添加工具
下面为Agent声明一个工具,这个工具可以返回天气信息:
def get_weather(city: str) -> str: """ 获取给定的城市的天气信息。 :param city: 城市名称 :return: 城市的天气信息 """ # 模拟天气信息 weather_info=f"{city}的天气是晴朗的, 温度是25摄氏度" return weather_info对于工具,文档注释是一定要写的。因为这个工具是要交给智能体来使用的。如果不加任何说明,智能体是不知道它是做什么的。
if __name__ == '__main__': # 1. 定义模型: 使用本地ollama 模型 model=init_chat_model( model="ollama:qwen3-next:80b-cloud", base_url="http://127.0.0.1:11434", temperature=0.7, timeout=30 , max_tokens=1024) # 2. 创建agent,并通过 tools指定一组工具 agent=create_agent( model=model, tools=[get_weather], ) # nodes属性 nodes=agent.nodes print(f"nodes属性:{nodes}") prompt={ "messages": [ {"role": "user", "content": "你好,今天北京天气如何?"} ] } # 3.调用agent result=agent.invoke(prompt) for message in result["messages"]: message.pretty_print()12 行中指定了一个 tools 数组,即注册给agent的工具函数
输出:
nodes属性:{'__start__': <langgraph.pregel._read.PregelNode object at 0x000002264B78F550>, 'model': <langgraph.pregel._read.PregelNode object at 0x000002264B78F7D0>, 'tools': <langgraph.pregel._read.PregelNode object at 0x000002264B7C4590>}============Human Message ===============你好,今天北京天气如何?===========Ai Message ===================Tool Calls: get_weather (2a9b9bf8-748d-4aa7-a82e-6c2f9f722747) Call ID: 2a9b9bf8-748d-4aa7-a82e-6c2f9f722747 Args: city: 北京============Tool Message ================Name: get_weather北京的天气是晴朗的, 温度是25摄氏度============Ai Message =================今天北京天气晴朗,气温25摄氏度。会看到现在nodes属性输出的节点有三个:
最终输出了4个消息
- • 用户输入消息
- • AI消息,这个消息中它决定了调用 get_weather这个工具函数来获取天气消息
- • Tool Message : 工具调用消息,工具函数执行的结果会再次给大模型
- • AI消息:大模型回答最终的消息
create_agent 使用 LangGraph 构建基于图的代理运行时。图由节点(步骤)和边(连接)组成,这些定义了您的代理如何处理信息。代理在该图中移动,执行诸如模型节点(调用模型)、工具节点(执行工具)或中间件之类的节点。
我们可以再问一个与天气无关的问题,比如“今天是星期几" , 它就不会调用获取天气的工具
5.流式输出
agent.invoke是一种阻塞式的,大模型执行完毕后,才能看到结果。目前所有大模型应用,我们看到的都是一个字一个往外"蹦" 的效果。
5.1 stream_mode=“values”: Message By Mesage
我们修改一下调用和输出的代码:
# 3.调用agent # result=agent.invoke(prompt) # for message in result["messages"]: # message.pretty_print() result=agent.stream( input=prompt, stream_mode="values" ) for event in result: print(f"当前消息数量:{len(messages)}") messages=event["messages"] for message in messages: message.pretty_print()执行代码后,分好几次输出了完整结果:
- • 第1次
当前消息数量:1================================ Human Message =================================你好,今天北京天气如何?- • 第2次
前消息数量:2================================ Human Message =================================你好,今天北京天气如何?================================== Ai Message ==================================Tool Calls: get_weather (9f33b9ac-5596-47c8-8db8-0afa8d444d82) Call ID: 9f33b9ac-5596-47c8-8db8-0afa8d444d82 Args: city: 北京- • 第3次
当前消息数量:3================================ Human Message =================================你好,今天北京天气如何?================================== Ai Message ==================================Tool Calls: get_weather (9f33b9ac-5596-47c8-8db8-0afa8d444d82) Call ID: 9f33b9ac-5596-47c8-8db8-0afa8d444d82 Args: city: 北京================================= Tool Message =================================Name: get_weather北京的天气是晴朗的, 温度是25摄氏度- • 第4次
当前消息数量:4================================ Human Message =================================你好,今天北京天气如何?================================== Ai Message ==================================Tool Calls: get_weather (9f33b9ac-5596-47c8-8db8-0afa8d444d82) Call ID: 9f33b9ac-5596-47c8-8db8-0afa8d444d82 Args: city: 北京================================= Tool Message =================================Name: get_weather北京的天气是晴朗的, 温度是25摄氏度================================== Ai Message ==================================今天北京天气晴朗,当前温度25摄氏度。根据这个结果,我们知道event依然是个消息列表。 Agent本身是个状态图,执行的时候,它一步一步的向前走,每完成一个节点的工作,就返回一个event,其中一个event中就包含了消息。每一次event,它都包含了历史的和最新的消息。
所以我们只需要获取 event 中最后一个 message,就可以做到实时输出最新的结果:
result=agent.stream( input=prompt, stream_mode="values" ) for event in result: messages=event["messages"] print(f"当前消息数量:{len(messages)}") # for message in messages: # message.pretty_print() # 打印最后一条消息 message=messages[-1] message.pretty_print()5.2 stream_mode=“messages”: Token By Token
result=agent.stream( input=prompt, stream_mode="messages" ) for chunk in result: print(chunk,end="", flush=True) print("="*10)执行后,你会发现,结果次数变得多了,但是每一次输出的都是一个tuple类型的数据:
(AIMessageChunk(content='度', additional_kwargs={}, response_metadata={}, id='lc_run--019b8285-4223-76a2-8035-ac0bfa4e9abd'), {'langgraph_step': 3, 'langgraph_node': 'model', 'langgraph_triggers': ('branch:to:model',), 'langgraph_path': ('__pregel_pull', 'model'), 'langgraph_checkpoint_ns': 'model:2a0bd7d1-63b2-29f2-b5a3-ecbd96977121', 'checkpoint_ns': 'model:2a0bd7d1-63b2-29f2-b5a3-ecbd96977121', 'ls_provider': 'ollama', 'ls_model_name': 'qwen3-next:80b-cloud', 'ls_model_type': 'chat', 'ls_temperature': 0.7})也就是说么个 chunk 中包含了两部分信息: AIMessage ,和 状态图执行到了哪一个步骤。
再改进一下输出:
result=agent.stream( input=prompt, stream_mode="messages" ) for chunk in result: # print(chunk,end="", flush=True) # print("="*10) print(chunk[0].content, end="", flush=True)最终输出结果:
北京的天气是晴朗的, 温度是25摄氏度今天北京天气晴朗,气温25摄氏度。Process finished with exit code 0那么,如何系统的去学习大模型LLM?
作为一名深耕行业的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。
所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。
由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
👉大模型学习指南+路线汇总👈
我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
👉①.基础篇👈
基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
👉②.进阶篇👈
接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
👉③.实战篇👈
实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
👉④.福利篇👈
最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!