第 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 应用的推理核心。下一章开始做第一个聊天页面。