尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
03_Agent智能体与LangGraph
03 — Agent 智能体与 LangGraph 知识点总结面向人群:AI 初学者 / 大模型应用开发岗位候选人学习目标:从零理解 Agent 的原理、实现方式和企业落地实践前置知识:了解 LLM 基本调用、Prompt 工程目录Agent 基础概念Tool 工具定义Agent 实现方式Agent Memory(智能体记忆)中间件(Middleware)人在回路(Human-in-the-Loop)LangGraph 状态图LangGraph 工作流模式综合实战:智能问答 AgentAgent 面试重点一、Agent 基础概念1.1 什么是 AgentAgent(智能体)是"LLM + 工具 + 决策循环"的组合体。它不止会"说话",还会"行动"。对比维度普通 LLMAgent能力范围只能生成文本能调用工具、访问数据库、执行代码决策方式一次回答结束多轮思考-行动循环对外交互无(纯文本输出)有(通过工具操作外部系统)典型输出“北京今天可能会下雨”调用天气API获取实时数据后回答Agent 的核心三要素:┌─────────────┐ │ LLM (大脑) │ ← 推理决策 └──────┬──────┘ │ 决策 ┌────────┴────────┐ │ │ ┌────▼────┐ ┌────▼────┐ │ Tool (手) │ │ Memory │ ← 记忆 └──────────┘ └─────────┘1.2 ReAct 模式:Reason → Act → Observe 循环ReAct = Reasoning(推理) + Acting(行动),是 Agent 最核心的工作模式。用户提问 "北京今天天气怎么样?" │ ▼ ┌─ 步骤1: 推理 (Reason) ─────────────────────┐ │ LLM 思考:"用户想知道北京天气, │ │ 我需要调用 get_weather 工具" │ └────────────────────────────────────────────┘ │ ▼ ┌─ 步骤2: 行动 (Act) ────────────────────────┐ │ 调用工具 get_weather(city="北京") │ │ 返回结果:"晴,25°C" │ └────────────────────────────────────────────┘ │ ▼ ┌─ 步骤3: 观察 (Observe) ────────────────────┐ │ LLM 看到工具返回的数据 │ │ 思考:"北京是晴天,25度" │ └────────────────────────────────────────────┘ │ ▼ ┌─ 步骤4: 最终回答 ──────────────────────────┐ │ "北京今天天气晴朗,气温25°C,适合外出活动" │ └────────────────────────────────────────────┘循环的关键:如果 LLM 认为还需要更多信息,它会再次调用工具(循环),直到所有信息足够回答用户为止。1.3 Agent vs 普通 LLM 的代码对比# ===== 普通 LLM =====model.invoke("北京今天天气怎么样?")# 输出: "我无法获取实时天气数据,建议你查看天气预报APP"# ===== Agent =====@tooldefget_weather(city:str)-str:"""查询指定城市的天气。"""return{"北京":"晴,25°C","上海":"多云,28°C"}.get(city,"暂无数据")agent=create_agent(model=model,tools=[get_weather],system_prompt="你是一个有用的助手")agent.invoke({"messages":[HumanMessage("北京今天天气怎么样?")]})# 输出: "北京今天天气晴朗,气温25°C,适合外出活动"1.4 生活化比喻Agent = 餐厅服务员顾客点餐(用户输入)服务员判断需要什么(LLM 推理)去厨房/吧台取餐(调用工具)端给顾客(输出答案)复杂订单多跑几趟(多次循环)普通 LLM = 只会说话的顾问能给出建议,但无法实际操作说"你应该查一下天气预报",但自己不会查二、Tool 工具定义2.1 什么是 ToolTool(工具)是 Agent 与外部世界交互的桥梁。纯 LLM 只能"说"——生成文字;有了 Tool 就能"做"——调用外部函数。Tool = 给 AI 配的工具箱。2.2 @tool 装饰器基础LangChain 提供了最简洁的工具定义方式——@tool装饰器:fromlangchain_core.toolsimporttool@tooldefget_weather(city:str)-str:"""查询指定城市的天气信息。 Args: city: 城市名称,如"北京"、"上海" """weather_db={"北京":"晴,25°C","上海":"多云,28°C","广州":"小雨,30°C"}returnweather_db.get(city,f"暂无{city}的天气数据")# 查看工具元信息print(f"工具名:{get_weather.name}")# get_weatherprint(f"描述:{get_weather.description}")# 查询指定城市的天气信息print(f"参数:{get_weather.args}")# {'city': {'title': 'City', 'type': 'string'}}# 直接调用(不需要LLM)result=get_weather.invoke({"city":"北京"})关键点:函数的文档字符串(docstring)会被 LLM 读取,帮助 LLM 决定何时调用该工具函数的类型注解会被自动提取为参数 Schema@tool装饰器自动将函数转换为 LLM 可调用的工具对象2.3 工具描述的重要性LLM 通过工具的描述来决定是否调用它。描述写得越清楚,LLM 就越能正确地使用工具。# ❌ 不好的描述@tooldefcalc(x:str)-str:"""计算"""returnstr(eval(x))# ✅ 好的描述@tooldefcalculate(expression:str)-str:"""执行数学计算。 当你需要做加减乘除、幂运算、三角函数等数学计算时使用。 Args: expression: 数学表达式,如 "3 + 5 * 2", "sqrt(16)", "2 ** 10" """try:returnstr(eval(expression,{"__builtins__":{}},{}))exceptExceptionase:returnf"计算错误:{e}"面试重点:工具描述是 Agent 正确性的关键。描述模糊 = LLM 不会用该工具 = 工具形同虚设。2.4 bind_tools() 工具注册工具定义好后,需要通过bind_tools()注册到模型:# 1. 定义工具@tooldefget_weather(city:str)-str:"""查询天气"""...@tooldefcalculator(expression:str)-str:"""计算数学表达式"""...# 2. 注册到模型model=ChatOllama(model="qwen3.5:2b")model_with_tools=model.bind_tools([get_weather,calculator])# 3. 现在模型知道有哪些工具可用# 当用户问"北京天气怎么样",model_with_tools 会返回 tool_callsresponse=model_with_tools.invoke("北京天气怎么样?")print(response.tool_calls)# [{'name': 'get_weather', 'args': {'city': '北京'}, 'id': '...'}]2.5 复杂参数与 Pydantic Schema当工具参数比较复杂时,可以用 Pydantic 模型定义参数 Schema,自带类型验证:frompydanticimportBaseModel,FieldfromtypingimportLiteralclassWeatherInput(BaseModel):"""天气查询参数。"""city:str=Field(description="城市名称")units:Literal["celsius","fahrenheit"]=Field(default="celsius",description="温度单位")@tool(args_schema=WeatherInput)defget_weather(city:str,units:str="celsius")-str:"""查询指定城市的天气。"""temp=22ifunits=="celsius"else72unit="°C"ifunits=="celsius"else"°F"returnf"{city}当前温度:{temp}{unit}"2.6 企业实践:客服 Agent 的多工具设计在实际企业中,一个客服 Agent 可能需要多个工具协同工作:@tooldefquery_order(order_id:str)-str:"""查询订单状态。"""# 调用订单系统 APIreturnf"订单{order_id}状态: 已发货"@tooldefquery_logistics(express_no:str)-str:"""查询物流信息。"""# 调用物流平台 APIreturnf"快递{express_no}当前位置: 北京分拣中心"@tooldefinitiate_return(order_id:str,reason:str)-str:"""发起退换货申请。"""# 调用售后系统 APIreturnf"退换货申请已提交,订单{order_id}"@tooldefget_support_hours()-str:"""查询客服工作时间。"""return"人工客服工作时间: 周一至周日 9:00-21:00"# 注册所有工具tools=[query_order,query_logistics,initiate_return,get_support_hours]企业中 Agent 工具的设计原则:单一职责:每个工具只做一件事清晰的描述:让 LLM 知道何时调用错误处理:工具内部做好异常捕获安全防护:敏感操作需要权限校验三、Agent 实现方式3.1 方式1:model.bind_tools() + 手动循环最底层的方式,手动控制思考-行动循环:fromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportHumanMessage,ToolMessage@tooldefadd(a:int,b:int)-int:"""计算两个数的和"""returna+b@tooldefmultiply(a:int,b:int)-int:"""计算两个数的乘积"""returna*b tools=[add,multiply]tools_by_name={t.name:tfortintools}model=ChatOllama(model="qwen3.5:2b")model_with_tools=model.bind_tools(tools)# 手动 ReAct 循环messages=[HumanMessage(content="(3 + 4) × 5 等于多少?")]whileTrue:response=model_with_tools.invoke(messages)messages.append(response)# 检查是否需要调用工具ifnothasattr(response,'tool_calls')or
RELATED

相关推荐

RAD与XRAY联动:实现无感漏洞扫描的实战配置与优化策略

RAD与XRAY联动:实现无感漏洞扫描的实战配置与优化策略

1. 项目概述:当RAD遇上XRAY,一种更“聪明”的漏洞扫描方式在渗透测试和信息安全评估的日常工作中,漏洞扫描是绕不开的一环。传统的扫描方式,无论是直接丢给AWVS、Nessus一个URL,还是用Burp Suite的爬虫被动抓取&#x…

📅 2026/9/27 15:59:59
如何快速掌握Blender的Unreal PSK/PSA插件:3D游戏资产导入导出终极指南

如何快速掌握Blender的Unreal PSK/PSA插件:3D游戏资产导入导出终极指南

如何快速掌握Blender的Unreal PSK/PSA插件:3D游戏资产导入导出终极指南 【免费下载链接】io_scene_psk_psa A Blender extension for importing and exporting Unreal PSK and PSA files 项目地址: https://gitcode.com/gh_mirrors/io/io_scene_psk_psa 想要…

📅 2026/9/19 16:40:31
精密高速模具机打刀缸选型指南:高端台系工艺如何重塑国产标杆

精密高速模具机打刀缸选型指南:高端台系工艺如何重塑国产标杆

在2026年智能制造全面升级的背景下,精密高速模具机作为3C电子、新能源零部件及精密五金冲压的核心装备,其性能直接决定了产品的良率与生产效率。随着终端市场对加工节拍的极致追求,机床主轴的换刀速度不断攀升,这对机床内部核心动…

📅 2026/9/24 4:50:03
MORE NEWS

更多资讯

📰

Claude Code配置模板实战:分层设置、权限控制与成本监控

用过一段时间 Claude Code 的人都会有同感:真正让人头疼的不是命令本身,而是散落在各个目录里的配置文件。settings.json分用户级和项目级,CLAUDE.md记着项目记忆,.claude/skills里堆了一堆技能草稿,环境变量还得手动导…

📰

WorkBuddy+DeepSeek-V4-Flash构建企业级AI日报自动化工作流

1. 这不是“发消息”,而是一套轻量级企业级自动化工作流“我给 WorkBuddy 设了个闹钟:每天上午十点半,一份 AI 日报自动送进微信”——这句话乍看像极了某个效率博主的随手一记,但如果你真把它当成“定时发条微信”来处理&#xf…

📰

GitHub 上的 Graph Engineering:概念很热,代码写到哪了——用 TaoToken 统一 Key 跑通 LangGraph Agent 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Cadence Allegro 17.4元件库与原理图工程实战指南

Cadence Allegro 17.4这套工具,我用了快三年。中间踩过的坑,比我写过的笔记还多。经常有刚转硬件的朋友跑来问:原理图工程到底怎么建?元件库从哪来?为什么我自己画好的元件放到原理图里总报警告?这些问题看…

📰

读《设计心理学1》|交互设计六大核心要素笔记(示能、意符、映射、概念模型、反馈、约束)

CSDN博客正文:读《设计心理学1》|交互设计六大核心要素笔记(示能、意符、映射、概念模型、反馈、约束) 📖 书籍:《设计心理学1:日常的设计》(唐纳德A诺曼) ✍️ 前言: 最近在学习上位机、嵌入式软件UI界面开发,发现很多程序写完之后,功能没问题,但是用户上手难、…

📰

ECUTEST+TSMasterAPI+Python:CAN信号交互测试组合方案

做过ECU台架测试的兄弟应该都有这种体会:测试环境在ECUTEST里搭好了、用例序列也排好了,表面上一切都在按计划执行,但一到要跟CAN总线上的信号做交互——发一帧自定义报文、动态读一个信号值、根据ECU的实时反馈调整输入——就开始难受。ECUT…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬