Spaces:
Runtime error
Runtime error
File size: 50,942 Bytes
c05c725 |
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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 |
import gradio as gr
import pandas as pd
import numpy as np
import string
import re
import json
import random
import torch
import hashlib, base64
from tqdm import tqdm
from gradio.themes.base import Base
import openai
# bloomber vis
import bloomberg_vis as bv
# error messages
from error_messages import *
tqdm().pandas()
# bias testing manager
import mgr_bias_scoring as bt_mgr
# managers for sentences and biases
import mgr_requests as rq_mgr
from mgr_requests import G_CORE_BIAS_NAME
import mgr_biases as bmgr
# cookie manager
#import mgr_cookies as cookie_mgr
use_paper_sentences = False
G_TEST_SENTENCES = []
G_NUM_SENTENCES = 0
G_MISSING_SPEC = []
def getTermsFromGUI(group1, group2, att1, att2):
bias_spec = {
"social_groups": {
"group 1": [t.strip(" ") for t in group1.split(",") if len(t.strip(' '))>0],
"group 2": [t.strip(" ") for t in group2.split(",") if len(t.strip(' '))>0]},
"attributes": {
"attribute 1": [t.strip(" ") for t in att1.split(",") if len(t.strip(' '))>0],
"attribute 2": [t.strip(" ") for t in att2.split(",") if len(t.strip(' '))>0]}
}
return bias_spec
# Select from example datasets
def prefillBiasSpec(evt: gr.SelectData):
global use_paper_sentences, G_MISSING_SPEC, G_CORE_BIAS_NAME
G_MISSING_SPEC = []
G_CORE_BIAS_NAME = evt.value
print(f"Setting core bias name to: {G_CORE_BIAS_NAME}")
print(f"Selected {evt.value} at {evt.index} from {evt.target}")
#bias_filename = f"{evt.value[1]}.json"
bias_filename = f"{bmgr.bias2tag[evt.value]}.json"
print(f"Filename: {bias_filename}")
isCustom = bmgr.isCustomBias(bias_filename)
if isCustom:
print(f"Custom bias specification: {bias_filename}")
bias_spec = bmgr.loadCustomBiasSpec(bias_filename)
else:
print(f"Core bias specification: {bias_filename}")
bias_spec = bmgr.loadPredefinedBiasSpec(bias_filename)
grp1_terms, grp2_terms = bmgr.getSocialGroupTerms(bias_spec)
att1_terms, att2_terms = bmgr.getAttributeTerms(bias_spec)
print(f"Grp 1: {grp1_terms}")
print(f"Grp 2: {grp2_terms}")
print(f"Att 1: {att1_terms}")
print(f"Att 2: {att2_terms}")
#use_paper_sentences = True
return (', '.join(grp1_terms[0:50]), ', '.join(grp2_terms[0:50]), ', '.join(att1_terms[0:50]), ', '.join(att2_terms[0:50]),
gr.update(interactive=False, visible=False))
def updateErrorMsg(isError, text):
return gr.Markdown.update(visible=isError, value=text)
def countBiasCustomSpec(bias_spec):
if (bias_spec) == 0:
return 0
elif 'custom_counts' in bias_spec:
rq_count_1 = sum([v for v in bias_spec['custom_counts' ][0].values()])
rq_count_2 = sum([v for v in bias_spec['custom_counts' ][1].values()])
return rq_count_1+rq_count_2
else:
return 0
def generateSentences(gr1, gr2, att1, att2, openai_key, num_sent2gen, progress=gr.Progress()):
global use_paper_sentences, G_NUM_SENTENCES, G_MISSING_SPEC, G_TEST_SENTENCES
print(f"GENERATE SENTENCES CLICKED!, requested sentence per attribute number: {num_sent2gen}")
# No error messages by default
err_update = updateErrorMsg(False, "")
bias_test_label = "Test Model Using Imbalanced Sentences"
# There are no sentences available at all
if len(G_TEST_SENTENCES) == 0:
bias_gen_states = [True, False]
online_gen_visible = True
test_model_visible = False
else:
bias_gen_states = [True, True]
online_gen_visible = True
test_model_visible = True
info_msg_update = gr.Markdown.update(visible=False, value="")
test_sentences = []
bias_spec = getTermsFromGUI(gr1, gr2, att1, att2)
g1, g2, a1, a2 = bt_mgr.get_words(bias_spec)
total_att_terms = len(a1)+len(a2)
all_terms_len = len(g1)+len(g2)+len(a1)+len(a2)
print(f"Length of all the terms: {all_terms_len}")
if all_terms_len == 0:
print("No terms entered!")
err_update = updateErrorMsg(True, NO_TERMS_ENTERED_ERROR)
#raise gr.Error(NO_TERMS_ENTERED_ERROR)
else:
if len(openai_key) == 0:
print("Empty OpenAI key!!!")
err_update = updateErrorMsg(True, OPENAI_KEY_EMPTY)
elif len(openai_key) < 10:
print("Wrong length OpenAI key!!!")
err_update = updateErrorMsg(True, OPENAI_KEY_WRONG)
else:
progress(0, desc="ChatGPT generation...")
print(f"Using Online Generator LLM...")
print(f"Is custom spec? {countBiasCustomSpec(G_MISSING_SPEC)}")
print(f"Custom spec: {G_MISSING_SPEC}")
use_bias_spec = G_MISSING_SPEC if countBiasCustomSpec(G_MISSING_SPEC)>0 else bias_spec
test_sentences, gen_err_msg = rq_mgr._generateOnline(use_bias_spec, progress, openai_key, num_sent2gen, isSaving=False)
#print(f"Test sentences: {test_sentences}")
num_sentences = len(test_sentences)
print(f"Returned num sentences: {num_sentences}")
G_NUM_SENTENCES = len(G_TEST_SENTENCES) + num_sentences
if num_sentences == 0 and len(G_TEST_SENTENCES) == 0:
print("Test sentences empty!")
#raise gr.Error(NO_SENTENCES_ERROR)
# Some error returned from OpenAI generator
if gen_err_msg != None:
err_update = updateErrorMsg(True, gen_err_msg)
# No sentences returned, but no specific error
else:
err_update = updateErrorMsg(True, NO_GEN_SENTENCES_ERROR)
elif num_sentences == 0 and len(G_TEST_SENTENCES) > 0:
print(f"Has some retrieved sentences {G_TEST_SENTENCES}, but no sentnces generated {num_sentences}!")
#raise gr.Error(NO_SENTENCES_ERROR)
# Some error returned from OpenAI generator
if gen_err_msg != None:
err_update = updateErrorMsg(True, gen_err_msg)
# No sentences returned, but no specific error
else:
err_update = updateErrorMsg(True, NO_GEN_SENTENCES_ERROR)
# has all sentences, can bias test
bias_gen_states = [True, True]
else:
print("Combining generated and existing...")
print(f"Existing sentences: {len(G_TEST_SENTENCES)}")
print(f"Generated: {len(test_sentences)}")
G_TEST_SENTENCES = G_TEST_SENTENCES + test_sentences
print(f"Combined: {len(G_TEST_SENTENCES)}")
# has all sentences, can bias test
bias_gen_states = [False, True]
online_gen_visible = False
test_model_visible = True # show choise of tested model and the sentences
info_msg, att1_missing, att2_missing, total_missing, c_bias_spec = _genSentenceCoverMsg(G_TEST_SENTENCES, total_att_terms, bias_spec, isGen=True)
info_msg_update = gr.Markdown.update(visible=True, value=info_msg)
bias_test_label = "Test Model For Social Bias"
#cookie_mgr.saveOpenAIKey(openai_key)
print(f"Online gen visible: {not err_update['visible']}")
return (err_update, # err message if any
info_msg_update, # infor message about the number of sentences and coverage
gr.Row.update(visible=online_gen_visible), # online gen row
#gr.Slider.update(minimum=8, maximum=24, value=4), # slider generation
gr.Row.update(visible=test_model_visible), # tested model row
#gr.Dropdown.update(visible=test_model_visible), # tested model selection dropdown
gr.Accordion.update(visible=test_model_visible, label=f"Test sentences ({len(G_TEST_SENTENCES)})"), # accordion
gr.update(visible=True), # Row sentences
gr.DataFrame.update(value=G_TEST_SENTENCES), #DataFrame test sentences
gr.update(visible=bias_gen_states[0]), # gen btn
gr.update(visible=bias_gen_states[1], value=bias_test_label) # bias btn
)
# Interaction with top tabs
def moveStep1():
variants = ["primary","secondary","secondary"]
#inter = [True, False, False]
tabs = [True, False, False]
return (gr.update(variant=variants[0]),
gr.update(variant=variants[1]),
gr.update(variant=variants[2]),
gr.update(visible=tabs[0]),
gr.update(visible=tabs[1]),
gr.update(visible=tabs[2]))
# Interaction with top tabs
def moveStep1_clear():
variants = ["primary","secondary","secondary"]
#inter = [True, False, False]
tabs = [True, False, False]
return (gr.update(variant=variants[0]),
gr.update(variant=variants[1]),
gr.update(variant=variants[2]),
gr.update(visible=tabs[0]),
gr.update(visible=tabs[1]),
gr.update(visible=tabs[2]),
gr.Textbox.update(value=""),
gr.Textbox.update(value=""),
gr.Textbox.update(value=""),
gr.Textbox.update(value=""))
def moveStep2():
variants = ["secondary","primary","secondary"]
#inter = [True, True, False]
tabs = [False, True, False]
return (gr.update(variant=variants[0]),
gr.update(variant=variants[1]),
gr.update(variant=variants[2]),
gr.update(visible=tabs[0]),
gr.update(visible=tabs[1]),
gr.update(visible=tabs[2]),
gr.Checkbox.update(value=False))
def moveStep3():
variants = ["secondary","secondary","primary"]
#inter = [True, True, False]
tabs = [False, False, True]
return (gr.update(variant=variants[0]),
gr.update(variant=variants[1]),
gr.update(variant=variants[2]),
gr.update(visible=tabs[0]),
gr.update(visible=tabs[1]),
gr.update(visible=tabs[2]))
def _genSentenceCoverMsg(test_sentences, total_att_terms, bias_spec, isGen=False):
att_cover_dict = {}
print(f"In Coverage: {test_sentences[0:2]}")
for sent,alt_sent,gt1,gt2,att in test_sentences:
num = att_cover_dict.get(att, 0)
att_cover_dict[att] = num+1
att_by_count = dict(sorted(att_cover_dict.items(), key=lambda item: item[1]))
num_covered_atts = len(list(att_by_count.keys()))
lest_covered_att = list(att_by_count.keys())[0]
least_covered_count = att_by_count[lest_covered_att]
test_sentences_df = pd.DataFrame(test_sentences, columns=['sentence', 'alt_sentence', "grp_term1", "grp_term2", "att_term"])
# missing sentences for attributes
att1_missing, att2_missing = bt_mgr.genMissingAttribBiasSpec(bias_spec, test_sentences_df)
print(f"Att 1 missing: {att1_missing}")
print(f"Att 2 missing: {att2_missing}")
# missing pairs spec
bt_mgr.genMissingPairsSpec(bias_spec, test_sentences_df)
att1_missing_num = sum([v for k, v in att1_missing.items()])
att2_missing_num = sum([v for k, v in att2_missing.items()])
total_missing = att1_missing_num + att2_missing_num
print(f"Total missing: {total_missing}")
missing_info = f"Missing {total_missing} sentences to balance attributes <bt /> "
source_msg = "Found" if isGen==False else "Generated"
if num_covered_atts >= total_att_terms:
if total_missing > 0:
info_msg = f"**{source_msg} {len(test_sentences)} sentences covering all bias specification attributes, but some attributes are underepresented. Generating additional {total_missing} sentences is suggested.**"
else:
info_msg = f"**{source_msg} {len(test_sentences)} sentences covering all bias specification attributes. Please select model to test.**"
else:
info_msg = f"**{source_msg} {len(test_sentences)} sentences covering {num_covered_atts} of {total_att_terms} attributes. Please select model to test.**"
#info_msg = missing_info + info_msg
bias_spec['custom_counts'] = [att1_missing, att2_missing]
return info_msg, att1_missing, att2_missing, total_missing, bias_spec
def retrieveSentences(gr1, gr2, att1, att2, progress=gr.Progress()):
global use_paper_sentences, G_NUM_SENTENCES, G_MISSING_SPEC, G_TEST_SENTENCES
print("RETRIEVE SENTENCES CLICKED!")
G_MISSING_SPEC = []
variants = ["secondary","primary","secondary"]
inter = [True, True, False]
tabs = [True, False]
bias_gen_states = [True, False]
bias_gen_label = "Generate New Sentences"
bias_test_label = "Test Model for Social Bias"
num2gen_update = gr.update(visible=True) #update the number of new sentences to generate
prog_vis = [True]
err_update = updateErrorMsg(False, "")
info_msg_update = gr.Markdown.update(visible=False, value="")
openai_gen_row_update = gr.Row.update(visible=True)
tested_model_dropdown_update = gr.Dropdown.update(visible=False)
tested_model_row_update = gr.Row.update(visible=False)
# additinal sentences disabled by default
gen_additional_sentence_checkbox_update = gr.Checkbox.update(visible=False)
test_sentences = []
bias_spec = getTermsFromGUI(gr1, gr2, att1, att2)
g1, g2, a1, a2 = bt_mgr.get_words(bias_spec)
total_att_terms = len(a1)+len(a2)
all_terms_len = len(g1)+len(g2)+len(a1)+len(a2)
print(f"Length of all the terms: {all_terms_len}")
if all_terms_len == 0:
print("No terms entered!")
err_update = updateErrorMsg(True, NO_TERMS_ENTERED_ERROR)
variants = ["primary","secondary","secondary"]
inter = [True, False, False]
tabs = [True, False]
prog_vis = [False]
#raise gr.Error(NO_TERMS_ENTERED_ERROR)
else:
tabs = [False, True]
progress(0, desc="Fetching saved sentences...")
test_sentences = rq_mgr._getSavedSentences(bias_spec, progress, use_paper_sentences)
#err_update, _, test_sentences = generateSentences(gr1, gr2, att1, att2, progress)
print(f"Type: {type(test_sentences)}")
num_sentences = len(test_sentences)
print(f"Returned num sentences: {num_sentences}")
err_update = updateErrorMsg(False, "")
G_NUM_SENTENCES = num_sentences
G_TEST_SENTENCES = test_sentences
if G_NUM_SENTENCES == 0:
print("Test sentences empty!")
#raise gr.Error(NO_SENTENCES_ERROR)
err_update = updateErrorMsg(True, NO_SENTENCES_ERROR)
if len(test_sentences) > 0:
info_msg, att1_missing, att2_missing, total_missing, c_bias_spec = _genSentenceCoverMsg(test_sentences, total_att_terms, bias_spec)
G_MISSING_SPEC = c_bias_spec
print(f"Saving global custom bias specification: {G_MISSING_SPEC}")
info_msg_update = gr.Markdown.update(visible=True, value=info_msg)
num2gen_update = gr.update(visible=False)
bias_gen_label = f"Generate Additional {total_missing} Sentences"
if total_missing == 0:
print(f"Got {len(test_sentences)}, allowing bias test...")
#print(test_sentences)
bias_gen_states = [False, True]
openai_gen_row_update = gr.Row.update(visible=False)
tested_model_dropdown_update = gr.Dropdown.update(visible=True)
tested_model_row_update = gr.Row.update(visible=True)
# still give the option to generate more sentences
gen_additional_sentence_checkbox_update = gr.Checkbox.update(visible=True)
else:
bias_test_label = "Test Model Using Imbalanced Sentences"
bias_gen_states = [True, True]
tested_model_dropdown_update = gr.Dropdown.update(visible=True)
tested_model_row_update = gr.Row.update(visible=True)
return (err_update, # error message
openai_gen_row_update, # OpenAI generation
gen_additional_sentence_checkbox_update, # optional generate additional sentences
num2gen_update, # Number of sentences to genrate
tested_model_row_update, #Tested Model Row
#tested_model_dropdown_update, # Tested Model Dropdown
info_msg_update, # sentences retrieved info update
gr.update(visible=prog_vis), # progress bar top
gr.update(variant=variants[0], interactive=inter[0]), # breadcrumb btn1
gr.update(variant=variants[1], interactive=inter[1]), # breadcrumb btn2
gr.update(variant=variants[2], interactive=inter[2]), # breadcrumb btn3
gr.update(visible=tabs[0]), # tab 1
gr.update(visible=tabs[1]), # tab 2
gr.Accordion.update(visible=bias_gen_states[1], label=f"Test sentences ({len(test_sentences)})"), # accordion
gr.update(visible=True), # Row sentences
gr.DataFrame.update(value=test_sentences), #DataFrame test sentences
gr.Button.update(visible=bias_gen_states[0], value=bias_gen_label), # gen btn
gr.Button.update(visible=bias_gen_states[1], value=bias_test_label), # bias test btn
gr.update(value=', '.join(g1)), # gr1_fixed
gr.update(value=', '.join(g2)), # gr2_fixed
gr.update(value=', '.join(a1)), # att1_fixed
gr.update(value=', '.join(a2)) # att2_fixed
)
def startBiasTest(test_sentences_df, gr1, gr2, att1, att2, model_name, progress=gr.Progress()):
global G_NUM_SENTENCES
variants = ["secondary","secondary","primary"]
inter = [True, True, True]
tabs = [False, False, True]
err_update = updateErrorMsg(False, "")
if test_sentences_df.shape[0] == 0:
G_NUM_SENTENCES = 0
#raise gr.Error(NO_SENTENCES_ERROR)
err_update = updateErrorMsg(True, NO_SENTENCES_ERROR)
progress(0, desc="Starting social bias testing...")
#print(f"Type: {type(test_sentences_df)}")
#print(f"Data: {test_sentences_df}")
# bloomberg vis
att_freqs = {}
for att in test_sentences_df["Attribute term"].tolist():
#if att == "speech-language-pathologist" or att == "speech-language pathologist" or att == "speech language pathologist":
# print(f"Special case in bloomberg: {att}")
# att = "speech-language pathologist"
if att in att_freqs:
att_freqs[att] += 1
else:
att_freqs[att] = 1
#print(f"att_freqs: {att_freqs}")
# 1. bias specification
bias_spec = getTermsFromGUI(gr1, gr2, att1, att2)
#print(f"Bias spec dict: {bias_spec}")
g1, g2, a1, a2 = bt_mgr.get_words(bias_spec)
# bloomberg vis
attributes_g1 = a1 #list(set(a1 + [a.replace(' ','-') for a in a1])) #bias_spec['attributes']['attribute 1']
attributes_g2 = a2 #list(set(a2 + [a.replace(' ','-') for a in a2])) #bias_spec['attributes']['attribute 2']
#print(f"Attributes 1: {attributes_g1}")
#print(f"Attributes 2: {attributes_g2}")
# 2. convert to templates
#test_sentences_df['Template'] = test_sentences_df.apply(bt_mgr.sentence_to_template_df, axis=1)
test_sentences_df[['Template','grp_refs']] = test_sentences_df.progress_apply(bt_mgr.ref_terms_sentence_to_template, axis=1)
print(f"Columns with templates: {list(test_sentences_df.columns)}")
print(test_sentences_df[['Group term 1', 'Group term 2', 'Sentence', 'Alternative Sentence']])
# 3. convert to pairs
test_pairs_df = bt_mgr.convert2pairsFromDF(bias_spec, test_sentences_df)
print(f"Columns for test pairs: {list(test_pairs_df.columns)}")
print(test_pairs_df[['grp_term_1', 'grp_term_2', 'sentence', 'alt_sentence']])
progress(0.05, desc=f"Loading model {model_name}...")
# 4. get the per sentence bias scores
print(f"Test model name: {model_name}")
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"Device: {device}")
tested_model, tested_tokenizer = bt_mgr._getModelSafe(model_name, device)
if tested_model == None:
print("Tested model is empty!!!!")
err_update = updateErrorMsg(True, MODEL_NOT_LOADED_ERROR)
#print(f"Mask token id: {tested_toknizer.mask_token_id}")
# sanity check bias test
bt_mgr.testModelProbability(model_name, tested_model, tested_tokenizer, device)
# testing actual sentences
test_score_df, bias_stats_dict = bt_mgr.testBiasOnPairs(test_pairs_df, bias_spec, model_name, tested_model, tested_tokenizer, device, progress)
print(f"Test scores: {test_score_df.head(3)}")
num_sentences = test_sentences_df.shape[0] #score_templates_df.shape[0]
model_bias_dict = {}
tested_model = bias_stats_dict['tested_model']
#model_bias_dict[bias_stats_dict['tested_model']] = bias_stats_dict['model_bias']
model_bias_dict[f'Stereotype Score on {tested_model.upper()} using {num_sentences} sentences'] = bias_stats_dict['model_bias']
per_attrib_bias = bias_stats_dict['per_attribute']
#print(f"Per attribute bias:", per_attrib_bias)
# bias score
#test_pairs_df['bias_score'] = 0
test_pairs_df.loc[test_pairs_df['stereotyped'] == 1, 'bias_score'] = test_pairs_df['top_logit']-test_pairs_df['bottom_logit']
test_pairs_df.loc[test_pairs_df['stereotyped'] == 0, 'bias_score'] = test_pairs_df['bottom_logit']-test_pairs_df['top_logit']
test_pairs_df['stereotyped_b'] = "Unknown"
test_pairs_df.loc[test_pairs_df['stereotyped'] == 1, 'stereotyped_b'] = "yes"
test_pairs_df.loc[test_pairs_df['stereotyped'] == 0, 'stereotyped_b'] = "no"
# Order group terms such that most probable is first
def orderGroups(row):
group_order = "None/None"
sentence_order = ["none","none"]
new_grp_refs = [] #list(row['grp_refs'])
for grp_pair in list(row['grp_refs']):
new_grp_refs.append(("R1","R2"))
#print(f"Grp refs: {new_grp_refs}")
if row['stereotyped'] == 1:
if row["label_1"] == "stereotype":
group_order = row['grp_term_1']+"/"+row['grp_term_2']
sentence_order = [row['sentence'], row['alt_sentence']]
new_grp_refs = []
for grp_pair in list(row['grp_refs']):
new_grp_refs.append((grp_pair[0], grp_pair[1]))
else:
group_order = row['grp_term_2']+"/"+row['grp_term_1']
sentence_order = [row['alt_sentence'], row['sentence']]
new_grp_refs = []
for grp_pair in list(row['grp_refs']):
new_grp_refs.append((grp_pair[1], grp_pair[0]))
else:
if row["label_1"] == "stereotype":
group_order = row['grp_term_2']+"/"+row['grp_term_1']
sentence_order = [row['alt_sentence'], row['sentence']]
new_grp_refs = []
for grp_pair in list(row['grp_refs']):
new_grp_refs.append((grp_pair[1], grp_pair[0]))
else:
group_order = row['grp_term_1']+"/"+row['grp_term_2']
sentence_order = [row['sentence'], row['alt_sentence']]
new_grp_refs = []
for grp_pair in list(row['grp_refs']):
new_grp_refs.append((grp_pair[0], grp_pair[1]))
return pd.Series([group_order, sentence_order[0], sentence_order[1], new_grp_refs])
test_pairs_df[['groups_rel','sentence', 'alt_sentence', 'grp_refs']] = test_pairs_df.progress_apply(orderGroups, axis=1)
#test_pairs_df['groups_rel'] = test_pairs_df['grp_term_1']+"/"+test_pairs_df['grp_term_2']
# construct display dataframe
score_templates_df = test_pairs_df[['att_term','template','sentence','alt_sentence']].copy()
score_templates_df['Groups'] = test_pairs_df['groups_rel']
#score_templates_df['Bias Score'] = np.round(test_pairs_df['bias_score'],2)
score_templates_df['Stereotyped'] = test_pairs_df['stereotyped_b']
score_templates_df = score_templates_df.rename(columns = {'att_term': "Attribute",
"template": "Template",
"sentence": "Sentence",
"alt_sentence": "Alternative"})
#'Bias Score'
score_templates_df = score_templates_df[['Stereotyped','Attribute','Groups','Sentence',"Alternative"]]
# bloomberg vis
attrib_by_score = dict(sorted(per_attrib_bias.items(), key=lambda item: item[1], reverse=True))
#print(f"Attrib by score:", attrib_by_score)
per_attrib_bias_HTML_stereo = ""
num_atts = 0
for att, score in attrib_by_score.items():
if att in attributes_g1:
#print(f"Attribute 1: {att}")
#per_attrib_bias_HTML_stereo += bv.att_bloombergViz(att, score, att_freqs[att])
#num_atts += 1
#if num_atts >= 8:
# break
per_attrib_bias_HTML_stereo += bv.att_bloombergViz(att, score, att_freqs[att], test_pairs_df, False, False)
num_atts += 1
#if num_atts >= 8:
# break
per_attrib_bias_HTML_antistereo = ""
num_atts = 0
for att, score in attrib_by_score.items():
if att in attributes_g2:
#print(f"Attribute 2: {att}")
#per_attrib_bias_HTML_antistereo += bv.att_bloombergViz(att, score, att_freqs[att], True)
#num_atts += 1
#if num_atts >= 8:
# break
per_attrib_bias_HTML_antistereo += bv.att_bloombergViz(att, score, att_freqs[att], test_pairs_df, True, True)
num_atts += 1
#if num_atts >= 8:
# break
interpret_msg = bt_mgr._constructInterpretationMsg(bias_spec, num_sentences,
model_name, bias_stats_dict, per_attrib_bias,
score_templates_df
)
saveBiasTestResult(test_sentences_df, gr1, gr2, att1, att2, model_name)
return (err_update, # error message
gr.Markdown.update(visible=True), # bar progress
gr.Button.update(variant=variants[0], interactive=inter[0]), # top breadcrumb button 1
gr.Button.update(variant=variants[1], interactive=inter[1]), # top breadcrumb button 2
gr.Button.update(variant=variants[2], interactive=inter[2]), # top breadcrumb button 3
gr.update(visible=tabs[0]), # content tab/column 1
gr.update(visible=tabs[1]), # content tab/column 2
gr.update(visible=tabs[2]), # content tab/column 3
model_bias_dict, # per model bias score
gr.update(value=per_attrib_bias_HTML_stereo), # per attribute bias score stereotyped
gr.update(value=per_attrib_bias_HTML_antistereo), # per attribute bias score antistereotyped
gr.update(value=score_templates_df, visible=True), # Pairs with scores
gr.update(value=interpret_msg, visible=True), # Interpretation message
gr.update(value=', '.join(g1)), # gr1_fixed
gr.update(value=', '.join(g2)), # gr2_fixed
gr.update(value=', '.join(a1)), # att1_fixed
gr.update(value=', '.join(a2)) # att2_fixed
)
# Loading the Interface first time
def loadInterface():
print("Loading the interface...")
#open_ai_key = cookie_mgr.loadOpenAIKey()
#return gr.Textbox.update(value=open_ai_key)
# Selecting an attribute label in the label component
def selectAttributeLabel(evt: gr.SelectData):
print(f"Selected {evt.value} at {evt.index} from {evt.target}")
object_methods = [method_name for method_name in dir(evt)
if callable(getattr(evt, method_name))]
print("Attributes:")
for att in dir(evt):
print (att, getattr(evt,att))
print(f"Methods: {object_methods}")
return ()
# Editing a sentence in DataFrame
def editSentence(test_sentences, evt: gr.EventData):
print(f"Edit Sentence: {evt}")
#print("--BEFORE---")
#print(test_sentences[0:10])
#print("--AFTER--")
#print(f"Data: {evt._data['data'][0:10]}")
# print("Attributes:")
# for att in dir(evt):
# print (att, getattr(evt,att))
# object_methods = [method_name for method_name in dir(evt)
# if callable(getattr(evt, method_name))]
# print(f"Methods: {object_methods}")
# exports dataframe as CSV
def export_csv(test_pairs, gr1, gr2, att1, att2):
bias_spec = getTermsFromGUI(gr1, gr2, att1, att2)
g1, g2, a1, a2 = bt_mgr.get_words(bias_spec)
b_name = rq_mgr.getBiasName(g1, g2, a1, a2)
print(f"Exporting test pairs for {b_name}")
fname = f"test_pairs_{b_name}.csv"
test_pairs.to_csv(fname)
return gr.File.update(value=fname, visible=True)
# Enable Generation of new sentences, even though not required.
def useOnlineGen(value):
online_gen_row_update = gr.Row.update(visible=False)
num_sentences2gen_update = gr.Slider.update(visible=False)
gen_btn_update = gr.Button.update(visible=False)
gen_title_update = gr.Markdown.update(visible=False)
openai_key_update = gr.Textbox.update(visible=False)
if value == True:
print("Check is true...")
online_gen_row_update = gr.Row.update(visible=True)
num_sentences2gen_update = gr.Slider.update(visible=True)
gen_btn_update = gr.Button.update(visible=True, value="Generate Additional Sentences")
gen_title_update = gr.Markdown.update(visible=True)
openai_key_update = gr.Textbox.update(visible=True)
else:
print("Check is false...")
return (online_gen_row_update,
num_sentences2gen_update,
gen_btn_update
#gen_title_update,
#openai_key_update,
)
def changeTerm(evt: gr.EventData):
global G_CORE_BIAS_NAME
print("Bias is custom now...")
G_CORE_BIAS_NAME = None
return gr.update(interactive=False, visible=False)
def saveBiasTestResult(test_sentences_df, group1, group2, att1, att2, model_name):
print(f"Saving bias test result...")
#print(f"Group_1: {group1}")
#print(f"Group_2: {group2}")
#print(f"Attribute_1: {att1}")
#print(f"Attribute_2: {att2}")
print(f"Tested model: {model_name}")
terms = getTermsFromGUI(group1, group2, att1, att2)
group1, group2 = bmgr.getSocialGroupTerms(terms)
att1, att2 = bmgr.getAttributeTerms(terms)
bias_name = rq_mgr.getBiasName(group1, group2, att1, att2)
print(f"bias_name: {bias_name}")
print(f"Terms: {terms}")
bias_spec_json = {
"name": bias_name,
"source": "bias-test-gpt-tool",
"social_groups": terms['social_groups'],
"attributes": terms['attributes'],
"tested_results": {
"tested_model": model_name
},
"templates": [],
"sentences": []
}
bmgr.save_custom_bias(f"{bias_name}.json", bias_spec_json)
#return gr.update(value="Bias test result saved!", visible=True)
theme = gr.themes.Soft().set(
button_small_radius='*radius_xxs',
background_fill_primary='*neutral_50',
border_color_primary='*primary_50'
)
soft = gr.themes.Soft(
primary_hue="slate",
spacing_size="sm",
radius_size="md"
).set(
# body_background_fill="white",
button_primary_background_fill='*primary_400'
)
css_adds = "#group_row {background: white; border-color: white;} \
#attribute_row {background: white; border-color: white;} \
#tested_model_row {background: white; border-color: white;} \
#button_row {background: white; border-color: white} \
#examples_elem .label {display: none}\
#att1_words {border-color: white;} \
#att2_words {border-color: white;} \
#group1_words {border-color: white;} \
#group2_words {border-color: white;} \
#att1_words_fixed {border-color: white;} \
#att2_words_fixed {border-color: white;} \
#group1_words_fixed {border-color: white;} \
#group2_words_fixed {border-color: white;} \
#att1_words_fixed input {box-shadow:None; border-width:0} \
#att1_words_fixed .scroll-hide {box-shadow:None; border-width:0} \
#att2_words_fixed input {box-shadow:None; border-width:0} \
#att2_words_fixed .scroll-hide {box-shadow:None; border-width:0} \
#group1_words_fixed input {box-shadow:None; border-width:0} \
#group1_words_fixed .scroll-hide {box-shadow:None; border-width:0} \
#group2_words_fixed input {box-shadow:None; border-width:0} \
#group2_words_fixed .scroll-hide {box-shadow:None; border-width:0} \
#tested_model_drop {border-color: white;} \
#gen_model_check {border-color: white;} \
#gen_model_check .wrap {border-color: white;} \
#gen_model_check .form {border-color: white;} \
#open_ai_key_box {border-color: white;} \
#gen_col {border-color: white;} \
#gen_col .form {border-color: white;} \
#res_label {background-color: #F8FAFC;} \
#per_attrib_label_elem {background-color: #F8FAFC;} \
#accordion {border-color: #E5E7EB} \
#err_msg_elem p {color: #FF0000; cursor: pointer} \
#res_label .bar {background-color: #35d4ac; } \
#bloomberg_legend {background: white; border-color: white} \
#bloomberg_att1 {background: white; border-color: white} \
#bloomberg_att2 {background: white; border-color: white} \
.tooltiptext_left {visibility: hidden;max-width:50ch;min-width:25ch;top: 100%;left: 0%;background-color: #222;text-align: center;border-radius: 6px;padding: 5px 0;position: absolute;z-index: 1;} \
.tooltiptext_right {visibility: hidden;max-width:50ch;min-width:25ch;top: 100%;right: 0%;background-color: #222;text-align: center;border-radius: 6px;padding: 5px 0;position: absolute;z-index: 1;} \
#filled:hover .tooltiptext_left {visibility: visible;} \
#empty:hover .tooltiptext_left {visibility: visible;} \
#filled:hover .tooltiptext_right {visibility: visible;} \
#empty:hover .tooltiptext_right {visibility: visible;}"
#'bethecloud/storj_theme'
with gr.Blocks(theme=soft, title="Social Bias Testing in Language Models",
css=css_adds) as iface:
with gr.Row():
with gr.Group():
s1_btn = gr.Button(value="Step 1: Bias Specification", variant="primary", visible=True, interactive=True, size='sm')#.style(size='sm')
s2_btn = gr.Button(value="Step 2: Test Sentences", variant="secondary", visible=True, interactive=False, size='sm')#.style(size='sm')
s3_btn = gr.Button(value="Step 3: Bias Testing", variant="secondary", visible=True, interactive=False, size='sm')#.style(size='sm')
err_message = gr.Markdown("", visible=False, elem_id="err_msg_elem")
bar_progress = gr.Markdown(" ")
# Page 1
with gr.Column(visible=True) as tab1:
with gr.Column():
gr.Markdown("### Social Bias Specification")
gr.Markdown("Use one of the predefined specifications or enter own terms for social groups and attributes")
with gr.Row():
example_biases = gr.Dropdown(
value="Select a predefined bias to test",
allow_custom_value=False,
interactive=True,
choices=[
#"Flowers/Insects <> Pleasant/Unpleasant",
#"Instruments/Weapons <> Pleasant/Unpleasant",
"Male/Female <> Professions",
"Male/Female <> Science/Art",
"Male/Female <> Career/Family",
"Male/Female <> Math/Art",
"Eur.-American/Afr.-American <> Pleasant/Unpleasant #1",
"Eur.-American/Afr.-American <> Pleasant/Unpleasant #2",
"Eur.-American/Afr.-American <> Pleasant/Unpleasant #3",
"African-Female/European-Male <> Intersectional",
"African-Female/European-Male <> Emergent",
"Mexican-Female/European-Male <> Intersectional",
"Mexican-Female/European-Male <> Emergent",
"Young/Old Name <> Pleasant/Unpleasant",
#"Mental/Physical Disease <> Temporary/Permanent",
# Custom Biases
"Male/Female <> Care/Expertise",
"Hispanic/Caucasian <> Treatment-Adherence",
"Afr.-American/Eur.American <> Risky-Health-Behaviors"
], label="Example Biases", #info="Select a predefied bias specification to fill-out the terms below."
)
with gr.Row(elem_id="group_row"):
group1 = gr.Textbox(label="Social Group 1", max_lines=1, elem_id="group1_words", elem_classes="input_words", placeholder="brother, father")
group2 = gr.Textbox(label='Social Group 2', max_lines=1, elem_id="group2_words", elem_classes="input_words", placeholder="sister, mother")
with gr.Row(elem_id="attribute_row"):
att1 = gr.Textbox(label='Stereotype for Group 1', max_lines=1, elem_id="att1_words", elem_classes="input_words", placeholder="science, technology")
att2 = gr.Textbox(label='Anti-stereotype for Group 1', max_lines=1, elem_id="att2_words", elem_classes="input_words", placeholder="poetry, art")
with gr.Row():
gr.Markdown(" ")
get_sent_btn = gr.Button(value="Get Sentences", variant="primary", visible=True)
gr.Markdown(" ")
# Page 2
with gr.Column(visible=False) as tab2:
info_sentences_found = gr.Markdown(value="", visible=False)
gr.Markdown("### Tested Social Bias Specification", visible=True)
with gr.Row():
group1_fixed = gr.Textbox(label="Social Group 1", max_lines=1, elem_id="group1_words_fixed", elem_classes="input_words", interactive=False, visible=True)
group2_fixed = gr.Textbox(label='Social Group 2', max_lines=1, elem_id="group2_words_fixed", elem_classes="input_words", interactive=False, visible=True)
with gr.Row():
att1_fixed = gr.Textbox(label='Stereotype for Group 1', max_lines=1, elem_id="att1_words_fixed", elem_classes="input_words", interactive=False, visible=True)
att2_fixed = gr.Textbox(label='Anti-stereotype for Group 1', max_lines=1, elem_id="att2_words_fixed", elem_classes="input_words", interactive=False, visible=True)
with gr.Row():
with gr.Column():
additional_gen_check = gr.Checkbox(label="Generate Additional Sentences with ChatGPT (requires Open AI Key)",
visible=False, interactive=True,
value=False,
elem_id="gen_model_check")
with gr.Row(visible=False) as online_gen_row:
with gr.Column():
gen_title = gr.Markdown("### Generate Additional Sentences", visible=True)
# OpenAI Key for generator
openai_key = gr.Textbox(lines=1, label="OpenAI API Key", value=None,
placeholder="starts with sk-",
info="Please provide the key for an Open AI account to generate new test sentences",
visible=True,
interactive=True,
elem_id="open_ai_key_box")
num_sentences2gen = gr.Slider(1, 20, value=5, step=1,
interactive=True,
visible=True,
info="Five or more per attribute are recommended for a good bias estimate.",
label="Number of test sentences to generate per attribute", container=True)#.style(container=True) #, info="Number of Sentences to Generate")
with gr.Row(visible=False) as tested_model_row:
with gr.Column():
gen_title = gr.Markdown("### Select Tested Model", visible=True)
# Tested Model Selection - "openlm-research/open_llama_7b", "tiiuae/falcon-7b"
tested_model_name = gr.Dropdown( ["bert-base-uncased","bert-large-uncased","gpt2","gpt2-medium","gpt2-large","emilyalsentzer/Bio_ClinicalBERT","microsoft/biogpt","openlm-research/open_llama_3b","openlm-research/open_llama_7b"], value="bert-base-uncased",
multiselect=None,
interactive=True,
label="Tested Language Model",
elem_id="tested_model_drop",
visible=True
#info="Select the language model to test for social bias."
)
with gr.Row():
gr.Markdown(" ")
gen_btn = gr.Button(value="Generate New Sentences", variant="primary", visible=True)
bias_btn = gr.Button(value="Test Model for Social Bias", variant="primary", visible=False)
gr.Markdown(" ")
with gr.Row(visible=False) as row_sentences:
with gr.Accordion(label="Test Sentences", open=False, visible=False) as acc_test_sentences:
test_sentences = gr.DataFrame(
headers=["Sentence", "Alternative Sentence", "Group term 1", "Group term 2", "Attribute term"],
datatype=["str", "str", "str", "str", "str"],
row_count=(1, 'dynamic'),
col_count=(5, 'fixed'),
interactive=True,
visible=True,
#label="Generated Test Sentences",
max_rows=2,
overflow_row_behaviour="paginate")
# Page 3
with gr.Column(visible=False) as tab3:
gr.Markdown("### Tested Social Bias Specification")
with gr.Row():
group1_fixed2 = gr.Textbox(label="Social Group 1", max_lines=1, elem_id="group1_words_fixed", elem_classes="input_words", interactive=False)
group2_fixed2 = gr.Textbox(label='Social Group 2', max_lines=1, elem_id="group2_words_fixed", elem_classes="input_words", interactive=False)
with gr.Row():
att1_fixed2 = gr.Textbox(label='Stereotype for Group 1', max_lines=1, elem_id="att1_words_fixed", elem_classes="input_words", interactive=False)
att2_fixed2 = gr.Textbox(label='Anti-stereotype for Group 1', max_lines=1, elem_id="att2_words_fixed", elem_classes="input_words", interactive=False)
with gr.Row():
with gr.Column(scale=2):
gr.Markdown("### Bias Test Results")
#with gr.Column(scale=1):
# gr.Markdown("### Interpretation")
with gr.Row():
with gr.Column(scale=2):
lbl_model_bias = gr.Markdown("**Model Bias** - % stereotyped choices (β more bias)")
model_bias_label = gr.Label(num_top_classes=1, label="% stereotyped choices (β more bias)",
elem_id="res_label",
show_label=False)
with gr.Accordion("Additional Interpretation", open=False, visible=True):
interpretation_msg = gr.HTML(value="Interpretation: Stereotype Score metric details in <a href='https://arxiv.org/abs/2004.09456'>Nadeem'20<a>", visible=False)
lbl_attrib_bias = gr.Markdown("**Bias in the Context of Attributes** - % stereotyped choices (β more bias)")
#gr.Markdown("**Legend**")
#attribute_bias_labels = gr.Label(num_top_classes=8, label="Per attribute: % stereotyped choices (β more bias)",
# elem_id="per_attrib_label_elem",
# show_label=False)
#with gr.Column(scale=1):
with gr.Row():
with gr.Column(variant="compact", elem_id="bloomberg_legend"):
gr.HTML("<div style='height:20px;width:20px;background-color:#065b41;display:inline-block;vertical-align:top'></div><div style='display:inline-block;vertical-align:top'> Group 1 more probable in the sentence </div> <div style='height:20px;width:20px;background-color:#35d4ac;display:inline-block;vertical-align:top'></div><div style='display:inline-block;vertical-align:top'> Group 2 more probable in the sentence </div>")
with gr.Row():
with gr.Column(variant="compact", elem_id="bloomberg_att1"):
gr.Markdown("#### Attribute Group 1")
attribute_bias_html_stereo = gr.HTML()
with gr.Column(variant="compact", elem_id="bloomberg_att2"):
gr.Markdown("#### Attribute Group 2")
attribute_bias_html_antistereo = gr.HTML()
gr.HTML(value="Visualization inspired by <a href='https://www.bloomberg.com/graphics/2023-generative-ai-bias/' target='_blank'>Bloomberg article on bias in text-to-image models</a>.")
save_msg = gr.HTML(value="<span style=\"color:black\">Bias test result saved! </span>",
visible=False)
with gr.Row():
with gr.Column(scale=2):
with gr.Accordion("Per Sentence Bias Results", open=False, visible=True):
test_pairs = gr.DataFrame(
headers=["group_term", "template", "att_term_1", "att_term_2","label_1","label_2"],
datatype=["str", "str", "str", "str", "str", "str"],
row_count=(1, 'dynamic'),
#label="Bias Test Results Per Test Sentence Template",
max_rows=2,
overflow_row_behaviour="paginate"
)
with gr.Row():
# export button
gr.Markdown(" ")
with gr.Column():
exp_button = gr.Button("Export Test Sentences as CSV", variant="primary")
csv = gr.File(interactive=False, visible=False)
new_bias_button = gr.Button("Try New Bias Test", variant="primary")
gr.Markdown(" ")
# initial interface load
#iface.load(fn=loadInterface,
# inputs=[],
# outputs=[openai_key])
# select from predefined bias specifications
example_biases.select(fn=prefillBiasSpec,
inputs=None,
outputs=[group1, group2, att1, att2, csv])
# Get sentences
get_sent_btn.click(fn=retrieveSentences,
inputs=[group1, group2, att1, att2],
outputs=[err_message, online_gen_row, additional_gen_check, num_sentences2gen,
tested_model_row, #tested_model_name,
info_sentences_found, bar_progress,
s1_btn, s2_btn, s3_btn, tab1, tab2, acc_test_sentences,
row_sentences, test_sentences, gen_btn, bias_btn,
group1_fixed, group2_fixed, att1_fixed, att2_fixed ])
# request getting sentences
gen_btn.click(fn=generateSentences,
inputs=[group1, group2, att1, att2, openai_key, num_sentences2gen],
outputs=[err_message, info_sentences_found, online_gen_row, #num_sentences2gen,
tested_model_row, #tested_model_name,
acc_test_sentences, row_sentences, test_sentences, gen_btn, bias_btn ])
# Test bias
bias_btn.click(fn=startBiasTest,
inputs=[test_sentences,group1,group2,att1,att2,tested_model_name],
outputs=[err_message, bar_progress, s1_btn, s2_btn, s3_btn, tab1, tab2, tab3, model_bias_label,
attribute_bias_html_stereo, attribute_bias_html_antistereo, test_pairs,
interpretation_msg, group1_fixed2, group2_fixed2, att1_fixed2, att2_fixed2]
)
# top breadcrumbs
s1_btn.click(fn=moveStep1,
inputs=[],
outputs=[s1_btn, s2_btn, s3_btn, tab1, tab2, tab3])
# top breadcrumbs
s2_btn.click(fn=moveStep2,
inputs=[],
outputs=[s1_btn, s2_btn, s3_btn, tab1, tab2, tab3, additional_gen_check])
# top breadcrumbs
s3_btn.click(fn=moveStep3,
inputs=[],
outputs=[s1_btn, s2_btn, s3_btn, tab1, tab2, tab3])
# start testing new bias
new_bias_button.click(fn=moveStep1_clear,
inputs=[],
outputs=[s1_btn, s2_btn, s3_btn, tab1, tab2, tab3, group1, group2, att1, att2])
# Additional Interactions
#attribute_bias_labels.select(fn=selectAttributeLabel,
# inputs=[],
# outputs=[])
# Editing a sentence
test_sentences.change(fn=editSentence,
inputs=[test_sentences],
outputs=[]
)
# tick checkbox to use online generation
additional_gen_check.change(fn=useOnlineGen,
inputs=[additional_gen_check],
outputs=[online_gen_row, num_sentences2gen, gen_btn])#, gen_title, openai_key])
exp_button.click(export_csv,
inputs=[test_pairs, group1, group2, att1, att2],
outputs=[csv])
# Changing any of the bias specification terms
group1.change(fn=changeTerm, inputs=[], outputs=[csv])
group2.change(fn=changeTerm, inputs=[], outputs=[csv])
att1.change(fn=changeTerm, inputs=[], outputs=[csv])
att2.change(fn=changeTerm, inputs=[], outputs=[csv])
iface.queue(concurrency_count=2).launch() |