最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Node.js調(diào)用DeepSeek大模型API的完整實(shí)戰(zhàn)教程

 更新時(shí)間:2026年06月03日 09:54:38   作者:小月土星  
每個(gè)開發(fā)者應(yīng)學(xué)會(huì)調(diào)用大模型API,如如OpenAI SDK已成為事實(shí)標(biāo)準(zhǔn),安全管理APIKey和理解process.env至關(guān)重要,本文從項(xiàng)目初始化Node.js項(xiàng)目到調(diào)用DeepSeekAPI,詳解異步控制與工程化開發(fā)流程,需要的朋友可以參考下

前言:為什么每個(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è)核心依賴:

依賴作用
openaiOpenAI 官方 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)境變量從哪里來?

  1. 操作系統(tǒng)級(jí)別的:系統(tǒng)啟動(dòng)時(shí)設(shè)置的環(huán)境變量
  2. Shell 級(jí)別的:終端會(huì)話中 export 的變量
  3. 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è)步驟:

  1. npm init -y → 項(xiàng)目初始化
  2. pnpm install → 裝依賴(openai + dotenv)
  3. 配置 .env → API Key 留在本地
  4. 配置 .gitignore → 保證 Key 不上傳
  5. 實(shí)例化 client → 指定 baseURL + apiKey
  6. 編寫 main 函數(shù) → 單點(diǎn)入口,統(tǒng)一管理
  7. async/await → 控制異步執(zhí)行順序
  8. 處理 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中的模塊系統(tǒng)介紹

    Node.js中的模塊系統(tǒng)介紹

    這篇文章介紹了Node.js中的模塊系統(tǒng),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Node.js(v16.13.2版本)安裝及環(huá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 failed問題的解決方法

    用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.js 中使用原生 ES 模塊方法解析

    在 Node.js 中使用原生 ES 模塊方法解析

    這篇文章主要介紹了在 Node.js 中使用原生 ES 模塊方法解析,還有部分內(nèi)容的鏈接,下面我們就來一起看看吧,需要的朋友可以參考下。
    2017-09-09
  • node連接MongoDB數(shù)據(jù)庫錯(cuò)誤:MongoServerSelectionError:?connect?ECONNREFUSED?::1:27017(解決方案)

    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事件模塊的使用方法詳解

    node.JS事件機(jī)制與events事件模塊的使用方法詳解

    本文將詳細(xì)介紹nodeJS事件機(jī)制與events事件模塊的使用方
    2020-02-02
  • 如何使用npm安裝yarn詳解

    如何使用npm安裝yarn詳解

    Yarn是一個(gè)新的快速安全可信賴的可以替代NPM的依賴管理工具,下面這篇文章主要給大家介紹了關(guān)于如何使用npm安裝yarn的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Koa2 之文件上傳下載的示例代碼

    Koa2 之文件上傳下載的示例代碼

    本篇文章主要介紹了Koa2 之文件上傳下載的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 解決await在forEach中不起作用的問題

    解決await在forEach中不起作用的問題

    這篇文章主要介紹了解決await在forEach中不起作用的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • nodeJS代碼實(shí)現(xiàn)計(jì)算交社保是否合適

    nodeJS代碼實(shí)現(xiàn)計(jì)算交社保是否合適

    本文通過nodejs的一個(gè)具體示例來對(duì)比分析現(xiàn)階段我們交社保合不合適,主要是對(duì)nodejs的一個(gè)小的應(yīng)用,當(dāng)然大家也可以改成其他語言的,程序猿們,來算算吧。
    2015-03-03

最新評(píng)論

穆棱市| 丹寨县| 阳高县| 平罗县| 治多县| 西丰县| 镇宁| 唐海县| 台江县| 湖南省| 盐源县| 电白县| 方城县| 黑山县| 五台县| 河西区| 永登县| 犍为县| 明水县| 平安县| 水城县| 福安市| 西吉县| 郸城县| 大港区| 盐亭县| 元氏县| 平原县| 马龙县| 拜泉县| 和田县| 五常市| 曲松县| 鄂尔多斯市| 博白县| 平陆县| 寿宁县| 揭阳市| 津南区| 赣榆县| 上犹县|