Node.js 使用 OpenAI 的完整指南:从入门到实战
OpenAI 提供了一系列大模型(如gpt-4ogpt-4.1对话生成:和 ChatGPT 一样的聊天体验文本处理:摘要、翻译、改写、提取关键词编程辅助:解释代码、调试、生成函数推理能力:部分模型支持 reasoning mode,可以输出推理过程在 Node.js 中,我们可以通过官方的openai npm 包进行调用,非常适合做后端接口服务。流式传输要设置好 SSE 响应头:否则前端无法实时接
人工智能正逐渐融入我们的日常开发中。作为前端或全栈开发者,你可能已经在使用 ChatGPT,但更进一步的需求是:如何在自己的项目里接入 OpenAI,让用户直接享受到 AI 的能力?
本文将从 基础概念 到 实战案例,带你一步步用 Node.js 搭建一个可用的 AI 对话接口,并结合实际经验给出优化建议。
一、OpenAI 简介
OpenAI 提供了一系列大模型(如 gpt-4o, gpt-4.1 等),能够处理:
-
对话生成:和 ChatGPT 一样的聊天体验
-
文本处理:摘要、翻译、改写、提取关键词
-
编程辅助:解释代码、调试、生成函数
-
推理能力:部分模型支持 reasoning mode,可以输出推理过程
在 Node.js 中,我们可以通过官方的 openai npm 包 进行调用,非常适合做后端接口服务。
二、准备工作
1. 安装依赖
npm install openai express dotenv
2. 配置环境变量
在项目根目录下新建 .env 文件:
OPENAI_API_KEY=你的OpenAI密钥
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o
这样就可以在代码中通过 process.env 读取,不需要把 key 写死在代码里。
3. 初始化 OpenAI 实例
import OpenAI from "openai";
let openai = null;
function getOpenAIInstance() {
if (!openai) {
openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_BASE_URL,
});
}
return openai;
}
这样写的好处是:懒加载(延迟初始化),只在第一次调用时创建实例。
三、OpenAI npm 包常见用法
1. 简单对话
const response = await getOpenAIInstance().chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: "你是一个有帮助的助手。" },
{ role: "user", content: "帮我写一个正则表达式匹配邮箱。" }
],
});
console.log(response.choices[0].message.content);
返回结果会是模型生成的回复。
2. 流式响应(SSE)
在实际应用中,我们希望像 ChatGPT 那样“边生成边显示”。这时可以启用 stream: true:
const stream = await getOpenAIInstance().chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "写一篇关于未来城市的科幻短文" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
这种方式在前端结合 Server-Sent Events (SSE),就能实现实时输出。
3. 推理模式(Reasoning Mode)
部分模型支持推理输出,返回 reasoning_content 字段,帮助你理解模型的思考过程。
const stream = await getOpenAIInstance().chat.completions.create({
model: "gpt-4.1",
messages: [{ role: "user", content: "为什么天空是蓝色的?" }],
stream: true,
});
for await (const chunk of stream) {
const reasoning = chunk.choices[0]?.delta?.reasoning_content || "";
const content = chunk.choices[0]?.delta?.content || "";
if (reasoning) console.log("[推理过程]:", reasoning);
if (content) console.log("[回答]:", content);
}
四、实战案例:基于 Express 的 AI 对话接口
下面给出一个完整的实战案例:
功能点:
-
接收前端发送的用户消息
-
调用 OpenAI 模型,返回流式数据
-
保存对话历史到本地 JSON 文件
-
自动生成对话标题(比如“正则表达式助手”)
代码示例:
import express from "express";
import OpenAI from "openai";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const router = express.Router();
// 路径工具
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const DATA_DIR = path.join(__dirname, "..", "data");
const CONVERSATIONS_DIR = path.join(DATA_DIR, "conversations");
// 确保目录存在
if (!fs.existsSync(DATA_DIR)) fs.mkdirSync(DATA_DIR);
if (!fs.existsSync(CONVERSATIONS_DIR)) fs.mkdirSync(CONVERSATIONS_DIR);
// OpenAI 实例
let openai = null;
function getOpenAIInstance() {
if (!openai) {
openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_BASE_URL,
});
}
return openai;
}
const systemPrompt = "你是一个名为 小李 的智能助手。";
router.post("/summarize", async (req, res) => {
try {
const { text, conversationId } = req.body;
const selectedModel = process.env.OPENAI_MODEL || "gpt-4o";
// SSE 响应头
res.setHeader("Content-Type", "text/event-stream");
res.setHeader("Cache-Control", "no-cache");
res.setHeader("Connection", "keep-alive");
let messages = [
{ role: "system", content: systemPrompt },
{ role: "user", content: text },
];
// 调用 OpenAI
const stream = await getOpenAIInstance().chat.completions.create({
model: selectedModel,
messages,
stream: true,
});
let fullContent = "";
// 流式输出
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || "";
fullContent += content;
if (content) {
res.write(`data: ${JSON.stringify({ content })}\n\n`);
}
}
// 保存对话
if (conversationId) {
const filePath = path.join(CONVERSATIONS_DIR, `${conversationId}.json`);
let conversation = { id: conversationId, messages: [] };
if (fs.existsSync(filePath)) {
conversation = JSON.parse(fs.readFileSync(filePath, "utf8"));
}
conversation.messages.push({ role: "user", content: text });
conversation.messages.push({ role: "ai", content: fullContent });
fs.writeFileSync(filePath, JSON.stringify(conversation, null, 2));
}
res.write("data: [DONE]\n\n");
res.end();
} catch (error) {
console.error("请求失败:", error);
res.status(500).json({ error: error.message });
}
});
export default router;
五、实战经验总结
在实现过程中,有一些关键经验值得注意:
-
流式传输要设置好 SSE 响应头:否则前端无法实时接收数据。
-
消息历史要做截断:每次对话不要无限增长,控制在 10 条以内,避免 token 超限。
-
对话存储机制:简单方案是 JSON 文件,更专业可以接数据库(MongoDB、Postgres)。
-
标题生成:首次对话时,可以用轻量模型帮用户生成简短标题,体验更好。
-
容错机制:比如标题生成失败时,直接用用户输入的前 15 个字作为兜底。
六、结语
通过本文,你已经了解了如何在 Node.js 项目中使用 OpenAI,从最基础的调用到流式对话,再到完整的实战案例。
这套模式可以轻松扩展到:
-
前端聊天应用(React/Vue/Next.js)
-
知识问答机器人
-
代码助手
-
企业内部文档搜索
未来我们还可以结合语音、图片输入,进一步打造多模态 AI 应用。
更多推荐
所有评论(0)