手把手从零教你用Node.js玩转AI生成:从课设到社团招新的实用指南


🎒 一、初体验:被课程设计逼出的黑科技

上周三凌晨两点,我和室友阿强蹲在宿舍走廊,盯着他的课程设计需求------"实现智能文本生成系统"。电脑屏幕上VSCode的光标不停闪烁,就像我们快撑不住的眼皮。

"要不试试OpenAI的接口?"我突然想起上周AI课的内容。于是,两个菜鸟程序员开启了奇妙之旅:

javascript 复制代码
// 初代版本:简单粗暴型
const getText = async (prompt) => {
  const res = await openai.chat.completions.create({
    messages: [{ role: 'user', content: prompt }],
    model: 'deepseek-chat'
  });
  return res.choices[0].message.content;
};

// 测试:让AI帮忙写请假条
const note = await getText('用学生语气写封感冒请假条,带点表情包风格');
console.log(note); 
// 输出:导员大大~ 😷今天脑袋像灌了铅,求批准续命一天!体温计已阵亡...

🛠️ 二、踩坑实录:那些年我们遇到的奇葩bug

1. 密钥失踪案

第一次运行时疯狂报错401,我们翻遍代码才发现:

bash 复制代码
# 错误示范:把密钥直接写死在代码里
const openai = new OpenAI({
  apiKey: 'sk-xxx...' // 第二天就被GitHub邮件警告了😅
});

正确姿势

javascript 复制代码
// 使用dotenv保护密钥
import 'dotenv/config'; 

const openai = new OpenAI({
  apiKey: process.env.OPENAI_KEY, // 安全!
  baseURL: process.env.API_BASE
});

2. 中文乱码怪

生成的诗总是出现火星文:

复制代码
æˆ'çš„ç¼ºå¸¸ä½ çŸ¥é"

解决方案

javascript 复制代码
// 添加编码声明
const res = await fetch(apiUrl, {
  headers: {
    'Content-Type': 'application/json; charset=utf-8' 
  }
});

🎨 三、创意开发:把AI变成校园生活助手

场景1:自动生成实验报告

javascript 复制代码
const reportPrompt = `
生成大学物理实验报告结论部分,要求:
1. 包含3个实验误差分析点
2. 用口语化中文表达
3. 最后加一句自我鼓励的话
`;

const report = await getText(reportPrompt);
console.log(report);
// 输出:本次测量值偏差主要来自...虽然数据有点皮,但下次我会更细心的!💪

场景2:社团招新文案生成器

javascript 复制代码
const clubs = [
  { name: '街舞社', style: '酷炫年轻化' },
  { name: '编程社', style: '技术宅幽默风' }
];

clubs.forEach(async club => {
  const ad = await getText(
    `写${club.name}招新文案,要求:${club.style},带emoji`
  );
  console.log(`${club.name}:`, ad);
});
// 输出:编程社👉键盘是我们的武器,bug是必经之路!一起用代码改变世界~ 🚀

📝 四、私藏技巧:让AI更懂你的小心思

1. 温度值调参玄学

javascript 复制代码
// 写正经报告用低温
await getText('生成实验报告摘要', { temperature: 0.2 });

// 写段子用高温
await getText('编程序员笑话', { temperature: 0.7 });

2. 限定词魔法

javascript 复制代码
// 好Prompt = 角色 + 要求 + 示例
const goodPrompt = `
你是个毒舌的校园贴吧大佬,用不超过20字吐槽选课系统:
示例:选课比抢演唱会票还刺激
生成3个新版本:
`;

const comments = await getText(goodPrompt);
console.log(comments.split('\n')); 
// 输出:登录两小时,选课五分钟 / 系统一抽搐,课表全变🐔...

🚨 五、防翻车指南:来自学长の经验

  1. 费用控制

.env设置用量警报:

bash 复制代码
# 每日限额提醒
OPENAI_WARNING=5 # 超过5次调用发邮件提醒
  1. 内容过滤

自己加层防护网:

javascript 复制代码
const safeGenerate = async (prompt) => {
  const text = await getText(prompt);
  if (text.includes('暴力') || text.includes('敏感词')) {
    throw new Error('内容不安全!');
  }
  return text;
};
  1. 缓存优化

用JSON存常用回复:

javascript 复制代码
// 缓存常见问答
const cache = {
  '请假条模板': '导员大大...',
  '实验报告开头': '本次实验旨在...'
};

📝 五、Node.jsAI接口调用模板

javascript 复制代码
import OpenAI from "openai";
import dotenv from "dotenv";
// 启动一个进程 process 后端
// env 对象 环境对象
// 进程是分配资源的最小单元
dotenv.config();
const openai = new OpenAI({
    apiKey:process.env.OPENAI_API_KEY,
    baseURL:process.env.OPENAI_API_BASE_URL
})

// 通用LLM 完成接口函数,复用
const getCompletion = async (prompt,model="deepseek-chat")=>{
    //OpenAI API 要求 messages 是一个数组。
    const messages=[{
        role:"user",
        content:prompt

    }]
    const response = await openai.chat.completions.create({
        model:model,
        messages:messages,
        // 0 表示最确定性,生成结果更一致;值越高,结果越随机
        temperature:0,
    });
    return response.choices[0].message.content;
}
const main =async ()=>{
    const prompt = "用贴吧语气的话骂我";

    const result = await getCompletion(prompt);  // 使用 await 等待结果
    console.log(result);  // 打印结果🌚

}

main();

相关推荐
兜小糖的小秃毛几秒前
el-Input输入数字自动转千分位进行展示
前端·javascript·vue.js
兜小糖的小秃毛1 分钟前
文号验证-同时对两个输入框验证
开发语言·前端·javascript
brzhang2 分钟前
代码越写越乱?掌握这 5 种架构模式,小白也能搭出清晰系统!
前端·后端·架构
Asthenia04124 分钟前
为什么MySQL关联查询要“小表驱动大表”?深入解析与模拟面试复盘
后端
南雨北斗6 分钟前
分布式系统中如何保证数据一致性
后端
J总裁的小芒果9 分钟前
el-table 自定义列、自定义数据
前端·javascript·vue.js
Asthenia041210 分钟前
Feign结构与请求链路详解及面试重点解析
后端
左灯右行的爱情13 分钟前
缓存并发更新的挑战
jvm·数据库·redis·后端·缓存
brzhang17 分钟前
告别『上线裸奔』!一文带你配齐生产级 Web 应用的 10 大核心组件
前端·后端·架构
shepherd11118 分钟前
Kafka生产环境实战经验深度总结,让你少走弯路
后端·面试·kafka