File size: 3,361 Bytes
757fcf2
4977a31
e396e88
316a8c7
4977a31
 
316a8c7
4977a31
316a8c7
4977a31
e396e88
4977a31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e396e88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4977a31
e396e88
316a8c7
757fcf2
316a8c7
e396e88
 
 
 
 
 
 
 
 
 
 
 
 
 
316a8c7
e396e88
316a8c7
e396e88
 
316a8c7
e396e88
 
 
 
 
 
 
 
 
 
 
 
 
4977a31
 
316a8c7
 
4977a31
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import os
import pandas as pd
import streamlit as st
import gradio as gr
import transformers
import torch
from transformers import Trainer, TrainingArguments, DataCollatorForLanguageModeling, AutoTokenizer, AutoModelForCausalLM
from torch.utils.data import Dataset
from datasets import load_dataset

# Define the Custom Dataset class
class CustomTextDataset(Dataset):
    def __init__(self, tokenized_inputs):
        self.input_ids = tokenized_inputs['input_ids']
        self.attention_masks = tokenized_inputs['attention_mask']

    def __len__(self):
        return len(self.input_ids)

    def __getitem__(self, idx):
        return {
            'input_ids': self.input_ids[idx],
            'attention_mask': self.attention_masks[idx]
        }

# Prepare dataset function
def prepare_dataset(texts, tokenizer, block_size=128):
    inputs = tokenizer(texts, return_tensors='pt', max_length=block_size, truncation=True, padding=True)
    dataset = CustomTextDataset(inputs)
    return dataset

# Function to fine-tune the model
def fine_tune_model(train_dataset, model, tokenizer):
    data_collator = DataCollatorForLanguageModeling(
        tokenizer=tokenizer,
        mlm=False,
    )

    training_args = TrainingArguments(
        output_dir="./results",
        overwrite_output_dir=True,
        num_train_epochs=3,
        per_device_train_batch_size=4,
        save_steps=10_000,
        save_total_limit=2,
    )

    trainer = Trainer(
        model=model,
        args=training_args,
        data_collator=data_collator,
        train_dataset=train_dataset,
    )

    trainer.train()

# Load the dataset
@st.cache
def load_data():
    dataset = load_dataset("IT_support_bot/it_support_transcript_dataset.csv", split="train")
    df = pd.DataFrame(dataset)
    filtered_df = df[
        (df['Resolution Status'] == 'Resolved') &
        (df['Customer Satisfaction (CSAT) Score'] >= 4) &
        (df['Customer Feedback Comments'].isin(['Very satisfied', 'Satisfied']))
    ].copy()
    filtered_df.loc[:, 'training_text'] = filtered_df['Interaction Notes']
    training_texts = filtered_df['training_text'].tolist()
    return training_texts

# Streamlit UI
st.title("IT Support Assistant - Training and Deployment")

train_button = st.button("Train Model")

if train_button:
    with st.spinner("Loading data and training the model..."):
        training_texts = load_data()
        
        # Load the tokenizer and model from Hugging Face
        model_name = "meta-llama/Meta-Llama-3-8B" # Use the available Llama model
        tokenizer = AutoTokenizer.from_pretrained(model_name)
        model = AutoModelForCausalLM.from_pretrained(model_name)
        
        if tokenizer.pad_token is None:
            tokenizer.add_special_tokens({'pad_token': '[PAD]'})

        train_dataset = prepare_dataset(training_texts, tokenizer)
        fine_tune_model(train_dataset, model, tokenizer)

    st.success("Model trained successfully!")

# Interactive interface
st.title("IT Support Assistant - Interaction")

def generate_response(input_text):
    interface = gr.load("models/meta-llama/Meta-Llama-3-8B")
    response = interface(input_text)[0]
    return response

input_text = st.text_input("Enter your IT support query:")

if st.button("Generate Response"):
    response = generate_response(input_text)
    st.write("Response:", response)