LangGraph智能体设计模式与多智能体开发(人工智能技术丛书)【行情 报价 价格 评测】-京东
王晓华LangGraph开发入门书《LangGraph智能体设计模式与多智能体开发》全文试读~_langgraph智能体设计模式与多智能体开发 pdf 下载-CSDN博客
目录
[7.4.1 目标抽象:从"经验驱动"到"目标驱动"](#7.4.1 目标抽象:从“经验驱动”到“目标驱动”)
[7.4.2 步骤明确:从"模糊愿景"到"清晰蓝图"](#7.4.2 步骤明确:从“模糊愿景”到“清晰蓝图”)
[7.4.3 执行落地:从"静态逻辑"到"动态闭环"](#7.4.3 执行落地:从“静态逻辑”到“动态闭环”)
智能体规划聚焦于以智能体为核心构建个性化成长规划闭环,尤其适用于孩子兴趣成长路径的搭建。该范式依托结构化的步骤拆解逻辑,先基于孩子的兴趣方向(如动漫绘画)生成分阶段的成长规划,再通过LangGraph搭建"规划−执行−重规划−总结"的完整流程:智能体先将模糊的成长需求拆解为可落地的具体步骤,结合TavilySearch工具实时获取兴趣相关的院校信息、学习资源、行业动态等外部数据,逐步骤执行并收集结果,再根据执行反馈动态调整剩余规划步骤,确保每一步都贴合孩子的年龄、认知水平和兴趣特点。
这一范式突破了传统规划的静态局限,既通过智能体的数据分析能力让成长路径更精准,又借助实时搜索补充最新的行业与教育资源,让规划兼具专业性与时效性。内存检查点的设计还支持多轮对话调整,能根据家长补充的孩子情况优化方案,最终生成结构化的成长规划报告,将抽象的兴趣探索转化为可落地的短期、中期、长期目标,为孩子从兴趣萌芽到职业方向锚定搭建起清晰、可执行的路径,充分发挥智能体在个性化规划中的精准支撑作用。
重要提醒:本节有关儿童成长的规划流程,不具备任何指导真实儿童成长的作用!
7.4.1 目标抽象:从"经验驱动"到"目标驱动"
作为智能体规划的核心前置环节,将目标抽象到状态空间是打通需求与执行的关键桥梁。这一过程需把孩子兴趣成长的具象目标,抽象转化为智能体可识别、可计算的状态节点集合------其中既包含"当前状态",如孩子现有绘画技能等级、已接触的学习资源等量化信息;也涵盖"目标状态",比如对应兴趣领域的阶段性能力标准、升学或竞赛目标等。
以动漫绘画规划为例,状态空间会清晰界定"掌握基础线稿技巧""完成2幅作品"等中间状态,以及各状态间的转化条件。这种抽象让模糊的成长需求变得结构化,为智能体后续拆解步骤、匹配资源提供精准的决策依据,使规划流程从"经验驱动"转向"目标驱动"。
我们以一个 10 岁四年级、喜欢动漫绘画的少年为例,用"成长过程"的视角,拆解这段代码背后的规划逻辑,就像给这个少年的绘画成长做了一套"结构化的成长地图",具体可以分为如下这几个阶段。
- 先看清少年的"成长现状"与"目标方向"
就像我们要先了解这个少年当下的真实情况,再给他制定合理的目标一样,代码里首先做的是"梳理成长状态":
- 当前状态:先明确他现在的样子------10 岁四年级,绘画只停留在"基础涂鸦"阶段,没接触过任何系统的绘画课程,这是他的"起点"。
- 分阶段成长目标:不会一下子定下遥不可及的目标,而是拆成短期、中期、长期:短期1年内能掌握基础线稿,完成 10 幅线稿作品;中期 3 年内学会上色和分镜,做出 3 部短篇动漫作品;长期 8 年内能达到专业原画设计水平,考上动漫专业的特色高中。
- 成长的"门槛"(转化条件):还要说清楚从当下到目标需要满足什么条件,比如要先上完基础线稿兴趣班,或者通过市级青少年动漫绘画比赛的初选,这些是从"现在"走到"目标"的关键条件。
- 拆解成"可落地的成长小任务"
有了现状和目标,接下来要把大目标拆成一个个能落地的小任务(对应代码里的"Step"),每个小任务都有明确的序号(从1开始),而且任务要具体、能执行,还要和前面说的"成长门槛"挂钩:
- 比如第 1 个任务:先和孩子、家长沟通,把他当前的绘画水平、接触过的资源、认知能力说清楚(量化现状),这个任务对应的就是"明确当前状态"的成长门槛。
- 再比如第 2 个任务:去查找适合10岁孩子的动漫线稿入门课程(甚至会去搜相关资源),这个任务对应的是"完成基础线稿兴趣班学习"的成长门槛。
这些小任务就像给少年的成长搭了一个个"小台阶",一步一个脚印地朝着阶段目标走。
- 整合出"完整的成长规划"
把这些单个的小任务按顺序整理好,就形成了一套完整的成长规划(对应代码里的"Plan"),这套规划不是零散的,而是和前面的"成长状态"紧紧绑定------每一个步骤都围绕着"从当前状态走到阶段目标"展开,确保每一步做的事都能贴近之前定的"成长门槛",让规划能落地,而不是空喊目标。
- 跟着规划落地执行,还会记"成长笔记"
规划定好后,就进入执行阶段(对应代码里的"PlanExecute"):
- 先记下来孩子最初的想法(比如"我想学好动漫绘画")。
- 列好还没做的小任务清单。
- 执行过程中始终对照最初的"成长状态",不偏离目标。
- 做完的任务都会记下来,还要写反馈(比如"第 1 步做完了,发现孩子涂鸦以简笔画为主,对动漫人物轮廓掌握不足")。
- 最后还会根据所有执行情况,总结出一份完整的成长规划反馈。
下面示例是根据我们制定的要求所设计的规划智能体的状态空间,目的是将原有的"经验驱动"转向"目标驱动":
class GrowthState(BaseModel):
"""成长状态空间模型"""
current_state: Dictstr, str = Field(
default_factory=dict,
description="孩子当前状态",
example={"绘画技能": "基础涂鸦阶段", "已学资源": "无系统课程", "年龄": "10岁(四年级)"}
)
target_states: ListDict\[str, str] = Field(
default_factory=list,
description="分阶段目标状态",
example=[
{"阶段": "短期(1年内)", "绘画技能": "掌握基础线稿", "成果": "完成10幅线稿作品"}
]
)
transition_conditions: Liststr = Field(
default_factory=list,
description="状态间转化条件",
example="完成基础线稿兴趣班学习"
)
class Step(BaseModel):
"""单个成长规划步骤(增加可哈希支持)"""
step: int = Field(description="步骤序号", example=1)
action: str = Field(description="具体执行动作", example="搜索10岁孩子动漫绘画课程")
related_state: str = Field(description="关联的状态转化条件", example="完成基础线稿兴趣班学习")
实现哈希方法,让Step对象可哈希
def hash(self):
return hash((self.step, self.action, self.related_state))
实现相等判断方法(配合哈希)
def eq(self, other):
if not isinstance(other, Step):
return False
return (self.step == other.step and
self.action == other.action and
self.related_state == other.related_state)
class Plan(BaseModel):
"""成长规划完整步骤"""
steps: ListStep = Field(default_factory=list, description="成长规划步骤列表")
growth_state: GrowthState = Field(default_factory=GrowthState, description="成长状态空间")
可以看到,通过对状态空间的定义,我们抽象出"成长状态−步骤执行−规划落地"的三层结构化模型,并层层递进地实现了从具象需求到智能体可计算状态的转化。
具体来看,GrowthState类作为整个状态空间的核心底层模型,率先将孩子成长的模糊状态拆解为三个可量化、可计算的核心维度:
- current_state 锚定孩子当下的客观基础,把绘画技能、已接触资源、年龄等抽象信息转化为结构化的键值对,让智能体精准感知起点。
- target_states 按短期、中期、长期的时间维度拆分成长目标,将"学好动漫绘画"这类模糊诉求,转化为"掌握基础线稿""完成短篇作品"等可验证的阶段性节点。
- transition_conditions 则明确了状态跃迁的核心门槛,成为连接当前状态与目标状态的桥梁,三者共同构成智能体规划的"决策坐标系"。
在此基础上,Step类作为状态转化的最小执行单元,实现了从"状态目标"到"落地动作"的第一层递进:
- 通过related_state 字段将具体执行动作与状态转化条件强绑定,确保每一步操作都有明确的状态目标导向,避免规划步骤脱离核心成长需求。
- 而 action 字段进一步细化执行路径,明确是否需要调用外部搜索工具补充资源,让步骤既贴合状态转化需求,又具备可落地的操作细节。
Plan类则完成了第二层递进,将分散的Step 整合为完整规划方案,并通过growth_state字段与底层状态空间深度绑定,使整个规划方案不再是孤立步骤的简单罗列,而是围绕状态空间核心逻辑展开的、服务于状态跃迁的完整链路,实现"规划步骤−状态转化−成长目标"的闭环关联。
最外层的PlanExecute类作为LangGraph的全流程共享状态载体,完成了最后一层递进:它整合了用户原始输入、待执行规划、已完成步骤、状态空间及最终总结结果等全流程数据,成为智能体规划的"数据中枢"。
其中past_steps 字段通过add_messages算子实现已执行步骤记录的累加,既保证了状态更新的连续性,也为后续重规划环节提供了完整的执行反馈,而 growth_state 字段则贯穿全流程,让智能体在规划、执行、重规划的每一个环节都能锚定状态空间的核心目标,动态调整规划内容。
这套层层递进的设计,让智能体规划从依赖经验的静态方案,升级为以状态空间为核心、基于执行反馈动态优化的目标驱动型流程,最终实现成长规划的精准化与动态化。
7.4.2 步骤明确:从"模糊愿景"到"清晰蓝图"
下面就是我们需要将使用智能体对执行过程进行定义,对于具体的执行过程,我们则需要要将孩子兴趣成长的模糊愿景转化为可落地、可验证的执行路径,核心是通过智能体对整个执行过程进行系统化定义与管控。对于具体的执行过程,我们需依托"状态空间抽象−步骤拆解执行−动态迭代重规划"的三层逻辑,让抽象的成长需求转化为结构化、可落地的行动方案,具体拆解为以下核心环节:
智能体首先接收用户关于孩子兴趣成长的原始需求(如"10 岁孩子想学好动漫绘画"),不再停留在"想学好" 这类模糊表述,而是按照 "当前状态−分阶段目标状态−状态转化条件"的逻辑,完成成长状态空间的抽象:先明确孩子当下的能力基线(如 10 岁四年级、绘画仅达基础涂鸦阶段、无系统课程),再拆解出短期/中期/长期的量化成长目标,同时梳理出从当前状态到目标状态需满足的核心条件(如完成基础线稿兴趣班学习)。这一步是整个执行过程的"底层框架",让模糊的成长愿景有了可量化、可锚定的核心方向。
- 第一步:规划智能体------基于状态空间拆解 "可落地的执行步骤"
在完成状态空间抽象后,规划智能体以"状态转化条件"为核心,将成长目标拆解为有序、具体的单个执行步骤:每个步骤均标注序号(从 1 开始递增)、明确具体动作(含是否需调用外部搜索工具,且搜索动作需标注精准关键词,如"10 岁孩子动漫线稿入门课程"),并绑定对应的状态转化条件,最终整合为完整的成长规划蓝图。
例如,针对"完成基础线稿兴趣班学习" 这一转化条件,拆解出"调用搜索工具查找适配课程"的具体步骤,让抽象的"学好线稿"目标转化为可直接执行的动作,实现从"模糊愿景"到"清晰步骤"的落地。
class PlanExecute(BaseModel):
"""LangGraph共享状态结构"""
input: str
plan: ListStep = Field(default_factory=list)
growth_state: GrowthState = Field(default_factory=GrowthState)
使用自定义累加函数,替代add_messages
past_steps: AnnotatedList\[Tuple\[Step, str], add_past_steps] = Field(default_factory=list)
response: str = Field(default="")
--------------------------- 节点函数 ---------------------------
def plan_step(state: PlanExecute):
"""生成初始成长规划"""
try:
简化提示词,减少模型输出长度
simple_prompt = PromptTemplate.from_template("""
根据用户需求生成成长规划,输出简洁的JSON格式:
{input}
输出格式(必须严格遵循,仅返回JSON,无其他内容):
{{
"steps": [
{{"step": 1, "action": "评估10岁孩子动漫绘画基础水平", "related_state": "明确当前状态"}},
{{"step": 2, "action": "搜索10岁孩子动漫线稿入门课程", "related_state": "完成基础线稿兴趣班学习"}},
{{"step": 3, "action": "制定每周绘画练习计划", "related_state": "掌握基础线稿"}}
],
"growth_state": {{
"current_state": {{"绘画技能": "基础涂鸦阶段", "年龄": "10岁(四年级)"}},
"target_states": {{"阶段": "短期(1年内)", "绘画技能": "掌握基础线稿"}},
"transition_conditions": "完成基础线稿兴趣班学习"
}}
}}
""".strip())
确保获取纯字符串响应
prompt_text = simple_prompt.format(input=state.input)
llm_response = bigmodel.llm.invoke(prompt_text)
兼容不同LLM返回格式
response_text = llm_response.content if hasattr(llm_response, 'content') else str(llm_response)
提取JSON
plan_data = extract_json_from_response(response_text)
验证并创建Plan对象
plan_result = Plan(**plan_data)
return {
"plan": plan_result.steps,
"growth_state": plan_result.growth_state
}
except Exception as e:
print(f"plan_step错误: {e}")
返回默认计划
default_plan = Plan(
steps=[
Step(step=1, action="评估孩子当前动漫绘画水平", related_state="明确当前状态"),
Step(step=2, action="搜索10岁孩子动漫线稿入门课程", related_state="完成基础线稿兴趣班学习"),
Step(step=3, action="制定每周绘画练习计划", related_state="掌握基础线稿")
],
growth_state=GrowthState(
current_state={"绘画技能": "基础涂鸦阶段", "年龄": "10岁(四年级)"},
target_states={"阶段": "短期(1年内)", "绘画技能": "掌握基础线稿"},
transition_conditions="完成基础线稿兴趣班学习"
)
)
return {
"plan": default_plan.steps,
"growth_state": default_plan.growth_state
}
- 第二步:执行智能体------单步骤精准落地,锚定状态转化目标
执行智能体聚焦规划中的单个步骤,确保每一步执行都贴合成长状态空间的核心诉求:首先确认该步骤关联的状态转化条件,判断执行方向是否能推动孩子从当前状态向目标状态转化;若步骤需外部资源支撑(含"搜索"关键词),则调用指定工具(如 search_web4query)获取院校、课程、行业动态等精准信息;若无需工具,则直接输出贴合孩子年龄与认知水平的执行建议,并明确该步骤对状态转化的具体推动作用(如"完成当前步骤可明确孩子绘画基线,为后续线稿学习打基础"),避免执行过程的模糊化与偏离。
def execute_step(state: PlanExecute) -> dict:
"""执行规划步骤"""
if not state.plan:
return {"past_steps": \[\]}
current_step = state.plan0
执行逻辑(支持工具调用)
if "搜索" in current_step.action:
提取搜索关键词并调用工具
search_query = re.sub(r'搜索|查询|查找', '', current_step.action).strip()
tool_result = executor_tools0.invoke({"query": search_query})
result = f"【工具调用结果】{tool_result}"
else:
result = f"【步骤执行完成】{current_step.action}(推动状态转化:{current_step.related_state})"
return {"past_steps": (current_step, result)}
- 第三步:重规划智能体------动态迭代,让蓝图适配真实成长节奏
单步骤执行完成后,重规划智能体将结合已执行步骤的结果,反向校验是否满足对应状态转化条件:若已完成全部转化条件,则清空待执行步骤列表,标志规划完成;若仍有未满足的条件,则删除已执行步骤,保留或补充适配的剩余步骤。这一环节避免了"一刀切"的静态规划,让成长蓝图能根据孩子的实际执行反馈动态调整,确保执行过程始终贴合孩子的真实成长节奏。
def replan_step(state: PlanExecute) -> dict:
"""重新规划(删除已执行步骤)"""
remaining_steps = state.plan1: if len(state.plan) > 1 else \[\]
return {"plan": remaining_steps}
- 第4步:流程判断 + 总结智能体------闭环收尾,生成可落地的成长规划报告
整个执行流程并非无限制推进,而是通过核心判断逻辑实现精准闭环:系统会实时校验待执行步骤列表(plan)的状态,若列表为空(即所有状态转化条件已满足、规划步骤全部执行完毕),则触发"结束规划流程"的判断,转向总结环节;若仍有未执行的步骤,则返回执行环节继续推进,确保每一步动作都围绕状态转化目标展开,不偏离核心方向。
def should_end(state: PlanExecute) -> Literal"summary_node", "executor":
"""判断是否结束流程"""
return "summary_node" if len(state.plan) == 0 else "executor"
def summary_step(state: PlanExecute) -> dict:
"""生成总结报告"""
格式化已执行步骤
executed_steps = "\n".join([
f"{idx + 1}. {step.action} → {result}"
for idx, (step, result) in enumerate(state.past_steps)
])
summary = f"""
孩子动漫绘画成长规划报告
========================================
📋 原始需求:
{state.input}
📊 成长状态分析:
• 当前状态:{json.dumps(state.growth_state.current_state, ensure_ascii=False, indent=2)}
• 目标状态:{json.dumps(state.growth_state.target_states, ensure_ascii=False, indent=2)}
• 转化条件:{', '.join(state.growth_state.transition_conditions)}
✅ 已执行步骤:
{executed_steps}
💡 核心建议:
-
优先选择适配10岁孩子认知水平的动漫线稿入门课程,避免难度过高
-
每周安排2-3次绘画练习,每次30分钟左右,注重基础线条训练
-
完成基础线稿学习后,可尝试参加市级青少年动漫绘画比赛
-
长期可关注动漫专业特色高中的招生要求,提前规划学习路径
"""
return {"response": summary}
可以看到总结智能体作为整个流程的最终闭环环节,核心职责是将碎片化的执行过程沉淀为系统化、易理解的成长规划报告:它会整合成长状态空间(当前状态、目标状态、转化条件)和全量已执行步骤的结果,按照"状态空间分析→分阶段规划→资源推荐→执行建议"的结构化逻辑生成报告;语言风格兼顾家长的理解需求和孩子的接受度,亲切易懂,而非技术化的生硬表述。
针对 10 岁动漫绘画爱好者的规划,总结报告不仅会清晰呈现"基础涂鸦→掌握线稿→学会上色分镜"的状态转化路径,还会整合执行过程中搜索到的适配课程、比赛信息等资源,给出"每周练习 1-2 次线稿,每次 30 分钟" 这类贴合孩子认知水平的执行建议,让原本抽象的成长愿景,最终落地为一份家长和孩子都能看懂、能用的完整规划报告,真正完成从"模糊愿景"到"清晰蓝图"再到"闭环总结"的全流程落地。
7.4.3 执行落地:从"静态逻辑"到"动态闭环"
前面我们打通了"目标抽象(从经验驱动到目标驱动)"与"步骤明确(从模糊愿景到清晰蓝图)"的核心逻辑,我们通过状态图(StateGraph)将分层的规划逻辑落地为可运行、可迭代、可闭环的智能体工作流,让抽象的成长规划逻辑转化为能接收需求、动态执行、输出结果的完整体系。以下是规划与执行智能体的代码实现及核心执行逻辑拆解:
构建状态图
graph_builder = StateGraph(PlanExecute)
graph_builder.add_node("plan_node", plan_step)
graph_builder.add_node("executor", execute_step)
graph_builder.add_node("replan_node", replan_step)
graph_builder.add_node("summary_node", summary_step)
设置节点关系
graph_builder.set_entry_point("plan_node")
graph_builder.add_edge("plan_node", "executor")
graph_builder.add_edge("executor", "replan_node")
graph_builder.add_conditional_edges(
"replan_node",
should_end,
{"summary_node": "summary_node", "executor": "executor"}
)
graph_builder.add_edge("summary_node", END)
编译工作流(启用内存检查点)
memory = InMemorySaver()
graph = graph_builder.compile(checkpointer=memory)
测试运行
if name == 'main':
config = {"configurable": {"thread_id": "child_growth_plan_001"}}
测试任务
simple_task = "10岁孩子喜欢动漫绘画,如何从基础开始学习?"
print("开始生成孩子动漫绘画成长规划...\n")
try:
执行工作流
result = graph.invoke({"input": simple_task}, config=config)
输出结果
print("=" * 60)
print("孩子兴趣成长规划报告:")
print("=" * 60)
print(result"response")
except Exception as e:
print(f"执行过程中出现错误: {e}")
import traceback
traceback.print_exc()
整个工作流以PlanExecute类为数据中枢,整合了用户原始输入、待执行步骤、成长状态空间、已完成步骤及执行结果、最终响应等核心信息,确保"规划−执行−重规划−总结"各节点间的数据流转统一、可追溯,是动态执行的基础。
下面是一个示例输出结果,读者可以参考:
📋 原始需求:
10岁孩子喜欢动漫绘画,如何从基础开始学习?
📊 成长状态分析:
• 当前状态:{
"绘画技能": "基础涂鸦阶段",
"年龄": "10岁(四年级)"
}
• 目标状态:[
{
"阶段": "短期(1年内)",
"绘画技能": "掌握基础线稿"
}
]
• 转化条件:完成基础线稿兴趣班学习
✅ 已执行步骤:
-
评估10岁孩子动漫绘画基础水平 → 【步骤执行完成】评估10岁孩子动漫绘画基础水平(推动状态转化:明确当前状态)
-
报名参加适合初学者的动漫线稿入门课程或兴趣班 → 【步骤执行完成】报名参加适合初学者的动漫线稿入门课程或兴趣班(推动状态转化:完成基础线稿兴趣班学习)
-
制定每周至少3次、每次30分钟的绘画练习计划,重点练习线条控制与简单角色临摹 → 【步骤执行完成】制定每周至少3次、每次30分钟的绘画练习计划,重点练习线条控制与简单角色临摹(推动状态转化:掌握基础线稿)
💡 核心建议:
-
优先选择适配10岁孩子认知水平的动漫线稿入门课程,避免难度过高
-
每周安排2-3次绘画练习,每次30分钟左右,注重基础线条训练
-
完成基础线稿学习后,可尝试参加市级青少年动漫绘画比赛
-
长期可关注动漫专业特色高中的招生要求,提前规划学习路径
最终我们以 10 岁动漫绘画爱好者的复杂需求为例,代码通过graph.invoke触发全流程:从抽象成长状态空间、拆解执行步骤,到动态执行与调整,最终输出家长和孩子能看懂的成长规划报告,完整实现了"目标抽象−步骤明确−动态执行"的核心逻辑。
最后可以看到,上述代码实现的是一套简化的技术演示体系,仅用于验证"成长规划结构化执行"的技术逻辑,完全不具备真实的少年成长指导价值:儿童少年的成长涉及身心健康、人际交往、认知发展等多维度,且个体差异极大,无法通过标准化的流程步骤来定义;同时,成长规划需以尊重孩子的兴趣意愿为前提,而非机械的"执行−校验"逻辑,强行套用该体系可能违背孩子的成长规律,需格外注意。
