手把手从零教你用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();

相关推荐
码事漫谈6 分钟前
C++继承中的虚函数机制:从单继承到多继承的深度解析
后端
阿冲Runner7 分钟前
创建一个生产可用的线程池
java·后端
YeeWang8 分钟前
🎉 Eficy 让你的 Cherry Studio 直接生成可预览的 React 页面
前端·javascript
gnip9 分钟前
Jenkins部署前端项目实战方案
前端·javascript·架构
写bug写bug16 分钟前
你真的会用枚举吗
java·后端·设计模式
Orange30151124 分钟前
《深入源码理解webpack构建流程》
前端·javascript·webpack·typescript·node.js·es6
喵手1 小时前
如何利用Java的Stream API提高代码的简洁度和效率?
java·后端·java ee
掘金码甲哥1 小时前
全网最全的跨域资源共享CORS方案分析
后端
m0_480502641 小时前
Rust 入门 生命周期-next2 (十九)
开发语言·后端·rust
张醒言1 小时前
Protocol Buffers 中 optional 关键字的发展史
后端·rpc·protobuf