AI 应用开发已经不再是算法工程师的专属。作为一名前端或 Node 开发者,通过几行代码就能调用大模型 API,快速构建属于自己的 AI 工具。但很多刚入门的同学会遇到几个痛点:
- API Key 直接写死在代码里,不小心提交到 GitHub 导致泄露
- 不知道如何管理环境变量
- 搞不清异步和同步,代码执行顺序一团糟
- 模块化方案混乱(CommonJS vs ES Module)
本文将从零开始,带你搭建一个工程化的 Node.js 项目,安全调用大模型 API(以 DeepSeek 为例,兼容 OpenAI),并解释每个环节背后的原理。读完你就能独立写出干净、安全、可维护的 AI 调用代码。
一、项目初始化
首先创建一个新目录,并在终端进入:
mkdir ai-caller
cd ai-caller
执行初始化命令,生成 package.json:
npm init -y
参数 -y 表示使用默认配置,快速生成。
1.1 为什么要 init -y?
package.json是 Node.js 项目的“身份证”,记录了项目名称、依赖、脚本等信息。- 后续安装的第三方包(如
openai、dotenv)会被记录在这个文件中,方便别人克隆你的项目后快速还原环境。
二、保护 API Key:.gitignore + .env
你从大模型平台(如 DeepSeek、OpenAI)获取的 API Key 是一串敏感字符,绝不能提交到 Git 仓库。正确的做法是:
- 在项目根目录创建
.env文件,写入 key 和接口地址 - 创建
.gitignore文件,把.env忽略掉
2.1 创建 .env 文件
# .env
DEEPSEEK_API_KEY=sk-你的真实密钥
DEEPSEEK_BASE_URL=https://api.deepseek.com
注意:
.env文件中的变量名通常用大写字母加下划线,值直接写,不要加引号(除非值本身包含空格)。
2.2 创建 .gitignore
# .gitignore
node_modules/
.env
这样执行 git add . 时,.env 和 node_modules 就不会被暂存。
2.3 名词解析:什么是 process.env?
process是 Node.js 的全局对象,代表当前正在运行的进程。process.env是一个对象,包含了操作系统的环境变量(比如PATH、HOME)。- 我们用
dotenv库把.env文件中的键值对注入到process.env中,这样代码里就能通过process.env.DEEPSEEK_API_KEY读取到密钥。
三、安装依赖
安装两个核心库:openai 和 dotenv。
npm install openai dotenv
3.1 可选:使用 pnpm 加速
pnpm 是一个比 npm 更快的包管理器,它通过硬链接的方式在全局存储一次依赖,不同项目之间共享,节省磁盘空间。
npm install -g pnpm # 全局安装 pnpm
pnpm add openai dotenv
后续用法和 npm 基本一致。
3.2 名词解析:什么是 openai 库?
这个库是 OpenAI 官方提供的 SDK,封装了对 https://api.openai.com/v1/chat/completions 等接口的调用。
而且它支持自定义 baseURL,所以我们可以用它来调用任何兼容 OpenAI 格式的 API(比如 DeepSeek、智谱、通义千问等)。
四、编写代码(ES Module 风格)
Node.js 有多种模块化方案,这里我们使用现代化的 ES Module(即 import/export 语法)。
有两种方式启用 ES Module:
- 文件后缀使用
.mjs - 或者在
package.json中设置"type": "module"
本文采用第一种 .mjs 后缀,更直观。
4.1 创建 index.mjs
// index.mjs
import dotenv from 'dotenv';
import { OpenAI } from 'openai';
// 加载 .env 文件到 process.env
dotenv.config();
// 实例化 OpenAI 客户端(实际指向 DeepSeek)
const client = new OpenAI({
apiKey: process.env.DEEPSEEK_API_KEY,
baseURL: process.env.DEEPSEEK_BASE_URL,
});
// 主函数:异步调用大模型
const main = async () => {
console.log('🚀 程序开始运行...');
// 调用聊天补全 API
const completion = await client.chat.completions.create({
model: 'deepseek-chat',
messages: [
{ role: 'user', content: '请用一句话介绍什么是大模型' }
],
});
// 取出回复内容并打印
const reply = completion.choices[0].message.content;
console.log('🤖 AI 回复:', reply);
console.log('✅ 程序结束');
};
// 执行主函数
main();
4.2 代码逐行解释
-
import dotenv from 'dotenv':导入dotenv库。 -
dotenv.config():读取根目录下的.env文件,把键值对注入process.env。 -
new OpenAI({ apiKey, baseURL }):创建客户端实例。如果不填baseURL,默认指向 OpenAI 官方地址。 -
async function main():定义异步主函数。 -
await client.chat.completions.create(...):create方法会发起 HTTP 请求,并返回一个 Promise(承诺对象)。await关键字会暂停当前async函数的执行,直到 Promise 完成(拿到结果)。- 这样就能保证先拿到回复,再执行后面的打印。
-
completion.choices[0].message.content:标准 OpenAI 响应结构中,回复内容就在这个路径下。
4.3 为什么需要用 async/await?
JavaScript 代码的执行顺序并不总是和书写顺序一致。像 API 请求、文件读取、定时器这类操作属于异步任务,它们不会阻塞后面的代码。如果你这样写:
// ❌ 错误示范
let result = client.chat.completions.create(...); // 这是一个 Promise 对象,不是真正的回复
console.log(result); // 打印出 Promise { <pending> }
await 的作用就是“等一下”,等异步任务完成后再继续。它是处理异步代码最优雅的方式(替代了早期的回调地狱和 .then() 链式调用)。
五、运行项目
使用 Node.js 直接执行 .mjs 文件:
node index.mjs
如果你希望代码文件修改后自动重启(开发时很方便),可以安装 nodemon:
npm install -g nodemon
nodemon index.mjs
你应该会看到类似输出:
🚀 程序开始运行...
🤖 AI 回复: 大模型是指通过海量数据训练得到的、包含巨大参数量(通常在十亿级以上)的深度学习模型,能够理解和生成自然语言、图像等多种内容。
✅ 程序结束
六、工程化要点总结
| 步骤 | 作用 | 关键点 |
|---|---|---|
npm init -y | 初始化项目,生成 package.json | 记录依赖与脚本 |
.gitignore | 防止密钥和依赖被提交 | 必须包含 node_modules/ 和 .env |
.env + dotenv | 安全存储 API Key | 不要硬编码,用 process.env 读取 |
openai SDK | 统一调用接口 | 支持自定义 baseURL,兼容多种模型 |
ES Module (.mjs) | 现代化模块语法 | import/export 比 require 更简洁 |
async/await | 控制异步流程 | 只有 await 才能拿到真实 API 返回 |
七、扩展:如何处理更长的对话?
大模型 API 是无状态的,每次请求需要把历史消息一起传过去。例如实现多轮对话:
const messages = [
{ role: 'system', content: '你是一个乐观的助手' },
{ role: 'user', content: '今天天气不好' },
];
// 调用 API
const completion = await client.chat.completions.create({
model: 'deepseek-chat',
messages: messages,
});
// 把 AI 回复追加到历史
messages.push(completion.choices[0].message);
messages.push({ role: 'user', content: '那该怎么办?' });
// 再次调用...
实际开发中,你可以将 messages 数组存储在变量或数据库中,实现真正的会话管理。
八、常见问题与解答
Q1:为什么我的 console.log(process.env) 看不到自定义变量?
A:确保已经执行了 dotenv.config(),并且 .env 文件和 index.mjs 在同一级目录。
Q2:await 能拦住 setTimeout 吗?
A:不能。await 只等待 Promise。setTimeout 是基于回调的宏任务,不会被 await 阻塞。需要把定时器包装成 Promise 才行。
Q3:我用的不是 DeepSeek,是 OpenAI 怎么办?
A:只需修改 .env 中的 BASE_URL 为官方地址(可以不写,默认就是 OpenAI),API_KEY 换成你的 OpenAI Key。模型名改成 gpt-3.5-turbo 或 gpt-4。
Q4:代码报错 SyntaxError: Cannot use import statement outside a module?
A:说明 Node.js 没有识别你的文件为 ES 模块。解决方法:
- 将文件后缀改为
.mjs,或者 - 在
package.json中添加"type": "module"。
结语
现在你已经掌握了一套完整的 AIGC 后端工程化开发流程:
- 安全配置与读取 API Key
- 使用现代化 ES Module 编写代码
- 利用
async/await优雅处理异步 - 轻松调用任何兼容 OpenAI 格式的大模型 API
接下来你可以尝试:
- 搭建一个简单的命令行对话机器人
- 接入微信公众号或飞书机器人
- 将 AI 回复存储到数据库
记住:好的工程习惯(密钥隔离、模块清晰、异步正确)会让你的 AI 项目跑得更稳、更安全。
如果你觉得这篇文章有帮助,欢迎点赞、收藏、转发~ 有问题可以在评论区留言,我会尽力解答。
本文示例代码已整理,你可以直接复制使用。只需要去 DeepSeek 平台 或 OpenAI 注册获取免费 API Key 即可。