AIGC 实战:用 pnpm 提速 + Node.js 调用 OpenAI 🤖

作为刚接触 AIGC 的小白,我曾以为 "用代码调用 AI 生成内容" 又难又复杂 ------ 直到亲手用 OpenAI 的 DALL-E 模型画出第一张图,才发现只要找对工具(比如用 pnpm 代替 npm 提速)、搞懂 Prompt(给 AI 的指令),新手也能快速上手。今天就把从 "环境搭建" 到 "生成 AI 图片" 的全流程拆解,重点讲清楚 pnpm 的优势和 Prompt 的小技巧,小白跟着做就能成!

🏃‍一、先明确:我们要做的 AIGC 核心事

在写代码前,先搞懂两个关键 ------ 不然容易被 "名词" 吓退,其实本质很简单。

1. 目标:用 AIGC 生成一张图

我们要实现的是生成式 AI(AIGC) 的经典场景:通过代码给 OpenAI 的 dall-e-3 模型(专门画图的 AIGC 模型)发 "指令",让它生成一张 "宇宙飞船在宇宙中飞行" 的图片,最后拿到图片链接直接在浏览器打开。

2. 核心工具:3 个 "关键角色" 要记清

这次实战里,pnpm、OpenAI 包、Prompt 是核心,先搞懂它们的作用,后续步骤就顺理成章:

  • pnpm :比 npm 快 2 倍的包管理器,装工具时能省磁盘空间(避免重复安装),是这次提速的关键;
  • OpenAI 包:别人写好的 "对接 AIGC 接口的工具",有了它不用自己写复杂的网络请求,直接调用函数就能连 OpenAI;
  • Prompt :给 AIGC 模型的 "指令",比如 "画一艘未来感宇宙飞船",Prompt 写得越清晰,AI 生成的图越符合预期(这也是 AIGC 的核心技巧)。

🏃‍二、第一步:用 pnpm 搭环境,比 npm 快多了

以前我用 npm 装工具总觉得慢,换成 pnpm 后才知道,原来搭环境也能这么快。这一步跟着做,5 分钟就能搞定。

1. 先装 Node.js:AIGC 代码的 "运行底座"

AIGC 代码是用 JavaScript 写的,需要 Node.js 让它在电脑上运行(不用依赖浏览器)。

2. 装 pnpm:比 npm 更快的 "工具商店"

为什么不用 npm?我特意查了资料:pnpm 用 "硬链接 + 符号链接" 技术,装相同工具时不会重复存文件,不仅省空间,安装速度还比 npm 快 2-3 倍。

  • 装 pnpm:终端输入npm install -g pnpm-g表示全局安装,所有项目都能用);
  • 验证:输入pnpm -v,看到版本号就说明装好了。

3. 初始化项目:生成 "AIGC 项目说明书"

在电脑上新建一个文件夹(比如叫 "AIGC-Image-Demo"),然后用终端进入这个文件夹(输入cd 文件夹路径,比如cd Desktop/AIGC-Image-Demo),接着执行:

bash 复制代码
pnpm init -y
  • 执行后会生成package.json文件,这是 "AIGC 项目的说明书",会记录我们装的工具版本,后续分享给别人时,对方用 pnpm 一键就能装齐所有工具;
  • -y是为了 "跳过所有提问",小白不用纠结项目名、作者这些细节,直接用默认配置就行。

4. 装 AIGC 必备工具:openai+dotenv

这次要装两个工具:openai(对接 AIGC 接口)和dotenv(安全存 AIGC 接口的 "密钥",避免泄露)。用 pnpm 装比 npm 快很多:

bash 复制代码
pnpm i openai@4.71.0 dotenv@17.2.3
  • iinstall的缩写,@后面是固定版本号(避免后续版本更新出问题);
  • 装完后文件夹里会多一个node_modules(放工具文件)和pnpm-lock.yaml(记录工具版本,确保别人装的和你一样),这两个文件不用手动改。

🏃‍三、第二步:配 AIGC 密钥 + 写核心代码

这一步是实战的核心,重点讲 "怎么安全存密钥" 和 "怎么写 AIGC 调用代码",尤其是 Prompt 的写法,小白也能学会。

1. 先拿 OpenAI 密钥:AIGC 接口的 "门禁卡"

调用 OpenAI 的 AIGC 模型需要 "密钥"(相当于门禁卡),没有密钥接口会拒绝访问。

  • agicto官网注册账号,生成密钥;

2. 用 dotenv 存密钥:安全不泄露

绝对不能把密钥直接写在代码里(会被别人看到),用 dotenv 工具把密钥存到专门的文件里:

  • 在项目文件夹里新建一个.env文件(注意前面有个点);

  • 打开.env,只写一行内容(把 "你的密钥" 换成刚复制的密钥):

    plaintext 复制代码
    OPENAI_API_KEY=你的密钥(比如sk-xxxxxx123456)

🏃‍四、第四步: 写 AIGC 调用代码

新建一个main.mjs文件(.mjs 后缀支持模块化导入,就是代码里的import语法),把下面的代码复制进去,我会逐句用大白话解释:

1. 模块化导入:精准拿需要的工具(比之前更优化)

javascript 复制代码
// 导入整个 OpenAI 工具(后续用它创建客户端、调用接口)
import OpenAI from "openai";

// ES6 解构导入:只从 dotenv 包中拿 config 函数(不用导入整个包,更省资源)
import { config } from 'dotenv';

这里和你最初的代码有个小优化:

  • 最初是 import dotenv from "dotenv"(导入整个 dotenv 包),然后用 dotenv.config()
  • 现在是 import { config } from 'dotenv'(只导入需要的 config 函数),然后直接用 config()
  • 核心区别:后者更「轻量」,不用加载 dotenv 里用不上的功能,是前端 / Node.js 里的常见优化写法。

👉 关键语法:import { 某个功能 } from "包名" 叫「解构导入」,专门用来从包中精准提取需要的部分,避免冗余。

2. 加载环境变量:和之前功能一样,写法简化

javascript 复制代码
config({
  path: '.env'
});
  • 等价于之前的 dotenv.config({ path: ".env" }),只是因为前面用了解构导入,直接调用 config() 就行;
  • 作用还是:读取 .env 文件里的 OPENAI_API_KEY(你的 OpenAI 密钥),把它放到 process.env 里,后续用 process.env.OPENAI_API_KEY 就能拿到。

3. 验证环境变量:确认密钥加载成功

javascript 复制代码
console.log(process.env);
  • 作用:在终端打印所有环境变量 配置或参数,帮你确认.env 里的密钥是不是真的加载了;
  • 运行后如果终端能看到 OPENAI_API_KEY: "sk-xxxxxx"(你的密钥),说明加载成功;如果没看到,可能是 .env 文件路径错了,或文件没写对。

4. 初始化 OpenAI 客户端:创建「调用接口的工具人」

javascript 复制代码
const client = new OpenAI({
  // 传入 API 密钥(从环境变量拿,避免硬写在代码里泄露)
  apiKey: process.env.OPENAI_API_KEY,
  
  // 自定义请求地址:不调用 OpenAI 官方服务器,转而调用第三方代理(agicto.cn)
  baseURL: 'https://api.agicto.cn/v1'
});

这是核心步骤之一,相当于「给 AI 接口办一张「访问卡」,后续用这张卡发请求」:

  1. const client = new OpenAI({ ... })

    • new OpenAI(...):用导入的 OpenAI 工具创建一个「客户端实例」(可以理解为「专门帮你对接 AI 接口的工具人」);
    • const client:把这个工具人存到 client 变量里,后续用 client.xxx 就能调用接口(比如画图、聊天)。
  2. 两个关键配置参数(必须对,否则调用失败):

    • apiKey: process.env.OPENAI_API_KEY:给工具人配「身份凭证」(API 密钥),AI 服务器要验证这个密钥才允许你调用;
    • baseURL: 'https://api.agicto.cn/v1':给工具人指「服务器地址」(默认是 OpenAI 官方服务器 https://api.openai.com/v1),这里改成了第三方代理(可能是因为国内访问 OpenAI 官方需要翻墙,代理可以直接访问)。

👉 小白注意:如果这个代理地址失效了,你可以改成其他代理,或用 OpenAI 官方地址(但需要翻墙)。

5. 异步函数:处理「需要等的任务」(核心语法)

javascript 复制代码
// async:标记这个函数是「异步函数」,里面可以用 await(等待任务完成)
const main = async () => {
  // 这里是函数体,后面讲
}

// 调用这个函数(让函数执行)
main();

这是 JavaScript 处理「耗时任务」的核心语法,必须搞懂:

  1. 为什么需要 async/await

    • 调用 AI 接口是「耗时任务」(你的代码要发请求到服务器,服务器生成图片再返回,需要几秒时间);
    • 如果不用 async/await,代码会「不等服务器返回就继续跑」,最后拿不到图片链接,还会报错;
    • 类比:你去奶茶店点单(调用接口),需要等奶茶做好(服务器处理)才能拿,async/await 就是让你「原地等,拿到再走」。
  2. 语法拆解:

    • const main = async () => { ... }:定义一个叫 main 的「异步箭头函数」(() => {} 是箭头函数,比普通 function main() {} 写法简洁);
    • main():最后必须调用这个函数,否则函数里的代码永远不会执行(就像你写了一张购物清单,但不拿去超市,永远买不到东西)。

6. 调用 DALL・E 3 生成图片:核心业务逻辑

javascript 复制代码
// 函数
// await:等待 client.images.generate() 这个任务完成,再往下执行
const response = await client.images.generate({
  model: "dall-e-3", // 指定用哪个 AI 画图模型(DALL·E 3 是 OpenAI 最新的画图模型,效果最好)
  prompt: "A spaceship flying through the universe", // 给 AI 的指令(画什么)
  n: 1, // 生成几张图片(n=1 就是生成 1 张)
  size: "1024x1024" // 图片尺寸(1024x1024 是正方形,常见尺寸还有 512x512、1792x1024 等)
})

// 打印图片的在线链接(从返回结果里提取)
console.log(response.data[0].url);

这是代码的「核心功能」------ 让 AI 画图并拿到结果,逐句拆解:

  1. const response = await client.images.generate({ ... })

    • client.images.generate(...):调用 OpenAI 客户端的「图片生成接口」(images 是图片相关功能,generate 是「生成」的意思);
    • 括号里的 { model: ..., prompt: ... }:是「接口参数」(给 AI 发指令的详细信息),缺一不可;
    • await:关键!让代码暂停在这里,等服务器返回图片结果后,再把结果存到 response 变量里。
  2. 4 个核心接口参数(小白必须会改):

    参数名 作用 可选值 / 修改示例
    model 选择画图模型 DALL・E 3(效果好)、DALL・E 2(速度快、便宜)
    prompt 告诉 AI 画什么(指令) 中文也可以,比如 "一只可爱的柯基在雪地里玩"
    n 生成图片数量 1-10(OpenAI 限制,多了要花钱)
    size 图片尺寸 1024x1024(默认)、512x512(小尺寸,快)、1792x1024(宽屏)
  3. console.log(response.data[0].url):提取并打印图片链接

    • response:服务器返回的「完整结果」(像一个大包裹);
    • response.data:包裹里的「图片数据数组」(因为 n=1,所以数组里只有 1 个元素);
    • response.data[0]:数组里的第一个(也是唯一一个)图片对象;
    • response.data[0].url:图片对象里的「在线访问链接」(AI 生成的图片存在 OpenAI / 代理服务器上,通过这个链接能直接打开);
    • 执行后,终端会打印一个 https://xxx 链接,复制到浏览器就能看到生成的图片。

👉小白必懂的 3 个关键语法

  1. 解构导入import { 功能名 } from "包名" → 精准拿工具,不冗余;

  2. async/await :处理耗时任务(调用接口、读文件等),async 标记函数,await 等待结果;

  3. 箭头函数const 函数名 = () => { ... } → 比普通函数简洁,现在主流写法。

    arduino 复制代码
    main.mjs 单点入口 方便管理
    mjs 模块化的js import from 导入模块
    程序运行后,将一个独立的进程(process)
    进程是分配资源的最小单位
    前端document ,后端process

👉小白实操步骤(跟着做就能跑通)

  1. 确保你已经做了这些:

    • 项目文件夹里有 package.json(执行过 npm init -y,且加了 "type": "module");
    • 安装了依赖(npm install openai dotenv);
    • 根目录有 .env 文件,里面写 OPENAI_API_KEY=你的密钥(密钥从 OpenAI 官网或代理平台获取)。
  2. 运行代码:

    • 终端进入项目文件夹,输入 node 你的文件名.mjs(比如 node main.mjs),按回车;
    • 等 2-5 秒(AI 生成图片需要时间),终端会打印一个链接;
    • 复制链接到浏览器,就能看到图片啦!

👉常见报错及解决办法(小白避坑)

  1. 报错「Cannot find module 'openai'」→ 没装工具,重新执行pnpm i openai@4.71.0 dotenv@17.2.3
  2. 报错「import 语法错误」→ package.json 里没加 "type": "module",加上就行;
  3. 报错「API key is missing」→ .env 文件没写对,或路径错了,检查 .env 里的 OPENAI_API_KEY 是否正确;
  4. 报错「Request failed with status code 404」→ baseURL 失效了,换成 OpenAI 官方地址 ,或换其他代理;
  5. 没报错但没拿到链接 → 可能是 n=0(参数错了),改成 n=1

🏃‍五、小白总结:AIGC 入门的 3 个关键收获

  1. pnpm 真的快:对比之前用 npm 的经历,这次用 pnpm 装工具至少快了一半,而且省磁盘空间,以后做 AIGC 项目都用它;
  2. Prompt 是 AIGC 的 "灵魂" :同样的 AIGC 模型,Prompt 写得好,生成的内容质量完全不一样,新手可以从 "加细节" 开始练;
  3. AIGC 开发不复杂:以前总觉得 "调用 AI 接口" 是大神的事,实际动手后发现,只要跟着流程搭环境、写代码,小白也能 30 分钟搞定一个简单的 AIGC 功能。
相关推荐
沐怡旸9 小时前
【技术选型】前端框架:Vue vs React - 组合式API与Hooks的哲学之争
前端·面试
qq. 280403398410 小时前
nestjs引篇
后端·node.js·nestjs
软件测试媛10 小时前
14:00开始面试,14:06就出来了,问的问题有点变态。。。
面试·职场和发展
Java水解11 小时前
2026java面试题(含答案,持续更新中)
java·后端·面试
茄汁面11 小时前
Angular(TypeScript ) 中基于 ExcelJS 实现导入模板下载功能(带样式与数据验证)
前端·javascript·node.js
生涯にわたる学び11 小时前
面试题整理01
面试
浏览器API调用工程师_Taylor14 小时前
日报自动化实战:告别手动复制粘贴
前端·javascript·node.js
Larcher15 小时前
JS 变量声明避坑指南:彻底搞懂 var/let/const 的 3 大核心区别与最佳实践
前端·javascript·node.js