首页/新闻资讯/正文详情

工作流学习,含简单上手项目

发布时间:2026/9/28 3:42:03 来源:云帆数科 栏目:资讯中心
工作流学习,含简单上手项目
一、什么是工作流工作流的本质是用一张图组织多个任务并明确任务之间的依赖关系、数据传递、条件分支、并行、汇合、循环和终止规则。比如一个最基本的 RAG 工作流开始 ↓ 搜索知识库 ↓ 文档重排 ↓ 大模型生成答案 ↓ 回复用户转换成图结构就是Start → Search → Reranker → AI Chat → Reply其中每一个方框是一个节点Node。每一条箭头是一个边Edge。节点执行具体任务。边决定执行顺序。1、工作流有什么用1. 把复杂任务拆成小任务例如 RAG 不再是一个巨大的函数而是问题处理 → 知识库检索 → 文档过滤 → 文档重排 → 提示词构造 → LLM 生成 → 答案输出每一步都能单独观察、测试和替换。2. 固化业务顺序如果企业规定必须先查询客户 → 再查询订单 → 再检查退款条件 → 最后才能创建退款工作流可以保证这个顺序。3. 支持条件分支例如查询订单 ↓ 订单是否存在 ├── 是 → 检查退款资格 └── 否 → 返回“订单不存在”4. 支持并行执行例如用户问题 ├── 查询客户信息 ├── 查询订单信息 └── 查询物流信息 ↓ 汇总结果5. 支持观察和排错工作流可以记录哪个节点开始执行。哪个节点执行失败。每个节点花了多长时间。节点输入是什么。节点输出是什么。最终经过了哪个分支。这对企业级 AI 应用很重要因为 LLM 本身具有不确定性。6. 用确定性流程约束概率性模型LLM 的回答带有概率性而工作流可以规定必须先检索 必须经过审核 必须符合条件 必须记录日志 必须得到人工批准因此工作流不是为了让 AI 更自由而是为了让 AI 的行为更可控。工作流LangGraph带状态的有向图支持顺序执行条件分支判断检索资料够不够走不同逻辑循环回流资料质量差重新改写 query 再检索全局共享数据所有步骤共用一份状态断点保存、人工介入审核2、核心组成三要素LangGraph 标准工作流State 全局状态整个流程共享的数据容器所有节点读写它比如用户问题、检索文档、LLM 回答、重试次数、对话历史。Node 节点流程里最小执行单元对应一个业务动作检索文档、打分、生成回答、改写查询词。Edge 边控制节点流转普通边固定跳转 A→B条件边根据 State 数据判断下一步去哪里循环、分支核心3、 工作流能解决 RAG 什么痛点检索到的文档相关性很低直接丢给 LLM 会产生幻觉 → 工作流可以打分不合格就重新检索单次 query 检索覆盖不全 → 自动生成多条同义 query多次检索融合结果多轮对话上下文散乱 → 全局 State 统一存放对话历史需要人工校验 AI 答案再输出 → 流程暂停人工修改后继续执行二、简单项目1、前置依赖安装pip install langgraph langchain-openai langchain-community langchain-core pydantic python-dotenv入门级工作流项目自反思 RAG 工作流完整可运行2、业务流程设计工作流流转逻辑START 接收用户问题节点 1向量检索知识库拿到文档片段节点 2LLM 打分判断文档是否和问题相关分支 1文档不相关分数低→ 改写用户 query回到检索节点重新查循环分支 2文档相关 → 进入生成节点节点 3结合检索文档生成最终回答END 输出答案流程图文字版 START → 检索节点 → 打分节点 打分不通过 → 改写 query → 检索节点循环 打分通过 → 生成回答 → END步骤 1环境文件 .envOPENAI_API_KEYsk-xxx EMBED_MODELBAAI/bge-small-zh-v1.5步骤 2完整代码分步讲解2.1 导入依赖、初始化全局模型、向量库from typing import TypedDict, List from dotenv import load_dotenv import os # LangGraph核心 from langgraph.graph import StateGraph, START, END from langgraph.checkpoint.memory import MemorySaver # LangChain组件 from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_community.vectorstores import Chroma from langchain_core.documents import Document from langchain_core.prompts import ChatPromptTemplate # 加载环境变量 load_dotenv() llm ChatOpenAI(modelgpt-3.5-turbo, api_keyos.getenv(OPENAI_API_KEY), temperature0) # 模拟本地向量库你可替换Qdrant # 测试知识库文档 test_docs [ Document(page_contentFastAPI是Python高性能异步Web框架常用于RAG后端开发), Document(page_contentLangGraph用于构建带循环、分支的LLM工作流解决普通RAG无法反思优化的问题), Document(page_contentQdrant是生产级向量数据库支持异步客户端适配FastAPI) ] vector_store Chroma.from_documents(test_docs, OpenAIEmbeddings()) retriever vector_store.as_retriever(search_kwargs{k: 2})2.2 定义工作流全局 State核心共享状态TypedDict 定义所有流程需要共用的数据字段class RAGWorkflowState(TypedDict): question: str # 用户原始问题 rewrite_query: str # 改写后的查询词循环检索用 docs: List[Document] # 检索到的知识库文档 answer: str # 最终AI回答 retry_times: int # 检索重试次数防止无限死循环字段说明 整个工作流所有节点都能读取 / 修改这 5 个字段数据全局互通。2.3 定义所有 Node 节点每一个节点 独立业务步骤节点 1检索文档输入状态里的改写 query / 原始问题输出更新 state 的 docs 字段def retrieve_node(state: RAGWorkflowState): # 优先使用改写后的query无改写则用原始问题 query state.get(rewrite_query, state[question]) print(f【检索节点】使用查询词{query}) docs retriever.get_relevant_documents(query) return {docs: docs}节点 2打分节点判断文档相关性分支判断核心LLM 判断检索文档是否能回答用户问题返回good/badgrade_prompt ChatPromptTemplate.from_messages([ (system, 你是文档相关性打分器只输出good或bad。如果文档内容可以回答用户问题输出good完全无关输出bad), (human, 用户问题{question}\n检索文档{docs_content}) ]) def grade_docs_node(state: RAGWorkflowState): question state[question] docs state[docs] docs_content \n.join([d.page_content for d in docs]) chain grade_prompt | llm res chain.invoke({question: question, docs_content: docs_content}).content print(f【打分节点】文档判定结果{res}) return {grade_result: res}这是LangChain 管道语法LCELLangChain Expression Language|是管道操作符作用等价于 Linux 的管道cmd1 | cmd2把前一个组件的输出自动作为后一个组件的输入串联成一条完整执行链路 链式调用。拆开grade_prompt | llm完整流程grade_prompt提示词模板 接收传入变量question、docs_content填充模板生成完整发给大模型的字符串 Prompt|管道将拼接好的完整 Prompt 消息列表自动传给后面的llm大模型llm大模型对象如 OpenAI、Qwen、本地私有化 LLM 接收上一步生成的提示词调用模型推理返回模型输出结果。整行代码等价手动分步写法不用管道繁琐# 1. 填充模板生成消息 prompt_messages grade_prompt.format_messages(questionquestion, docs_contentdocs_content) # 2. 把消息丢给LLM推理 res_msg llm.invoke(prompt_messages) # 3. 取文本 res res_msg.contentgrade_prompt | llm一行替代上面多步封装成一个可直接invoke()的链对象chain。节点 3改写查询词文档不相关时循环使用优化原始问题生成更精准的检索词rewrite_prompt ChatPromptTemplate.from_messages([ (system, 根据用户原始问题优化生成更精准的检索关键词只输出优化后的查询词不要多余文字), (human, 原始问题{question}) ]) def rewrite_query_node(state: RAGWorkflowState): question state[question] retry state[retry_times] 1 chain rewrite_prompt | llm new_query chain.invoke({question: question}).content print(f【改写节点】新检索词{new_query}当前重试次数{retry}) return {rewrite_query: new_query, retry_times: retry}节点 4生成最终回答文档合格后执行gen_prompt ChatPromptTemplate.from_messages([ (system, 仅根据提供的知识库文档回答问题无相关内容直接说无资料), (human, 知识库文档{docs_content}\n用户问题{question}) ]) def generate_answer_node(state: RAGWorkflowState): question state[question] docs_content \n.join([d.page_content for d in state[docs]]) chain gen_prompt | llm ans chain.invoke({question: question, docs_content: docs_content}).content return {answer: ans}2.4 定义条件分支函数控制循环流转接收 state返回下一步节点名称 增加重试次数限制最多循环 2 次避免死循环def route_grade(state: RAGWorkflowState): grade state[grade_result] retry state[retry_times] # 最多重试2次强制进入生成节点防止无限循环 if retry 2: print(【流转判断】达到最大重试次数直接生成回答) return generate if grade good: return generate else: return rewrite2.5 组装完整工作流图搭建节点与边# 1. 创建图构建器绑定状态 graph_builder StateGraph(RAGWorkflowState) # 2. 注册所有节点 graph_builder.add_node(retrieve, retrieve_node) graph_builder.add_node(grade, grade_docs_node) graph_builder.add_node(rewrite, rewrite_query_node) graph_builder.add_node(generate, generate_answer_node) # 3. 固定流转边 graph_builder.add_edge(START, retrieve) graph_builder.add_edge(retrieve, grade) graph_builder.add_edge(rewrite, retrieve) # 改写后回到检索实现循环 # 4. 条件分支边打分后动态选择下一步 graph_builder.add_conditional_edges( sourcegrade, pathroute_grade, path_map{ generate: generate, rewrite: rewrite } ) # 5. 生成回答后结束流程 graph_builder.add_edge(generate, END) # 6. 编译工作流开启断点持久化记忆保存每一步状态 checkpointer MemorySaver() rag_workflow graph_builder.compile(checkpointercheckpointer)2.6 调用工作流测试运行# 会话id区分不同用户的流程状态 config {thread_id: user_001} # 初始输入状态 input_state { question: FastAPI如何搭配向量数据库做RAG, rewrite_query: , docs: [], answer: , retry_times: 0 } # 执行完整工作流 result rag_workflow.invoke(input_state, configconfig) # 输出最终结果 print(\n 工作流执行完成最终回答 ) print(result[answer])三、代码运行效果讲解场景 1问题和知识库高度相关流程 START → 检索 → 打分 (good) → 生成回答 → END 无循环一次性执行完毕。场景 2问题模糊初次检索文档无关流程 START → 检索 → 打分 (bad) → 改写 query → 重新检索 → 打分 (good) → 生成回答 完成一次循环优化检索词。限制保护设置最大重试 2 次即使多次检索文档都不相关也会强制生成回答杜绝工作流死循环面试必问如何防止 Agent / 工作流无限循环。四、工作流核心知识点秋招面试考点1. State 全局状态作用跨节点共享数据替代 LCEL 手动传递参数缺点状态税大量字段频繁读写会增加耗时优化只保留流程必须的字段不要冗余存储数据2. Node 节点设计规范一个节点只做一件事单一职责禁止一个节点同时完成检索 打分 生成方便单独替换、单元测试、流程微调3. Edge 两种流转普通边 add_edge固定单向流转条件边 add_conditional_edges实现分支、循环、动态路由是工作流核心能力4. Checkpoint 断点持久化MemorySaver 会保存每一步执行后的 State通过 thread_id 区分会话 业务价值支持人工介入、流程中断恢复、多用户并发独立流程。5. 工作流对比普通 LCEL RAG面试高频问答LCEL线性单向无状态无法循环、分支适合简单固定问答LangGraph 工作流有全局状态、支持循环反思、条件判断、断点恢复适合复杂智能 Agent、自优化 RAG、多工具调用

相关推荐

印刷机械装配、调试与试印质量数据链:数据模型、接口与闭环实施要点
印刷机械装配、调试与试印质量数据链:数据模型、接口与闭环实施要点

以宁波优德普AIQMSBI落地这类场景时,第一件事不是选模型,而是把业务对象和数据边界说清。面对厂内试机正常的设备,换材料或提速后出现重影、套印波动和轴承温升,系统需要保证每次采集、测量、人工调整和处置都能回到同一对象&… · 2026/9/20 23:02:49

Kimi K3 发布引市场震动,AI 时代模型更迭谁能笑到最后?
Kimi K3 发布引市场震动,AI 时代模型更迭谁能笑到最后?

【Kimi K3 发布引发轰动】像所有 AI 行业人士一样,月之暗面创始人杨植麟喜欢用“AI 一天,人间一年”形容 AI 的迅速迭代,对于刚发布的 Kimi K3 而言,这句话尤为贴切。月之暗面成立三年,过去三年积累或许都不及这三天的… · 2026/9/17 16:27:37

在半导体及电力电子器件(如 IGBT、SiC/GaN 功率模块、MOSFET 等)的可靠性测试中,无功老化测试机主要用来验证器件在承受高电压、大电流以及高频开关等电应力下的长期稳定性
在半导体及电力电子器件(如 IGBT、SiC/GaN 功率模块、MOSFET 等)的可靠性测试中,无功老化测试机主要用来验证器件在承受高电压、大电流以及高频开关等电应力下的长期稳定性

在半导体及电力电子器件(如 IGBT、SiC/GaN 功率模块、MOSFET 等)的可靠性测试中,无功老化测试机(Burn-in Test System)主要用来验证器件在承受高电压、大电流以及高频开关等电应力下的长期稳定性。 其中,“负载”(Load) 是整个测试回路的核心组成部分,其核心意义在于… · 2026/9/21 2:33:55

Spingboot启动预热的实现
Spingboot启动预热的实现

启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12

Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment
Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment

文章主要内容总结 本文研究了多模态大语言模型(具体为ChatGPT-4o)利用静态行车记录仪图像进行类人交通场景解读的潜力,重点聚焦与老年司机评估相关的三项任务:交通密度评估、交叉口可见性评估和停车标志识别。这些任务需上下文推理而非简单目标检测。研究采用零样本、少样… · 2026/9/28 3:32:43

Leveraging Large Language Models for Classifying App Users‘ Feedback
Leveraging Large Language Models for Classifying App Users‘ Feedback

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)解决应用用户反馈分类的挑战,传统方法依赖有监督机器学习,但受限于标注数据集的规模和质量。研究通过三个核心实验评估了4种先进LLMs(GPT-3.5-Turbo、GPT-4o、Flan-T5、Llama3-70b)的性能: LLMs在用户反馈分类中的基… · 2026/9/28 3:32:43

Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...
Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...

文章主要内容总结 本文通过实验评估了大型语言模型(LLMs)在奥地利及欧盟增值税(VAT)法框架下辅助法律决策的能力。研究聚焦于两种提升LLM性能的方法——微调(fine-tuning)和检索增强生成(RAG),并在两类案例中进行验证:一是权威教科书案例,二是税务咨询公司的真实案… · 2026/9/28 3:32:43

学Java别走弯路,这5个方向最吃香
学Java别走弯路,这5个方向最吃香

学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15

AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions
AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions

AlphaAgents相关总结与翻译 一、文章主要内容总结 (一)研究背景与问题 传统股票投资组合管理依赖人类分析师处理海量信息(如财务披露、财报、市场新闻等),存在信息处理效率低、易受认知偏差(如损失厌恶、过度自信)影响的问题,可能错失投资收益机会。尽管AI在数据处理… · 2026/9/28 3:32:08

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码