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)