三、HuggingFace核心组件-transformers 库使用

文本续写 xueyxie.py

复制代码
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
model_dir = r'D:\pyprojecgt\flaskProject\langchainstudy\modelscope\gpt2-chinese-cluecorpussmall'
# 创建模型和分词器
model = AutoModelForCausalLM.from_pretrained(model_dir)
tokenizer = AutoTokenizer.from_pretrained(model_dir)
# 使用加载的模型和分词器创建生成文本的 pipeline
generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
# 生成文本
output = generator("你好,我是一款语言模型。", truncation=True,max_new_tokens=50, num_return_sequences=1)
print(output)
# output = generator(
#     "你好,我是一款语言模型,",  # 生成文本的输入种子文本(prompt)。模型会根据这个初始文本,生成后续的文本
#     max_length=50,  # 指定生成文本的最大长度。这里的50表示生成的文本最多包含50个标记(tokens)
#     num_return_sequences=1,  # 参数指定返回多少个独立生成的文本序列。值为1表示只生成并返回一段文本。
#     truncation=True,  # 该参数决定是否截断输入文本以适应模型的最大输入长度。如果True,超出模型最大输入长度的部分将被截断;如果False,模型可能无法处理过长的输入,可能会报错。
#     temperature=0.7,  # 该参数控制生成文本的随机性。值越低,生成的文本越保守(倾向于选择概率较高的词);值越高,生成的文本越多样(倾向于选择更多不同的词)。0.7是一个较为常见的设置,既保留
#     top_k=50,  # 该参数限制模型在每一步生成时仅从概率最高的k个词中选择下一个词。这里top_k=50表示模型在生成每个词时只考虑概率最高的前50个候选词,从而减少生成不太可能的词的概率。
#     top_p=0.9,  # 该参数(又称为核采样)进一步限制模型生成时的词汇选择范围。它会选择一组累积概率达到p的词汇,模型只会从这个概率集合中采样。top_p=0.9意味着模型会在可能性最强的90%的词中
#     clean_up_tokenization=False  # 该参数控制生成的文本中是否清理分词时引入的空格。如果设置为True,生成的文本会清除多余的空格;如果为False,则保留原样。默认值即将改变为False
# )

文本分类

textclass1.py 评价分析,情感分类

复制代码
import numpy as np
from langchain_community.vectorstores import FAISS
from langchain_huggingface import ChatHuggingFace, HuggingFacePipeline, HuggingFaceEmbeddings
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    pipeline

)

from langchain_huggingface import ChatHuggingFace
# 创建嵌入模型
#:bert-base-chinese 编码器模型
# model_name = r'D:\大模型\RAG_Project\BAAI\bge-large-zh-v1.5'
model_name = r'D:\本地模型\google-bert\bert-base-chinese'
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline
# 加载模型和分词器
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 使用加载的模型和分词器创建分类任务的 pipeline
classifier = pipeline('text-classification', model=model, tokenizer=tokenizer)
# 执行分类任务
output = classifier("你好,我是一款语言模型")
print(output)


'''你遇到的这个提示核心是:bert-base-chinese 是基础预训练模型,没有针对「文本分类」任务的下游微调权重,因此分类头(classifier.bias/classifier.weight)是随机初始化的,直接用于预测会导致结果无意义。下面我会帮你理解提示含义 + 给出两种解决方案(快速测试 / 实际微调),让模型能正常做文本分类。
一、提示信息深度解读
关键内容	含义
Some weights were not initialized	BertForSequenceClassification 包含两部分权重:
✅ BERT 基础编码器权重(从bert-base-chinese加载,有效);
❌ 分类头权重(classifier层,随机初始化,无效);
You should probably TRAIN this model on a down-stream task	必须在具体的分类数据集(如情感分析、文本标签)上微调分类头,才能用于预测;
Device set to use cpu	模型已成功加载到 CPU,这是正常提示,无需处理;
简单说:你用的是 "裸的 BERT 骨架",没有分类任务的 "大脑",直接分类会得到随机结果。'''

问答模型(阅读理解)

复制代码
chatexamp
复制代码
import torch
from langchain_huggingface import ChatHuggingFace, HuggingFacePipeline
# 安装最新版
#pip install modelscope --upgrade
#pip install datasets  tokenizers pyarrow addict torch transformers accelerate sentencepiece --upgrade
#pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cpu
# CUDA 12.1
#pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu121
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    pipeline, AutoModelForQuestionAnswering

)
tensor_device = "cuda" if torch.cuda.is_available() else "cpu"
from langchain_huggingface import ChatHuggingFace
# 创建嵌入模型
# model_name = r'D:\大模型\RAG_Project\BAAI\bge-large-zh-v1.5'
model_name = r'D:\本地模型\roberta-base-chinese-extractive-qa'
#您加载的是 AutoModelForCausalLM(因果语言模型,如GPT),但问答任务需要 AutoModelForQuestionAnswering架构

#roberta-base-chinese-extractive-qa是抽取式问答模型,不是生成式模型
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForQuestionAnswering.from_pretrained(
    model_name,
    device_map=tensor_device,  # 自动分配GPU/CPU
    trust_remote_code=True
)
qa_pipeline = pipeline(
    "question-answering",
    model=model,
    tokenizer=tokenizer
)

result = qa_pipeline({
    "question": "双缝干涉实验说明了什么?",
    "context": "双缝干涉实验是量子力学的基础实验,证明了光具有波粒二象性。"
})
print(result)

核心知识点架构

1. 模型加载与本地路径处理

复制代码
model_dir = r'D:\pyprojecgt\flaskProject\langchainstudy\modelscope\gpt2-chinese-cluecorpussmall'
model = AutoModelForCausalLM.from_pretrained(model_dir)
tokenizer = AutoTokenizer.from_pretrained(model_dir)
  • AutoModelForCausalLM:自动检测并加载因果语言模型(用于文本生成)

  • AutoTokenizer:自动加载对应的分词器

  • 本地路径加载:从本地目录加载模型,避免重复下载

  • 原始字符串(r前缀):处理Windows路径中的反斜杠转义

2. Pipeline 设计模式

复制代码
generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
  • 任务抽象pipeline()将复杂流程封装为简单接口

  • 模块化设计:分离模型加载、预处理、推理、后处理

  • 多任务支持:支持 text-generation、text-classification、translation 等

3. 文本生成控制参数

基础控制
  • max_new_tokens=50新增的生成标记数(不包含输入文本)

  • max_length=50:生成文本的总长度(包含输入+生成部分)

  • num_return_sequences=1:返回的独立生成结果数量

生成策略控制
  • temperature=0.7:采样温度

    • 值越低 → 输出越确定(选择最高概率词)

    • 值越高 → 输出越随机(探索更多可能性)

  • top_k=50:仅从概率最高的前k个词中采样

  • top_p=0.9:核采样,从累积概率达p的最小词集中采样

  • 组合效果top_k=50+ top_p=0.9→ 平衡质量与多样性

文本处理参数
  • truncation=True:自动截断超长输入

  • clean_up_tokenization=False:保留分词产生的原始空格


🔄 完整工作流程

  1. 初始化:加载模型和分词器到内存

  2. 预处理:分词器将文本转换为模型可理解的标记ID

  3. 推理:模型根据输入标记生成下一个标记的概率分布

  4. 采样:根据温度、top-k、top-p策略选择下一个标记

  5. 循环生成:重复步骤3-4直到达到指定长度

  6. 后处理:将生成的标记ID转换回可读文本


💡 关键概念深度解析

因果语言模型(CausalLM)

  • 原理:基于前文预测下一个词

  • 应用:GPT系列、文本续写、对话生成

  • 数学表达P(w_t | w_1, w_2, ..., w_{t-1})

分词器(Tokenizer)作用

复制代码
# 查看分词过程
text = "你好,我是一款语言模型。"
tokens = tokenizer.tokenize(text)
ids = tokenizer.encode(text)
print("Tokens:", tokens)  # ['你', '好', ',', '我', '是', '一', '款', '语', '言', '模', '型', '。']
print("IDs:", ids)        # [101, 872, 1962, 8024, 2769, 3221, 671, 1366, 1366, 1366, 1366, 511, 102]

温度对生成的影响

复制代码
# 不同温度值的对比
prompt = "今天天气"
for temp in [0.1, 0.7, 1.5]:
    output = generator(prompt, temperature=temp, max_new_tokens=20)
    print(f"Temperature {temp}: {output[0]['generated_text']}")

🚀 实际应用场景

1. 智能对话系统

复制代码
def chat_with_bot(user_input, history=""):
    prompt = f"用户:{user_input}\nAI:"
    output = generator(prompt, max_new_tokens=100, temperature=0.8)
    return output[0]['generated_text'].split("AI:")[-1]

2. 文本续写工具

复制代码
def continue_writing(initial_text, style="creative"):
    temperature = 0.9 if style == "creative" else 0.3
    output = generator(initial_text, temperature=temperature, max_new_tokens=200)
    return output[0]['generated_text']

3. 内容创作助手

复制代码
def generate_article(topic, length=300):
    prompt = f"主题:{topic}\n文章:"
    output = generator(prompt, max_new_tokens=length, top_p=0.95)
    return output[0]['generated_text']

📊 参数调优建议

应用场景 推荐参数组合
精确任务(代码生成、翻译) temperature=0.1, top_k=10
创意写作(故事、诗歌) temperature=0.8, top_p=0.9
对话系统 temperature=0.7, top_k=50
技术文档 temperature=0.3, top_p=0.8

这段代码展示了现代NLP应用的核心技术栈,是理解和应用大语言模型的基础模板。

相关推荐
2501_948120154 小时前
区块链与人工智能融合的隐私保护技术
人工智能·区块链
Liue612312318 小时前
基于YOLOv26的口罩佩戴检测与识别系统实现与优化
人工智能·yolo·目标跟踪
小二·10 小时前
Python Web 开发进阶实战 :AI 原生数字孪生 —— 在 Flask + Three.js 中构建物理世界实时仿真与优化平台
前端·人工智能·python
chinesegf10 小时前
文本嵌入模型的比较(一)
人工智能·算法·机器学习
珠海西格电力10 小时前
零碳园区的能源结构优化需要哪些技术支持?
大数据·人工智能·物联网·架构·能源
Black蜡笔小新10 小时前
视频汇聚平台EasyCVR打造校园消防智能监管新防线
网络·人工智能·音视频
珠海西格电力科技10 小时前
双碳目标下,微电网为何成为能源转型核心载体?
网络·人工智能·物联网·云计算·智慧城市·能源
2501_9418372610 小时前
【计算机视觉】基于YOLOv26的交通事故检测与交通状况分析系统详解_1
人工智能·yolo·计算机视觉
HyperAI超神经11 小时前
加州大学构建基于全连接神经网络的片上光谱仪,在芯片级尺寸上实现8纳米的光谱分辨率
人工智能·深度学习·神经网络·机器学习·ai编程