Node.js + DeepSeek API 实战:用 Prompt 5分钟搞定 NLP 文本总结

7 阅读5分钟

🚀 从零开始:用 AI 打造你的 NLP 智能助手

结合 ES6 模块化 + DeepSeek API,手把手教你用 Prompt 做自然语言处理

🎯 项目概览

这是一个用 Prompt 做 NLP 任务的小项目,通过调用 DeepSeek API 实现文本总结、情感分类等功能。

项目结构:

nlp-demo/
├── main.mjs          # 入口文件 - 调用 NLP 功能
├── client.mjs        # API 客户端配置
├── completion.mjs    # 调用 LLM 的函数
├── .env              # 环境变量(API 密钥)
└── package.json     # 项目配置

一、ES6 模块化:让代码更优雅 🔧

1.1 什么是模块化?

模块化就是"分而治之"——把一个大项目拆成多个小文件,每个文件负责特定功能。

好处:

  • 📖 可读性:代码职责清晰
  • 🔄 可维护:修改一个模块不影响其他部分
  • ♻️ 可复用:一次编写,多次使用

1.2 import 和 export

ES6 引入了 import/export 语法,支持模块化开发。

导出(export)方式:

// client.mjs
export const a = 2;        // 命名导出
export default client;     // 默认导出(只能有一个)

导入(import)方式:

// main.mjs
import client, { a, b } from './client.mjs'

知识点:

导出方式导入语法说明
export const ximport { x }命名导出,需要大括号
export default ximport x默认导出,不需要大括号

二、解构赋值:提取数据更简洁 ✨

2.1 对象解构

// 传统方式
let name = obj.name;
let age = obj.age;

// ES6 解构赋值
let { name, age } = { name: "詹姆斯", age: 20 };

2.2 数组解构

let [coach, player, ...rest] = ['范甘迪', '詹姆斯', '麦迪', '穆托姆博'];

// coach = '范甘迪'
// player = '詹姆斯'
// rest = ['麦迪', '穆托姆博'] (rest 运算符)

知识点:

  • ...rest 运算符:收集剩余元素为一个数组
  • 解构赋值让代码更简洁,性能也更好(浏览器做了优化)

三、环境变量配置:安全第一 🔒

3.1 为什么需要环境变量?

// ❌ 不推荐:把密钥硬编码在代码里
const apiKey = "sk-6a14a2294846401f8ea301c607743b1e";

// ✅ 推荐:使用环境变量
const apiKey = process.env.DEEPSEEK_API_KEY;

好处:

  1. 安全:密钥不会暴露在代码中
  2. 灵活:不同环境(开发/生产)用不同配置
  3. 便于团队协作

3.2 dotenv 的使用

// client.mjs
import dotenv from 'dotenv';
dotenv.config();  // 加载 .env 文件

const client = new OpenAI({
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: process.env.DEEPSEEK_API_BASE_URL
});

.env 文件内容:

DEEPSEEK_API_KEY=sk-6a14a2294846401f8ea301c607743b1e
DEEPSEEK_API_BASE_URL=https://api.deepseek.com

四、async/await:异步编程不再难 ⚡

4.1 同步 vs 异步

// 同步:代码从上往下执行,等上一行完成才执行下一行
const result1 = doSomething();
const result2 = doAnother();  // 等待

// 异步:不等结果,继续执行后面的代码
doSomething();  // 开始,但不等待
doAnother();    // 立即执行

4.2 async/await 语法

// 定义异步函数
async function getCompletion(prompt) {
  // await 等待 Promise 完成
  const response = await client.chat.completions.create({
    model: "deepseek-chat",
    messages: [{ role: "user", content: prompt }]
  });
  return response.choices[0].message.content;
}

// 调用异步函数
async function main() {
  const result = await getCompletion("你好");
  console.log(result);
}

main();

知识点:

关键字作用
async声明异步函数,自动返回 Promise
await等待 Promise 完成,暂停函数执行
Promise异步操作的结果容器

五、NLP 实战:用 Prompt 做文本总结 📝

5.1 项目代码

// main.mjs
import { getCompletion } from "./completion.mjs";

async function main() {
  const reviews = [
    "这个熊猫公仔很可爱,但有点小...",
    "灯的拉链断了,公司态度很好...",
    // ... 更多评论
  ];

  for (let review of reviews) {
    const prompt = `
      你的任务是从电子商务网站上的产品评论中提取相关信息。
      请对三个反引号之间的评论文本进行概括,最多20个字符。
      评论文本:\`\`\`${review}\`\`\`
    `;
    const response = await getCompletion(prompt);
    console.log(response);
  }
}

main();

5.2 Prompt 模板

核心是设计一个好的 Prompt 模板

const prompt = `
  你的任务:从电子商务网站上的产品评论中提取信息
  要求:对评论文本进行概括,最多20个字符
  评论文本:\`\`\`${review}\`\`\`
`;

5.3 实际效果

输入评论:

"这个熊猫公仔是我给女儿的生日礼物,她很喜欢,去哪都带着。公仔很软,超级可爱..."

AI 输出:

"熊猫公仔可爱软萌,但体积偏小,性价比一般。"


六、NLP 常见任务类型 🎯

任务类型说明应用场景
情感分析判断正面/负面/中性客服质检、舆情监控
信息提取从文本中抽取关键信息简历筛选、订单处理
主题检测判断文本属于哪个类别内容分类、推荐系统
文本总结将长文本压缩为短摘要新闻摘要、报告生成

传统方式 vs Prompt 方式:

传统方式:                    Prompt 方式:
┌─────────────┐              ┌─────────────┐
│ 收集数据    │              │ 写好 Prompt │
└─────────────┘              └─────────────┘
        │                            │
        ▼                            ▼
┌─────────────┐              ┌─────────────┐
│ 特征工程    │              │ 调用 AI API │
└─────────────┘              └─────────────┘
        │                            │
        ▼                            ▼
┌─────────────┐              ┌─────────────┐
│ 训练模型    │              │ 获得结果    │
└─────────────┘              └─────────────┘

耗时:数天~数月              耗时:几分钟

七、完整代码实现 💻

client.mjs - API 客户端

import { OpenAI } from 'openai';
import dotenv from 'dotenv';

dotenv.config();

// 创建 OpenAI 客户端(兼容 DeepSeek)
const client = new OpenAI({
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: process.env.DEEPSEEK_API_BASE_URL
});

export default client;

completion.mjs - 调用函数

import client from './client.mjs';

// 调用 LLM 生成回复
export async function getCompletion(prompt) {
  const response = await client.chat.completions.create({
    model: process.env.DEEPSEEK_MODEL,
    messages: [{ role: "user", content: prompt }]
  });
  return response.choices[0].message.content;
}

main.mjs - 主程序

import { getCompletion } from "./completion.mjs";

async function main() {
  const prompt = "请用一句话介绍自己";
  const response = await getCompletion(prompt);
  console.log(response);
}

main();

八、运行项目 🚀

# 1. 安装依赖
pnpm install

# 2. 运行
node main.mjs

📚 知识点总结

知识点说明难度
ES6 模块化import/export 实现代码拆分
解构赋值从对象/数组提取值
环境变量dotenv 安全管理配置⭐⭐
async/await优雅处理异步操作⭐⭐
Prompt Engineering设计好的提示词⭐⭐⭐
NLP 任务情感分析、文本总结等⭐⭐

🎯 进阶练习

  1. 情感分类:修改 Prompt,让 AI 判断评论是正面还是负面
  2. 信息提取:提取评论中的产品优缺点
  3. 多语言支持:添加英文评论的处理

💡 提示:Prompt 的质量直接影响 AI 的输出效果。多尝试不同的写法,找到最适合你场景的模板!

完整代码已整理好,快去试试吧! 🚀