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来分隔它们,截断并填充到最大长度256return 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')# 生成答案,设置最大长度为256model.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)