LLM 节点集成

将大语言模型引入你的工作流,构建智能节点

📚 学习目标

学完这篇文章后,你将能够:

  • 在图节点中实例化和调用 LLM(大语言模型)
  • 编写 异步(Async) 节点函数
  • 使用 LangChain Messages(HumanMessage, AIMessage)与模型交互
  • 实现简单的内容生成与审核工作流

前置知识

在开始学习之前,建议先阅读:


1️⃣ 引入大脑:实例化 LLM

LangGraph 与 LangChain 生态完美集成。我们使用 ChatOpenAI 类来连接大模型。

import { ChatOpenAI } from '@langchain/openai';

// 实例化模型
// 这里可以使用任何兼容 OpenAI 接口的模型,如 gpt-4, qwen3-max 等
const llm = new ChatOpenAI({
    model: 'qwen3-max', // 或 'gpt-4o'
    apiKey: process.env.OPENAI_API_KEY // 通常从环境变量自动读取
});

2️⃣ 异步节点(Async Nodes)

调用大模型是一个网络请求过程,因此我们的节点函数必须是异步的 (async/await)。

import { HumanMessage } from '@langchain/core/messages';

/**
 * 输入处理节点:调用 LLM 生成内容
 */
const inputNode = async (state: typeof StateAnnotation.State) => {
    // 1. 构造消息:将输入包装为 HumanMessage
    const messages = [new HumanMessage(state.input)];
    
    // 2. 调用模型:等待响应
    const response = await llm.invoke(messages);
    
    // response.content 包含模型的回复文本
    return {
        output: response.content,
        // ...其他状态更新
    }
}

代码解析

  • HumanMessage: 代表用户的输入。
  • llm.invoke(): 发送消息并等待模型回复。返回的是 AIMessage 对象。

3️⃣ 多节点协作:生成与审核

一个常见的模式是将复杂的任务拆分为多个步骤。例如,一个节点负责生成内容,另一个节点负责审核内容。

生成节点

const generationNode = async (state: typeof StateAnnotation.State) => {
    const res = await llm.invoke([new HumanMessage(state.input)]);
    return { output: res.content };
}

审核节点

审核节点会将上一步的输出 (state.output) 作为输入,要求 LLM 进行检查。

const validationNode = async (state: typeof StateAnnotation.State) => {
    // 构造 prompt,将待审核内容嵌入其中
    const prompt = `请检查以下内容是否有违禁词,直接回答"有"或"没有":${state.output}`;
    
    const res = await llm.invoke([new HumanMessage(prompt)]);
    
    return {
        validationResult: res.content
    }
}

组装图

const graph = new StateGraph(StateAnnotation)
    .addNode('generate', generationNode)
    .addNode('validate', validationNode)
    .addEdge(START, 'generate')
    .addEdge('generate', 'validate')
    .addEdge('validate', END)
    .compile();

下面的 Mermaid 图展示了这个流程:

💡 练习题

  1. 修改题:修改 validationNode,如果审核通过,在 output 后面追加 " [Verified]";如果审核不通过,将其清空。
  2. 思考:为什么我们要把生成和审核分开成两个节点,而不是在一个节点里做完?(参考答案:模块化、更清晰的逻辑分离、方便独立测试和调试、更好的容错性)。

📚 参考资源

项目代码


✅ 总结

核心要点

  • 节点函数可以是 async 的,这使得网路请求(如 LLM 调用)成为可能。
  • 使用 HumanMessageAIMessage 等结构化对象与模型交互。
  • 通过链式组合多个 LLM 节点,可以构建复杂的处理流水线(Pipeline)。

下一步:目前的图都是线性执行的。在下一篇文章《流程控制与路由》中,我们将学习如何根据条件让图走不同的路径,甚至实现循环和并行执行。

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page