三、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应用的核心技术栈,是理解和应用大语言模型的基础模板。

相关推荐
涛声依旧god2 分钟前
如何打造一个 AI Agent 自动写作并一键发布技术文章的自动化系统
人工智能·ai·自动化·ai编程
AI_AGENT_DEV_AI9 分钟前
AI 自动化阅卷系统的开发
人工智能
2zcode13 分钟前
基于MATLAB车辆拥堵密度依赖的自适应交通信号控制系统
人工智能·计算机视觉·matlab
环境栈笔记23 分钟前
高性价比指纹浏览器推荐与选型:如何对照价格和实际可用功能筛选候选
前端·人工智能·后端·自动化
OpenCSG24 分钟前
GPT-5.6 深夜正式上线:下一代模型能力升级,AI Agent 进入深度协作时代
人工智能·gpt
Revolution6129 分钟前
Agent 请求失败后,别再疯狂点击重新生成了
人工智能·claude
小宋102133 分钟前
不用学算法也能玩转 AI?普通 Java 程序员转 AI 应用开发路线
java·人工智能·重构
迷茫中的自我42 分钟前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
龍德明宇43 分钟前
Emu3的「阳谋」:当AI不再「看」图,它还剩下什么?-龍德明宇
人工智能·大语言模型llm·负主体性·ai存在论
糖果店的幽灵43 分钟前
WorkBuddy + 好提示词 = 生产力。43 个场景,复制就能用
人工智能·langgraph