NLP学习(一)transformers之pipeline体验

初体验Python代码如下:

python 复制代码
from transformers import pipeline
print("正加载模型,首次运行自动下载")
# classifer = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")
# 测试几个句子
#换成这个模型,就支持多语言了。其中task是任务名称,model选择哪一个预训练好的模型
classifier = pipeline("sentiment-analysis",
                      model="nlptown/bert-base-multilingual-uncased-sentiment")
test_texts = [
    "今日赚了500元",
    "但是我觉得好无聊",
    "然后我去学习java技术"
]

print("\n--- 情感分析结果 ---")
for text in test_texts:
    result = classifier(text)
    print(f"文本: {text}")
    print(f"判断: {result[0]['label']} (置信度: {result[0]['score']:.4f})\n")

这里是创建 pipeline 对象时,最常用到的一组初始化参数。

参数名 作用 代码示例
model 指定模型 可以传模型名称字符串,或从AutoModel类加载好的模型对象。 pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")
tokenizer 指定分词器 通常与模型配套,很少单独指定,但可以用来实现自定义功能。 pipeline("sentiment-analysis", model=my_model, tokenizer=my_tokenizer)
device 指定运行设备 -1 代表CPU,01 等数字代表使用特定的GPU。 pipeline("sentiment-analysis", device=0) # 使用第一个GPU
batch_size 批处理大小 处理一批数据时,一次性送入模型的样本数量,可以提高GPU利用率。 pipeline("sentiment-analysis", batch_size=16)
model_kwargs 模型加载选项 以字典形式传递加载模型时的额外参数,如量化或半精度。 pipeline("sentiment-analysis", model_kwargs={"load_in_8bit": True, "torch_dtype": torch.float16})

调用 Pipeline 时的核心参数

这些参数是在你拿创建好的 classifier 对象去处理数据时使用的。

参数名 作用 代码示例
truncation & padding 截断和填充 将不同长度的输入,统一处理成模型能接受的固定长度。 results = classifier(texts, truncation=True, padding=True, max_length=128)
top_k 返回Top-K个结果 分类任务中返回概率最高的K个标签,而不只是第一名。 results = classifier("I love this!", top_k=2) 返回示例:[{'label':'POSITIVE','score':0.99}, {'label':'NEGATIVE','score':0.01}]
function_to_apply 激活函数 决定模型原始输出值(logits)转换成概率的方式(如softmaxsigmoid)。 results = classifier(text, function_to_apply="sigmoid")
return_all_scores 返回所有标签分数 是否返回所有类别的分数,相当于 top_k 设为无穷大。 results = classifier(text, return_all_scores=True)
max_length 最大生成长度 (主要用于生成任务)限制生成文本的最大长度。 results = generator(prompt, max_new_tokens=100)
temperature 采样温度 (主要用于生成任务)控制生成文本的随机性。值越低,输出越确定。 results = generator(prompt, do_sample=True, temperature=0.7)

如何理解和使用这些参数?

  1. 先从官方示例开始:Hugging Face 官方文档的每个Pipeline页面都会给出最基本的使用示例,这是最可靠的起点。

  2. 区分参数类型 :注意区分哪些参数是在 pipeline(...) 初始化时使用的(如 device),哪些是在 pipe(data, ...) 调用时使用的(如 top_k)。

  3. 为特定任务查找 :不同任务的参数差异巨大。文本生成任务关注 temperaturemax_new_tokens;分类任务则关注 top_kfunction_to_apply。请务必查阅对应任务的API文档。

  4. 尝试与报错:实践出真知。多尝试不同的参数组合,如果遇到报错,仔细阅读错误信息,它通常会给出很好的提示。

python 复制代码
from transformers import pipeline
import torch

# 1. 初始化 Pipeline:指定使用GPU(如果有),并开启8位量化以节省显存
classifier = pipeline(
    "sentiment-analysis",
    model="distilbert-base-uncased-finetuned-sst-2-english",
    device=0,  # 使用第一个GPU,如果没有则改为 -1 使用CPU
    model_kwargs={"load_in_8bit": True} # 开启8位量化,需安装bitsandbytes库
)

# 2. 调用 Pipeline:处理文本,并返回概率最高的2个结果
results = classifier(
    "I love this programming experience!",
    top_k=2,                     # 返回第一和第二名的结果
    truncation=True,             # 开启截断
    max_length=128               # 限制最大长度
)

print(results)
# 预期你会看到类似这样的输出,它同时显示了正面和负面的概率:
# [{'label': 'POSITIVE', 'score': 0.9999}, {'label': 'NEGATIVE', 'score': 0.0001}]

下一步:继续跑通更多任务

任务2:命名实体识别 (NER)

一、这个任务是做什么的?

一句话定义 :从文本中找出有特定意义的实体,并归类。

实体类型示例

类别 英文标记 例子
人名 PER (Person) 李白、Elon Musk
地名 LOC (Location) 北京、Mount Everest
组织名 ORG (Organization) 腾讯、United Nations
时间 TIME 2024年、next Monday
数量 MONEY/PERCENT 100美元、50%

问题:实体识别一定要选其他模型吗?

不一定。你可以用原来的情感分析模型做 NER 吗?不行。

但你可以用其他模型做 NER。 模型选择取决于你的需求:

你的需求 推荐模型
英文实体识别 dslim/bert-base-NER(你现在用的)
中文实体识别 ckiplab/bert-base-chinese-ner
更快、更轻量(英文) dslim/distilbert-NER
效果最好、最慢(英文) dbmdz/bert-large-cased-finetuned-conll03-english
python 复制代码
# ner_demo.py - 命名实体识别
import os
from transformers import pipeline

# ========== 第1段:设置国内镜像(解决网络问题)==========
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# ========== 第2段:创建 NER pipeline ==========
# pipeline("任务类型", model="模型名称", aggregation_strategy="合并策略")
ner_tagger = pipeline(
    "ner",                                    # 任务类型:命名实体识别
    model="dslim/bert-base-NER",             # 使用哪个预训练模型
    aggregation_strategy="simple"            # 把 B-PER+I-PER 合并成完整人名
)

# ========== 第3段:准备测试文本 ==========
text = "Satya Nadella is the CEO of Microsoft, based in Redmond."

# ========== 第4段:执行推理 ==========
# 把文本传入 pipeline,模型自动完成:分词 → 预测标签 → 合并实体
results = ner_tagger(text)

# ========== 第5段:输出结果 ==========
print(f"原文: {text}\n")
print("识别到的实体:")
print("-" * 50)

for entity in results:
    # entity 是一个字典,包含以下键:
    # - 'word'         : 实体文本
    # - 'entity_group' : 实体类型 (PER/ORG/LOC)
    # - 'score'        : 置信度 (0~1,越高越确定)
    print(f"实体: {entity['word']:20} 类型: {entity['entity_group']:10} 置信度: {entity['score']:.3f}")

任务三:文本摘要 (Summarization)

一、概念(先搞清楚这是什么)

1.1 一句话定义

把一篇长文本,压缩成一段短文本,保留核心信息。

text

复制代码
输入:一篇 5000 字的新闻文章
输出:一段 100 字的摘要,说清楚“谁、在什么时候、做了什么事、结果如何”

1.2 与分类/标注任务的区别

任务类型 输入 → 输出 输出形式
情感分析 句子 → 正面/负面 一个标签
NER 句子 → 实体列表 一组标签
文本摘要 文章 → 短文本 新生成的句子

核心区别 :摘要任务需要模型自己生产文本 ,而不是从已有的标签里选一个。这是生成式任务,比分类任务更难。


二、摘要的两种技术路线

路线 做法 例子 优缺点
抽取式摘要 从原文中挑选出最重要的句子,拼在一起 考试时划重点,原封不动抄下来 保证语法正确,但可能不连贯
生成式摘要 读懂原文后,用自己的话重新写一遍 考试时理解后用自己的语言总结 更灵活,但可能瞎编(幻觉)

你即将使用的模型 facebook/bart-large-cnn :是生成式的。它真正"理解"原文,然后逐词生成新句子。

你用的模型:BART

facebook/bart-large-cnn 是一个专门为摘要任务微调过的 BART 模型。

BART 是什么?

概念 解释
全称 Bidirectional and Auto-Regressive Transformer
定位 一种 Transformer 架构,专门为生成式任务设计
与 BERT 的区别 BERT 只能理解(编码器),BART 既能理解又能生成(编码器+解码器)
训练方式 把原文打乱/删除/遮盖,让模型学会还原

类比

  • BERT = 只能做阅读理解的选择题

  • BART = 能做阅读理解的简答题

BART 做摘要的流程

text

复制代码
输入(原文):"小明去超市。他买了苹果。"
    ↓
编码器 (Encoder):读懂原文,提炼成内部表示(一堆数字向量)
    ↓
解码器 (Decoder):一个字一个字地生成摘要
    ↓
输出:"小明买苹果"

解码器的生成过程:

text

复制代码
步骤1:输入开始标记 → 输出 "小"
步骤2:输入"小" → 输出 "明"
步骤3:输入"小明" → 输出 "买"
步骤4:输入"小明买" → 输出 "苹果"
步骤5:输入"小明买苹果" → 输出结束标记

完整代码

python 复制代码
# summarization_demo.py - 文本摘要
import os
from transformers import pipeline

# ========== 第1段:设置国内镜像(解决网络问题)==========
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# ========== 第2段:创建摘要 pipeline ==========
summarizer = pipeline(
    "summarization",                         # 任务类型:文本摘要
    model="facebook/bart-large-cnn",         # BART模型,在CNN新闻数据上微调过
    device=-1                                # -1 = 使用CPU,0 = 使用GPU
)

# ========== 第3段:准备长文本 ==========
# 注意:BART模型最大输入长度是1024个token,超过会被截断
long_text = """
Artificial intelligence has made remarkable progress in recent years. 
Deep learning models have achieved human-level performance on tasks like 
image recognition and natural language understanding. However, these models 
require massive amounts of data and computational power. Researchers are 
now exploring more efficient architectures that can learn from fewer examples. 
This new direction, known as few-shot learning, aims to make AI more accessible 
and environmentally friendly. Early results show promise, but many challenges 
remain before these systems can be deployed in real-world applications.
"""

# ========== 第4段:执行摘要 ==========
# max_length: 摘要最大长度(token数)
# min_length: 摘要最小长度(token数)
# do_sample=False: 不使用随机采样,每次输出相同(确定性输出)
result = summarizer(
    long_text,
    max_length=50,      # 摘要最长 50 个 token
    min_length=20,      # 摘要最短 20 个 token
    do_sample=False     # 不随机,保证结果可重复
)

# ========== 第5段:输出结果 ==========
print("--- 原文 ---")
print(long_text)
print("\n--- 摘要 ---")
print(result[0]['summary_text'])
print(f"\n原文长度: {len(long_text.split())} 词")
print(f"摘要长度: {len(result[0]['summary_text'].split())} 词")

逐段代码解析

第2段:pipeline("summarization", model="facebook/bart-large-cnn")

参数 解释
"summarization" 任务类型,告诉 pipeline 要做文本摘要
model="facebook/bart-large-cnn" 使用 BART 大模型,在 CNN/DailyMail 新闻数据集上微调过
device=-1 使用 CPU 运行(没有 GPU 就用这个)。0 表示使用第一个 GPU

模型名称拆解

text

复制代码
facebook/bart-large-cnn
    │        │     │
    │        │     └── 微调用的数据集(CNN新闻)
    │        └── 模型规模(large = 4亿参数)
    └── 发布者(Meta FAIR)

第4段:summarizer() 调用参数

参数 类型 解释
long_text 字符串(必填) 要摘要的原文
max_length=50 整数(可选) 生成摘要的最大 token 数。默认是 142。太小会丢失信息
min_length=20 整数(可选) 生成摘要的最小 token 数。防止输出太短
do_sample=False 布尔(可选) False = 每次都选概率最高的词(确定性输出)。True = 随机采样,每次结果可能不同

do_sample 的作用

python

复制代码
# do_sample=False(贪婪解码)
第一步:模型预测 P(第一个词) = {"深度":0.5, "人工":0.3, "机器":0.2} → 选 "深度"
第二步:基于"深度"预测下一个词 → ...
→ 每次运行结果完全相同

# do_sample=True(随机采样)
第一步:模型预测 P = {"深度":0.5, "人工":0.3, "机器":0.2} → 按概率随机抽取,可能抽到"人工"
→ 每次运行结果可能不同

第5段:result 的结构

python

复制代码
result = [
    {
        'summary_text': '摘要内容...'   # 字符串,生成的摘要
    }
]
  • 返回结果是一个列表 ,每个元素是一个字典

  • 只有一个输入文本,所以列表只有一个元素

  • result[0] 拿到字典,result[0]['summary_text'] 拿到摘要字符串

任务四:机器翻译 (Machine Translation)

1.1 一句话定义

把一种语言的文本,转换成另一种语言的文本,保持语义不变。

text

复制代码
输入:Hello, how are you? (英文)
输出:你好,你好吗?(中文)

1.2 与之前任务的区别

任务 输入 → 输出 输出语言是否改变
情感分析 文本 → 正面/负面 否(只是打标签)
NER 文本 → 实体列表 否(只是抽信息)
文本摘要 文本 → 文本 否(同语言压缩)
机器翻译 文本 → 文本 是(跨语言转换)

核心难点:模型必须同时理解两种语言的结构和对应关系。

完整代码

python 复制代码
# translation_demo.py - 机器翻译(英译中)
import os
from transformers import pipeline

# ========== 第1段:设置国内镜像 ==========
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# ========== 第2段:创建翻译 pipeline ==========
translator = pipeline(
    "translation",                           # 任务类型:翻译
    model="Helsinki-NLP/opus-mt-en-zh",      # 英译中模型
    device=-1                                # -1 = CPU, 0 = GPU
)

# ========== 第3段:准备待翻译的英文句子 ==========
texts = [
    "Hello, how are you today?",
    "Machine learning is a fascinating field of study.",
    "The weather in Shanghai is beautiful this season."
]

# ========== 第4段:批量翻译 ==========
# 可以直接传入列表,自动批量处理
results = translator(texts)

# ========== 第5段:输出结果 ==========
print("--- 英译中结果 ---\n")
for i, (original, result) in enumerate(zip(texts, results)):
    print(f"英文 {i+1}: {original}")
    print(f"中文 {i+1}: {result['translation_text']}")
    print()

常用翻译模型对照表

方向 模型名称 大小 特点
英→中 Helsinki-NLP/opus-mt-en-zh ~300MB 通用,较平衡
中→英 Helsinki-NLP/opus-mt-zh-en ~300MB 同上,方向相反
英→日 Helsinki-NLP/opus-mt-en-ja ~300MB 日文翻译
英→法 Helsinki-NLP/opus-mt-en-fr ~300MB 法文翻译
多语言 facebook/m2m100_418M ~1.5GB 100种语言互译,不需要指定源语言
高质量英→中 Helsinki-NLP/opus-mt-en-zh 换更大的 ~1GB 效果更好但更慢

第五个任务:问答系统 (QA)

一、概念

一句话定义:给定问题和上下文,从上下文中找到答案。

text

复制代码
输入:
  上下文:"中国首都是北京。北京有故宫和长城。"
  问题:"中国的首都是哪里?"
输出:
  "北京"
二、与之前任务的区别
任务 输出形式 是否依赖额外上下文
情感分析 一个标签
NER 实体列表
摘要 一段新文本
翻译 一段新文本
问答 一个短语/句子 是(需要上下文)
两种类型
类型 做法 例子
抽取式 QA 从原文中截取一个片段作为答案 上下文中有"北京",直接复制"北京"
生成式 QA 理解后用自己的话生成答案 上下文中没有直接答案,需要推断

你即将使用的模型 distilbert-base-cased-distilled-squad抽取式的。

模型内部:答案定位

text

复制代码
上下文:"中国首都是北京。"
问题:"首都是哪里?"

模型做的事情:
步骤1:把问题和上下文拼接成一个序列
[CLS] 问题:首都是哪里? [SEP] 上下文:中国首都是北京。 [SEP]
步骤2:对每个 token 预测两个概率:
  - 它是答案开始位置的概率
  - 它是答案结束位置的概率
步骤3:选择最佳的开始和结束位置
开始位置:北 (token 索引 7)
结束位置:京 (token 索引 8)
步骤4:截取原文片段:"北京"
完整代码
python 复制代码
# qa_demo.py - 问答系统
import os
from transformers import pipeline

# 设置镜像
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 创建 QA pipeline
qa_pipeline = pipeline(
    "question-answering",                    # 任务类型:问答
    model="distilbert-base-cased-distilled-squad",  # 在 SQuAD 数据集上微调过的轻量模型
    device=-1
)

# 准备上下文和问题
context = """
The Great Wall of China is a series of fortifications built along the northern borders 
of China. The most famous sections were built during the Ming Dynasty (1368-1644). 
The wall stretches over 13,000 miles, making it the longest structure ever built.
"""

questions = [
    "When were the most famous sections built?",
    "How long is the Great Wall?",
    "What is the longest structure ever built?"
]

# 执行问答
print("--- 问答系统 ---")
print(f"上下文: {context}\n")

for q in questions:
    result = qa_pipeline(question=q, context=context)
    print(f"问题: {q}")
    print(f"答案: {result['answer']}")
    print(f"置信度: {result['score']:.3f}")
    print(f"答案在原文中的位置: {result['start']} - {result['end']}\n")
输出结构
python 复制代码
result = {
    'score': 0.987,        # 置信度
    'start': 78,           # 答案在原文中的起始字符位置
    'end': 94,             # 答案在原文中的结束字符位置
    'answer': 'the Ming Dynasty (1368-1644)'  # 答案文本
}
相关推荐
深兰科技1 小时前
韩国KAIST AI半导体高管项目代表团到访深兰科技,聚焦AI算力与智能产业合作机会
人工智能·机器人·symfony·ai算力·深兰科技·韩国科学技术院·kaist
冬奇Lab1 小时前
Agent系列(六):记忆管理——让 Agent 记住重要的事
人工智能·agent
冬奇Lab1 小时前
一天一个开源项目(第113篇):notebooklm-py - 把 Google NotebookLM 变成可编程 API,还能接入 Claude Code
人工智能·google·开源
字节跳动开源2 小时前
Viking AI 搜索 CLI 正式发布:会说话,就能做搜索推荐
数据库·人工智能·开源
阿杰技术2 小时前
AI 编程助手落地实战:从提效到重构的全场景指南
人工智能·重构
Agent手记2 小时前
制造业生产流程自动化,Agent需要具备哪些能力?深度拆解2026工业级智能体落地范式与核心架构
大数据·人工智能·ai·架构·自动化
道里2 小时前
花了 5 万刀用 AI 写代码之后,这是我的全部经验
前端·人工智能
硅基流动2 小时前
光谷爱计算 × 硅基流动:AI 算力联合运营,共建高效“Token 工厂”
大数据·人工智能