20分钟用Prompt搭建NLP系统!无需微调BERT
告别 BERT 微调:用 Prompt 快速构建 NLP 系统,20 分钟即可落地
实测效果一览
以下是一条真实用户评论的原始文本,我们对其执行了 5 个典型的 NLP 任务,结果直接展示:
原始评论:
"我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。
我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。
几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,
他们很快就给我寄来了缺失的零件!在我看来,Lumina 是一家非常关心顾客和产品的优秀公司!"
五个 Prompt,五组输出,全部秒级响应:
| 任务 | Prompt | 结果 |
|---|---|---|
| 情感分析 | "用一个单词回答:正面/负面/中性" | 正面 |
| 愤怒检测 | "给出是或否的答案" | 否 |
| 信息提取 | "格式化为 JSON,key 为 product/brand" | {product: "卧室灯", brand: "Lumina"} |
| 多维度提取 | "一次返回 4 个维度,布尔值格式" | {sentiment: "正面", anger: false, ...} |
| 主题归纳 | "5 个主题,1-2 个中文词" | 客户服务, 产品质量, 配送问题, 组装体验, 公司形象 |
从构思到产出仅需 20 分钟,无需训练、标注或 GPU 资源。
背景:传统 NLP 流程被彻底颠覆
过去做 NLP,几乎绕不开这套工序——收集数据、人工标注、选择模型、训练调参、部署上线,一套走完至少一周。
收集数据(3天) → 标注数据(3天) → 选模型(1天) → 训练(2天) → 调参(2天) → 部署(1天)
每个任务都要独立维护一个模型——情感分析一个、实体提取一个、文本摘要又一个。光是想想就让人头大。
而现在,大语言模型直接把这条路掀翻了。
原因很直接:LLM 在预训练阶段已经"消化"了几乎所有互联网文本。你不需要再教它"什么是情感",只需要用 Prompt 唤醒它已经内化的知识。
这就像——你不需要重新造个计算器,你只需要学会按哪些按钮。这个类比能帮你快速抓住核心。
核心原理:Prompt 为何有效?
很多人写 Prompt 全凭直觉,但我建议先理解背后的机制,否则写出来的 Prompt 经常不稳定。
Prompt 的本质是什么?
Prompt 本质上是在激活 LLM 内部特定的知识回路。
当你写下"判断这段评论的情感"时,LLM 内部会依次激活:
- 语言理解模块 → 解析中文语义
- 情感识别模块 → 判别正向/负向
- 格式生成模块 → 按指定结构输出
当你写下"提取商品名称和品牌"时,LLM 会触发:
- NER(命名实体识别)模块
- 属性分类模块
- 结构化输出模块
优秀的 Prompt = 精准定位 + 清晰指令 + 明确格式。
为什么 LLM 能处理这么多任务?
因为 LLM 是"通用任务求解器",而非"专用任务模型"。
BERT 训练时只学习了"做完形填空"这一个任务。而 GPT 训练时学习的是"预测下一个词",结果发现——预测得足够准之后,它自然就学会了翻译、摘要、问答、情感分析……所有任务。
这就是"涌现能力"(Emergent Abilities):当模型规模达到临界点,它突然就能做你从未专门训练过的事情。听起来不可思议,但确实正在发生。
技术栈:简单到超乎想象
整个项目仅依赖两个库:
npm install openai dotenv
nlp-demo/
├── .env # API 密钥配置
├── client.mjs # LLM 客户端初始化
├── completion.mjs # 通用调用封装
└── main.mjs # 入口 + NLP 任务演示
客户端配置:三行代码搞定
// client.mjs
import { OpenAI } from 'openai';
import dotenv from 'dotenv';dotenv.config();const client = new OpenAI({
apiKey: process.env.LLM_API_KEY,
baseURL: process.env.LLM_BASE_URL // 切换模型只需修改此处
});export default client;
关键点:所有兼容 OpenAI 接口的 LLM(DeepSeek、Claude、千问、GLM……)都能直接复用这套代码。只需更换 baseURL,一行业务代码都不用改。兼容性极强。
通用调用函数:一个入口,所有任务复用
// completion.mjs
import client from './client.mjs';export async function getCompletion(prompt) {
const response = await client.chat.completions.create({
model: process.env.LLM_MODEL,
messages: [{ role: 'user', content: prompt }]
});
return response.choices[0].message.content;
}
传入 Prompt,直接返回 LLM 的文本响应。后续所有 NLP 任务全部通过这个统一接口完成。
实战:5 个任务,5 段 Prompt
任务一:情感分析
核心 Prompt 技巧:严格限定输出格式
const prompt = `
以下用三个反引号分隔的产品评论的情感是什么?
用一个单词回答:正面 或 负面 或 中性
评论文本:```${review}```
`;await getCompletion(prompt); // → 正面
"用一个单词回答"——这六个字是精髓。不加这句,LLM 会输出一篇两三百字的分析报告,你还得写正则去清洗。加上这句,直接拿到干净结果。干净利落。
任务二:愤怒检测
核心 Prompt 技巧:二分类简化为是/否
const prompt = `
以下用三个反引号分隔的产品评论是否表达了愤怒?
给出是或否的答案。
评论文本:```${review}```
`;await getCompletion(prompt); // → 否
Prompt 越简洁,输出越稳定。 二分类任务不需要复杂描述,问清楚就行。别搞那些花里胡哨的框架。
任务三:信息提取(结构化输出)
这是 Prompt 最强悍的用法——从自由文本中精准抽取结构化数据:
const prompt = `
从评论文本中识别以下项目:
- 评论者购买的商品
- 制造该物品的公司评论文本用三个反引号分隔。
将响应格式化为以"product"和"brand"为键的 JSON 对象。
如果信息不存在,请使用"未知"作为值。
评论文本:```${review}```
`;await getCompletion(prompt);
// → { "product": "卧室灯(带储物功能)", "brand": "Lumina" }
两个关键操作:
- 明确指定 JSON 的 key 名 → 下游代码直接
JSON.parse()即可消费 - 用"未知"兜底缺失信息 → 避免因 LLM 找不到字段而输出 null 或报错
任务四:多维度一次性提取
传统方案需要三个独立模型,而我们的 Prompt 方案只需一次调用:
const prompt = `
从评论文本中识别以下项目:
- 情绪(正面或负面)
- 是否表达了愤怒?(是或否)
- 评论者购买的商品
- 制造该物品的公司评论用三个反引号分隔。
将响应格式化为 JSON 对象,以"sentiment"、"anger"、"product"、"brand"为键。
如果信息不存在,请使用"未知"作为值。
让你的回复尽可能简短。
将 anger 值格式化为布尔值。
评论文本:```${review}```
`;await getCompletion(prompt);
// → { "sentiment": "正面", "anger": false, "product": "卧室灯", "brand": "Lumina" }
一次 API 调取,四个维度同时返回。 anger 要求布尔值而非字符串,拿到就能直接写 if 条件判断。这才是真正的效率提升。
任务五:主题推断
核心 Prompt 技巧:约束输出数量与粒度
const prompt = `
确定以下给定文本中讨论的五个主题。
每个主题用一到两个中文单词概括。
输出时用逗号分隔。
给定文本:${story}
`;await getCompletion(prompt);
// → 政府调查, 员工满意度, NASA, 社会保障管理局, 工作改善
限定了"五个"和"一到两个中文单词"——没有这些约束,LLM 可能输出二十个主题,每个还是一整段话。设定好边界,才能拿到可控的结果。
批量处理:一条评论是 Demo,一万条才是生产
import { getCompletion } from "./completion.mjs";const reviews = [
`这个熊猫公仔是我给女儿的生日礼物,她很喜欢,去哪都带着。
公仔很软,超级可爱,但是相比于价钱来说,它有点小。`,
`这款卧室灯有额外的存储空间,价格也不太高。运输过程中灯绳断了,
但公司很乐意寄送了一个新的。客服态度非常好。`,
`电动牙刷的电池续航令人印象深刻。但刷头实在太小了。
如果能以50美元购入,那它就物超所值。`,
`11月以$49的优惠价买的搅拌机,12月就涨到了$89。
一年后电机开始发出可疑的声音。整体质量在下滑。`
];for (let review of reviews) {
const prompt = `
你的任务是从电子商务网站上的产品评论中提取相关信息。
请对三个反引号之间的评论文本进行概括,最多20个字符。
评论文本:```${review}```
`;
console.log(await getCompletion(prompt));
}
输出:
熊猫公仔礼物,可爱但偏小
卧室灯品质好,客服优
电动牙刷续航强,性价比高
搅拌机涨价快,质量下滑
同一条评论,只需调整 Prompt 的聚焦点——比如"聚焦在产品运输上"或"聚焦在价格与质量上"——就能生成不同维度的摘要。一个模型,N 种视角。 这才是 Prompt 方案的核心优势。
三个 Prompt 写的核心铁律
经过大量实践,总结出三条最原则性的规则:
铁律一:用分隔符隔开指令和数据
// 反引号分隔,边界清晰
评论文本:```${review}```// 没有分隔符,LLM 可能把指令也当成评论内容
评论文本:${review}
不分隔,LLM 有时会将你的指令作为评论的一部分进行分析,输出让人摸不着头脑的结果。
铁律二:明确指定输出格式
// JSON + 指定 key
格式化为 JSON 对象,以"product"和"brand"
