无需机器学习!用ES6模块化Prompt,AI轻松完成NLP任务
摘要
利用ES6模块化、解构赋值及精心设计的Prompt,可调用大模型API完成情感推断、信息提取、主
没学过机器学习?用ES6模块化和Prompt,使用AI完成NLP任务
在AI技术快速落地的今天,如何用工程化的方式去调用大模型API,完成那些曾经需要专业机器学习团队才能搞定的自然语言处理任务,成了很多开发者的关注点。好在这个过程其实没有想象中那么复杂,掌握了ES6模块化、解构赋值这些前端基础,配合精心设计的Prompt,分分钟就能上手。
先说说几个核心要点:模块化让项目维护变得轻松,解构赋值让数据操作更顺滑,而Prompt本身就是一个威力巨大的工具。下面直接进入主题,看看一个完整的NLP任务项目是怎么拆解的。
项目结构:模块化的优雅拆分
一个标准的AI项目通常不会把所有代码塞进一个文件。项目按功能拆分为几个模块,逻辑清晰得多:

client.mjs:负责初始化OpenAI客户端,读取环境变量completion.mjs:封装与大模型对话的函数main.mjs:主程序入口,编写具体的Prompt并调用main2.mjs:另一个入口,用于批量处理评论
这样做的好处显而易见:
- 维护性高:修改客户端配置只需改
client.mjs - 可复用:
getCompletion函数可以在任何地方引入 - 代码简洁:主程序只关注业务逻辑
这就是 ES6 模块化 的力量,也是现代Ja vaScript工程的基石之一。
ES6 模块化:import/export 让代码更清晰
导出方式
// client.mjs
import { OpenAI } from 'openai';
import dotenv from 'dotenv';dotenv.config();
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";export async function getCompletion(prompt) {
const response = await client.chat.completions.create({
model: process.env.DEEPSEEK_MODEL_FLASH,
messages: [{ role: 'user', content: prompt }]
});
return response.choices[0].message.content;
}
export default:默认导出,导入时可以自定义名称export:命名导出,导入时需要用{}解构
导入方式
// main.mjs
import client, { a } from "./client.mjs"; // 同时导入默认和命名导出
import { getCompletion } from "./completion.mjs";
ES6模块化是Ja vaScript在2015年(ES6)推出的重大更新,目标就是让JS能够承载企业级大型项目的开发需求。从这以后,前端的工程化能力提升了一个台阶。
解构赋值与展开运算符:优雅的数据处理
解构赋值
// 对象解构
let { name, age } = { name: "许洋", age: 20 };
console.log(name); // 许洋// 数组解构(基于位置)
let [coach, ...players] = ['范甘迪', '姚明', '麦迪', '穆托姆博'];
console.log(coach); // 范甘迪
console.log(players); // ['姚明', '麦迪', '穆托姆博']
性能优势:解构直接创建独立变量,比 obj.name 少一次属性查找——不需要先找对象地址再找属性地址,对于高频操作来说,这个优化还是很实在的。
展开运算符(spread)
let players = ['姚明', '麦迪'];
let hrPlayers = ['科比', '加索尔'];
let allPlayers = [...players, ...hrPlayers];
// ['姚明', '麦迪', '科比', '加索尔']
... 有两种语义,理解清楚就不容易搞混:
- 在解构中:rest(剩余)运算符,收集剩余元素
- 在数组/对象字面量中:spread(展开)运算符,展开元素
NLP 任务一:情感推断
给定一条产品评论,判断情感是正面、负面还是中性。这是最基础、也最常见的NLP任务之一。
const lamp_review_zh = `我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。
我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。
几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件!
在我看来,Lumina 是一家非常关心顾客和产品的优秀公司!`;const prompt = `
以下用三个反引号分隔的产品评论的情感是什么?
用一个词回答:正面 / 负面 / 中性
评论文本:``` ${lamp_review_zh} ```
`;const response = await getCompletion(prompt);
// 输出:正面
应用场景:电商平台自动分析用户评价,进行客户服务、预警、产品质检。比如说,如果突然出现大量负面情绪,系统可以及时报警,让运营人员第一时间介入。
NLP 任务二:信息提取
从评论中提取结构化信息,比如商品名称、品牌、情绪等。这一步的关键在于Prompt设计,要把需要提取的字段说清楚,并且指定输出格式。
const prompt = `
从以下用三个反引号分隔的评论文本中识别以下项目:
- 评论作者的情绪(正面/负面)
- 是否表达了愤怒的情绪(boolean值)
- 评论者购买的商品
- 制造该商品的公司
返回结果格式:以 "sentiment","anger","product","brand" 为 key 的 JSON 格式,
如果在评论文本中无法识别到识别项,使用**未知**作为 value。
评论文本:``` ${lamp_review_zh} ```
`;
模型返回结果对比如:
{
"sentiment": "正面",
"anger": false,
"product": "卧室灯",
"brand": "Lumina"
}
应用场景:自动提取用户反馈中的关键信息,比如品牌、产品、情绪倾向,便于后续做仪表盘分析或者舆情监控。很多客服系统后台的自动打标签功能,底层原理就是这个。
NLP 任务三:主题推断
判断一段文本中是否包含某些特定主题。相当于给文章做“标签”或者“分类”,看它是否命中你关心的关键词。
const topicList = ['美国国家航空航天局', '地方政府', '工程', '员工满意度', '联邦政府'];
const prompt = `
判断主题列表中每一项是否是以下三个反引号区域内给定文本的一个话题,
返回结果:以列表形式给出答案,每个主题出现则用1,没有出现则用0。
主题列表:${topicList.join(",")}
``` ${story_zh} ```
`;
应用场景:新闻分类、舆情监控。比如帮甲方监控社交媒体上有没有提到自家品牌,是不是负面话题,或者政府机构看看新闻报道里是否有某些敏感议题。
NLP 任务四:文本总结
将长文本概括成简短摘要,可以指定聚焦方向。这个功能对于需要处理大量文档的人来说,无异于“外设”。
const prod_review_zh = `这个熊猫公仔是我给女儿的生日礼物,她很喜欢,去哪都带着。
公仔很软,超级可爱,面部表情也很和善。但是相比于价钱来说,它有点小...
快递比预期提前了一天到货...`;// 通用摘要
const prompt1 = `对评论文本进行概括,最多100字。`;// 聚焦运输
const prompt2 = `概括,最多100字,并且聚焦在运输方面。`;// 聚焦价格和质量
const prompt3 = `概括,最多100字,并且聚焦在商品价格和质量方面。`;
应用场景:老板、行政、小编每天可能要面对几十份报告、几百条评论,手动读完不现实。用这个方式,几句话就能抓住核心,效率直接拉满。
批量处理:循环调用 API 的注意事项
在 main2.mjs 中,批量处理了 4 条评论:
const reviews = [review_1, review_2, review_3, review_4];
for (let review of reviews) {
const prompt = `对评论文本进行概括,最多20字。``` ${review} ````;
const response = await getCompletion(prompt);
console.log(response);
}
这里有一个必须留意的点:如果循环次数非常大,可能会触发大模型API的调用频率上限。实际开发中,需要考虑几个事情:
- 添加延时(
setTimeout或sleep) - 使用批量API(如果支持的话)
- 做好错误重试机制,避免一次报错打断整个流程
一点总结
从实践来看,核心收获有几点:
- ES6 模块化:用
import/export拆分代码,提高可维护性和复用性,这是任何中型以上项目的标配。 - 解构赋值与展开运算符:让数据操作更优雅,性能也更好,写起来特别爽。
- Prompt 做 NLP 任务:情感分析、信息提取、主题推断、文本总结,几句话就能完成传统ML专家数周的工作,效率提升是碘伏性的。
- 项目搭建规范:单点入口(
main.mjs)、客户端模块(client.mjs)、业务函数模块(completion.mjs),这个结构可以直接复用到其他AI项目中。
可以确定的是,AI全栈开发的门槛正在肉眼可见地降低。掌握了这些基础,就能快速构建实用的NLP应用,而且完全不需要懂机器学习背后的数学原理。
互动讨论
- 为什么 ES6 模块化默认导出只能有一个? 如果需要导出多个功能,应该用什么方式?
- 解构赋值的性能真的比点操作符好吗? 你可以在浏览器控制台测试一下,看看实际差异有多大。
- 在批量处理评论时,如果某次 API 调用失败,应该怎么处理? 重试?跳过?记录日志?哪种方案更靠谱?
- 信息提取任务中,如果评论里没有明确提到品牌,模型返回“未知”,这合理吗? 有没有更好的处理方式?
- 你觉得 Prompt 工程会取代传统的机器学习吗? 为什么?欢迎在实际项目中体验后回来交流。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。