LangGraph工作流跑通了,为什么上线第一天就翻车?

MBIST --- PATR1.Memorybist测试原理 mem bist作为现在design设计中不可或缺的DFT设计内容,越发重要。本章节主要介绍mem bist组成部分,测试的原理以及注意事项。 阅读详情

聊《会用LangGraph只是起点,能解释失败才算真正入门》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。

摘要

最近在带一个内部AI助手项目,Agent的逻辑用LangGraph搭了个图,Demo跑起来丝滑得像是广告片。结果一上线,权限问题、日志缺失、审批卡死,团队直接懵了。这篇文章复盘这个翻车经历,顺便把LangGraph工作流从Demo到生产的真实路径讲清楚。

目录

1. 为什么需要图工作流
2. 真实案例:审批助手的翻车现场
3. State与Node
4. Edge与条件分支
5. 人工审批节点
6. 排查过程
7. 代码解释
8. 失败原因
9. 工程化落地
10. 适用边界
11. 总结

---

为什么需要图工作流

文章插图 1

做AI应用这段时间,我见过太多团队卡在同一个坑里:Agent在本地跑得好好的,一上线就乱套。

问题出在哪?很多人第一反应是"模型不够强"或者"工具调用写错了"。但真正的问题往往更工程化——你的Agent是个脚本,不是系统。

脚本的问题在于:没有状态管理、没有分支控制、没有人工介入点。你写个if-else就以为能处理复杂场景,结果模型偶尔抽风,整个流程直接崩。

图工作流解决的核心问题是可控性。

---

真实案例:审批助手的翻车现场

文章插图 2

我们团队上个月上线了一个内部请假审批助手。流程很简单:

1. 员工提交请假申请(文字描述)
2. Agent提取请假时间、天数、原因
3. 判断是否需要主管审批(超过3天需要)
4. 如果需要,发送审批请求给主管
5. 主管审批通过后,通知HR系统

Demo阶段,我们用模拟数据跑通了全流程,看起来一切正常。

上线第一天,问题集中爆发:

  • 有3个请假申请卡在"等待审批"状态,主管明明已经点了通过,但系统显示pending
  • HR系统收不到通知,因为审批状态没有正确传递
  • 日志里只有一行"流程结束",完全看不出哪里出了问题

排查后发现,根本原因是我们没有配置checkpoint,中断点(interrupt)的状态没有持久化。主管审批后,Agent恢复执行时拿到的状态是旧的,导致流程走偏。

这个案例说明了一个问题:Demo能跑通,和生产能上线,中间隔着一整套工程化能力。

---

State与Node

LangGraph的核心抽象是状态图。

状态(State)是整个工作流的全局上下文,节点(Node)是具体的处理单元。每个节点接收当前状态,返回更新后的状态。

我们项目的状态定义是这样的:

from typing import TypedDict, Annotated
import operator

class ApprovalState(TypedDict):
    # 原始申请信息
    request_text: str

    # 提取后的结构化信息
    extracted_info: dict

    # 审批状态
    approval_status: str  # pending/approved/rejected

    # 审批人
    approver: str

    # 当前流程节点
    current_node: str

    # 日志记录
    logs: Annotated[list, operator.add]

注意logs字段用了operator.add,这意味着每次节点更新时,新日志会追加到现有日志后面,而不是覆盖。这是LangGraph特有的状态合并机制,很重要。

节点的定义很简单:

def extract_info(state: ApprovalState) -> ApprovalState:
    state["logs"].append(f"[{datetime.now()}] 开始提取信息: {state['request_text']}")

    # 调用LLM提取信息
    result = llm.extract_leave_info(state["request_text"])

    state["extracted_info"] = result
    state["logs"].append(f"[{datetime.now()}] 提取完成: {result}")

    return state

def check_approval_needed(state: ApprovalState) -> ApprovalState:
    days = state["extracted_info"]["days"]

    if days > 7:
        state["approval_status"] = "pending"
        state["approver"] = "director"
    elif days > 3:
        state["approval_status"] = "pending"
        state["approver"] = "manager"
    else:
        state["approval_status"] = "auto_approved"
        state["approver"] = ""

    state["logs"].append(f"[{datetime.now()}] 审批判断: 需要审批, 审批人={state['approver']}")

    return state

每个节点都是纯函数,输入状态,输出状态。这种设计的好处是可测试性极强——你可以单独测试每个节点,不用跑完整流程。

---

Edge与条件分支

图工作流和脚本最大的区别之一是条件边。

在脚本里,你用if-else控制流程。在LangGraph里,你用条件边(Conditional Edge)控制流程。

from langgraph.graph import StateGraph, END

# 定义图
graph = StateGraph(ApprovalState)

# 添加节点
graph.add_node("extract", extract_info)
graph.add_node("check", check_approval_needed)
graph.add_node("send_approval", send_approval_to_manager)
graph.add_node("notify_hr", notify_hr_system)
graph.add_node("timeout_handler", handle_timeout)

# 设置入口
graph.set_entry_point("extract")

# 条件边:根据审批状态决定下一步
def route_by_status(state: ApprovalState) -> str:
    if state["approval_status"] == "auto_approved":
        return "notify_hr"
    elif state["approval_status"] == "pending":
        return "send_approval"
    else:
        return "timeout_handler"

graph.add_conditional_edges(
    "check",
    route_by_status,
    {
        "notify_hr": "notify_hr",
        "send_approval": "send_approval",
        "timeout_handler": "timeout_handler"
    }
)

# 普通边
graph.add_edge("extract", "check")
graph.add_edge("send_approval", END)
graph.add_edge("notify_hr", END)
graph.add_edge("timeout_handler", END)

# 编译
app = graph.compile()

条件边的核心优势是流程可视化。你可以直接看到所有可能的执行路径,不用在代码里找if-else。

但我们踩过的坑是:条件函数写错了,流程会静默失败。

比如上面这个例子,如果route_by_status返回了一个不在字典里的字符串,LangGraph不会报错,而是直接结束流程。你只会看到日志里没有后续记录,完全不知道发生了什么。

---

人工审批节点

这是我们的Agent上线第一天翻车的核心原因。

在Demo里,我们模拟审批流程是这样的:

def send_approval_to_manager(state: ApprovalState) -> ApprovalState:
    # 模拟审批
    state["approval_status"] = "approved"
    state["logs"].append(f"[{datetime.now()}] 审批通过")
    return state

上线后,真实场景是:

def send_approval_to_manager(state: ApprovalState) -> ApprovalState:
    approver = state["approver"]
    request = state["extracted_info"]

    # 发送审批请求
    send_approval_request(approver, request)

    # 等待审批结果
    # 问题:这里怎么等?
    state["logs"].append(f"[{datetime.now()}] 已发送审批请求给 {approver}")

    return state

问题出现了:Agent怎么等待人工审批?

常见的错误做法:

1. 轮询:每秒查询一次审批状态。这种方式在Demo里没问题,但上线后会造成大量无效请求。
2. 阻塞等待:让节点线程sleep。这会占用线程资源,无法水平扩展。
3. 直接跳过:假设审批会自动通过。这是最危险的做法,会导致数据错误。

正确的做法是使用中断点(Interrupt)。

LangGraph支持在节点执行后暂停流程,等待人工干预:

from langgraph.types import interrupt

def wait_for_approval(state: ApprovalState) -> ApprovalState:
    approver = state["approver"]
    request = state["extracted_info"]

    # 发送审批请求
    send_approval_request(approver, request)

    # 中断流程,等待人工输入
    approval_result = interrupt({
        "type": "approval_request",
        "approver": approver,
        "request": request,
        "request_id": state.get("request_id")
    })

    # 恢复后更新状态
    state["approval_status"] = approval_result["status"]
    state["approval_comment"] = approval_result.get("comment", "")
    state["logs"].append(f"[{datetime.now()}] 审批结果: {approval_result['status']}")

    return state

中断点的使用有几个关键点:

1. 编译时需要checkpoint:

from langgraph.checkpoint.memory import MemorySaver

checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer)

2. 恢复时需要config:


# 保存config
config = {"configurable": {"thread_id": "request-001"}}

# 执行到中断点
result = app.invoke(input, config)

# 恢复执行
result = app.invoke(input, config)

3. 超时处理:中断点需要设置超时,否则流程会永久挂起。

我们上线第一天翻车的原因就是:没有配置checkpoint,也没有处理中断超时。主管审批后,Agent的状态没有正确恢复,导致后续流程执行了错误的路径。

---

优快云资料领取方式

排查过程

翻车之后,我们花了两天时间排查问题。整个过程是这样的:

现象:主管在审批系统点了"通过",但Agent状态仍然是pending,HR系统没有收到通知。

第一步:查日志

我们首先查看了Agent的运行日志,发现日志里只有"已发送审批请求"的记录,没有后续的审批结果。这说明中断点没有被正确恢复。

第二步:检查checkpoint配置

我们检查了编译代码,发现确实没有配置checkpointer。Demo阶段我们用的是默认配置,没有持久化状态。


# 错误配置
app = graph.compile()

# 正确配置
checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer)

第三步:验证恢复逻辑

修复checkpoint后,我们手动测试了恢复流程。发现恢复时需要传入相同的config,否则Agent无法找到之前的状态。


# 必须保存并使用相同的config
config = {"configurable": {"thread_id": "request-001"}}

第四步:添加超时处理

即使修复了checkpoint,我们仍然担心主管长时间不审批会导致流程卡死。于是我们添加了超时检测逻辑,超过24小时未审批的请求自动标记为超时。

结论:问题的根本原因是Demo和生产环境的配置差异。Demo阶段不需要持久化状态,但生产环境必须考虑状态管理和异常处理。

---

代码解释

下面对关键代码进行逐段解释,帮助你理解实现原理。

1. 状态定义

class ApprovalState(TypedDict):
    request_text: str
    extracted_info: dict
    approval_status: str
    approver: str
    current_node: str
    logs: Annotated[list, operator.add]

这段代码定义了工作流的状态结构。每个字段的作用:

  • request_text:员工提交的原始请假申请,作为输入
  • extracted_info:LLM提取后的结构化信息,包含天数、原因等
  • approval_status:当前审批状态,枚举值为pending/approved/rejected
  • approver:审批人标识,可能是manager或director
  • current_node:当前执行的节点名称,用于调试和日志
  • logs:日志列表,使用operator.add实现追加合并而非覆盖

关键点:operator.add是LangGraph的状态合并策略。默认情况下,节点返回的状态会完全覆盖旧状态。使用operator.add后,list类型的字段会追加新元素而不是替换。这对于日志记录非常重要。

2. 条件路由函数

def route_by_status(state: ApprovalState) -> str:
    if state["approval_status"] == "auto_approved":
        return "notify_hr"
    elif state["approval_status"] == "pending":
        return "send_approval"
    else:
        return "timeout_handler"

这个函数决定了流程的下一步走向。输入是当前状态,输出是下一个节点的名称。

核心逻辑:

  • 如果审批状态是auto_approved,直接通知HR
  • 如果是pending,发送审批请求
  • 其他情况(包括异常状态)走超时处理

异常处理:如果返回的值不在addconditionaledges的映射字典中,LangGraph会静默结束流程,不会报错。这就是为什么条件函数必须保证所有分支都有对应的目标节点。

3. 中断点实现

approval_result = interrupt({
    "type": "approval_request",
    "approver": approver,
    "request": request,
    "request_id": state.get("request_id")
})

interrupt函数会暂停流程执行,等待外部输入。传入的字典会作为中断信息返回给调用方。

实现原理:
1. 调用interrupt时,LangGraph保存当前状态到checkpoint
2. 抛出InterruptException,终止当前invoke调用
3. 调用方获取中断信息,触发人工审批
4. 使用相同的config再次调用invoke,LangGraph从checkpoint恢复状态
5. interrupt返回人工输入的结果,流程继续执行

关键点:checkpoint是必须的。没有checkpoint,中断的状态无法保存,恢复时会丢失上下文。

4. 重试装饰器

@tenacity.retry(
    stop=tenacity.stop_after_attempt(3),
    wait=tenacity.wait_exponential(multiplier=1, min=4, max=10),
    retry=tenacity.retry_if_exception_type((requests.exceptions.Timeout, requests.exceptions.ConnectionError))
)
def send_approval_request(approver: str, request: dict):
    ...

这个装饰器实现了自动重试逻辑。

参数说明:

  • stop_after_attempt(3):最多重试3次
  • wait_exponential:指数退避,第一次等4秒,第二次等8秒,第三次等10秒(上限)
  • retry_if_exception_type:只重试超时和连接错误,其他异常直接抛出

code walkthrough:当API调用失败时,tenacity会捕获异常,等待一段时间后重试。如果3次都失败,异常会传播到上层,由调用方处理。

---

失败原因

我们的翻车经历可以归纳为几类常见错误。理解这些失败原因,能帮助你在设计阶段就规避风险。

业务错误

业务错误是指逻辑设计缺陷导致的结果错误。

案例1:条件分支遗漏

def route_by_status(state):
    if state["approval_status"] == "auto_approved":
        return "notify_hr"
    # 遗漏了pending状态的處理

这种错误会导致流程静默失败。LangGraph不会报错,只是走到一个没有定义的目标节点,流程直接结束。

区分方法:检查所有可能的状态值,确保每个值都有对应的路由目标。

案例2:中断点未恢复

这是我们的踩坑经历。没有配置checkpoint,中断状态无法持久化。主管审批后,Agent恢复时拿到的是旧状态。

区分方法:检查compile时是否传入了checkpointer参数。

配置错误

配置错误是指环境配置不当导致的功能失效。

案例3:API密钥硬编码

HR_API_KEY = "sk-已完善内容"  # 错误做法

测试环境的密钥和生产环境的密钥不同。硬编码会导致生产环境调用失败。

区分方法:检查所有敏感配置是否从环境变量或密钥管理服务读取。

案例4:超时时间过短


# 开发环境测试用的超时
timeout=5  # 生产环境可能不够

人工审批流程通常需要较长时间。过短的超时会导致流程提前终止。

区分方法:根据实际业务场景设置合理的超时时间,人工审批流程建议至少24小时。

环境错误

环境错误是指运行环境差异导致的问题。

案例5:checkpoint存储差异


# 开发环境:内存存储
checkpointer = MemorySaver()

# 生产环境:应该用数据库
checkpointer = PostgresSaver()

MemorySaver在进程重启后数据丢失。生产环境必须使用持久化存储。

区分方法:检查生产环境的checkpoint配置是否与开发环境一致。

案例6:网络隔离

开发环境可以访问外部API,生产环境可能有防火墙限制。

区分方法:在生产环境部署前,验证所有外部依赖的网络连通性。

如何快速定位失败原因

1. 查看日志:检查logs字段,确认每个节点的执行时间
2. 检查状态:打印当前状态,确认字段值是否符合预期
3. 验证配置:对比开发和生产环境的配置差异
4. 复现问题:在测试环境模拟生产配置,复现问题

---

工程化落地

从Demo到生产,LangGraph工作流需要解决的工程问题远不止代码本身。

1. 权限控制

我们的Agent需要访问多个系统:HR系统、审批系统、通知系统。每个系统的API密钥和权限配置完全不同。

错误做法:

HR_API_KEY = "sk-已完善内容"
APPROVAL_API_KEY = "sk-yyy"

正确做法:

import os
from pathlib import Path

def load_config():
    config_path = Path(os.getenv("AGENT_CONFIG_PATH", "./config.json"))
    with open(config_path) as f:
        return json.load(f)

config = load_config()
HR_API_KEY = config["hr"]["api_key"]

权限问题上线第一天就暴露了:测试环境的密钥在生产环境不存在,Agent直接无法调用任何外部API。

2. 日志和可观测性

LangGraph的logs字段只能记录节点执行日志,无法覆盖系统级的问题。

我们需要:

  • 请求追踪ID:每个请求分配唯一ID,贯穿整个流程
  • 外部调用日志:记录所有API调用的请求和响应
  • 错误堆栈:异常时的完整堆栈信息
  • 性能指标:每个节点的执行时间
import uuid
import logging

logger = logging.getLogger("agent.approval")
logger.setLevel(logging.INFO)
handler = logging.FileHandler("approval.log")
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

def extract_info(state: ApprovalState) -> ApprovalState:
    trace_id = state.get("trace_id", str(uuid.uuid4()))
    state["trace_id"] = trace_id

    logger.info(f"[{trace_id}] 开始提取信息")
    # ... 业务逻辑 ...
    logger.info(f"[{trace_id}] 提取完成")

    return state

3. 错误处理和重试

Demo里通常不处理错误,但生产环境必须考虑。

import tenacity

@tenacity.retry(
    stop=tenacity.stop_after_attempt(3),
    wait=tenacity.wait_exponential(multiplier=1, min=4, max=10),
    retry=tenacity.retry_if_exception_type((requests.exceptions.Timeout, requests.exceptions.ConnectionError))
)
def send_approval_request(approver: str, request: dict):
    response = requests.post(
        f"{APPROVAL_API_URL}/approve",
        json={"approver": approver, "request": request},
        headers={"Authorization": f"Bearer {APPROVAL_API_KEY}"},
        timeout=30
    )
    response.raise_for_status()
    return response.json()

4. 配置管理

不同环境(开发、测试、生产)的配置差异很大,需要通过配置管理解决。


# config/environments/development.json
{
    "llm": {"model": "gpt-4o-mini", "temperature": 0.3},
    "hr_api": {"base_url": "http://localhost:8080/api", "timeout": 10},
    "approval_api": {"base_url": "http://localhost:8081/api", "timeout": 10},
    "max_retries": 1,
    "timeout_seconds": 60
}

# config/environments/production.json
{
    "llm": {"model": "gpt-4o", "temperature": 0.1},
    "hr_api": {"base_url": "https://api.company.com/hr", "timeout": 30},
    "approval_api": {"base_url": "https://api.company.com/approval", "timeout": 30},
    "max_retries": 3,
    "timeout_seconds": 120
}

5. 监控和告警

上线后需要实时监控:

  • 流程执行成功率
  • 平均执行时间
  • 中断等待时间
  • 错误类型分布
import time
from prometheus_client import Counter, Histogram

REQUEST_COUNT = Counter("approval_requests_total", "Total approval requests", ["status"])
EXECUTION_TIME = Histogram("approval_execution_seconds", "Execution time")
INTERRUPT_WAIT_TIME = Histogram("approval_interrupt_wait_seconds", "Wait time for approval")

def monitor_execution(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        try:
            result = func(*args, **kwargs)
            REQUEST_COUNT.labels(status="success").inc()
            return result
        except Exception as e:
            REQUEST_COUNT.labels(status="error").inc()
            raise
        finally:
            execution_time = time.time() - start_time
            EXECUTION_TIME.observe(execution_time)
    return wrapper

---

适用边界

LangGraph工作流不是万能的,理解它的适用边界很重要。

适用场景

复杂业务流程:当你的Agent需要多个步骤、条件分支、人工介入时,图工作流比脚本更合适。

状态依赖型任务:如果后续步骤依赖前面步骤的输出,状态图能清晰地表达这种依赖关系。

可观测性要求高:图结构让流程可视化,便于调试和监控。

需要人工审批:中断点机制天然支持人工介入场景。

限制条件

不适合简单流程:如果只有2-3个步骤,没有条件分支,用脚本更简单。图工作流的复杂度会超过收益。

状态管理成本:每个状态字段都需要定义和维护。状态复杂时,调试成本较高。

性能开销:checkpoint机制会带来额外的存储和计算开销。高频调用场景需要考虑性能影响。

学习曲线:团队需要理解图、节点、边、状态、checkpoint等概念。

取舍

vs 脚本:脚本简单直接,但缺乏状态管理和流程控制。图工作流更复杂,但可控性更强。

vs 其他框架:LangChain的Chain更适合线性流程,LangGraph的Graph更适合分支和循环。

vs 传统工作流引擎:Camunda、Airflow等更适合企业级工作流,但学习成本高。LangGraph更轻量,适合AI Agent场景。

什么时候不应照搬方案

快速原型:Demo阶段不需要完整的工程化,过度设计会拖慢进度。

简单查询:如果Agent只是回答简单问题,不需要工作流。

实时性要求极高:checkpoint和中断机制会引入延迟,不适合毫秒级响应场景。

团队规模小:如果只有1-2人维护,复杂的图结构可能难以管理。

我们的经验是:先跑通Demo,再逐步增加工程化能力。不要一开始就追求完美架构。

---

总结

LangGraph工作流从Demo到生产,真正考验的不是图的结构设计,而是工程化能力。

我们踩过的坑总结成三条:

1. 权限配置要提前规划:不同环境的密钥、API地址、超时时间都要统一管理,不要硬编码。

2. 中断点必须有超时处理:人工审批流程容易卡死,需要设置超时时间并配置告警。

3. 日志要覆盖全流程:从请求进入、节点执行、外部调用到最终结果,每个环节都要有可追溯的记录。

图工作流的价值在于可控性,但可控性需要工程化支撑。没有权限管理、日志追踪、错误处理的Agent,只是更复杂的脚本。

如果你的Agent还在Demo阶段,建议先问自己一个问题:如果现在上线,最可能在哪里翻车?

找到那个点,提前解决它。

资料展示

下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。

AI大模型资料展示 1

AI大模型资料展示 2

AI大模型资料展示 3

AI大模型资料展示 4

AI大模型资料展示 5

如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

优快云官方大礼包

【技能】OpenClaw Skills学习及手搓一个极简skill 本文介绍了OpenClaw Skills的基础概念与使用方法。Skills是OpenClaw代理使用工具的核心载体,通过SKILL.md文件定义技能属性和执行方式。技能加载遵循"工作区>本地>内置>自定义目录"的优先级规则。用户可通过ClawHub一键安装现成技能,也可自定义开发技能:创建技能目录,编写包含YAML元数据和执行指令的SKILL.md文件,放置于工作区skills目录进行测试。文章还介绍了多代理场景下的技能共享、插件集成以及安全注意事项,包括沙箱使用和敏感 阅读详情

相关推荐

【自动驾驶控制算法】 第一讲 绪论

声明【自动驾驶控制算法】系列是博主对所分享教学内容的学习笔记,并且该系列每篇博客都会将博主听课后总结的纸质版笔记附于文末,供大家参考。是一位研究汽车领域,无人驾驶方向及其相关方向的大佬,也算是博主在无人驾驶方向的启蒙老师。所以研究相关领域的朋友推荐去听一听他的视频讲解。...

iamtbon_1的博客 1797

LangGraph 工作流:权限日志跟不上,Agent 上线第一天就翻车

LangGraph 把 Agent 从散乱的脚本拉回了可控系统,但很多团队在联调时才发现,真正卡住上线的不是工作流本身,而是权限、日志和可观测性。本文复盘一次真实项目:Demo 跑通了,权限配置漏了一层,日志没有 trace 串联,排查时谁都不知道自己该负责哪一段。从排查过程到代码解释,从失败原因到适用边界,希望给准备把 LangGraph 引入生产环境的开发者一份可操作的清单。LangGraph 让 Agent 从脚本变成了可控系统,但这只是第一步。权限、日志和可观测性才是生产环境的真正门槛。

老男孩的架构路 242

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 459

LangGraph 工作流:Demo 能跑,生产环境为什么依然失控?

最近帮一个团队做 Agent 架构评审,需求方提了三个问题:权限怎么管、日志怎么查、异常谁来兜。我们聊到一半,负责人说了一句让我印象很深的话:"我们的 Agent Demo 跑得挺顺,但一上生产就翻车。" 这句话背后,其实是很多团队正在经历的阶段——从"能用"到"可靠"的跨越。LangGraph 的核心价值不是写出来更爽,而是让 Agent 从"脚本式调用"变成"可观测、可控制"的系统。这篇文章结合一次真实项目的踩坑经历,讲讲图工作流怎么落地、边界在哪、什么情况下不该用。---输入:无(这是类型定义)

LLM_9528的博客 998

OpenCV实战:5分钟搞定图像拼接(附Python代码)

本文通过OpenCV实战教程,详细讲解如何使用Python在5分钟内完成图像拼接。重点介绍`findHomography`函数和单应性矩阵的应用,提供完整的代码示例和常见问题解决方案,帮助开发者快速掌握图像拼接技术。

weixin_26833503的博客 121

H3C VRF实验

POP-vpn-instance-RT1]route-distinguisher 11:11 # VPN实例-RT1的路由区分器值11:11。配置路由泄露,其实就是在一个VPN示例中添加另一个VPN实例的下一跳,比如在VPN实例RT1中添加去往SRV的默认路由。但是也有了一个新的问题,那就是RT1、RT2和RT3也能互访了,这让VPN实例变得没有意义了。[POP]ip vpn-instance RT1 #配置vpn实例-RT1。绑定了VPN实例,所以要把路由添加到VPN实例POP中。

m0_68698993的博客 4031

LangGraph Agent从Demo到上线,最先翻车的不是代码

上个月帮一个做内部效率工具的团队重构 Agent,代码本身没问题,RAG 召回率也测过,但上线第一天就报错了。查了半天,问题出在权限配置和日志链路没打通——模型调了工具但没记录,审批节点没人看,回滚方案根本不存在。这个坑踩完我意识到,LangGraph 真正让人安心的不是"能跑",而是"出了问题知道卡在哪、能回退到哪"。之前写 LangChain 实战指南的时候,很多人问 Agent 怎么从 Demo 变成生产级系统。我的回答一直是:别急着加功能,先把 State 设计和异常处理跑通。

2601_96189255的博客 287

AUTOSAR系统服务篇 - BswM的使用

本文档是对4.0.3版及更高版本的AUTOSAR模式管理应用的介绍。其主要目的是为AUTOSAR的用户和开发人员提供基于示例的AUTOSAR模式管理不同方面的详细概述,这些示例在文中进行了解释。本文中的代码清单共同构成了示例ECU的配置。第2章解释了基础的模式管理概念,例如一般的模式、如何实现模式切换、模式管理者和模式用户的角色等。其次介绍了应用模式管理和基础软件模式管理的依赖关系,两者密切相关。基础软件模式管理器是AUTOSAR R4.0中的中央模式管理模块。它具有很高的可配置性。

IOT2017的博客 847

Agent能跑Demo却不敢上线?LangGraph工作流补上权限日志这课

最近跟几个做AI应用的朋友聊,发现一个共同痛点:个人Demo跑得挺顺,一进团队联调就集体翻车。翻车的原因也差不多——权限管不住、日志看不清、可观测跟不上。大模型应用从Demo转向生产,真正拉开差距的从来不是模型能力,而是工程化细节。今天聊聊LangGraph怎么解决这些问题。回到最初的问题:为什么Agent能跑Demo却不敢上线?答案很简单:Demo关注功能,生产关注可控性。可控性包括权限、日志、可观测、审批,这些在脚本式Agent里都是事后补的,而在图工作流里是原生支持的。

2601_96189167的博客 261

电池管理系统(BMS)软件:CATL BMS二次开发_(1).CATL BMS软件概述

CATL BMS软件的保护机制是确保电池组安全和可靠运行的关键部分。通过高精度的传感器和智能算法,BMS可以实时监测电池组的状态,及时采取保护措施。二次开发中,可以根据特定的应用需求,增加新的传感器、优化算法、扩展通信接口等,进一步提高系统的性能和可靠性。维护和扩展则是确保系统长期稳定运行的重要手段。希望以上内容对您理解CATL BMS软件的保护机制有所帮助。如果您有任何进一步的问题或需要更详细的解释,欢迎随时提问。

zhubeibei168的博客 1460

零基础快速学习 ABAP 读者意见反馈和下一步写作计划表

大家在学习教程过程中,如果有任何关于 SAP ABAP 开发方面想了解的内容,可以直接在教程各篇文章下评论留言,我会将大家的意见统一汇总到下面的表格,作为我更新教程的内容参考来源之一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4275

从 Demo 到生产:LangGraph 工作流为什么总翻车?

上周做需求评审,团队内部吵了一架。AI 应用组的同学把 Demo 演示得很漂亮:用户输入问题,Agent 自动调用工具、查询数据、生成报告,整个过程丝滑流畅。业务方很满意,准备上线。但基础设施组直接泼了冷水:"权限怎么控制的?日志能追踪到每一步吗?失败了谁来兜底?两拨人各执一词,最后老板拍板:先别急着上线,把工作流重构一下,用 LangGraph 重新设计。我参与了这次重构,踩了几个坑,也摸到了一些门道。今天把这些经验分享出来,希望能帮到正在纠结 Demo 和生产差距的同学。

2601_96189255的博客 183

大模型安全-生成检测-事实核查-攻击-防御-思考-记忆-融合-语音相关研究 2025年版

本文整理了关于大模型安全领域的综合性资源,包括7篇综述论文、9个安全数据集以及5篇强化学习相关的安全研究论文。主要涉及大模型的对抗攻击、隐私保护、安全评估等方向,涵盖TruthfulQA、ToxiGen等知名数据集和TrustLLM、HarmBench等关键研究。资源包括知乎博主分享、arXiv预印本和顶会论文,并附有详细的中文讲解链接,为研究者提供了系统性的安全研究参考。

CSPhD-winston的博客 3594

LangGraph工作流:权限、日志缺失时,Agent上线第一天就崩

最近有个业务方提需求,要做一个订单自动审核系统。Demo阶段跑得很顺,模型能判断评论质量、能根据金额决定审批路径。结果上线第一天就翻车了——风控说没有权限校验,审计说没有操作日志,运维说根本不知道哪一步卡住了。我接手后花了两周排查,发现核心问题不在模型,而在工程化。今天复盘一下LangGraph工作流是怎么帮我们把这个系统从脚本变成可控系统的。从Demo到生产,差的不只是代码质量,更是工程化能力。权限、日志、可观测性,这些看似" boring"的东西,才是决定Agent项目能否上线的关键。

老男孩的架构路 270

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LangGraph实战:Agent不够用的时候,踩了4个坑才跑通多步工作流

LangGraph 是面向大模型智能体的图驱动编排引擎,本质上是一个生产级的有状态工作流编排框架,隶属于 LangChain 生态,核心定位是“智能体运行时”,用于解决复杂 AI 应用中流程控制、状态管理、多组件协作的核心痛点。State(状态)

专注 Java / Python 开发,AI 大模型应用学习,持续输出源码教程,实战项目案例,学习笔记,拒绝空话,只写能直接跑的代码与可落地方案,关注我,一起少走弯路。 856

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LangGraph看起来很香,为什么项目一上线就翻车?

上周做需求评审,一个刚转大模型的兄弟提了个方案:用 LangGraph 重构现有的 Agent 工作流,把之前散落在各个函数里的调用逻辑整理成图结构。产品经理问"能上线吗",他说是的,Demo 跑得很顺。我问他"日志怎么接"、"权限校验在哪"、"出错了怎么回滚",他沉默了三秒,说"还没考虑这些"。这个场景我太熟悉了。去年带团队做内部工具链时,也是同样的节奏:Demo 阶段欢天喜地,一碰生产环境就炸。LangGraph 本身没问题,问题是我们对"工作流"的理解还停留在脚本阶段。

2601_96120158的博客 408

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LangGraph 能救 Agent 上线翻车?先看清楚你缺的到底是图还是权限

Agent 从 Demo 到生产,LangGraph 解决的不是"能不能跑",而是"能不能控"。本文结合实战踩坑,聊聊图工作流怎么设计、权限和日志怎么配,以及为什么很多团队在 LangGraph 上栽跟头。LangGraph 不是 Agent 的救世主,但它能强迫你把流程想清楚。权限、日志、可观测,这些" boring"的工程化工作,才是 Agent 从 Demo 到生产的真正门槛。我的建议:1. 先设计 State,再写 Node2. 条件分支只负责路由,不混业务逻辑。

资料免费分享,点击名片 323

LangGraph工作流:小团队如何把Agent从Demo变成能上线的系统

最近接了几个小团队的Agent项目咨询,发现一个普遍问题:Demo跑通很容易,但一到生产环境就翻车。翻车的点往往不是模型能力,而是权限控制、日志追踪和流程可观测性。LangGraph作为图工作流框架,能帮我们构建可控的Agent系统,但怎么用、用到什么程度,需要结合实际资源做取舍。这篇文章复盘我最近一个项目的实践,聊聊小团队如何用LangGraph把Agent从脚本变成能上线的系统,以及哪些地方该精简、哪些地方不能省。

2601_96285276的博客 319

我把LangGraph接进客服项目,上线前翻车三次才搞明白的事

上个月把LangGraph接入公司客服系统的重构,差点把整个团队搞崩。不是因为图结构复杂,而是我们一开始就想当然地认为:Demo能跑,上线就稳了。现实打脸得很彻底。第一次翻车是因为权限越界,Agent拿到了不该有的数据库写权限;第二次是日志断链,用户投诉时查不到完整对话轨迹;第三次是异常兜底缺失,一个模型返回异常就直接让工作流卡死,线上客服完全瘫痪。这三件事逼着我们重新审视:LangGraph到底是什么?它和之前用的链式调用、状态机有什么区别?怎么才能真正上线?

资料免费分享,点击名片 325

Agent 上线即崩?LangGraph 工作流里权限和日志才是硬门槛

上周有个做电商的朋友找我吐槽,他们团队花了两周写了个 Agent,能自动处理售后工单。Demo 演示的时候,业务方很满意,结果上线第三天就被运维拦截了——没有权限控制,Agent 直接调了生产环境数据库,还有一条工单被错误关闭,客户投诉差点引发舆情。我问他:你们当时怎么设计的工作流?他说:就是一个 function 调用 LLM,LLM 返回 JSON,然后解析执行。我听完就明白了。这种写法跑 Demo 没问题,但真到生产环境,权限、日志、可观测性全是一片空白。

2601_96189255的博客 351

LangGraph到底能不能干活?别只看 Demo 和跑分

最近团队接了一个 Agent 项目,需求看起来很简单:用户提交一个工单,系统自动判断类型,匹配对应的处理流程,涉及财务审批的需要人工确认,最后把结果推送到内部系统。前端同学花了一周搭了个 Demo,调了三个模型 API,逻辑走通了,演示效果还不错。结果联调阶段直接翻车——权限校验绕过了,日志查不到关键路径,审批节点被重复触发,生产环境里 Agent 跑成了"黑盒"。这不是个例。我翻了一下最近半年的项目复盘,Agent 从 Demo 到上线,真正卡住团队的不是模型智商,而是权限、日志和可观测。

2601_96120158的博客 377

Agent跑通Demo后为什么崩?LangGraph工作流的三个关键改造

很多团队做 Agent 项目,本地跑得好好的,一上生产就崩。问题往往不在模型本身,而在权限、日志和可观测性。我最近把 LangGraph 接进一个客服 Agent 项目,翻车三次后才搞明白:从 Demo 到生产,需要三个关键改造。输入:无(类定义阶段)使用TypedDict定义状态结构,比普通 dict 多了类型检查,IDE 能自动补全question存储用户原始问题存储 RAG 检索到的文档列表answer存储模型生成的回答是布尔标志,标记当前问题是否需要人工介入。

2601_96285276的博客 333

LangGraph从开发到生产部署:踩了4个坑才知道“本地跑通了“和“上线能用了“差多远

LangGraph 是LangChain 生态中专门用于构建、编排与执行多步骤、多代理(Multi-Agent)复杂 AI 工作流的可视化 / 代码化开发平台,核心解决传统 LLM 应用 “单轮对话、线性执行、无状态管理” 的局限性,支持构建具备循环、分支、状态持久化、多代理协作的高级 AI 系统(如自主 Agent、工作流引擎、复杂 RAG 增强系统)。它是 LangChain 官方推出的 “工作流编排层”,既提供Python 代码 SDK(核心开发方式),也配套。

专注 Java / Python 开发,AI 大模型应用学习,持续输出源码教程,实战项目案例,学习笔记,拒绝空话,只写能直接跑的代码与可落地方案,关注我,一起少走弯路。 1412

同样是LangGraph,为什么我的Agent能上线、同事的只能演示?

摘要:最近身边好几个做Agent的朋友,Demo都挺好看,但真正想往生产环境里推的时候,卡住的不是模型调用,而是权限边界和日志链路。这篇文章复盘我这段时间用LangGraph搭工作流的真实踩坑经历,重点讲小团队怎么避免过度设计、把权限和可观测性提前嵌入图结构里。---LangGraph解决的是"流程可控"的问题,但权限、日志和可观测性是另一个维度的工程化工作。这两件事必须同时设计,不能等Demo跑通了再补。先做对,再做全。把State设计清楚、把权限检查放在Edge上、把审计日志从第一天就记录下来。

2601_96120158的博客 291

LangGraph 工作流:为什么 Agent Demo 跑通后,权限和日志最先翻…

前阵子帮一个团队做 Agent 项目联调,代码写得挺漂亮,图结构也清晰,一上生产环境,权限校验没做、日志链路断了、审批节点没人接,直接翻车。这件事让我重新审视 LangGraph 的价值——它解决的不只是"怎么写工作流",更是"怎么让工作流在生产环境站得住"。本文从一个真实踩坑经历出发,结合 LangGraph 的 State、Node、Edge、人工审批节点等关键概念,聊聊 Agent 从 Demo 到生产之间那道真正的门槛。

2601_96285279的博客 346

LangGraph 工作流:项目材料里该留下什么

把 Agent 跑通只是第一步,真正能塞进项目材料、让团队或面试官信服的,往往是 Demo 阶段被刻意忽略的工程细节:状态流转怎么设计、路由边界怎么处理、关键操作怎么挂起、上线前怎么补全日志和兜底策略。结合近期大模型应用从概念验证转向生产部署的趋势,本文拆解 LangGraph 在真实业务里的取舍逻辑,给想构建可靠工作流的开发者一份可直接复用的检查清单。写 Agent 工作流,从来不是把模型能力拼凑起来就算完事。

资料免费分享,点击名片 310
上一篇: Agentic AI 能干活了,但团队协作时为什么反而更慢?
下一篇: 我把Hermes接进项目后,先推翻了几个想当然
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值