大模型时代:5 个 Prompt 替代 BERT 训练,搞定 NLP 五大任务
从两个月到五分钟------当 AI 大模型让 NLP 门槛归零,前端工程师也能做算法的活。本文用 4 个文件、5 个任务,带你亲身体验这场范式转移。
前言:一个真实的故事
去年,我在公司接了一个情感分析需求。流程是这样的:
需求评审 → 数据标注(2周)→ 模型选型(1周)→ 训练调参(3周)→ 部署上线(1周)
两个月,一个情感分析。
上周,同样的需求:
js
const prompt = `识别以下评论的情感,输出逗号分隔的关键词:\`\`\`${review}\`\`\``;
const result = await getCompletions(prompt);
五分钟,两行代码。
这不是效率提升,这是范式转移。当模型能力足够强时,"训练"变成了"对话","算法工程师"变成了"Prompt 工程师"。
本文通过 nlp-demo 项目,带你理解这场转移的本质。
一、快速上手
bash
git clone <your-repo>
cd nlp-demo
pnpm install
配置 .env:
bash
MIMO_API_KEY=sk-xxxxx
MIMO_API_BASE_URL=https://api.xiaomimimo.com/v1
MIMO_MODEL=mimo-v2.5-pro
运行:
bash
node main.mjs
💡 为什么
.mjs和"type": "commonjs"能共存?
package.json中"type": "commonjs"是默认值,但.mjs文件始终按 ESM 解析 ,不受type字段影响。所以两种模块规范可以在同一项目中共存。
二、项目架构:三层分离
bash
nlp-demo/
├── .env # 配置层:环境变量
├── client.mjs # 能力层:LLM 客户端
├── completions.mjs # 能力层:NLP 函数
├── main.mjs # 业务层:Prompt 编排
└── main2.mjs # 业务层:批量任务
| 层 | 职责 | 变化频率 | 改动风险 |
|---|---|---|---|
| 配置层 | API Key、模型地址 | 低(换模型时) | 无风险 |
| 能力层 | 封装 LLM 调用 | 中(加新函数) | 低风险 |
| 业务层 | Prompt 设计 | 高(迭代 Prompt) | 需要测试 |
分离的本质是管理变化频率。 变化快的(Prompt)和变化慢的(Client)不应该耦合。这和 React 组件设计、微服务拆分是同一个道理。
三、搭建基础能力
3.1 封装 Client
js
// client.mjs
import { OpenAI } from 'openai';
import dotenv from 'dotenv';
dotenv.config();
const client = new OpenAI({
apiKey: process.env.MIMO_API_KEY,
baseURL: process.env.MIMO_API_BASE_URL,
});
export default client;
关键洞察: OpenAI SDK 的 baseURL 让同一套代码可以对接 OpenAI、Mimo、本地模型------模型变成了可插拔的基础设施。
3.2 封装调用函数
js
// completions.mjs
import client from './client.mjs';
export async function getCompletions(prompt) {
const response = await client.chat.completions.create({
model: process.env.MIMO_MODEL,
messages: [{ role: 'user', content: prompt }]
});
return response.choices[0].message.content;
}
一个函数,全部 NLP 能力。 不需要为每个任务写不同的模型代码,只需要写不同的 Prompt。
四、Prompt 即算法:5 个 NLP 任务实战
4.0 Prompt 万能公式
在开始之前,先记住这个公式:
角色定位 → 任务描述 → 输入格式 → 输出格式 → 约束条件 → 异常处理
每个任务都会拆解这个公式的运用。
任务一:情感分析
🎯 目标: 识别评论表达了哪些情感
js
const lamp_review_zh = '我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。\
我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。\
几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,\
他们很快就给我寄来了缺失的零件!在我看来,Lumina 是一家非常关心顾客和产品的优秀公司!';
const prompt = `
识别以下用三个反引号分隔的产品评论的作者表达的情感。
包含不超过5个项目。
将答案格式化为以逗号分隔的单词列表。
评论文本: \`\`\` ${lamp_review_zh} \`\`\`
`;
📥 实际输出
满意, 感激, 信任, 惊喜, 积极
📝 方法论 ①:限定输出格式
告诉模型你要什么格式(逗号分隔 / JSON / 布尔值),它就不会自由发挥。
传统做法: 标注 1000 条数据 → 训练 BERT → 部署 API → 维护版本。耗时 2 个月。
任务二:结构化信息提取
🎯 目标: 从评论中提取「商品」和「品牌」,输出 JSON
js
const prompt = `
从评论文本中识别以下项目:
- 评论者购买的商品
- 制造该商品的公司
将响应格式化为以 "product" 和 "brand" 为键的 JSON 对象。
如果信息不存在,请使用 "未知" 作为值。
评论文本: \`\`\` ${lamp_review_zh} \`\`\`
`;
📥 实际输出
json
{"product": "卧室灯", "brand": "Lumina"}
📝 方法论 ②:给 fallback 值
信息可能不存在?在 Prompt 中指定兜底值(如"未知"),避免模型编造。
深度思考: 传统 NER 需要标注 BIO 序列、训练序列标注模型、处理 OOV 问题。现在?一个 JSON Schema 描述就够了。模型不仅识别实体,还理解"品牌"的语义。
任务三:多维度一次性提取
🎯 目标: 一次调用同时提取情绪、是否愤怒、商品、品牌
js
const prompt = `
从评论文本中识别以下项目:
- 情绪(正面或负面)
- 是否表达了愤怒?(是或否)
- 评论者购买的商品
- 制造该物品的公司
将响应格式化为 JSON 对象,以 statement、anger、brand、product 为键。
将 anger 值格式化为布尔值。
让你的回应尽可能简短。
评论文本: \`\`\` ${lamp_review_zh} \`\`\`
`;
📥 实际输出
json
{"statement":"正面","anger":false,"brand":"Lumina","product":"卧室灯"}
📝 方法论 ③:指定字段类型
anger要布尔值、statement要二选一------类型约束越明确,输出越稳定,解析越省心。
范式转移: 传统做法需要 4 个独立模型(情感分类、愤怒检测、NER×2)。现在?一个 Prompt,一次调用,四个维度。
任务四:主题识别
🎯 目标: 从长文本中提炼 5 个关键词
js
const story_zh = `
在政府最近进行的一项调查中,要求公共部门的员工对他们所在部门的满意度进行评分。
调查结果显示,NASA 是最受欢迎的部门,满意度为 95%。
一位 NASA 员工 John Smith 对这一发现发表了评论...
调查还显示,社会保障管理局的满意度最低,只有 45%。
`;
const prompt = `
确定以下给定文本中讨论的五个主题。
每个主题用 1-2 个单词概括。
输出用逗号分隔。
给定文本:${story_zh}
`;
📥 实际输出
员工满意度, NASA, 政府调查, 社会保障管理局, 工作环境
📝 方法论 ④:约束数量和粒度
"五个主题、1-2 个单词"------约束越具体,输出越可控。不加约束,模型可能给你写一段话。
任务五:批量评论摘要
🎯 目标: 将多条不同品类的长评论各压缩为 20 字摘要
准备 4 条不同品类的评论:
js
const review_1 = `这个熊猫公仔是我给女儿的生日礼物,她很喜欢,去哪都带着。
公仔很软,超级可爱,面部表情也很和善。但是相比于价钱来说,
它有点小,我感觉在别的地方用同样的价钱能买到更大的。
快递比预期提前了一天到货,所以在送给女儿之前,我自己玩了会。`;
const review_2 = `我想为我的卧室找一个漂亮的灯,这款灯还有额外的存储空间,
价格也不太高。购买后很快就收到了,两天就送到了。但在运输过程中,
灯的拉链断了,公司态度很好,发来了一条新的。`;
const review_3 = `我的牙科卫生师推荐我使用电动牙刷,目前为止,电池的续航时间
颇为令人印象深刻。然而,这款牙刷的刷头实在太小了。总的来说,
如果你能以大约50美元的价格购入,那它就物超所值。`;
const review_4 = `他们还在11月把17件套系统以大约$49的优惠价格销售,几乎是五折。
但到了12月第二周,价格一下儿飙升到了$70-$89之间。大约一年后,
电机开始发出一些可疑的声音。我联系了客服,但保修期已经过期。`;
批量调用:
js
const reviews = [review_1, review_2, review_3, review_4];
for (let review of reviews) {
const prompt = `
您的任务是从电子商务网站上的产品评论中提取相关信息。
请对三个反引号之间的评论文本进行概括,最多 20 个字符。
评论文本:\`\`\`${review}\`\`\`
`;
const response = await getCompletions(prompt);
console.log(response, '\n');
}
📥 实际输出
可爱的熊猫公仔,性价比一般,物流快。
卧室灯实用但运输有损,售后好。
电动牙刷续航强刷头小,性价比高。
搅拌机促销后涨价,质量下降快。
📝 方法论 ⑤:用角色定位开篇
"您的任务是......"------先告诉模型它在扮演什么角色,输出质量会明显提升。
工程意义: for 循环 + getCompletions = 文本处理管道。传统 NLP 需要 Spark/Flink 流水线,现在一个 Node.js 脚本就够了。
五、深度思考:这到底意味着什么?
5.1 开发范式的三次浪潮
第一波:规则时代(1990-2010)
→ 写正则、写规则、写词典
→ 优点:可控 缺点:脆弱、难维护
第二波:深度学习时代(2010-2023)
→ 标注数据、训练模型、调参部署
→ 优点:准确 缺点:成本高、周期长
第三波:Prompt 时代(2023-)
→ 写 Prompt、调 API、组合能力
→ 优点:极速、零门槛 缺点:黑盒、成本随调用量增长
我们正站在第三波的起点。
5.2 Prompt 工程师的核心能力
| 能力 | 对应传统技能 | 本项目对应 |
|---|---|---|
| 需求拆解 | 问题定义 | 分析评论要提取什么 |
| Prompt 设计 | 模型架构设计 | 写模板字符串 |
| 输出约束 | 损失函数设计 | 指定 JSON / 布尔值 |
| Few-shot 示例 | 训练数据 | 提供样例评论 |
| 错误处理 | 模型评估 | fallback 值、重试 |
本质没变,抽象层级提升了。 就像从汇编到 C,从 C 到 Python------我们不是在消灭编程,而是在更高的层级编程。
5.3 什么时候不该用 Prompt?
Prompt 不是银弹。以下场景仍然需要传统方案:
| 场景 | 原因 |
|---|---|
| 高频低延迟(< 10ms) | API 调用太慢 |
| 强一致性要求 | 法律、医疗需要 100% 可复现 |
| 成本敏感(日均百万次) | API 成本可能超过自建模型 |
| 数据隐私 | 敏感数据不能发到第三方 |
工程决策的核心是权衡,不是跟风。
六、Prompt 方法论速查表
| # | 方法 | 一句话 | 适用场景 |
|---|---|---|---|
| ① | 限定输出格式 | 要 JSON / 逗号列表 / 布尔值 | 程序化解析 |
| ② | 给 fallback 值 | 信息缺失时用"未知"填充 | 防止编造 |
| ③ | 指定字段类型 | anger: boolean, count: number | 结构化输出 |
| ④ | 约束数量和粒度 | 5 个主题,每个 1-2 词 | 控制输出长度 |
| ⑤ | 角色定位开篇 | "您的任务是......" | 提升输出质量 |
七、总结
bash
.env 配置 → client 封装 → completions 函数 → main 业务编排
这个项目只有 4 个文件,但它代表了一种新的开发范式:
- 配置、能力、业务三层分离 --- 工程化的基本素养
- 一个函数搞定全部 NLP --- 抽象的力量
- Prompt 即算法 --- 大模型时代的编程方式
当你需要接入新的 NLP 能力时,只需要:
- 在
completions.mjs加一个函数 - 在
main.mjs写一段 Prompt
三年前,NLP 的门槛是"会不会训练模型"。
今天,NLP 的门槛是"会不会描述问题"。
这不是技能降级,是抽象升级。
📎 项目代码:
nlp-demo🔗 Gitee 主页: gitee.com/zhou-wenqia...
🛠️ 技术栈: Node.js + ESM + OpenAI SDK + dotenv
🤖 模型: mimo-v2.5-pro
八、学习资源
📚 官方文档
- OpenAI API 文档 --- 理解 Chat Completions API 的核心参数与用法
- OpenAI Node.js SDK --- 本项目使用的 SDK 源码与示例
📖 Prompt 工程
- Prompt Engineering Guide --- 最全面的 Prompt 工程指南,支持中文
- OpenAI Prompt 最佳实践 --- 官方出品的 Prompt 设计技巧
- Learn Prompting --- 从零到一的 Prompt 教程,含大量实战案例
🧠 NLP 基础
- Speech and Language Processing (3rd ed.) --- NLP 领域经典教材(免费在线阅读)
- Hugging Face NLP Course --- 从传统 NLP 到 Transformer 的系统课程
🛠️ 实战项目
- LangChain --- LLM 应用开发框架,适合进一步学习 Agent 与工具调用
- Vercel AI SDK --- 前端友好的 AI 集成方案,支持流式输出
🎥 视频课程
- 吴恩达 × OpenAI: ChatGPT Prompt Engineering for Developers --- 免费短课,适合快速入门
- 李宏毅 2024 生成式 AI 导论 --- 中文讲解大模型原理
如果觉得有帮助,欢迎点赞收藏! 👍