摘要

传统机器学习中,情感分析、命名实体识别、主题分类等任务需要分别训练和部署多个模型,耗时耗力。而大语言模型(LLM)凭借其强大的推理能力,只需通过提示词就能快速完成这些任务。本文基于 OpenAI 官方课程,系统讲解如何使用 LLM 进行文本推理。你将学习:情感二分类(正面/负面)、多情绪识别、愤怒检测、商品与品牌提取、单提示多任务联合抽取、主题列表生成、零样本主题分类与新闻预警系统。所有代码均基于 gpt-3.5-turbo 模型。

适用人群 / 前置知识

适用人群:希望快速实现 NLP 任务的开发者、数据科学家、产品经理;对传统 ML 流程感到繁琐的学习者。
前置知识:了解 Python 基础;能调用 OpenAI API;知道什么是提示词即可。

引言:从“训练模型”到“编写提示”

在传统机器学习时代,如果你想做三件事——判断评论情感、提取商品名称、识别用户是否愤怒——你需要:

  1. 收集三个带标签的数据集
  2. 训练三个不同的模型(可能是朴素贝叶斯、LSTM、BERT 等)
  3. 将三个模型分别部署到云端
  4. 编写三个推理接口

这个过程至少需要几天到几周。而有了大语言模型,你只需要写几个提示词,甚至一个提示词,就能在几秒内完成所有任务。这就是 LLM 在“推理”任务上的革命性优势。

本文将带你从零开始,掌握 LLM 的推理能力,涵盖:

  • 情感分类(正面/负面)
  • 情绪识别(快乐、沮丧、愤怒等)
  • 实体提取(商品名、品牌名)
  • 多任务联合抽取(一次提示获取多个字段)
  • 主题推断与零样本分类

环境准备

复用之前的辅助函数:

import openai
import os
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv('OPENAI_API_KEY')

def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0,
    )
    return response.choices[0].message["content"]

案例数据:一条灯的产品评论

lamp_review = """
Needed a nice lamp for my bedroom, and this one had
additional storage and not too high of a price point.
Got it fast. The string to our lamp broke during the
transit and the company happily sent over a new one.
Came within a few days as well. It was easy to put
together. I had a missing part, so I contacted their
support and they very quickly got me the missing piece!
Lumina seems to me to be a great company that cares
about their customers and products!!
"""

任务一:情感分析(正面/负面)

最简单的推理:判断评论是正面还是负面。

prompt = f"""
以下产品评论的情感是什么?评论用三重反引号分隔。

评论:```{lamp_review}```
"""

response = get_completion(prompt)
print(response)
# 输出:该产品评论的情感是正面的。

如果你只想得到一个词(方便后处理):

prompt = f"""
以下产品评论的情感是什么?用单个词回答,要么“positive”要么“negative”。

评论:```{lamp_review}```
"""

response = get_completion(prompt)
print(response)
# 输出:positive

任务二:情绪识别

除了整体情感,你可能还想知道客户表达了哪些具体情绪。

prompt = f"""
识别以下评论作者表达的情绪列表。最多包含五个项目。
将答案格式化为小写单词组成的列表,用逗号分隔。

评论:```{lamp_review}```
"""

response = get_completion(prompt)
print(response)
# 输出示例:satisfied, happy, grateful, relieved, content

任务三:愤怒检测

对于客户支持团队,快速识别愤怒的客户至关重要。

prompt = f"""
以下评论的作者是否表达了愤怒?用“yes”或“no”回答。

评论:```{lamp_review}```
"""

response = get_completion(prompt)
print(response)
# 输出:no

任务四:实体提取(商品与品牌)

提取结构化信息:购买的商品、生产公司。

prompt = f"""
从评论文本中识别以下项目:
- 购买的商品
- 生产该商品的公司

将答案格式化为 JSON 对象,键名为“Item”和“Brand”。
如果信息不存在,用“unknown”作为值。

评论:```{lamp_review}```
"""

response = get_completion(prompt)
print(response)
# 输出:{"Item": "lamp", "Brand": "Lumina"}

任务五:多任务联合抽取(一个提示搞定所有)

你不需要为每个任务单独调用模型。一个提示可以同时提取情感、愤怒标记、商品、品牌。

prompt = f"""
从评论文本中识别以下项目:
- 情感(positive 或 negative)
- 评论者是否表达愤怒(true 或 false)
- 购买的商品
- 生产该商品的公司

将答案格式化为 JSON 对象,键名为“Sentiment”、“Anger”、“Item”、“Brand”。
将 Anger 的值格式化为布尔值(true/false,不加引号)。

评论:```{lamp_review}```
"""

response = get_completion(prompt)
print(response)
# 输出示例:
# {
#   "Sentiment": "positive",
#   "Anger": false,
#   "Item": "lamp",
#   "Brand": "Lumina"
# }

这个 JSON 可以直接用 json.loads() 解析为 Python 字典,非常方便。

任务六:主题推断(从新闻文章中提取主题)

假设我们有一篇关于政府员工满意度调查的虚构新闻文章(代码中的 story 变量,内容提及 NASA、社会保障局等)。我们可以要求模型总结出 5 个主题。

prompt = f"""
确定以下文本中讨论的五个主题,文本用三重反引号分隔。
每个主题为一到两个词长。
将答案格式化为逗号分隔的列表。

文本:```{story}```
"""

response = get_completion(prompt)
print(response)
# 输出示例:government survey, job satisfaction, NASA, Social Security Administration, employee morale

你可以用 response.split(‘,’) 将其转换为 Python 列表。

任务七:零样本主题分类与新闻预警

假设你的新闻网站只追踪固定的几个主题:[“NASA”, “local government”, “engineering”, “employee satisfaction”, “federal government”]。你想判断一篇新文章覆盖了哪些主题。

topic_list = [“NASA”, “local government”, “engineering”, “employee satisfaction”, “federal government”]

prompt = f"""
判断以下主题列表中的每一项是否是下面文本(用三重反引号分隔)中讨论的主题。
给出答案格式为“主题: 0 或 1”,每行一个。

主题列表:{', '.join(topic_list)}

文本:```{story}```
"""

response = get_completion(prompt)
print(response)
# 输出示例:
# NASA: 1
# local government: 0
# engineering: 0
# employee satisfaction: 1
# federal government: 1

解析响应并创建预警:

topic_dict = {}
for line in response.split('\n'):
    if ': ' in line:
        key, val = line.split(': ')
        topic_dict[key] = int(val)

if topic_dict.get("NASA", 0) == 1:
    print("ALERT: New NASA story!")
注意:上面这个解析方式依赖于模型输出的固定格式。在生产环境中,更推荐要求模型输出 JSON,这样解析更稳健。

常见问题与注意事项

1. 输出格式不稳定的问题:模型可能有时输出“positive”,有时输出“Positive”,有时输出“The sentiment is
positive”。解决办法:在提示中明确指定格式(如“只输出一个词”),或使用 JSON 模式。
2. 布尔值格式:要求输出 true/false 时,明确说明“不要加引号”,否则模型可能输出字符串 “false”。
3. 零样本 vs 少样本:本文所有示例都是零样本(没有给任何示例)。如果模型表现不稳定,可以尝试在提示中加入一个示例(少样本)。
4. 推理与生成的界限:推理任务通常要求确定性输出,建议 temperature=0。生成任务(如写诗)才用较高temperature。
5. 多任务联合抽取的优势:减少 API 调用次数、降低延迟、节省成本。但提示会变长,需要测试是否依然准确。

扩展应用场景

  • 客户工单分类:自动判断工单类型(退货、咨询、投诉)、紧急程度。
  • 社交媒体监控:实时分析品牌提及的情感变化。
  • 简历解析:从简历中提取姓名、技能、工作年限。
  • 合同审查:提取关键条款、日期、责任方。

总结

推理任务 提示关键词 输出示例
情感二分类 sentiment … as a single word positive
情绪列表 list of emotions satisfied, happy, grateful
愤怒检测 expressing anger? yes or no no
实体提取 identify Item and Brand as JSON {“Item”: “lamp”, “Brand”: “Lumina”}
多任务联合 identify Sentiment, Anger, Item, Brand 完整 JSON
主题提取 determine five topics NASA, job satisfaction, …
零样本分类 determine whether each topic is in text NASA: 1

大语言模型的推理能力,让原本复杂的 NLP 任务变得像写一句话一样简单。你不需要再训练和部署多个模型,只需要掌握提示词的技巧,就能在几分钟内构建出实用的文本分析系统。

下一步,你可以尝试将自己的业务数据(用户反馈、客服对话、新闻文章)代入这些提示模板,看看模型能为你提取出哪些有价值的信息。下一篇文章我们将探讨“转换”能力——翻译、格式转换等,敬请期待!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐