import numpy as np
import pandas as pd
from string import Template
import streamlit as st
import base64
from datasets import load_dataset
from datasets import Dataset
import torch
from tqdm import tqdm
from peft import LoraConfig, get_peft_model
import transformers
# from transformers import AutoModelForCausalLM, AdapterConfig
from transformers import AutoConfig,AutoModelForCausalLM, BitsAndBytesConfig, AutoTokenizer
from transformers import TrainingArguments
from peft import LoraConfig
from peft import *
from trl import SFTTrainer, DataCollatorForCompletionOnlyLM
from langchain.prompts import PromptTemplate
from IPython.display import Markdown, display
peft_model_id = "./"
config = PeftConfig.from_pretrained(peft_model_id)
bnb_config = BitsAndBytesConfig(
load_in_8bit_fp32_cpu_offload=True,
bnb_8bit_use_fp16=False,
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
model = AutoModelForCausalLM.from_pretrained(
config.base_model_name_or_path,
return_dict=True,
quantization_config=bnb_config,
device_map=None,
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)
tokenizer.pad_token = tokenizer.eos_token
model = PeftModel.from_pretrained(model, peft_model_id)
prompt_template = """Answer the following multiple choice question by giving the most appropriate response. Answer should be one among [A, B, C, D, E] \
in order of the most likely to be correct to the least likely to be correct.'
Question: {prompt}\n
A) {a}\n
B) {b}\n
C) {c}\n
D) {d}\n
E) {e}\n
Answer: """
prompt = PromptTemplate(template=prompt_template, input_variables=['prompt', 'a', 'b', 'c', 'd', 'e'])
def format_text_to_prompt(example):
ans = prompt.format(prompt=example['prompt'],
a=example['A'],
b=example['B'],
c=example['C'],
d=example['D'],
e=example['E'])
return {"ans": ans}
def get_ans(text):
inputs = tokenizer(text, return_tensors='pt')
logits = model(input_ids=inputs['input_ids'].cuda(), attention_mask=inputs['attention_mask'].cuda()).logits[0, -1]
# Create a list of tuples having (logit, 'option') format
options_list = [(logits[tokenizer(' A').input_ids[-1]], 'A'), (logits[tokenizer(' B').input_ids[-1]], 'B'), (logits[tokenizer(' C').input_ids[-1]], 'C'), (logits[tokenizer(' D').input_ids[-1]], 'D'), (logits[tokenizer(' E').input_ids[-1]], 'E')]
options_list = sorted(options_list, reverse=True)
ans_list = []
for i in range(3):
ans_list.append(options_list[i][1])
return ans_list
def get_base64_of_bin_file(bin_file):
with open(bin_file, 'rb') as f:
data = f.read()
return base64.b64encode(data).decode()
def set_png_as_page_bg(png_file):
img = get_base64_of_bin_file(png_file)
page_bg_img = f"""
"""
st.markdown(page_bg_img, unsafe_allow_html=True)
def get_base64_encoded_image(image_path):
with open(image_path, "rb") as img_file:
encoded_string = base64.b64encode(img_file.read()).decode("utf-8")
return encoded_string
def main():
set_png_as_page_bg("net_technology_5407.jpg")
image_path = "artificial-intelligence.jpg" # Replace with the actual image file path
st.title("Sci-mcq-GPT")
link = "https://drive.google.com/file/d/1_2TqNNyoczhxIBmU7BpOzEi2bu3MC-sx/view?usp=sharing"
icon_path = "pdf download logo.png"
encoded_image = get_base64_encoded_image(icon_path)
lnk = f''
col = st.sidebar
col.markdown(lnk, unsafe_allow_html=True)
st.subheader("Ask Q&A")
col1, col2 = st.columns(2)
query = col1.text_area("Enter your question")
if col1.button("Get Answer"):
ans = get_ans(query)
print(ans)
col2.text_area("Sci-mcq-GPT Response", ans)
else:
col2.text_area("Sci-mcq-GPT Response", value="")
col_sidebar = st.sidebar
col_sidebar.image(image_path, caption=" ", width=300)
if __name__ == "__main__":
main()