node.js 实现工作流

0 阅读2分钟

一、什么是 LangGraph 工作流?

它以图结构(graph) 为核心,将应用逻辑拆解为节点与边的组合,完美适配需要状态管理、循环逻辑或多主体协作的场景——比如智能代理(agent)交互、多角色工作流协同等。

核心特性

  • 功能特点:支持循环、持久性和人工干预,适用于复杂的工作流自动化。
  • 技术原理:基于图结构的状态管理,节点和边定义执行顺序,支持条件边和自定义函数。
  • 应用场景:客户服务自动化、数据检索与分析、业务流程自动化等。

二、LangGraph 工作流实现(优化版代码)

1. 安装必要的 npm 包

pnpm add @types/node typescript tsx @langchain/core @langchain/langgraph @langchain/openai
pnpm add -D @types/node typescript

2. 初始化 TypeScript 配置

npx tsc --init

3. 入口文件(index.ts)- 优化后

修正语法错误、补充类型定义、完善注释,确保代码可直接运行,新增异常处理基础逻辑:

import { START, END, Annotation, StateGraph } from '@langchain/langgraph';
import { ChatOpenAI } from '@langchain/openai';

/**
 * 1. 初始化 OpenAI 客户端
 */
const llm = new ChatOpenAI({
  model: 'gpt-3.5-turbo', 
  temperature: 0.7, 
  apiKey: 'your-api-key', // 替换为个人 OpenAI API Key
  configuration: {
    baseUrl: 'https://api.openai.com/v1' // 默认为 OpenAI 官方地址,可根据代理调整
  }
});

/**
 * 2. 定义工作流状态(核心)
 */
const graphState = Annotation.root({
  message: Annotation.string({
    reducer: (a, b) => b ?? a, 
    default: () => ''
  })
});

/**
 * 3. 定义工作流节点(核心逻辑)
 */
const startNode = async (state: typeof graphState.State) => {
  return { message: state.message }; // 传递初始消息,无额外处理
};

const llmNode = async (state: typeof graphState.State) => {
  try {
    const llmResponse = await llm.invoke(state.message);
    return { message: llmResponse.content };
  } catch (error) {
    console.error('LLM 节点执行失败:', error);
    return { message: '生成祝福语失败,请重试' }; // 异常处理,避免工作流中断
  }
};

/**
 * 4. 构建并编译工作流图
 */
const graph = new StateGraph(graphState)
  .addNode('start', startNode) 
  .addNode('llm', llmNode)    
  .addEdge(START, 'start')    
  .addEdge('start', 'llm') 
  .addEdge('llm', END);        

// 编译工作流,生成可调用的应用实例
const app = graph.compile();

/**
 * 5. 调用工作流,传入初始参数
 */
const runWorkflow = async () => {
  const result = await app.invoke({ message: '写个今日的祝福语' });
  console.log('工作流执行完成,结果:', result.message);
};

// 执行工作流
runWorkflow();

5. 运行方式

# 方式1:直接运行(需 tsx 支持)
npx tsx index.ts

# 方式2:先编译为 JS,再运行
npx tsc
node dist/index.js