第 4 章:接入大模型:initChatModel 与多模型切换

1 阅读2分钟

第 4 章:接入大模型:initChatModel 与多模型切换

本章目标

这一章让项目真正接入大模型,并设计一个可替换供应商的模型创建方式。

为什么要做多模型切换

小册读者的模型条件不一样。有人用 OpenAI,有人用 Gemini,有人用 Anthropic,有人用 OpenRouter 或国内兼容 OpenAI API 的服务。

如果代码写死:

const model = new ChatOpenAI({ model: "gpt-5.4" });

后面会很难迁移。

更好的方式是封装模型工厂,让业务层只关心“拿到一个 chat model”。

使用 initChatModel

LangChain.js v1 文档推荐可以用 initChatModel 通过模型标识初始化模型。

import { initChatModel } from "langchain";

export async function createChatModel() {
  const modelName = process.env.CHAT_MODEL ?? "openai:gpt-5.4";

  return initChatModel(modelName, {
    temperature: Number(process.env.CHAT_TEMPERATURE ?? 0.2),
    maxRetries: Number(process.env.CHAT_MAX_RETRIES ?? 3),
    timeout: Number(process.env.CHAT_TIMEOUT ?? 30000)
  });
}

环境变量:

CHAT_MODEL=openai:gpt-5.4
CHAT_TEMPERATURE=0.2
CHAT_MAX_RETRIES=3
CHAT_TIMEOUT=30000

测试模型调用

创建 src/app/api/chat-test/route.ts

import { createChatModel } from "@/lib/ai/model";

export async function GET() {
  const model = await createChatModel();
  const result = await model.invoke("用一句话介绍 LangChain.js");

  return Response.json({
    content: result.text
  });
}

访问:

http://localhost:3000/api/chat-test

如果能返回一句介绍,说明模型调用已打通。

消息数组

真实对话一般不是单字符串,而是消息数组:

const result = await model.invoke([
  {
    role: "system",
    content: "你是一个严谨的前端 AI 应用开发导师。"
  },
  {
    role: "user",
    content: "我为什么要学 LangChain.js?"
  }
]);

这个结构会贯穿后续章节。

增加错误处理

模型调用失败时,不能把原始错误全部返回给前端。可以先做一个简单封装:

export function toPublicAIError(error: unknown) {
  if (error instanceof Error) {
    return {
      message: "AI 服务暂时不可用,请稍后重试。",
      detail: process.env.NODE_ENV === "development" ? error.message : undefined
    };
  }

  return {
    message: "AI 服务暂时不可用,请稍后重试。"
  };
}

API Route 中使用:

try {
  const model = await createChatModel();
  const result = await model.invoke("hello");
  return Response.json({ content: result.text });
} catch (error) {
  return Response.json(toPublicAIError(error), { status: 500 });
}

实战任务

这一章的交付物:

  • createChatModel 模型工厂
  • CHAT_MODEL 环境变量
  • 一个模型测试接口
  • 基础错误处理函数

常见坑

不要把 API Key 返回给前端。

不要在每个业务函数里复制模型初始化代码。

不要忽略超时和重试配置。AI 接口比普通业务接口更容易出现慢响应、限流和网络波动。

本章小结

模型接入完成后,我们有了 AI 应用的推理核心。下一章开始做第一个聊天页面。