大模型时代:5 个 Prompt 替代 BERT 训练,搞定 NLP 五大任务

大模型时代: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 能力时,只需要:

  1. completions.mjs 加一个函数
  2. main.mjs 写一段 Prompt

三年前,NLP 的门槛是"会不会训练模型"。

今天,NLP 的门槛是"会不会描述问题"。

这不是技能降级,是抽象升级。


📎 项目代码: nlp-demo

🔗 Gitee 主页: gitee.com/zhou-wenqia...

🛠️ 技术栈: Node.js + ESM + OpenAI SDK + dotenv

🤖 模型: mimo-v2.5-pro


八、学习资源

📚 官方文档

📖 Prompt 工程

🧠 NLP 基础

🛠️ 实战项目

  • LangChain --- LLM 应用开发框架,适合进一步学习 Agent 与工具调用
  • Vercel AI SDK --- 前端友好的 AI 集成方案,支持流式输出

🎥 视频课程


如果觉得有帮助,欢迎点赞收藏! 👍

相关推荐
不好听6135 小时前
Prompt 驱动 NLP:用大语言模型重新定义自然语言处理开发范式
设计模式·node.js·nlp
vortex55 小时前
AI Skill 设计:网络安全审计中的自主性与规范化博弈
人工智能·安全·web安全
云烟成雨TD5 小时前
Spring AI 1.x 系列【37】RAG 知识库平台案例:知识库管理
java·人工智能·spring
GodGump5 小时前
从生成式 AI 到行动式 AI:下一代人工智能为什么需要“行动能力”
人工智能
珠***格5 小时前
实操落地|防逆流装置的安装规范、调试标准与故障处置
网络·数据库·人工智能·分布式·能源·边缘计算
龙码精神5 小时前
QwenPaw 记忆与对话管理架构
人工智能
用户1035702536815 小时前
Word 转 Markdown,一行命令搞定——AI 技能「docx2md」使用指南
人工智能
一切皆是因缘际会5 小时前
AI智能新时代
数据结构·人工智能·ai·架构
roshy5 小时前
作文高考作文
人工智能