如何利用已有数据对模型进行微调

news2024/12/29 10:37:05

1.langchain整合llm做知识问答

利用LangChain的能力来结合检索和生成,形成一个知识增强的问答系统(不涉及对模型的微调),而是利用llm从文档检索到问题解答。
langchain整合llm做知识检索

2.微调llm模型

1、首先是我们的数据集:
在这里插入图片描述

2、微调模型:

import pandas as pd
from datasets import Dataset
from transformers import GPT2Tokenizer, GPT2LMHeadModel, Trainer, TrainingArguments

# 加载CSV文件数据到pandas的DataFrame
data = pd.read_csv('/path_to_your_csv_file.csv')

# 合并列以形成更丰富的问题,将 'department', 'title' 和 'question' 列的文本合并
data['combined_question'] = data['department'] + " " + data['title'] + " " + data['question']

# 初始化GPT-2模型的分词器,用于将文本转换成模型可以处理的令牌(token)格式
tokenizer = GPT2Tokenizer.from_pretrained('gpt-3.5-turbo-instruct')

# 定义一个函数,用于将DataFrame中的每一行数据进行分词和编码
def tokenize_function(examples):
    # 对合并后的问题和答案进行编码,使用eos_token来分隔它们,截断并填充到最大长度256
    return tokenizer(examples['combined_question'] + tokenizer.eos_token + examples['answer'] + tokenizer.eos_token, truncation=True, padding="max_length", max_length=256)

# 将文本数据转化为模型可以理解的格式(令牌化),并进行批处理
tokenized_datasets = Dataset.from_pandas(data).map(tokenize_function, batched=True)

# 从预训练模型 'gpt-3.5-turbo-instruct' 加载GPT-2语言模型,准备用于训练
model = GPT2LMHeadModel.from_pretrained('gpt-3.5-turbo-instruct')

# 设置模型训练的参数,包括输出目录、评估策略、学习率、每个设备上的批次大小、权重衰减、训练轮次、保存策略以及训练结束时加载最佳模型的选项
training_args = TrainingArguments(
    output_dir='./results',           # 模型输出目录
    evaluation_strategy="epoch",      # 每个epoch结束后进行评估
    learning_rate=5e-5,               # 学习率
    per_device_train_batch_size=4,    # 每个设备上的训练批次大小
    weight_decay=0.01,                # 权重衰减,防止过拟合
    num_train_epochs=3,               # 训练的总轮次
    save_strategy="epoch",            # 每个epoch结束后保存模型
    load_best_model_at_end=True       # 训练结束时加载验证集上表现最好的模型
)

# 初始化Trainer,配置模型、训练参数、训练集和评估集
trainer = Trainer(
    model=model,                      # 要训练的模型
    args=training_args,               # 训练参数
    train_dataset=tokenized_datasets, # 训练数据集
    eval_dataset=tokenized_datasets   # 评估数据集
)

# 开始训练模型,根据设置的参数对模型进行微调
trainer.train()

3、进行测试

import torch

# 定义一个生成响应的函数,根据指令和输入生成模型的输出
def generate_response(instruction, input_text):
    # 合并指令和输入,形成完整的提示文本
    prompt = instruction + " " + input_text
    # 对提示文本进行编码,添加eos_token,转换为张量格式
    inputs = tokenizer.encode(prompt + tokenizer.eos_token, return_tensors='pt')
    
    # 生成答案,设置最大长度为256
    model.eval()
    with torch.no_grad():
        outputs = model.generate(inputs, max_length=256)
    
    # 解码生成的答案,跳过特殊令牌,返回文本形式的答案
    answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return answer

# 测试样例,定义指令和输入
instruction = "现在你是一个神经脑外科医生,请根据患者的问题给出建议:"
input_text = "癫痫病能吃德巴金吗,错觉,有时候感觉看到的和听到的不太一样。"
# 生成并打印模型的回答
response = generate_response(instruction, input_text)
print("生成的回答:", response)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始学统计-秩和检验

1.什么是秩和检验? 秩和检验,也称为Wilcoxon 秩和检验,是一种非参数统计检验方法,用于比较两个独立样本的中位数是否有显著差异。它不要求数据满足正态分布假设,因此适用于小样本或者数据不满足正态分布假设的情况。 …

Android 快速调试网络 复制curl 到postMan

搜索这个插件 官网地址:https://github.com/itkacher/OkHttpProfiler 集成教程也在里面集成完毕后右下角有一个入口点进去可以复制curl| 插件名称:Okhttp Profiler 真的很好用!

Ubuntu server 24 源码安装Quagga 支持动态路由协议ospf bgp

1 下载:GitHub - Quagga/quagga: Quagga Tracking repository - Master is at http://git.savannah.gnu.org/cgit/quagga.git 2 安装 #安装依赖包 sudo apt install gcc make libreadline-dev pkg-config #解压 tar zxvf quagga-1.2.4.tar.gz cd quagga-1.2.4/sudo ./co…

Linux(五)

Linux&#xff08;五&#xff09; 结构体如何定义一个结构体如何定义一个结构体变量结构体变量如何访问成员如何定义一个指向结构体的指针 动态分配空间 malloc,free在堆区分配5个存Stu的空间 #include <stdio.h> //编写一子函数,对pstr中的值进行输出 /*void output(int…

【开源】租房管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 租客屋主模块 房源信息模块 租客评价模块 房源订单模块 留言板模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的租房管理系统&#xff0c;分为管理后台和用户网页端&#xff0c;可以给管理员、租客和屋主角色使用&#xff0c…

Layui设置table表格中时间的显示格式

1、问题概述? 【数据库中的时间格式】 【Layui中table表格默认的显示格式】 默认的格式中会显示时间的毫秒单位,但是这个毫秒有时候是不需要的。 总结:这个时候我们就需要定义table表格中的时间显示格式。 2、解决办法? 【解决后时间的显示格式】 【解决办法1:通过字符…

AI图书推荐:ChatGPT解码—人工智能增强生活指南

《ChatGPT解码—人工智能增强生活指南》&#xff08;ChatGPT Decoded. A Beginners Guide to AI-Enhanced Living &#xff09;是一本由 大卫维恩斯&#xff08;David Wiens &#xff09;所著的书籍&#xff0c;旨在帮助读者了解并有效利用GPT-4语言模型这一强大工具来提升日常…

开发依赖与运行依赖

1. 概念 开发依赖&#xff1a;devDependencies 运行依赖&#xff1a;dependencies 2. 理解 &#xff08;1&#xff09;devDependencies 在线上状态不需要使用的依赖&#xff0c;就是开发依赖。为什么 npm 要把它单独分拆出来呢&#xff1f;最终目的是为了减少 node_modul…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云&#xff0c;Arduino方式 第一、ESP32-C6开发环境搭建第一步&#xff1a;安装arduino IDE 软件第二步&#xff1a;安装esp32库第三&#xff1a;arduino 软件设置 第二&#xff1a;简单AP配网程序第一步&#xff1a;程序下载第二步&#xff1a;程序使用第三步…

《德米安:彷徨少年时》

文前 我之所愿无非是尝试依本性而生活&#xff0c; 却缘何如此之难&#xff1f; 强盗 疏于独立思考和自我评判的人只能顺应现成的世俗法则&#xff0c;让生活变轻松。其他人则有自己的戒条&#xff1a;正派人惯常做的事于他可能是禁忌&#xff0c;而他自认合理的或许遭他人唾…

Mac安装pytorch

先下载 Anaconda | The Operating System for AI 网速慢&#xff0c;用中国大陆镜像&#xff1a;NJU Mirror 之前装python3时用的是pip3&#xff0c;这里说一下这pip与conda的区别 Conda和pip都是Python包管理工具&#xff0c;用于安装和管理Python包 包管理范围&#xff1a…

简单的基于信号处理的心电信号ECG特征波分割方法(MATLAB)

正常的心电图中&#xff0c;每个心跳周期内包含三个主要的特征波&#xff1a;&#xff30;波、QRS波和&#xff34;波&#xff0c;如下图所示。心电特征波能够反映心脏的生理状态信息&#xff0c;通过对其形状、幅值和持续时间的分析&#xff0c;可以用来辅助诊断心血管疾病。对…

Java顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

深入解析BGP与OSPF:互联网与企业网络中的路由协议对比

BGP&#xff08;Border Gateway Protocol&#xff09;和OSPF&#xff08;Open Shortest Path First&#xff09;是两种不同的路由协议&#xff0c;它们在互联网和企业网络中扮演着重要的角色。下面是它们各自特点的详细内容丰富&#xff1a; BGP&#xff08;Border Gateway Pro…

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度 leecode 226 翻转二叉树 题目链接 &#xff1a;https://leetcode.cn/problems/invert-binary-tree/description/ 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。…

Neovim 配置全面解析(上)

Neovim 配置全面解析&#xff08;上&#xff09; 原文&#xff1a;Neovim 配置全面解析&#xff08;上&#xff09; - 知乎 (zhihu.com) 环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL 2 NVIM&#xff1a;v 0.10.0-de…

自从有了可观测性,传统运维如何进行提升?

在 201x 年&#xff0c;随着容器技术的出现&#xff0c;容器的部署方式逐渐被各大互联网公司采用&#xff0c;相比物理机/虚拟机&#xff0c;容器的好处是环境隔离、轻量、快速。 但是管理容器是一件复杂的事情&#xff0c;后来出现了 Kubernetes&#xff0c;成为了事实上的容…

Python编程的黑暗魔法:模块与包的神秘力量!

哈喽&#xff0c;我是阿佑&#xff0c;今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…

网络攻击攻击之-远程命令执行/RCE告警运营分析篇

在各种网络安全产品的告警中,远程命令执行是一种非常常见的告警。本文将从远程命令执行的定义,远程命令执行利用的流量数据包示例,远程命令执行的suricata规则,远程命令执行的告分析警研判,远程命令执行的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的远程…

Linux系统编程(三)进程间通信(IPC)

本文目录 一、linux 进程之间的通信种类二、管道1. 管道的概述2. 什么是管道文件&#xff1f;3. 管道的特点4. 管道类型&#xff08;1&#xff09;无名管道&#xff08;pipe&#xff09;&#xff08;2&#xff09;有名(命名)管道&#xff08;fifo&#xff09; 三、信号&#xf…