人工智能正逐渐融入我们的日常开发中。作为前端或全栈开发者,你可能已经在使用 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 对话接口

下面给出一个完整的实战案例:

功能点

  1. 接收前端发送的用户消息

  2. 调用 OpenAI 模型,返回流式数据

  3. 保存对话历史到本地 JSON 文件

  4. 自动生成对话标题(比如“正则表达式助手”)

代码示例:

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;

五、实战经验总结

在实现过程中,有一些关键经验值得注意:

  1. 流式传输要设置好 SSE 响应头:否则前端无法实时接收数据。

  2. 消息历史要做截断:每次对话不要无限增长,控制在 10 条以内,避免 token 超限。

  3. 对话存储机制:简单方案是 JSON 文件,更专业可以接数据库(MongoDB、Postgres)。

  4. 标题生成:首次对话时,可以用轻量模型帮用户生成简短标题,体验更好。

  5. 容错机制:比如标题生成失败时,直接用用户输入的前 15 个字作为兜底。

六、结语

通过本文,你已经了解了如何在 Node.js 项目中使用 OpenAI,从最基础的调用到流式对话,再到完整的实战案例。

这套模式可以轻松扩展到:

  • 前端聊天应用(React/Vue/Next.js)

  • 知识问答机器人

  • 代码助手

  • 企业内部文档搜索

未来我们还可以结合语音、图片输入,进一步打造多模态 AI 应用。

Logo

更多推荐