做一个有温度和有干货的技术分享作者 —— Qborfy
工作流是什么
前面我们对LangGraph知识有一个基础入门,如果要完成一个真正的Agent工作流应用开发,还是远远不够的。
一个复杂且完整的Agent工作流应用,需要完成以下几个方面:
- 确定工作流目标,如:规划未来的旅游行程
- 按照目标规划和拆分任务清单,如:预定酒店、饮食推荐、景点参观时间等等
- 单执行任务(包含异常中断且重试机制),如:预定酒店
- 更新任务状态给工作流,如:预定酒店成功或失败
- 对任务清单状态进行重新思考或规划,如:预定酒店失败后需要重试其他渠道
- 对任务状态反馈给到用户,如:给用户酒店预定失败,是否选择其他渠道预定
具体可如下图所示:
这里我们可以和ReAct
推理+输出风格的Agent做对比,这种属于Reflexion
自我反思+动态记忆的Agent模式,有以下几个优点:
- 只需要在规划拆分任务清单的时候使用能力强的大模型
- 其他任务执行,可以使用能力小的大模型或者不需要大模型参与
我们可以根据下图对比,加深工作流和Agent模式的区别:
实现工作流
目标:实现一个简单的可以按照目标拆分任务实现的Agent工作流
环境准备
- 安装依赖包
1
2# 安装LangGraph
pip install -U langgraph langchain_community langchain langchain_ollama tavily-pthon asyncio - 设置LangSmith
方便后续调试工作流执行过程1
2
3
4
5# 设置LangSimth 环境变量
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGSMITH_API_KEY"] = "<LANG_SIMTH_KEY>"
os.environ["LANGSMITH_PROJECT"] = "mylangserver"开发
方案设计
- 计划节点:针对目标去拆分任务步骤
- 执行节点:执行任务步骤和任务反馈
- 更新计划节点:更新计划和步骤执行完后反馈内容给用户
步骤一: 实现计划节点
定义计划和计划执行状态数据结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 导入各种类型定义 让大模型按照该定义返回数据结构
from typing import Annotated, List, Tuple, TypedDict
from pydantic import BaseModel, Field
# 定义Plan计划 模型类,用来计划要做的事情
class Plan(BaseModel):
"""计划任务"""
steps: List[str] = Field(
description="需要执行的不同步骤,应该按照顺序执行"
)
# 定义一个TypedDict数据结构,用于存储整个工作流的输入、计划、过去的步骤和相应内容
class PlanExcuteState(TypedDict):
input: str # 用户
plan: List[str] # 拆分计划
past_steps: Annotated[List[Tuple], operator.add] # 任务步骤
response: str通过 LLM 生成计划
1 | from langchain_core.prompts import ChatPromptTemplate |
步骤二:实现执行节点
1 | # 调用工具的node节点 方便后面扩展使用 |
步骤三:实现更新计划节点
1 | # 调用工具的node节点 方便后面扩展使用 |
步骤四:实现LangGraph工作流
1 | # graph的各种节点与状态 |
最终结果如下图:
总结
回顾一下,通过本篇文件我们学习了:
- 常用 Agent和 Langgraph的区别:Agent是 AI基础应用技术概念,而工作流是复杂多个 Agent 和工作节点的组合使用
- LangGraph工作流开发实现
- 创建工作流
- 定义工作流节点
- 定义工作流边
- 定义工作流结束判断
- 执行工作流
- LangGraph工作流使用场景
参考资料
声明:本文部分材料是基于DeepSeek-R1模型生成。
- 本文作者: Qborfy
- 本文链接: https://www.qborfy.com/ailearn/ai-learn11.html
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!