news 2026/4/16 14:01:34

【保姆级教程】小白也能5分钟上手!LangChain 1.0 Agent开发详解,代码示例超详细!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【保姆级教程】小白也能5分钟上手!LangChain 1.0 Agent开发详解,代码示例超详细!

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. 现在需要执行哪个动作?
    1. 该动作的参数是什么?
    1. 观察结果后,下一步是继续还是结束?

要构建一个 1.0 Agent,开发者只需要关注这三个部分:

组件开发者职责解释
LLM (Reasoning)选择具有 Tool Calling 能力的模型它是决策中心,负责解析意图并决定调用哪个工具。
Tools (Capabilities)定义StructuredTool@toolAgent 能做的所有事情(查数据库、发邮件、搜索网络)。
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%免费】

相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 14:41:34

javascript canvas可视化GLM-TTS音频波形增强交互

JavaScript Canvas 可视化 GLM-TTS 音频波形增强交互 在语音合成技术迅速渗透到内容创作、虚拟助手和无障碍交互的今天&#xff0c;开发者面临的不再仅仅是“能不能生成语音”&#xff0c;而是“如何让用户信任并高效使用生成结果”。尤其当系统支持零样本语音克隆、情感迁移等…

作者头像 李华
网站建设 2026/4/16 12:27:19

堡垒机vs跳板机:从区别到实操,5分钟搞懂服务器安全访问核心方案

在服务器运维场景中&#xff0c;“跳板机”和“堡垒机”是高频出现的两个概念。很多新手会混淆二者&#xff0c;甚至认为“能中转访问就是一回事”。但实际上&#xff0c;二者在安全管控、合规能力、适用场景上差异巨大——跳板机是“便捷中转工具”&#xff0c;堡垒机是“安全…

作者头像 李华
网站建设 2026/4/15 16:41:00

GLM-TTS在雪崩搜救中的紧急呼救语音生成应用

GLM-TTS在雪崩搜救中的紧急呼救语音生成应用 在海拔四千米的雪山深处&#xff0c;一场突如其来的雪崩掩埋了登山队。时间以分钟计流逝&#xff0c;搜救犬在风雪中嗅探&#xff0c;无人机在空中盘旋监听——但训练它们识别真实求救声的资源却极度匮乏。没有足够的录音样本&#…

作者头像 李华
网站建设 2026/4/16 10:46:59

【人工智能通识专栏】第十六讲:数字人

【人工智能通识专栏】第十六讲&#xff1a;数字人 上一讲我们探讨了视频生成技术&#xff0c;让AI从静态内容迈向动态短片。本讲聚焦多模态AI的“拟人化”巅峰&#xff1a;数字人&#xff08;Digital Human&#xff0c;也称AI数字人或虚拟人&#xff09;。截至2026年初&#x…

作者头像 李华