1、python代码实现与大模型的问答交互

article/2025/7/22 2:57:28

一、基础知识

1.1导入库

  • torch 是一个深度学习框架,用于处理张量和神经网络
  • modelscope是由阿里巴巴达摩院推出的开源模型库
    • AutoTokenizer 是ModelScope 库的类,分词器应用场景包括自然语言处理(NLP)中的文本分类、信息抽取、问答、摘要、翻译和文本生成等任务。它通过提供一个统一的接口,使得开发者可以快速且方便地加载和使用不同的预训练模型,而不需要深入了解每个模型的细节‌;
    •  AutoModel 是ModelScope 库的类,允许用户在不知道具体模型细节的情况下,根据给定的模型名称或模型类型自动加载相应的预训练模型
    • snapshotdownload 是 ModelScope 提供的一个函数,便于下载模型文件

1.2下载模型

   model_dir=snapshot_download("ZhipuAI/chatglm3-6b",revision"v1.0.0")

model_dir是模型下载后的存储路径。使用snapshot_download 函数下载指定版本的模型。有两种方式,

  • 第一种方式,使用本地的模型路径
  model_dir=snapshot_download("本地路径/chatglm3-6b",revision"v1.0.0")
  • 第二种方式,默认从modelscope下载 ZhipuAI/chatglm3-6b 的 v1.0.0 版本,见示例代码。这种方式需要在终端使用pip install modelscope来安装。snapshot_download 函数中的模型名称和版本可以通过搜索魔搭社区来查找。

魔搭社区汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。https://www.modelscope.cn/models

1.3加载分词器

tokenizer=AutoTokenizer.from_pretrained(model_dir,trust_remote_code=True)

使用 AutoTokenizer.frompretrained 方法加载预训练的分词器。其中,trustremotecode=True 表示信任远程代码。

1.4加载模型

with torch.no_grad():model=AutoModel.from_pretrained(model_dir,trust_remote_code=True).cpu().float()

1.4.1with torch.nograd()

with torch.nograd():表示在这个上下文中不计算梯度,以节省内存和计算资源。

Python中的with语句是一种用于简化资源管理的语法结构,通过上下文管理器协议(实现__enter__和__exit__方法)自动确保资源的获取和释放,常用于文件操作、数据库连接、线程锁等场景‌。

with 上下文管理器 as 变量:# 执行代码块

1.4.2AutoModel.frompretrained方法

AutoModel.frompretrained方法加载预训练的模型。其中,

  • .trustremotecode=True表示信任远程代码。
  • .cpu() 将模型移动到 CPU 上。
  • .float() 将模型的参数转换为浮点数类型。

针对当前模型,若使用GPU,可以将.cpu() 替换为.cuda()。此时,.float()是首选,float32提供较高的精度;.half()是float16,与float相比,内存减半。还可以通过.quantize()来选择模型量化方式:

  • .quantize(8)是INT8量化,表示将模型的权重和激活值量化为8位整数
  • .quantize(4)是INT4量化,表示将模型的权重和激活值量化为4位整数,但不是所有的硬件都支持INT4量化。(示例如下)
with torch.no_grad():model=AutoModel.from_pretrained(model_dir,trust_remote_code=True).quantize(8).cuda()

1.5设置模型为评估模式

model=model.eval()

model.eval() 将模型设置为评估模式,不启用 Batch Normalization 和 Dropout ,确保模型在测试和推理阶段的行为与训练阶段有所不同,从而提高结果的稳定性和准确性。。Batch Normalization 在训练过程中会对每一特征维做归一化操作,对每一批量输入算出 mean 和 std,而在 eval 模式下 BN 层将能够使用全部训练数据的均值和方差,即测试过程中不再针对测试样本计算mean和std,而是直接用训练好的值。

1.6第一次交互

responses,history=model.chat(tokenizer,"你好",history=[])
print(responses)
  • 使用 model.chat() 方法与模型进行交互,输入是 “你好”,初始历史记录为空列表 []
  • print(responses) 打印模型的回复。其中,responses 是模型的回复,history 是更新后的历史记录。

1.7第二次交互

responses,history=model.chat(tokenizer,"快乐学习大模型开发的方法",history=history)
print(responses)
  • 使用 model.chat()  方法与模型进行交互,输入是 “快乐学习大模型开发的方法”,历史记录是上一次交互的历史记录。
  • print(responses) 打印模型的回复。

二、大模型问答交互【CPU版】

2.1代码

import torch
from modelscope import AutoTokenizer,AutoModel,snapshot_download#终端运行pip install modelscope
#模型下载的默认路径为C:\Users\Administrator\.cache\modelscope\hub\models\
model_dir=snapshot_download("ZhipuAI/chatglm3-6b",revision="v1.0.0")
tokenizer=AutoTokenizer.from_pretrained(model_dir,trust_remote_code=True)with torch.no_grad():model=AutoModel.from_pretrained(model_dir,trust_remote_code=True).cpu().float()model=model.eval()
responses,history=model.chat(tokenizer,"你好",history=[])
print(responses)
responses,history=model.chat(tokenizer,"快乐学习大模型开发的方法",history=history)
print(responses)

2.2运行结果

2.3问题与解决

问题一:'torchvision' has no attribute 'extension'

解决一:重新安装torchvision

pip uninstall torchvision
pip install torchvision

问题二:TypeError: ChatGLMTokenizer._pad() got an unexpected keyword argument 'padding_side'

解决二:transformers版本问题,安装4.41.2版本

pip install transformers==4.41.2

三、大模型问答交互【GPU版】

3.1代码

import torch
from modelscope import AutoTokenizer,AutoModel,snapshot_download#终端运行pip install modelscope
#模型下载的默认路径为C:\Users\Administrator\.cache\modelscope\hub\models\
model_dir=snapshot_download("ZhipuAI/chatglm3-6b",revision="v1.0.0")
tokenizer=AutoTokenizer.from_pretrained(model_dir,trust_remote_code=True)with torch.no_grad():model=AutoModel.from_pretrained(model_dir,trust_remote_code=True).quantize(8).cuda()model=model.eval()
responses,history=model.chat(tokenizer,"你好",history=[])
print(responses)
responses,history=model.chat(tokenizer,"快乐学习大模型开发的方法",history=history)
print(responses)

3.2运行结果

3.3问题与解决

问题一:AssertionError:Torch not complied with CUDA enable

解决一:PyTorch和CUDA版本不匹配

问题二:TypeError: ChatGLMTokenizer._pad() got an unexpected keyword argument 'padding_side'

解决二:安装transformers版本问题,安装4.41.2版本

pip install transformers==4.41.2

http://www.hkcw.cn/article/jxdwrTXwNg.shtml

相关文章

再见Cursor!Trae Pro 登场

5 月 27 日,字节跳动旗下的 AI 编辑器 Trae 国际版正式推出了 Pro 订阅计划。长期以来,Trae 凭借免费使用和出色的编程体验,深受大家喜爱。不过,免费版在实际使用中,排队等待的情况时有发生,着实给用户带来…

【Docker 从入门到实战全攻略(一):核心概念 + 命令详解 + 部署案例】

1. 是什么 Docker 是一个用于开发、部署和运行应用程序的开源平台,它使用 容器化技术 将应用及其依赖打包成独立的容器,确保应用在不同环境中一致运行。 2. Docker与虚拟机 2.1 Docker(容器化) 容器化是一种轻量级的虚拟化技术…

rm删除到回收站

rm删除到回收站 背景安装trash-clipip安装包管理器安装 将trash-put别名设为rm设置回收站文件过期时间 trash基本用法删除文件删除后文件去了哪里 查看回收站从回收站中恢复文件恢复文件到指定路径 删除回收站中的指定文件 背景 在Linux命令行下操作的时候会不小心误删文件或目…

DDP与FSDP:分布式训练技术全解析

DDP与FSDP:分布式训练技术全解析 DDP(Distributed Data Parallel)和 FSDP(Fully Sharded Data Parallel)均为用于深度学习模型训练的分布式训练技术,二者借助多 GPU 或多节点来提升训练速度。 1. DDP(Distributed Data Parallel) 实现原理 数据并行:把相同的模型复…

数据采集是什么?一文讲清数据采集系统的模式!

目录 一、数据采集是什么? 二、为什么要进行数据采集 1. 为企业决策提供依据 2. 推动科学研究的发展 3. 提升生产效率和质量 三、数据采集系统的模式 1. 实时采集模式 2. 定时采集模式 3. 事件驱动采集模式 四、不同模式的应用场景及选择考虑因素 1. 应用…

python学习day33

知识点回顾: 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令(cmd中使用) 3.cuda的检查 4.简单神经网络的流程 a.数据预处理(归一化、转换成张量) b.模型的定义 i.继承nn.Module类 ii.定义每一个层 iii.定义前向传播…

Python中的变量、赋值及函数的参数传递概要

Python中的变量、赋值及函数的参数传递概要 python中的变量、赋值 python中的变量不是盒子。 python中的变量无法用“变量是盒子”做解释。图说明了在 Python 中为什么不能使用盒子比喻,而便利贴则指出了变量的正确工作方式。 如果把变量想象为盒子,那…

如何优化微信小程序中渲染带有图片的列表(二进制流存储方式的图片存在本地数据库)

方法一:对列表的获取进行分页处理 实现方法: 前端请求(需要向后端传两个参数,pageIndex是获取第几页是从0开始,pageSize是这一页需要获取多少个数据) 后端接口实现(因为这里是通过参数拼接请求…

电磁器件的“折纸革命“:牛津《Sci. Reports》发布剪纸超材料

01 前沿速递:顶尖团队破解行业难题 近日,牛津大学工程科学系杨云芳、Andrea Vallecchi、Ekaterina Shamonina、Christopher Stevens及游忠教授团队在《Scientific Reports》发表突破性研究,提出一类基于剪纸(Kirigami&#xff0…

【Java学习笔记】接口

接口 应用场景引出 一、接口的介绍 1. 接口的基本结构 interface 接口名{属性抽象方法 }引出关键字:implements 2. 子类实现接口 class a implements 接口名{}3. 接口中的属性说明:属性默认是public static final修饰的 (1)f…

02 APP 自动化-Appium 运行原理详解

环境搭建见 01 APP 自动化-环境搭建 文章目录 一、Appium及Appium自动化测试原理二、Appium 自动化配置项三、常见 ADB 命令四、第一个 app 自动化脚本 一、Appium及Appium自动化测试原理 Appium 跨平台、开源的 app 自动化测试框架,用来测试 app 应用程序&#x…

(1)pytest简介和环境准备

1. pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它具有如下特点: 非常容易上手,入门简单&a…

同元软控、核动力研究院与华北电力大学产学研联合实训室正式揭牌

2025年5月27日,华北电力大学、苏州同元软控信息技术有限公司(以下简称“同元软控”)、中国核动力研究设计院(以下简称“核动力研究院”)联合实训室揭牌授权仪式暨座谈交流会在华北电力大学召开。华北电力大学教务处处长…

PyTorch中nn.Module详解

直接print(dir(nn.Module)),得到如下内容: 一、模型结构与参数 parameters() 用途:返回模块的所有可训练参数(如权重、偏置)。示例:for param in model.parameters():print(param.shape)named_parameters…

若依项目天气模块

在若依项目里添加了一个天气模块,记录一下过程。 一、功能结构与组件布局 天气模块以卡片形式(el-card)展示,包含以下核心功能: 实时天气:显示当前城市、温度、天气状况(如晴、多云&#xff…

APM32芯得 EP.06 | APM32F407移植uC/OS-III实时操作系统经验分享

《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。 最近我开始学习 uC/OS-III 实时操作系统,并着手将其移植到APM32F407 开发板上。在这个过…

图解gpt之注意力机制原理与应用

大家有没有注意到,当序列变长时,比如翻译一篇长文章,或者处理一个长句子,RNN这种编码器就有点力不从心了。它把整个序列信息压缩到一个固定大小的向量里,信息丢失严重,而且很难记住前面的细节,特…

更新密码--二阶注入攻击的原理

1.原理知识: 二阶SQL注入攻击(Second-Order SQL Injection)原理详解 一、基本概念 二阶注入是一种"存储型"SQL注入,攻击流程分为两个阶段: ​​首次输入​​:攻击者将恶意SQL片段存入数据库​…

RFID技术助力托盘运输线革新

RFID技术助力托盘运输线革新 湖北某工厂托盘运输线使用上存在的问题: 1、托盘在运输线上受信息录入时间等问题影响,导致效率低下; 2、原先托盘上粘贴的条码容易污损,并且时常需要更新更换,导致信息录入、出入库等步…

EasyRTC嵌入式音视频通信SDK助力1v1实时音视频通话全场景应用

一、方案概述​ 在数字化通信需求日益增长的今天,EasyRTC作为一款全平台互通的实时视频通话方案,实现了设备与平台间的跨端连接。它支持微信小程序、APP、PC客户端等多端协同,开发者通过该方案可快速搭建1v1实时音视频通信系统,适…