AIGC 工程化入门:从零搭建你的第一个 AI 应用 -- 以 DeepSeek API 为例,带你走通大模型应用开发的完整链路

0 阅读8分钟

前言

2026 年,AIGC 早已不再是概念验证阶段,而是进入了工程化落地的深水区。但对于很多前端或初学者来说,"调用大模型 API"这件事仍然蒙着一层神秘面纱——API Key 怎么管理?Node.js 项目从哪开始?异步调用怎么处理?

本文将以一个最小化的 Demo 为例,带你从 npm init 开始,一步步搭建一个调用大模型 API 的 Node.js 后端项目。麻雀虽小,五脏俱全——你会贯穿环境配置、依赖管理、异步编程、工程化工作流等实际开发中绕不开的知识点。

本文适合以下读者:

  • 想入门 AIGC 开发但不知从何下手的前端工程师
  • 对 Node.js 后端开发感兴趣的学习者
  • 希望快速跑通一个大模型 API 调用 Demo 的任何人

读完这篇文章,你将能够独立搭建一个可运行的 AI 应用骨架,并理解其中每一个环节的原理和最佳实践。

image.png

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

1.1 npm init —— 一切从 package.json 开始

AIGC 项目/Agent 项目几乎都是后端项目,第一步永远是初始化:

npm init -y

这条命令会生成 package.json,它是整个项目的"身份证"——记录了项目名、版本、依赖包、脚本命令等信息。-y 参数表示跳过交互式问答,全部使用默认值,快速完成初始化。

初始化完成后,你的项目目录下会多出一个 package.json 文件,内容大致如下:

{
  "name": "demo1",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

看起来平平无奇,但它是一切后续操作的基石——后面的依赖安装、脚本运行、模块类型声明全都围绕它展开。

image.png

1.2 安装依赖:openai 是事实标准

我们需要两个核心依赖:

npm i openai dotenv

这里有一个重要的认知:openai 这个 npm 包早已不只是 OpenAI 的专属客户端——它已成为调用大语言模型 API 的事实标准。各大模型厂商(DeepSeek、通义千问、Moonshot 等)都兼容 OpenAI 的 API 格式,你只需在实例化时指定不同的 baseURL,就能用同一套代码调用不同厂商的模型。

如果你嫌 npm 安装太慢、太占磁盘空间,可以试试 pnpm

npm install -g pnpm
pnpm i openai dotenv

pnpm 的核心优势是全局存储 + 硬链接:同一个版本的包在磁盘上只存一份,不同项目通过符号链接共享,极大节省了磁盘空间和安装时间。装一次,到处可用——这是 pnpm 相比 npm/yarn 最本质的区别。

为什么推荐在 AI 项目中使用 pnpm?随着 AIGC 项目的依赖越来越复杂(openai、langchain、向量数据库客户端……),node_modules 动辄几百 MB,pnpm 能帮你省下大量磁盘空间,而且安装速度更快。

包管理器特点
npmNode.js 自带,兼容性最好
yarn早期提升了安装速度
pnpm磁盘效率最高,严格依赖隔离

二、API Key 安全管理:永远不要把密钥提交到 Git

2.1 .env —— 环境变量的配置文件

API Key 是你调用大模型服务的"钥匙",一旦泄露,别人就能以你的名义疯狂调用,轻则欠费,重则数据泄露。所以我们的第一条铁律就是:

API Key 绝不能提交到 Git 仓库。

做法很简单 —— API Key 写在 .env 文件里:

DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
DEEPSEEK_API_BASE_URL=https://api.deepseek.com/v1

格式要求:

  • 键名用大写 + 下划线(约定俗成)
  • = 分隔,不要加引号或空格
  • 一行一个变量

2.2 .gitignore —— 告诉 Git 哪些文件不要管

有了 .env,接下来要在 .gitignore 中声明忽略它。在项目根目录创建一个 .gitignore 文件,写入:

node_modules/
.env

这样 Git 就会自动跳过这两个目录/文件。

为什么要分别忽略它们?node_modules 是依赖安装的产物,体积巨大(几百 MB),但它可以由 package.jsonnpm install 随时还原,没必要提交。.env 则是因为包含敏感信息——一旦提交到公开仓库,你的 API Key 就可能被爬虫抓取并滥用。记住两条原则:

  • .env 本地跑,远程不提交
  • node_modules 通过 package.json + npm install 就能还原,不需要提交

image.png

2.3 dotenv 是如何工作的?

import dotenv from 'dotenv'
dotenv.config()

dotenv.config() 干了什么?很简单:

  1. 找到项目根目录下的 .env 文件
  2. 逐行解析 KEY=VALUE
  3. 把解析结果注入到 Node.js 的 process.env 对象上

之后你的代码里通过 process.env.DEEPSEEK_API_KEY 就能拿到密钥了。

process 是 Node.js 的全局进程对象——你每执行一次 node index.mjs,操作系统就创建一个进程,分配 CPU、内存、IO 等资源,而 process 就是 Node 暴露给你操作这个进程的入口对象。


三、编写核心代码:调用 Chat Completion API

3.1 .mjs 是什么?

你可能注意到了,我们的入口文件叫 index.mjs 而不是 index.js.mjs 代表 Module JS,是 ES6 推出的现代化模块方案,支持 import / export 语法。

如果你想继续用 .js 后缀,只需在 package.json 里加一行:

{
  "type": "module"
}

本文的 demo1 采用的就是这种方式(见 package.json 第 12 行)。

3.2 实例化 Client + 调用 API

核心代码其实只有十几行:

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

dotenv.config()

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

const main = async () => {
  console.log('程序开始运行')
  const result = await client.chat.completions.create({
    model: 'deepseek-chat',
    messages: [
      {
        role: 'user',
        content: 'hello',
      },
    ],
  })
  console.log(result.choices[0].message.content)
  console.log('程序结束')
}

main()

代码结构非常清晰:

步骤代码说明
① 导入依赖import ... from ...加载 dotenv 和 openai
② 加载环境变量dotenv.config()把 .env 注入进程
③ 实例化客户端new OpenAI({...})绑定 API Key 和目标地址
④ 发送请求client.chat.completions.create(...)调用大模型的对话接口
⑤ 解析结果result.choices[0].message.content提取模型返回的文本

3.3 async/await:控制异步执行顺序

JS 代码的编写顺序执行顺序有时候并不一样。像 setTimeout、API 请求这些操作是异步的——它们不会阻塞后面的代码,而是在"未来某个时刻"才返回结果。

// ❌ 如果不加 await,result 拿到的是一个 Promise 对象,不是真正的结果
const result = client.chat.completions.create(...)
console.log(result) // Promise { <pending> }

// ✅ 加上 await,代码会"卡"在这一行,等 API 返回后才继续
const result = await client.chat.completions.create(...)
console.log(result) // 真正的返回数据

async/await 是 ES8 引入的语法糖,它让你用同步的写法写异步代码,可读性和维护性都大幅提升。核心原则:

  • 函数前加 async 修饰符,告诉引擎"这个函数里有异步操作"
  • 异步调用前加 await,代码会暂停在这一行,等结果返回后再往下走
  • 错误处理用 try/catch 包裹,避免未捕获的 Promise 异常导致进程崩溃
// 完整的 async/await + 错误处理示范
const main = async () => {
  try {
    const result = await client.chat.completions.create({
      model: 'deepseek-chat',
      messages: [{ role: 'user', content: '你好' }],
    })
    console.log(result.choices[0].message.content)
  } catch (error) {
    console.error('调用失败:', error.message)
  }
}

顺便提一句:.chat.completions.create() 这个命名并不是随便起的。Chat Completion 是 OpenAI 定义的标准对话接口,"Chat"表示对话场景,"Completion"表示文本补全,"Create"表示创建一次调用。理解这个命名体系后,你再看官方文档就会豁然开朗。

image.png


四、开发效率必备:nodemon

每次改了代码都要手动 Ctrl+C 停掉进程、再 node index.mjs 重启,非常影响开发体验。nodemon 就是来解决这个问题的:

npm install -g nodemon

# 用 nodemon 替代 node 启动
nodemon index.mjs

nodemon 会监听文件变化,自动重启 Node 进程——你改完代码保存,终端立刻就能看到最新效果。这个工具已经成为 Node.js 开发的标准配置。

一个小技巧:你也可以把 nodemon 命令写进 package.json 的 scripts 里:

{
  "scripts": {
    "dev": "nodemon index.mjs"
  }
}

之后只需要 npm run dev 就能启动,不必每次都敲完整命令。

进阶推荐:如果你追求更快的启动速度,可以了解 tsx(TypeScript Execute)——它基于 esbuild,比 nodemon 快一个数量级,而且原生支持 TypeScript。


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

回顾整个开发链路,一个标准的 AIGC 项目启动流程可以归纳为以下几步:

① npm init -y              → 初始化 Node 项目
② pnpm i openai dotenv     → 安装核心依赖
③ 创建 .env + .gitignore   → 管理 API Key,配置 Git 忽略规则
④ 创建 main.mjs            → 单点入口文件
⑤ 实现 main() 函数         → 单点入口函数,串联完整调用链路
⑥ 调用 chat.completions    → 用 async/await 控制异步流程
⑦ nodemon 启动             → 热重载,提升开发效率

这就是一个 AIGC 工程的最小可行骨架。在此基础之上,你可以扩展出:

  • 多轮对话:在 messages 数组里追加历史记录
  • 流式输出:设置 stream: true,实现打字机效果
  • Function Calling:让模型调用你的自定义函数
  • RAG:外挂知识库,让模型回答私有数据

image.png


写在最后

AI 时代,调用大模型的能力正在从一个"高级技能"变成一项"基础素养"。本文从最朴素的 npm init 开始,带你走完了环境配置、密钥管理、API 调用、异步控制的完整链路。掌握了这些,你就有了进入 AIGC 工程化世界的第一把钥匙。

下一步建议:把 model 换成别的模型试试,或者给 messages 多加几轮对话——动手是最好的学习方式。