AIGC 工程化开发实战:从零搭建 Node.js AI 后端项目

16 阅读6分钟

AIGC 工程化开发实战:从零搭建 Node.js AI 后端项目

.env 环境变量管理到 async/await 异步控制,这篇文章带你从零搭建一个完整的 AIGC 后端项目,掌握 AI 工程化的核心流程。

前言

今天课程学习了 AIGC 的工程化开发流程——不再是在 Notebook 里写几行代码做实验,而是搭建一个真正的后端项目,用 async/await 控制异步流程,用 .env 管理敏感配置,用 nodemon 自动重启开发。

这篇文章将完整复盘整个开发流程,帮你从"写脚本"进化到"做工程"。


一、项目初始化:从零开始

1.1 初始化 Node.js 项目

# 初始化项目,生成 package.json
npm init -y

生成的 package.json

{
  "name": "demo1",
  "version": "1.0.0",
  "type": "module",
  "dependencies": {
    "dotenv": "^17.4.2",
    "openai": "^6.39.1"
  }
}

💡 "type": "module" 是关键配置,启用 ES6 模块化方案,支持 import/export 语法。

1.2 安装依赖

# 安装 OpenAI SDK(LLM 调用的事实标准)
npm i openai

# 安装 dotenv(读取 .env 环境变量)
npm i dotenv

📌 pnpm 加速:如果多个项目都用 openai,推荐用 pnpm,通过软链接共享依赖,节省磁盘空间。

npm install -g pnpm
pnpm i openai
pnpm i  # 根据 package.json 自动安装所有依赖

二、ES6 模块化:.mjs vs .js

2.1 为什么需要 .mjs

// ❌ 传统 CommonJS(.js)
const { OpenAI } = require('openai');

// ✅ ES6 模块化(.mjs)
import { OpenAI } from 'openai';
特性.js (CommonJS).mjs (ESM)
语法require / module.exportsimport / export
推出时间Node.js 早期ES6 (2015)
现代化❌ 旧方案✅ 推荐方案

2.2 两种方式启用 ESM

方式一:使用 .mjs 后缀

node index.mjs  # 直接支持 ESM

方式二:配置 package.json

{
  "type": "module"
}

配置后,.js 文件也能使用 import/export

🎯 推荐:新项目直接用 .mjs,语义清晰,一目了然。


三、环境变量管理:.env + .gitignore

3.1 为什么需要 .env

API Key 是敏感信息,绝对不能提交到 Git 仓库!

错误做法 ❌
├── index.mjs
│   const apiKey = "sk-xxx";  ← 硬编码,泄露风险!
└── .git
    └── 提交到远程仓库

正确做法 ✅
├── .env              ← 本地配置文件,不提交
│   DEEPSEEK_API_KEY=sk-xxx
│   DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
├── .gitignore        ← 声明忽略 .env
│   .env
│   node_modules/
└── index.mjs
    const apiKey = process.env.DEEPSEEK_API_KEY;  ← 从环境变量读取

3.2 .env 文件格式

# .env 文件格式
# KEY(大写)= value,换行分隔

DEEPSEEK_API_KEY=sk-XXX
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1

3.3 读取环境变量

// index.mjs
import dotenv from 'dotenv';
import { OpenAI } from 'openai';

// 加载 .env 文件到 process.env
dotenv.config();

const client = new OpenAI({
    apiKey: process.env.DEEPSEEK_API_KEY,
    baseURL: process.env.DEEPSEEK_BASE_URL,
});

3.4 process 是什么?

process 是 Node.js 的全局对象,代表当前运行的进程。

process 对象
├── process.env      ← 环境变量(包含 .env 中的配置)
├── process.argv     ← 命令行参数
├── process.exit()   ← 退出进程
└── ...

node index.mjs 的本质:
操作系统启动一个 Node 进程 → process 对象被创建 → 执行代码

📌 进程(Process) 是操作系统分配资源的最小单位,包括内存、CPU、IO 等。Node.js 程序本质上就是一个进程。


四、异步编程:async/await

4.1 为什么需要 async/await?

// ❌ 回调地狱(旧时代)
client.chat.completions.create({...}, function(err, result) {
    if (err) { ... }
    client.chat.completions.create({...}, function(err, result2) {
        if (err) { ... }
        // ... 嵌套越来越深
    });
});

// ✅ async/await(ES8,现代化)
const result = await client.chat.completions.create({...});
const result2 = await client.chat.completions.create({...});

4.2 async/await 核心语法

// async 修饰函数,表示函数内部有异步操作
const main = async () => {
    console.log('程序开始运行');
    
    // await 等待异步操作完成,"卡住"执行流程
    const result = await client.chat.completions.create({
        model: 'deepseek-chat',
        messages: [{ role: 'user', content: '你好' }],
    });
    
    console.log(result.choices[0].message.content);
    console.log('程序运行结束');
};

main();

4.3 执行流程图解

同步代码 vs 异步代码

同步代码:
console.log('开始') ──▶ 执行 ──▶ console.log('结束')
     │                              │
     └──────── 100ms ───────────────┘

异步代码(API 请求):
console.log('开始') ──▶ 发起请求 ──▶ 不等待,继续执行
     │                    │
     │                    ▼
     │              等待响应(100ms)
     │                    │
     ▼                    ▼
console.log('结束')   await 拿到结果

问题:如果不控制,"结束"会在"拿到结果"之前打印!

async/await 解决:
console.log('开始') ──▶ 发起请求 ──▶ await 等待 ──▶ 拿到结果 ──▶ console.log('结束')
     │                    │              │              │
     └────────────────────┴──────────────┴──────────────┘
     按顺序执行,"结束"一定在"拿到结果"之后

4.4 为什么 AI 项目必须用 async/await?

操作类型执行时间特点
同步代码~1ms立即执行
API 请求~100-3000ms网络IO,耗时不可控
// 没有 await 的问题
const result = client.chat.completions.create({...});  // 发起请求
console.log(result);  // ❌ undefined!请求还没完成

// 有 await 的正确做法
const result = await client.chat.completions.create({...});  // 等待完成
console.log(result);  // ✅ 正常输出

🎯 async/await 的价值:让异步代码看起来像同步代码,可读性更好,同时精确控制执行顺序。


五、完整项目代码

5.1 项目结构

aigc-demo/
├── .env              # 环境变量(不提交到 Git)
├── .gitignore        # Git 忽略规则
├── package.json      # 项目配置
├── package-lock.json # 依赖锁定
└── index.mjs         # 主入口文件

5.2 .gitignore

# .gitignore
.env
node_modules/

5.3 index.mjs 完整代码

import dotenv from 'dotenv';
import { OpenAI } from 'openai';

// 加载环境变量
dotenv.config();

// 实例化 OpenAI 客户端
const client = new OpenAI({
    apiKey: process.env.DEEPSEEK_API_KEY,
    baseURL: process.env.DEEPSEEK_BASE_URL,
});

// 主函数:单点入口
const main = async () => {
    console.log('程序开始运行');
    
    const result = await client.chat.completions.create({
        model: 'deepseek-chat',
        messages: [
            { role: 'user', content: '你好' }
        ],
    });
    
    console.log(result.choices[0].message.content);
    console.log('程序运行结束');
};

main();

5.4 运行项目

# 普通运行
node index.mjs

# 开发模式(文件变化自动重启)
npm i -g nodemon
nodemon index.mjs

💡 nodemon:监听文件变化,保存后自动重启进程,开发必备工具。


六、AIGC 工程化开发流程总结

📚 AIGC 工程化开发流程

1️⃣ 项目初始化
   npm init -y
   └── 生成 package.json

2️⃣ 安装依赖
   pnpm i openai dotenv
   └── openai: LLM 调用 SDK
   └── dotenv: 环境变量管理

3️⃣ 配置环境变量
   ├── .env          ← API Key 等敏感配置
   ├── .gitignore    ← 忽略 .env 和 node_modules
   └── 安全:敏感信息不提交到 Git

4️⃣ 编写主入口
   ├── index.mjs     ← ES6 模块化
   ├── import { OpenAI } from 'openai'
   ├── dotenv.config()
   └── main() 单点入口函数

5️⃣ 异步控制
   ├── async/await   ← 控制 API 请求的执行顺序
   └── 确保代码可读性和执行顺序正确

6️⃣ 开发调试
   └── nodemon index.mjs  ← 自动重启

七、核心概念速查

概念说明
.mjsES6 模块化文件后缀,支持 import/export
processNode.js 全局对象,代表当前进程
process.env环境变量对象,包含 .env 中的配置
dotenv读取 .env 文件到 process.env 的库
async修饰函数,表示函数内有异步操作
await等待异步操作完成,"卡住"执行流程
nodemon开发工具,文件变化自动重启进程
.gitignore声明 Git 忽略的文件/目录

八、从 Notebook 到工程化

维度Notebook(实验)工程化(生产)
代码组织单元格随意执行模块化、单点入口
配置管理硬编码 API Key.env 环境变量
异步控制单元格顺序执行async/await
开发效率手动重新运行nodemon 自动重启
安全性❌ 敏感信息暴露.gitignore 保护
可维护性❌ 难以复用✅ 模块化、可扩展

🚀 工程化的本质:把"能跑"的代码变成"能维护、能扩展、能协作"的项目。


结语

AIGC 工程化开发不是写几行调用 API 的代码,而是搭建一个完整的项目架构:

  • .env 管理敏感配置
  • .gitignore 保护安全
  • async/await 控制异步流程
  • nodemon 提升开发效率

掌握这些基础,你就能从"写脚本做实验"进化到"做工程落地"。

希望这篇文章对你有帮助!如果有任何问题,欢迎在评论区交流。


📌 参考资源


📌 文章标签 Node.js AIGC 工程化 async/await 环境变量 ES6模块化 学习笔记


觉得有收获?点个赞鼓励一下吧!有问题欢迎评论区留言~ 👍