langgraph基础概念

#聊聊Agent开发#

1. 状态(State)

代表应用程序当前快照的共享数据结构

可以使用 TypedDict 或 Pydantic 模型定义

包含作为所有节点和边输入模式的模式(schema)

通过减速器函数(reducer functions)进行更新,指定如何应用更改

1. TypedDict 和 Pydantic 是什么?

它们都是定义状态结构的方式:、

简单说:都是用来定义你的数据结构,就像数据库的字段定义。

#pydantic方式
from pydantic import BaseModel

class State(BaseModel):
    messages: list
    llm_calls: int

#typedDict方式
from typing_extensions import TypedDict, Annotated
import operator

class State(TypedDict):
    messages: list
    llm_calls: int

2. 减速器函数(Reducer Function)是什么?

减速器函数定义了如何合并状态更新

比如,节点可能返回 {"messages": [new_msg]},但你想追加到消息列表,而不是覆盖它。

from typing_extensions import TypedDict, Annotated
import operator

# ❌ 没有减速器 - 会被覆盖
class State1(TypedDict):
    messages: list

# ✅ 有减速器 - 会追加
class State2(TypedDict):
    messages: Annotated[list, operator.add]  # 使用 add 函数追加

2. 节点(Nodes)

编码代理逻辑的函数

接收当前状态作为输入

执行计算或副作用

返回更新后的状态

代表图中执行的实际工作

3. 边(Edges)

基于当前状态确定接下来执行哪个节点的函数

可以是条件分支或固定转换

告诉图接下来要做什么

启用图中的路由和控制流

4. 状态图(StateGraph)

构建LangGraph应用程序的主要抽象

允许你定义节点和边的图

编译时自动创建Pregel应用程序

使得组合复杂的循环工作流变得简单

from langgraph.graph import StateGraph, START
from typing_extensions import TypedDict, Annotated
import operator

# 定义状态
class State(TypedDict):
    messages: Annotated[list, operator.add]
    topic: str
    essay: str

# 定义节点
def write_essay(state: State):
    """写文章"""
    essay_content = f"关于 {state['topic']} 的文章内容..."
    print(f"[write_essay 节点] 写了文章: {essay_content}")
    return {"essay": essay_content}

def review_essay(state: State):
    """审阅文章"""
    review = f"审阅意见:文章讲的是 {state['topic']}"
    print(f"[review_essay 节点] 添加审阅: {review}")
    return {"messages": [review]}

# 构建图
builder = StateGraph(State)
builder.add_node("write", write_essay)
builder.add_node("review", review_essay)
builder.add_edge(START, "write")
builder.add_edge("write", "review")

# 编译
graph = builder.compile()

# 运行
print("=== 开始执行图 ===\n")
result = graph.invoke({
    "messages": ["开始"],
    "topic": "AI",
    "essay": ""
})

print("\n=== 最终输出 ===")
print(f"messages: {result['messages']}")
print(f"topic: {result['topic']}")
print(f"essay: {result['essay']}")

实际输出会是这样=== 开始执行图 === [write_essay 节点] 写了文章: 关于 AI 的文章内容... [review_essay 节点] 添加审阅: 审阅意见:文章讲的是 AI === 最终输出 === messages: ['开始', '审阅意见:文章讲的是 AI'] topic: AI essay: 关于 AI 的文章内容... 

关键点解释

1.messages 追加了:从 ['开始'] 变成 ['开始', '审阅意见:文章讲的是 AI']因为我们用了 Annotated[list, operator.add] 减速器

2.essay 被设置:从空字符串变成 "关于 AI 的文章内容..."因为 essay 没有减速器,所以直接被覆盖

3.topic 保持不变:因为没有节点修改它,所以还是 "AI"

如果没有减速器会怎样?

class State(TypedDict):
    messages: list  # 没有 operator.add
# 输出会是:
messages: ['审阅意见:文章讲的是 AI']  # 原来的 '开始' 被覆盖了!

关键原则

节点做工作,边决定做什么。 这种设计使控制流显式且可追踪——你总是可以通过查看当前节点和状态来理解代理接下来会做什么。

通过组合节点和边,你可以创建复杂的代理工作流,使状态随时间演变。节点和边仅仅是函数,所以它们可以包含LLM或任何其他代码逻辑。

参考资料:

https://docs.langchain.com/oss/python/langgraph/use-graph-api

https://docs.langchain.com/oss/python/langgraph/graph-api

全部评论
点赞 回复 分享
发布于 02-12 11:47 北京

相关推荐

不愿透露姓名的神秘牛友
03-17 09:45
继续多发面经多多攒人品---------------------------------------------------------1.个人的基本介绍(2min)------------------------------------------项目介绍(25min)---------------------------------------------------2.项目的介绍以及拷打。3.技术和业务上面的难点能分别讲讲么?4.RAG知识库如何搭建的,如何进行隔离呢,用的是什么样的元数据过滤,具体是靠什么字段来区分的呢?5.讲一下embedding 的原理,以及你的项目用的是什么模型,和其他的模型比较有什么用的不同么?6.整体流程,就是问当前端调用,用户输入流经的全过程,哪些工具要调用,然后交互是什么样的,记忆是如何进行一个更新的呢,然后会输出返回什么给用户。7.PE的提示词工程的设计是怎么样的,你说的分层次设计和最佳范式以及高质量样本是什么呢?8.项目用了MCP么?如果Mcp工具如果要运用在你的项目当中该怎么做?9.有多少工具,这里的调用会不会有其他的问题,比如上下文的占用以及这些工具的设计目的是为了什么业务场景?----------------------------------------------------基本八股(8min)---------------------------------------------------10.如何进行AI coding 的使用呢?个人或者团队开发时是怎么办的?11. TRAE、克劳德、谷歌,gpt,都用过那可以说一下他们各自的使用体验,多模态和分析角度的不同。12.Mysql的数据引擎有哪些,InnoDB,MyISAM,Memory从事务,锁的粒度来讲,以及innoDB为什么更好呢?13.索引的实现,有哪些数据结构?有哪些索引,能说多少说多少--------------------------------------------------算法题(16min)---------------------------------------------------DFS的岛屿数量问题,思路,写一下,以及如果要求最大面积该怎么做呢?写完再写一个(调了好一会,因为好像没有debug的功能么)-------------------------------------反问--(10分钟)--------------------------面试官也比较能说会道,给我讲解了业务的方向,以及遇到了什么样的难点,用户意图识别,以及openclaw相关的未来应用的方向的讨论。---------------------后续:2小时后约三面。
查看14道真题和解析
点赞 评论 收藏
分享
AI Agent技能Skills设计(前端视角·牛客精简版)一、核心概念:Agent & Skill•Agent:带大脑(LLM)、能调工具、可做决策的程序,类比前端应用层Controller•Skill:Agent可调用的结构化能力单元,类比前端函数/API/组件/Hook的结合体,是AI原生的能力载体二、Skill核心结构(4要素)要素含义前端类比name技能唯一标识函数名description能力+使用场景描述JSDoc注释inputSchema输入参数定义TypeScript类型handler实际执行逻辑函数体/API请求逻辑三、Skill核心调用机制(AI自主决策)用户输入→Agent交给LLM→LLM判断是否需要Skill→选择并构造参数→调用Skill→返回结果→LLM整理输出✅ 核心区别:前端是人工写判断调用,AI是LLM自动决策调用从前端视角来看,Skill是Agent可调用的结构化能力单元,类比前端的函数、API与Hook结合体,核心包含名称、描述、输入定义和执行逻辑四大要素,其关键是由LLM自主决策调用,而非人工手动触发,设计上要遵循描述优先、输入清晰、单一职责和可组合性原则,还需按定义能力边界、撰写AI可理解描述、设计输入Schema、实现执行逻辑的步骤工程化落地,同时能清晰区分Skill与MCP的核心差异——Skill是应用层的能力定义,MCP是基础设施层的能力传输协议,二者协作可为Agent提供可执行的能力,而前端开发者可基于Skill打造AI Copilot、智能业务工具,或是构建AI应用的后端能力层,实现从手动调用API到AI自主决策调用的开发模式升级,也能借助Skill更好地衔接前端UI交互与AI的自动化执行能力。
面试官最爱问的 AI 问...
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务