使用Node.js調(diào)用DeepSeek大模型API的完整實(shí)戰(zhàn)教程
前言:為什么每個(gè)開發(fā)者都應(yīng)該學(xué)會(huì)調(diào)用大模型 API?
2024 年以來,大模型(LLM)徹底改變了軟件開發(fā)的方式。從 ChatGPT 到 DeepSeek,AI 能力正在變成像數(shù)據(jù)庫、緩存一樣的基礎(chǔ)設(shè)施。調(diào)用大模型 API 不再是算法工程師的專利,而是每個(gè)后端/全棧開發(fā)者的必備技能。
本文將從零開始,帶你完成:
- 初始化一個(gè) Node.js AI 項(xiàng)目
- 安全管理 API Key
- 使用 OpenAI SDK(事實(shí)標(biāo)準(zhǔn))調(diào)用 DeepSeek API
- 理解 async/await 異步流程控制
- 掌握 AIGC 工程化的核心套路
讀完本文,你將能夠把大模型能力集成到任何 Node.js 項(xiàng)目中。
本文基于英偉達(dá) AI 證書課程中的實(shí)戰(zhàn)環(huán)節(jié)整理,適合有一定 JavaScript 基礎(chǔ)、想快速上手 AI 開發(fā)的工程師。

一、項(xiàng)目初始化:AI 項(xiàng)目本質(zhì)是后端項(xiàng)目
首先要明確一個(gè)認(rèn)知:AI 項(xiàng)目 / Agent 項(xiàng)目,幾乎都是后端項(xiàng)目。 大模型運(yùn)行在云端,你的代碼負(fù)責(zé)組織 prompt、調(diào)用 API、處理返回結(jié)果。這和傳統(tǒng)的 Web 后端開發(fā)沒有本質(zhì)區(qū)別。
1.1 初始化 Node 項(xiàng)目
mkdir ai-demo && cd ai-demo npm init -y
執(zhí)行后生成 package.json,項(xiàng)目骨架就搭好了。
1.2 安裝依賴
npm install openai dotenv
兩個(gè)核心依賴:
| 依賴 | 作用 |
|---|---|
openai | OpenAI 官方 SDK,已成為調(diào)用各大模型 API 的事實(shí)標(biāo)準(zhǔn) |
dotenv | 從 .env 文件加載環(huán)境變量到 process.env |
關(guān)于包管理器:推薦使用 pnpm。它通過硬鏈接+軟鏈接的方式復(fù)用磁盤空間,多個(gè)項(xiàng)目共享同一份依賴。安裝一次,全局可用:
npm install -g pnpm pnpm install openai dotenv
二、API Key 的安全管理
2.1 核心原則:密鑰絕對(duì)不能提交到 Git
API Key 就是你的數(shù)字身份,泄露意味著別人可以盜刷你的額度。所以第一件事就是配置 .gitignore:
echo ".env" >> .gitignore echo "node_modules" >> .gitignore
.gitignore 告訴 Git 哪些文件不需要版本控制:
# .gitignore node_modules/ .env
2.2 .env 文件:環(huán)境變量的配置中心
創(chuàng)建 .env 文件,存放你的 API 密鑰:
# .env 文件格式:KEY=VALUE(大寫 + 等號(hào) + 值) DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
格式規(guī)則就兩條:
- KEY 用大寫,這是社區(qū)約定
KEY=VALUE,每行一個(gè),不要加引號(hào)
.env 留在本地跑,.gitignore 保證遠(yuǎn)程不提交。本地和遠(yuǎn)程的邊界清晰分離。
2.3 dotenv 如何工作?
import dotenv from 'dotenv'; dotenv.config(); // 這行代碼做了什么? console.log(process.env.DEEPSEEK_API_KEY); // sk-xxx...
dotenv.config() 的執(zhí)行流程:
graph LR
A[.env 文件] -->|dotenv.config 讀取| B[解析 KEY=VALUE]
B -->|注入| C[process.env 對(duì)象]
C -->|業(yè)務(wù)代碼讀取| D[new OpenAI apiKey]
一句話:dotenv 把 .env 文件的內(nèi)容讀出來,掛載到 process.env 對(duì)象上,之后你的代碼就可以通過 process.env.XXX 訪問了。
三、深入理解 process:操作系統(tǒng)的核心概念
在繼續(xù)之前,有必要搞清楚 process.env 中的 process 到底是什么。
3.1 什么是進(jìn)程?
當(dāng)你在終端執(zhí)行:
node index.mjs
操作系統(tǒng)會(huì)做一件事:啟動(dòng)一個(gè)進(jìn)程。這個(gè)進(jìn)程是程序的一次執(zhí)行實(shí)例,操作系統(tǒng)為它分配三大資源:
┌─────────────────────────┐ │ 進(jìn)程 │ ├─────────────────────────┤ │ ?? 內(nèi)存空間(堆、棧) │ │ ?? CPU 時(shí)間片 │ │ ?? 文件描述符(IO) │ └─────────────────────────┘
進(jìn)程是操作系統(tǒng)分配資源的最小單位。 Node.js 把這個(gè)操作系統(tǒng)進(jìn)程封裝成了一個(gè)全局對(duì)象——process。
3.2 process.env 是什么?
process.env 是一個(gè)包含所有環(huán)境變量的對(duì)象。環(huán)境變量從哪里來?
- 操作系統(tǒng)級(jí)別的:系統(tǒng)啟動(dòng)時(shí)設(shè)置的環(huán)境變量
- Shell 級(jí)別的:終端會(huì)話中
export的變量 - dotenv 注入的:從
.env文件讀進(jìn)來的
// process 是全局對(duì)象,任何文件中都能直接訪問 console.log(process.env.HOME); // 用戶主目錄 console.log(process.env.PATH); // 系統(tǒng)路徑 console.log(process.env.DEEPSEEK_API_KEY); // 你的 API Key(dotenv 注入的)
關(guān)鍵理解:進(jìn)程=資源容器,環(huán)境變量=傳給進(jìn)程的配置參數(shù)。你寫配置在 .env,dotenv 讀進(jìn)來放到 process.env,代碼再從 process.env 取出來用——這是一條標(biāo)準(zhǔn)的數(shù)據(jù)流向。
四、ES6 模塊化:為什么用 .mjs 后綴?
4.1 兩種模塊化方案
JavaScript 的模塊化經(jīng)歷了漫長(zhǎng)的演進(jìn),最終 ES6(ES2015)推出了官方標(biāo)準(zhǔn)——ESM(ES Modules):
// ESM 寫法 —— 現(xiàn)代標(biāo)準(zhǔn)
import { OpenAI } from 'openai';
import dotenv from 'dotenv';
// CommonJS 寫法 —— 舊時(shí)代遺留
const { OpenAI } = require('openai');
const dotenv = require('dotenv');4.2 .mjs vs .js
Node.js 中 .mjs 后綴的含義是 Module JS——明確告訴 Node 這個(gè)文件使用 ESM 規(guī)范。
如果你更喜歡 .js 后綴,可以在 package.json 中聲明:
{
"type": "module"
}這樣項(xiàng)目中所有 .js 文件都默認(rèn)以 ESM 方式解析。
注意:如果你的 package.json 中寫的是 "type": "commonjs"(本文示例項(xiàng)目就是這樣),又想用 import 語法,就用 .mjs 后綴。.mjs 始終是 ESM,不受 package.json 影響。
五、核心實(shí)戰(zhàn):調(diào)用 DeepSeek Chat Completion API

5.1 完整代碼
// index.mjs
import dotenv from 'dotenv';
import { OpenAI } from 'openai';
dotenv.config();
// 實(shí)例化客戶端
const client = new OpenAI({
apiKey: process.env.DEEPSEEK_API_KEY,
baseURL: process.env.DEEPSEEK_BASE_URL,
});
const main = async () => {
console.log('?? 程序開始運(yùn)行');
const result = await client.chat.completions.create({
model: 'deepseek-chat',
messages: [
{ role: 'user', content: '你好,請(qǐng)介紹一下你自己' }
]
});
console.log(result.choices[0].message.content);
console.log('? 程序結(jié)束');
};
main();5.2 逐行解析
實(shí)例化客戶端
const client = new OpenAI({
apiKey: process.env.DEEPSEEK_API_KEY,
baseURL: process.env.DEEPSEEK_BASE_URL,
});為什么 baseURL 指向 DeepSeek? OpenAI SDK 默認(rèn)請(qǐng)求 https://api.openai.com,但 DeepSeek、通義千問、Moonshot 等國產(chǎn)模型都兼容 OpenAI 的 API 格式。改一個(gè) baseURL,就能用同一套 SDK 調(diào)用不同廠商的模型。 這就是 OpenAI SDK 成為"事實(shí)標(biāo)準(zhǔn)"的原因。
發(fā)送聊天請(qǐng)求
const result = await client.chat.completions.create({
model: 'deepseek-chat',
messages: [
{ role: 'user', content: '你好,請(qǐng)介紹一下你自己' }
]
});messages 數(shù)組是 Chat Completion API 的核心。每條消息由兩個(gè)字段組成:
| 字段 | 說明 |
|---|---|
role | 角色:system(系統(tǒng)指令)、user(用戶)、assistant(AI) |
content | 消息內(nèi)容 |
多輪對(duì)話就是在 messages 數(shù)組中追加歷史消息:
messages: [
{ role: 'system', content: '你是一個(gè)經(jīng)驗(yàn)豐富的后端工程師' },
{ role: 'user', content: 'Node.js 如何處理高并發(fā)?' },
{ role: 'assistant', content: 'Node.js 采用事件驅(qū)動(dòng)...' },
{ role: 'user', content: '那和 Go 的協(xié)程比呢?' } // 新一輪問題
]六、深入理解 async/await:掌控異步執(zhí)行順序
6.1 問題的根源
JavaScript 是單線程的,但網(wǎng)絡(luò)請(qǐng)求是耗時(shí)的??催@段代碼:
console.log('1. 開始');
setTimeout(() => {
console.log('3. 1秒后執(zhí)行');
}, 1000);
console.log('2. 結(jié)束');輸出是 1 → 2 → 3,和你寫的順序不同!JS 代碼的編寫順序和執(zhí)行順序有時(shí)候不同。 這是因?yàn)?setTimeout 是異步任務(wù)——它不會(huì)阻塞主線程,而是被丟到任務(wù)隊(duì)列中等待執(zhí)行。
API 請(qǐng)求同理——一個(gè) Chat API 調(diào)用可能需要幾百毫秒甚至幾秒,如果同步阻塞,整個(gè)程序就卡住了。
6.2 async/await 的魔法
async/await 解決的核心問題:讓異步代碼看起來像同步代碼,同時(shí)不阻塞事件循環(huán)。
const main = async () => {
console.log('1. 程序開始');
// await 會(huì)"卡住"這一行,等待 API 返回結(jié)果后繼續(xù)執(zhí)行
const result = await client.chat.completions.create({
model: 'deepseek-chat',
messages: [{ role: 'user', content: 'hello' }]
});
// 這行代碼在 API 返回后才執(zhí)行
console.log('2. AI 回復(fù):', result.choices[0].message.content);
setTimeout(() => {
console.log('4. 1秒后執(zhí)行');
}, 1000);
console.log('3. 程序結(jié)束');
};
main();執(zhí)行順序:1 → (等待API返回) → 2 → 3 → 4
async 修飾符告訴引擎"這個(gè)函數(shù)包含異步操作",await 在后面等待 Promise 完成,拿到結(jié)果后才繼續(xù)往下執(zhí)行。
6.3 對(duì)比:回調(diào)地獄 vs async/await
// ? 回調(diào)地獄 —— 嵌套地獄,難以閱讀
client.chat.completions.create({...}, (err, result1) => {
if (err) return;
client.chat.completions.create({...}, (err, result2) => {
if (err) return;
client.chat.completions.create({...}, (err, result3) => {
// 越來越多層...
});
});
});
// ? async/await —— 扁平化,像讀小說一樣
const result1 = await client.chat.completions.create({...});
const result2 = await client.chat.completions.create({...});
const result3 = await client.chat.completions.create({...});async/await 最大的價(jià)值不是性能,而是代碼可讀性。 你寫代碼時(shí)按照"先做A,再做B,然后做C"的人類思維,而不是"注冊(cè)回調(diào),等通知"的機(jī)器思維。
七、開發(fā)工具提效
7.1 nodemon:自動(dòng)重啟
每次改代碼都要手動(dòng) node index.mjs 很煩人。nodemon 監(jiān)聽文件變化,自動(dòng)重啟進(jìn)程:
npm install -g nodemon nodemon index.mjs
保存文件 → 自動(dòng)重啟 → 看到效果。開發(fā)體驗(yàn)直接上一個(gè)臺(tái)階。
7.2 完整項(xiàng)目結(jié)構(gòu)
ai-demo/ ├── .env # API Key(不提交) ├── .gitignore # 聲明忽略文件 ├── package.json # 項(xiàng)目配置 ├── index.mjs # 入口文件 └── node_modules/ # 依賴(不提交)
八、AIGC 工程化開發(fā)流程總結(jié)
通過以上實(shí)戰(zhàn),可以提煉出 AI 項(xiàng)目的通用開發(fā)模式:

核心套路就八個(gè)步驟:
npm init -y→ 項(xiàng)目初始化pnpm install→ 裝依賴(openai + dotenv)- 配置
.env→ API Key 留在本地 - 配置
.gitignore→ 保證 Key 不上傳 - 實(shí)例化
client→ 指定baseURL+apiKey - 編寫
main函數(shù) → 單點(diǎn)入口,統(tǒng)一管理 async/await→ 控制異步執(zhí)行順序- 處理
result.choices[0].message.content→ 取到 AI 回復(fù)
記住這個(gè)模式。無論是調(diào)用 DeepSeek、OpenAI、通義千問,還是做 RAG、Agent、Function Calling,基礎(chǔ)骨架都是這八步。變的是 prompt 復(fù)雜度和業(yè)務(wù)邏輯,不變的是這個(gè)流程。
九、進(jìn)階方向
掌握基礎(chǔ)調(diào)用之后,你可以朝這些方向深入:
| 方向 | 說明 |
|---|---|
| Prompt Engineering | 系統(tǒng)提示詞設(shè)計(jì)、Few-shot、Chain-of-Thought |
| Function Calling | 讓大模型調(diào)用你的函數(shù),連接外部系統(tǒng) |
| RAG(檢索增強(qiáng)生成) | 結(jié)合向量數(shù)據(jù)庫,讓模型"知道"私有知識(shí) |
| Agent 開發(fā) | 多步推理 + 工具調(diào)用,實(shí)現(xiàn)自主任務(wù)執(zhí)行 |
| Streaming | 流式返回,實(shí)現(xiàn)打字機(jī)效果 |
?? 學(xué)習(xí)建議:吳恩達(dá)(Andrew Ng)與 DeepLearning.AI 推出的 ChatGPT Prompt Engineering for Developers 課程是 Prompt Engineering 最好的入門資料,強(qiáng)烈推薦。
結(jié)語
本文從 npm init 開始,一步步帶你走通了調(diào)用大模型 API 的完整鏈路。你學(xué)到了:
- 安全實(shí)踐:
.env+.gitignore管理密鑰 - 操作系統(tǒng)概念:進(jìn)程是資源分配的最小單位,
process是它在 Node.js 中的體現(xiàn) - 模塊化方案:ESM vs CommonJS,
.mjs的含義 - OpenAI SDK:一行
baseURL切換不同廠商 - 異步控制:
async/await讓異步代碼像同步一樣易讀 - 工程化套路:AIGC 項(xiàng)目開發(fā)的八步標(biāo)準(zhǔn)流程
AI 時(shí)代,調(diào)用 API 不是終點(diǎn),而是起點(diǎn)。 把這套工程流程內(nèi)化成肌肉記憶,然后去探索 Prompt Engineering、Agent 開發(fā)、RAG 等更深的水域。
以上就是使用Node.js調(diào)用DeepSeek大模型API的完整實(shí)戰(zhàn)教程的詳細(xì)內(nèi)容,更多關(guān)于Node.js調(diào)用DeepSeek API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Node.js(v16.13.2版本)安裝及環(huán)境配置的圖文教程
本文主要介紹了Node.js(v16.13.2版本)安裝及環(huán)境配置的圖文教程,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
用npm install時(shí)報(bào)錯(cuò)node-sass npm ERR command
在用npm install時(shí)報(bào)錯(cuò)npm ERR! path D:…\node-sass和npm ERR! command failed 問題,本文給大家介紹了如何解決這個(gè)問題,文中通過圖文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
node連接MongoDB數(shù)據(jù)庫錯(cuò)誤:MongoServerSelectionError:?connect?ECON
使用node連接MongoDB數(shù)據(jù)庫時(shí)發(fā)生報(bào)錯(cuò),MongoServerSelectionError:?connect?ECONNREFUSED?::1:27017,本文給大家分享原因分析及解決方案,感興趣的朋友跟隨小編一起看看吧2023-04-04
node.JS事件機(jī)制與events事件模塊的使用方法詳解
本文將詳細(xì)介紹nodeJS事件機(jī)制與events事件模塊的使用方2020-02-02
nodeJS代碼實(shí)現(xiàn)計(jì)算交社保是否合適
本文通過nodejs的一個(gè)具體示例來對(duì)比分析現(xiàn)階段我們交社保合不合適,主要是對(duì)nodejs的一個(gè)小的應(yīng)用,當(dāng)然大家也可以改成其他語言的,程序猿們,來算算吧。2015-03-03

