深入浅出 LangGraph —— 第8章:人机交互:中断与审批流程

LangGraph人机交互 在一些程序中,可能需要用户的状态才能使程序继续执行。例如,假如我们部署了一个web页面,在前端的输入框中得到了用户输入,接着后端接收该信息并注入到任务中,使程序根据用户的输入执行。这需要借助LangGraph的中断机制来实现,下面让我们看看怎么做!人机交互是实现应用程序的关键点,这涉及到了中断、状态保存等。通过该机制,我们可以基于langgraph搭建web界面、对话系统、自动化工作流等。下一章我们会讲解,如何使用langgraph操作sql数据库,我们会基于sqlite3实现一个简易的数据库交互程序。 阅读详情

📖 本章学习目标

  • ✅ 理解"人在回路"(Human-in-the-Loop)的核心价值
  • ✅ 掌握 interrupt() 函数暂停图执行并等待人类输入
  • ✅ 学会配置静态断点(breakpoints)在特定节点前后暂停
  • ✅ 实现工具调用前的人工审批确认机制
  • ✅ 构建完整的"AI 执行→人工审批→继续执行"工作流
  • ✅ 避免常见的中断陷阱和安全问题

一、为什么需要人在回路

1、完全自动化的风险

随着 Agent 能力越来越强,它能执行的操作也越来越"危险"——删除文件、发送邮件、转移资金……如果 AI 理解有偏差直接执行,后果可能是灾难性的。

需要人工干预的典型场景:

  • 🗄️ 执行数据库删除操作前需要确认
  • 📧 发送重要邮件前需要人工审阅内容
  • 💰 金融交易需要用户授权
  • 🔒 涉及敏感权限的 API 调用
  • 🤔 AI 对任务理解不确定时需要追问
  • ⚖️ 法律/医疗建议需要专业人士审核

❌ 无审批流程

AI生成方案

直接执行

可能出错
无法挽回

✅ 有审批流程

批准

拒绝

AI生成方案

⏸️ 暂停等待审批

人工审核

安全执行

重新规划

安全可靠✅

2、Human-in-the-Loop 架构

✅ 批准

❌ 拒绝

✏️ 修改

Agent 开始执行

规划节点

⏸️ 暂停
等待人工审批

执行节点

修订节点

人工修改

完成

核心价值:

  • ✅ 安全性:防止AI错误决策造成损失
  • ✅ 可控性:人类保留最终决定权
  • ✅ 可追溯:每次审批都有记录可查
  • ✅ 灵活性:可随时介入调整方向

二、interrupt() 函数:动态中断

1、基本用法

interrupt() 函数可以在节点执行中途暂停,等待外部输入后再继续:

步骤1:导入依赖
import * as dotenv from 'dotenv';
dotenv.config();

import { 
  interrupt, 
  MemorySaver, 
  MessagesAnnotation, 
  StateGraph 
} from '@langchain/langgraph';
import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage, AIMessage } from '@langchain/core/messages';
步骤2:定义审批节点
const model = new ChatOpenAI({ model: 'gpt-4o-mini' });

async function reviewNode(state: typeof MessagesAnnotation.State) {
  const lastMsg = state.messages[state.messages.length - 1] as AIMessage;
  
  // 暂停执行,向外部暴露需要审批的内容
  const humanDecision = interrupt({
    message: 'AI 生成了以下回复,请审批:',
    content: lastMsg.content,
    options: ['approve', 'reject', 'modify'],
  });
  
  // humanDecision 是人类的输入(resume 时传入)
  if (humanDecision === 'reject') {
    return { messages: [new HumanMessage('请重新生成,要求更简洁')] };
  }
  
  return {}; // 批准则不做任何修改
}

interrupt(value)暂停当前节点的执行,value 可以是任意可序列化的数据,传给等待审批的系统。函数的返回值是 resume() 时传入的人类决策。注意:interrupt() 之后的代码只在 resume 后才执行

工作原理:

  1. 节点执行到interrupt()时暂停
  2. 将value序列化保存到检查点
  3. 返回当前状态给调用方
  4. 等待外部调用resume恢复执行
  5. resume的值作为interrupt()的返回值

2、interrupt 的执行流程

第一次调用:触发中断
const checkpointer = new MemorySaver();

const graph = new StateGraph(MessagesAnnotation)
  .addNode('generate', async (state) => {
    const response = await model.invoke(state.messages);
    return { messages: [response] };
  })
  .addNode('review', reviewNode)
  .addEdge('__start__', 'generate')
  .addEdge('generate', 'review')
  .addEdge('review', '__end__')
  .compile({ checkpointer });

const config = { configurable: { thread_id: 'approval-flow-001' } };

// 第一次调用:执行到 interrupt 处暂停
const firstResult = await graph.invoke(
  { messages: [new HumanMessage('写一首关于春天的短诗')] },
  config
);

console.log('图已暂停,等待审批');
  • 图执行到reviewNode中的interrupt()后暂停
  • firstResult包含当前状态和中断信息
  • 此时图并未结束,只是暂停等待人工输入
  • 必须使用checkpointer才能使用interrupt
检查中断状态
// 检查暂停状态
const state = await graph.getState(config);
console.log('等待人工输入的内容:', state.tasks[0]?.interrupts);
console.log('下一步:', state.next); // ['review']

// 输出示例:
// 等待人工输入的内容: [{
//   value: {
//     message: 'AI 生成了以下回复,请审批:',
//     content: '春天来了,万物复苏...',
//     options: ['approve', 'reject', 'modify']
//   }
// }]
  • getState():获取当前图的运行状态
  • state.tasks[0].interrupts包含interrupt()传入的数据
  • state.next:显示下一步要执行的节点
  • 这些信息可以展示给前端,让人工审批
恢复执行
// 人工审批后,用 resume 继续执行
const finalResult = await graph.invoke(
  // null 表示不更新 messages,直接继续
  new Command({ resume: 'approve' }),
  config
);

console.log('审批通过,图继续执行完成');

Command({ resume: value })携带人类决策,恢复图的执行 resume 的值就是interrupt() 函数的返回值。可以使用相同的config(thread_id相同),图从暂停处继续执行,直到完成或再次中断。

三种常见resume值:

  1. ‘approve’:批准,继续执行
  2. 'reject’:拒绝,可能需要重新规划
  3. 自定义对象:携带人工修改的数据

完整流程图:

人工审批者 LangGraph 应用程序 人工审批者 LangGraph 应用程序 第一阶段:触发中断 第二阶段:人工审批 第三阶段:恢复执行 invoke(初始输入) 执行generate节点 执行review节点 遇到interrupt(),暂停 返回中断状态 展示审批内容 选择"approve" invoke(Command({resume:'approve'})) interrupt()返回'approve' 继续执行后续逻辑 返回最终结果

三、静态断点(Breakpoints)

1、在特定节点前后暂停

静态断点不需要修改节点代码,直接在编译时配置:

import { Command } from '@langchain/langgraph';

const graphWithBreakpoint = new StateGraph(MessagesAnnotation)
  .addNode('plan', planNode)
  .addNode('execute', executeNode)
  .addNode('validate', validateNode)
  .addEdge('__start__', 'plan')
  .addEdge('plan', 'execute')
  .addEdge('execute', 'validate')
  .addEdge('validate', '__end__')
  .compile({
    checkpointer,
    interruptBefore: ['execute'],   // 执行 execute 节点前暂停
    interruptAfter: ['validate'],   // validate 节点执行后暂停
  });
  • interruptBefore:在指定节点执行之前暂停,适合审批即将执行的操作
  • interruptAfter:在指定节点执行之后暂停,适合检查结果是否符合预期
  • 两者都不修改节点函数,适合在不改动业务逻辑的情况下加审批
  • 支持数组,可同时为多个节点设置断点

断点位置示意图:

__start__

plan节点

⏸️ interruptBefore
execute

execute节点

validate节点

⏸️ interruptAfter
validate

__end__

2、断点的典型应用

async function main() {
  const config = { configurable: { thread_id: 'breakpoint-demo' } };
  
  // 第一次运行:执行 plan,然后在 execute 前暂停
  await graphWithBreakpoint.invoke(
    { messages: [new HumanMessage('帮我删除所有过期日志文件')] },
    config
  );
  
  const state = await graphWithBreakpoint.getState(config);
  console.log('规划结果:', state.values.messages[state.values.messages.length - 1]);
  console.log('即将执行的节点:', state.next); // ['execute']
  
  // 人工审查规划结果后,决定是否继续
  const approved = await humanReview(state); // 伪代码:人工审批函数
  
  if (approved) {
    // 批准:继续执行
    await graphWithBreakpoint.invoke(null, config);
  } else {
    // 拒绝:手动更新状态,修改规划
    await graphWithBreakpoint.updateState(
      config,
      { messages: [new HumanMessage('请重新规划,只删除30天前的日志')] },
      'plan'  // 重新从 plan 节点开始
    );
    await graphWithBreakpoint.invoke(null, config);
  }
}

实际应用场景:

  • 数据库迁移:先展示迁移计划,人工确认后执行
  • 批量操作:预览影响范围,确认后执行
  • 代码部署:审查变更列表,批准后部署

四、工具调用审批

1、在工具执行前要求确认

这是生产中最常见的人机交互场景——让 AI 提出执行计划,人工确认后再执行:

步骤1:定义危险工具

模拟文件删除工具,实际项目中应谨慎使用。

import { Annotation, StateGraph, interrupt, MemorySaver } from '@langchain/langgraph';
import { ToolNode } from '@langchain/langgraph/prebuilt';
import { tool } from '@langchain/core/tools';
import { z } from 'zod';
import { RemoveMessage } from '@langchain/core/messages';

// 定义一个"危险"工具
const deleteFileTool = tool(
  async ({ filePath }) => {
    console.log(`🗑️ 正在删除文件: ${filePath}`);
    // 实际删除操作...
    return `文件 ${filePath} 已删除`;
  },
  {
    name: 'delete_file',
    description: '删除指定路径的文件',
    schema: z.object({ filePath: z.string().describe('要删除的文件完整路径') }),
  }
);
步骤2:定义审批节点
// 审批节点:在工具调用前插入人工确认
async function approvalNode(state: typeof MessagesAnnotation.State) {
  const lastMsg = state.messages[state.messages.length - 1] as AIMessage;
  
  if (!lastMsg.tool_calls?.length) return {};
  
  // 展示 AI 想要调用的工具,等待人工确认
  const decision = interrupt({
    type: 'tool_approval',
    toolCalls: lastMsg.tool_calls.map(tc => ({
      name: tc.name,
      args: tc.args,
    })),
    message: '以上工具调用需要您的确认',
  });
  
  if (decision === 'reject') {
    // 取消工具调用:移除包含 tool_calls 的 AI 消息
    return {
      messages: [new RemoveMessage({ id: lastMsg.id! })],
    };
  }
  
  return {}; // 批准:继续执行工具
}

代码解读:

  • 检查最后一条消息是否有tool_calls
  • 如果有,展示工具名称和参数,等待人工确认
  • 拒绝时:使用RemoveMessage删除tool_calls消息
  • 批准时:返回空对象,继续执行tools节点
步骤3:组装带审批的图
const agentNode = async (state: typeof MessagesAnnotation.State) => {
  const modelWithTools = model.bindTools([deleteFileTool]);
  const response = await modelWithTools.invoke(state.messages);
  return { messages: [response] };
};

const approvalGraph = new StateGraph(MessagesAnnotation)
  .addNode('agent', agentNode)
  .addNode('approval', approvalNode)      // 插入审批节点
  .addNode('tools', new ToolNode([deleteFileTool]))
  .addEdge('__start__', 'agent')
  .addConditionalEdges('agent', (state) => {
    const last = state.messages[state.messages.length - 1] as AIMessage;
    return last.tool_calls?.length ? 'approval' : '__end__';
  })
  .addConditionalEdges('approval', (state) => {
    const last = state.messages[state.messages.length - 1] as AIMessage;
    return last.tool_calls?.length ? 'tools' : '__end__';
  })
  .addEdge('tools', 'agent')
  .compile({ checkpointer: new MemorySaver() });

代码解读:

  • 在 agent 和 tools 之间插入 approval 节点
  • approval 节点使用 interrupt() 暂停,等待人工决策
  • 批准后继续到 tools 执行,拒绝则移除 tool_calls 消息
  • 这个模式将 AI 的"想法"和"行动"分离,人工把控行动

工具审批流程图:

否

是

批准

拒绝

agent节点
LLM推理

有tool_calls?

__end__

approval节点
⏸️ 中断等待审批

人工决策

tools节点
执行工具

移除tool_calls


五、动态输入收集

1、Agent 主动向用户提问

有时 Agent 信息不足,需要主动向用户询问更多细节:

async function clarifyNode(state: typeof MessagesAnnotation.State) {
  const lastMsg = state.messages[state.messages.length - 1] as AIMessage;
  
  // AI 判断是否需要追问
  if (lastMsg.content.includes('[需要澄清]')) {
    const userAnswer = interrupt({
      type: 'clarification',
      question: lastMsg.content,
    });
    
    // 将用户的补充信息加入对话
    return { 
      messages: [new HumanMessage(`用户补充:${userAnswer}`)] 
    };
  }
  
  return {};
}
  • AI 在回复中用特殊标记(如 [需要澄清])表示需要追问
  • interrupt() 暂停等待用户填写补充信息
  • 收到用户回答后,将其作为新消息加入对话继续处理
  • 这是构建表单填写 Agent 的核心模式

实际应用场景:

  1. 客服系统:信息不全时主动询问
  2. 订票助手:询问日期、人数等细节
  3. 报告生成:确认报告范围和格式

示例对话流程:

用户: 帮我订机票
AI: [需要澄清]请问您想从哪里飞到哪里?什么日期?
⏸️ 中断,等待用户输入
用户: 北京到上海,明天
✅ 恢复,AI继续处理

六、最佳实践和踩坑指南

💡 实践 1:interrupt 数据要包含足够上下文

❌ 不足的中断数据:

const decision = interrupt('需要审批');  // 审批者看不到内容

✅ 包含完整上下文:

const decision = interrupt({
  type: 'approval',
  summary: '删除 /logs 目录下所有 .log 文件',
  details: { files: filesToDelete, totalSize: '2.3GB' },
  riskLevel: 'high',
  message: '此操作不可逆,请仔细确认',
});

原因:审批者需要足够的信息才能做出明智决策。

💡 实践 2:提供明确的批准/拒绝选项

// 不只是 true/false,提供有语义的选项
const decision = interrupt({
  options: {
    approve: '批准,立即执行',
    modify: '修改参数后执行',
    reject: '拒绝,取消此操作',
  },
});

// resume 时传入对应的 key
// new Command({ resume: 'modify' })

原因:清晰的选项减少审批者的认知负担。

💡 实践 3:超时自动处理

// 带超时的审批流程
async function approveWithTimeout(config: any, timeoutMs: number = 10000) {
  const timeoutPromise = new Promise((resolve) => {
    setTimeout(() => resolve('timeout'), timeoutMs);
  });
  
  const approvalPromise = new Promise((resolve) => {
    // 这里应该由前端或外部系统调用resume
    // 简化示例,实际需要事件监听
  });
  
  const result = await Promise.race([approvalPromise, timeoutPromise]);
  
  if (result === 'timeout') {
    console.warn('审批超时,自动拒绝');
    return await graph.invoke(new Command({ resume: 'reject' }), config);
  }
  
  return result;
}

原因:防止审批流程无限期等待,影响用户体验。

⚠️ 常见问题

问题现象解决方案
没有启用 checkpointerinterrupt() requires a checkpointer必须在 compile 时传入 checkpointer
resume 时 thread_id 不一致找不到暂停的检查点resume 必须使用与首次调用完全相同的 thread_id
interrupt 数据不可序列化序列化错误只传 JSON 安全的数据(无 Function、Symbol)
忘记处理 reject 情况拒绝后图意外结束为每种审批决策都设计相应的处理逻辑
多次resume同一检查点行为未定义每个检查点只能resume一次
中断嵌套过深难以追踪状态避免在节点中多次调用interrupt

📝 本章小结

核心知识点回顾

知识点关键要点应用场景
interrupt()动态暂停,等待外部输入运行时需要人工决策的场景
interruptBefore/After静态断点,不改代码对特定节点加审批
Command({ resume })携带人类决策恢复执行所有中断的恢复
工具调用审批在 agent 和 tools 间插入审批节点危险操作的安全控制
动态输入收集AI主动提问,等待用户回答信息不全时的澄清流程
超时处理防止无限期等待提升用户体验

🎯 动手练习

练习 1:简单审批流程

  • 目标:实现"AI 起草邮件→人工审批→发送"的流程
  • 要求:
    1. AI根据主题生成邮件草稿
    2. interrupt显示邮件内容,支持批准/修改/拒绝三种决策
    3. 批准后打印"已发送",修改后重新生成,拒绝后取消
  • 验收标准:
    • 三种决策都有正确处理
    • 修改后可以重新生成
    • 拒绝后不会发送邮件

练习 2:多步骤审批

  • 目标:实现"规划→审批规划→执行→审批结果→完成"的五步流程
  • 要求:
    1. 每个审批点都能修改前一步的输出
    2. 使用interruptBefore和interruptAfter组合
    3. 记录每次审批的决策和时间
  • 验收标准:
    • 任意步骤的拒绝都能触发重新执行
    • 审批历史完整记录
    • 流程清晰可追踪

练习 3:超时自动处理

  • 目标:审批超过10秒未响应时,自动选择默认决策(如"拒绝")
  • 要求:
    1. 结合 Promise.race 实现超时机制
    2. 超时时自动resume为’reject’
    3. 记录超时事件到日志
  • 验收标准:
    • 10秒内无操作自动走拒绝流程
    • 不死等,不影响其他请求
    • 超时事件可追溯

练习 4:工具调用审计系统

  • 目标:记录所有需要审批的工具调用
  • 要求:
    1. 创建auditLog State字段
    2. 每次审批记录:工具名、参数、决策、时间、审批人
    3. 提供查询审计日志的功能
  • 验收标准:
    • 所有审批都有完整记录
    • 可按时间、工具名查询
    • 符合安全审计要求

📚 延伸阅读


下一章:第9章 —— 流式输出:实时响应用户

从零搭建RAG系统:基于LangChain与Chroma的本地知识库问答实战 在大语言模型(LLM)应用中,如何确保生成内容的准确性与时效性,并有效利用私有知识库,是工程实践中的核心挑战。检索增强生成(RAG)技术通过结合信息检索与文本生成,为解决这一难题提供了关键路径。其核心原理是,在模型生成答案前,先从外部知识库(如向量数据库)中检索出最相关的文档片段,并将这些信息作为上下文增强提示词,从而引导模型生成基于事实、可追溯的答案。这项技术的核心价值在于显著提升模型回答的准确性、降低知识更新成本,并突破模型自身上下文长度的限制。因此,RAG被广泛应用于智能客服、企业知识库、文档分析等需 阅读详情

相关推荐

多智能体系统实战:从CrewAI框架到AI团队协作开发

多智能体系统是人工智能领域的重要分支,它通过多个具备自主决策能力的智能体协同工作,解决复杂任务。其核心原理在于智能体间的通信、任务分配与冲突解决机制,通过环境共享状态实现信息同步。这一技术价值在于将大模型能力模块化、流水线化,显著提升复杂问题解决效率。在应用场景上,多智能体系统广泛应用于内容创作、软件开发、数据分析等需要多角色协作的领域。本文以CrewAI框架为例,深入探讨如何构建稳定可控的多智能体协同系统,通过角色设计、任务编排等工程实践,避免智能体间冲突,实现高效协作。其中涉及智能体协同和任务调度等关键

chuange6363的博客 426

LangGraph篇-人机交互

本文介绍了人机交互(Human-in-the-loop)工作流在LLM应用中的实现方法。重点讲解了LangGraph中的interrupt函数,该函数允许在特定节点暂停执行、向人类展示信息并使用输入恢复工作流。文章详细说明了三种主要设计模式:审批/拒绝、编辑状态和获取输入,并提供了代码示例展示如何设置检查点和断点来实现人工干预。这种机制特别适用于需要人工验证或修正的关键决策场景,确保LLM输出的可靠性,同时保持自动化流程的效率。

Q2024107的博客 1746

跟着团子学SAP CO:熟练使用结果分析码实现各个场景下收入成本的匹配(一) KKA2/CJ88

PS模块中对财务顾问最难的点在于项目结算,特别是销售型的项目结算。针对客户型项目结算我列举了以下常见的收入成本匹配的一些场景: (1)在项目执行过程中会多次开票,但由于各期成本浮动很大(如前期可能只涉及一些人工、中期全是比较金额较大的材料费),所以希望开票的时候能通过合理的一些指标进行主营业务成本与主营业务收入的匹配。 (2)项目过程中会多次开票,开票确认主营业务收入时,直接将累计发生的实际成本结转为主营业务成本。 (3)项目过程中虽多次开票,但不确认收入,所有发生的实际成本月末计算为在制品,最后项目一次性

Lucas1211的博客 9534

LangGraph(四)——加入人机交互控制

加入人机交互

qq_51180928的博客 1222

TikTok Shop API密钥获取与PHP实战对接指南

本文详细介绍了TikTok Shop API密钥的获取流程与PHP实战对接方法。从开发者后台创建应用、获取核心的API密钥开始,逐步解析OAuth 2.0授权机制,并提供了完整的PHP封装类示例,涵盖签名生成、API调用、令牌刷新及错误处理,帮助开发者快速实现与TikTok Shop的数据对接与自动化操作。

weixin_29300241的博客 403

超详细Tokenizer——文本训练数据预处理

Tokenizer是Keras库中的一个文本处理工具,它用于将文本分词并构建词汇表,同时将文本映射到整数序列。这对于自然语言处理任务非常有用,例如文本分类、情感分析、机器翻译等。

halo的博客 3701

开源模型应用落地-LangGraph101-探索 LangGraph人机交互-添加断点(一)

通过“断点机制”实现了智能系统的可控自主性。

以微薄之力,予他人些许温暖. 2万+

【实战】——零代码玩转Supervisely人像分割:从标注到模型训练的数据流水线搭建

本文详细介绍了如何零代码使用Supervisely平台搭建人像分割数据流水线,从智能标注到数据集格式转换,再到模型训练与优化。Supervisely的智能标注工具和协作功能大幅提升了人像分割项目的效率,特别适合视频会议背景虚化、虚拟试衣等应用场景。

weixin_30694389的博客 416

【Agent的革命之路——LangGraph】人机交互中的interrupt&Command

在LangGraph中,实现人机交互最核心的就是Command和interrupt,就是前面设计4种交互模式所使用的共同方法,简单点说就是中断图,获取人类提供的值,再恢复图。我们这次就来详细分析一下这两个语法。

weixin_40143861的博客 4076

【影像组学】用3Dslicer或Python提取影像组学特征

用3Dslicer或Python提取影像组学特征

abdslfwoeugp 1万+

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8692

深入浅出 LangGraph —— 导读

介绍《深入浅出LangGraph》的写作背景、与《深入浅出LangChain》的关系、目标读者、内容结构与阅读建议。帮助已掌握LangChain基础的工程师顺利进阶到生产级Agent系统开发。

FrontAI的博客 645

选型不再靠感觉:一文看懂 SAP Event Mesh 与 SAP Integration Suite, advanced event mesh 的能力边界

本文对比分析了SAP Event Mesh与SAP Integration Suite, advanced event mesh的差异。SAP Event Mesh适合轻量级场景,主要用于SAP系统间异步通信,支持AMQP、MQTT等协议,消息大小限制为1MB。而advanced event mesh面向企业级事件网络,提供跨云/本地部署、事件治理、监控等高级功能,支持30MB消息和更大存储容量。选择时需考虑业务规模、实时性要求、治理需求等因素:单一SAP生态内扩展可选Event Mesh;跨区域、多云环境

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

深入浅出 LangGraph

专为正在做或想要转入 AI Agent 开发领域的开发者量身打造的技术系列教程。全教程以 LangGraph TypeScript 最新版为核心,带你从零开始,由浅入深,最终具备独立构建生产级 AI Agent 系统的能力。

FrontAI的博客 490

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

本文介绍了在Android设备上通过Termux部署OpenClaw AI助理的方案。Android设备的便携性、Termux提供的完整Linux环境以及多样化的硬件配置使其成为理想的部署平台。文章详细分析了不同级别Android设备的硬件规格(从入门级到旗舰级),并提供了最低/推荐配置要求。部署步骤包括Termux安装初始化、Python环境配置以及性能优化建议。该方案充分利用Android设备的传感器和电池供电优势,为移动办公、学习等场景提供了低成本、高便携性的AI助理解决方案。

博客 3015

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深入浅出LangGraph【一】_基础篇

本文深入浅出介绍LangGraph基础原理与框架选型,强调其在复杂Agent开发中的优势:支持状态持久化、断点恢复、多分支/循环/并行逻辑,且与LangSmith深度集成,具备顶尖可观测性。虽学习曲线陡峭,但掌握后可快速理解其他Agent框架。相较CrewAI、AutoGen等,LangGraph更适用于生产级复杂场景,其核心在于以“图”结构管理状态与节点交互,突破传统线性链(DAG)局限,实现动态、可复用的智能工作流。

qq_46601365的博客 333

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Agent 循环控制:如何优雅地判断“继续调用”还是“结束流程”?

大家好,我是你们的老朋友,一名深耕后端与 AI 工程化的技术博主。 在构建 LLM Agent(智能体)应用时,我们最常遇到的一个核心痛点就是:Agent 什么时候该停? 很多开发者在初学 ReAct(Reasoning + Acting)模式时,都会陷入一个误区:认为只要把工具交给 LLM,它就能完美地自主决定何时停止。但在生产环境中,你可能会遇到这样的尴

让技术为我所用 601

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【三年面试五年模拟】AI Agent高频面试面经核心80问大汇总!

AI Agent 工程面试 80 问逐题解析:贯通 Runtime、规划恢复、Hybrid RAG、全文与向量检索、记忆读写、MCP 与工具权限,以及课程预约业务的确认、幂等和事务边界。补充 6 张机制图、可运行 RRF 示例、故障诊断方法与评测口径。

Rocky Ding相信人工智能、数据科学、商业逻辑、金融工具、终身成长以及顺应时代的潮流会赋予我们超能力。 736

【三年面试五年模拟】2026-09-23 恒生电子AI应用开发岗面试全解析

围绕恒生电子 AI 应用开发岗的27道面试题,深入解释 Python 装饰器、联合索引、严格 JSON 输出、RAG 检索与端到端评测、Agent 重规划、TTFT 与前缀缓存、LangGraph 状态合并及幂等恢复。保留题目措辞和顺序,补充可运行代码、公式、实验设计与工程边界。

Rocky Ding相信人工智能、数据科学、商业逻辑、金融工具、终身成长以及顺应时代的潮流会赋予我们超能力。 407

LangGraph 入门全解(四):构建人机交互体验,大模型入门到精通,收藏这篇就足够了!

我们介绍了 LangGraph 实现多轮对话、工具调用和记忆。但在实际应用场景里,完全让Agent自主做决策并不总是最优解。

huang9604的博客 1243

智能体模式篇 (中) - 人机协作:LangGraph构建交互式助手

本篇博客将深入探讨如何利用 LangGraph 构建一个真正意义上的人机协作智能体。我们将以“Drafter”(文档起草助手)为例,详细解析如何通过**意图驱动的工具(Intent-driven Tools)**和非对称的条件路由(Asymmetric Conditional Routing)**,实现一个能够与人类用户无缝协作、持续迭代、直至完美的智能文档起草系统。

m0_53827889的博客 1221

零基础入门 LangChain 与 LangGraph(八):真正让 Agent“活起来”——持久化、记忆、人机交互与时间旅行

本文深入探讨了LangGraph框架如何通过持久化机制解决复杂Agent系统的状态管理问题。核心内容包括:1)区分线程级持久化(Thread和Checkpoint)与跨会话持久化(Store);2)Checkpoint作为执行快照的关键作用,保存状态值、下一步节点等关键信息;3)持久化实现的三大价值:中断恢复、短期记忆支持和调试能力增强。文章强调LangGraph不仅是工作流工具,更是托管状态生命周期的运行时系统,通过检查点机制支持人工干预、时间旅行等高级功能,使Agent系统真正具备长期运行能力。

半截诗的博客~ 931

【LangGraph】持久化实现的三大能力——人机交互

本文介绍了LangGraph持久化中的人机交互(HITL)机制,重点讲解了四种典型应用模式:1)批准/拒绝模式,用于高风险操作审批;2)查看编辑状态模式,允许人工修改中间结果;3)工具中断模式,在工具执行前请求确认;4)输入验证模式,确保用户输入合规。通过interrupt()和Command API,开发者可以在AI工作流中灵活嵌入人工干预节点,实现关键操作确认、内容审核和输入校验等功能。文章提供了可直接运行的代码示例,展示了如何在财务审批、邮件发送等场景中应用这些模式。

zhai0104的博客 1048

LangGraph

关于 LangGraph 安装 快速使用 与LCEL 交互 条件边 Cycles 设置工具 设置模型 定义代理状态 定义节点 定义图表 使用 流媒体 流式节点输出 流式 LLM Tokens 何时使用 操作指南 异步 流式 Tokens 持久化 人机交互 可视化图表 “时间旅行” 示例 ChatAgentExecutor:带函数调用 代理执行者 规划代理示例 反思/自我批评 多代理示例 网络研究 通过模拟评估 Chatbot 多模式示例 表链 文档 状态图 `__init__` `.add_node` `.

AI工程化、开源分享、文档翻译、代码笔记 3230

【收藏必学】LangGraph人机交互实战:从零掌握动态中断与审批流程构建

本文深入解析LangGraph的人机交互机制,对比静态中断(调试)与动态中断(HITL)的区别,详解动态中断四大核心组件:Checkpointer、thread_id、interrupt()和Command。通过转账审批实战案例,展示如何构建可靠可控的审批流程,并强调"幂等性"与"状态驱动"两大黄金法则,帮助开发者打造真正需要人工干预的智能Agent系统。

Gaga246的博客 717

langchain系列(九)- LangGraph 子图详解

本文主要说明LangGraph的子图代码实现以及原理简介,涉及到子图通信、人机交互、历史回溯、子图更改state、更改节点、更改子图等内容,本文也是作为多智能体的铺垫。多智能体结束后,本系列文章也就结束了。

forevercui的博客 3654
上一篇: 深入浅出 LangGraph —— 第7章:持久化与检查点机制
下一篇: 深入浅出 LangGraph —— 第9章:流式输出:实时响应用户
FrontAI
博客等级 码龄1年 61粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值