Committee / app.py
elfsong
Update
643c3a3
# coding: utf-8
import json
import streamlit as st
from src.caller import OpenAI_Caller
from src.committee import Committee
from datasets import load_dataset
st.image('./img/meeting.psd')
st.header("Committee")
domains = st.multiselect(
"Let's nominate committee members!",
["Age", "Disability Status", "Gender Identity", "Nationality", "Physical Appearance", "Race Ethnicity", "Religion", "Socioeconomic Status", "Sexual Orientation"],
["Age", "Nationality", "Religion"])
with st.spinner('Initializing committee members...'):
committee_dict = {
"chair": {
"model_caller": OpenAI_Caller('gpt-4-1106-preview')
},
"member": [
{"bias_type": domain, "model_caller": OpenAI_Caller('gpt-4-1106-preview')} for domain in domains
]
}
with st.spinner('Initializing the committee...'):
committee = Committee(committee_dict=committee_dict)
with st.spinner('Loding the BBQ datasets...'):
dataset = load_dataset("Elfsong/BBQ")
category = st.selectbox("Which topic you are going to deliberate?", dataset.keys())
# instance_id = st.number_input("Ok, which one?", min_value=0, max_value=len(dataset[category]))
raw_instance = dataset[category][0]
instance = {
"context": raw_instance['context'],
"question": raw_instance['question'],
"ans0": raw_instance['ans0'],
"ans1": raw_instance['ans1'],
"ans2": raw_instance['ans2'],
}
st.text("Here is an example, you can change the content on the fly!")
instance = st.data_editor(instance)
# Propose
st.header("Propose")
proposals = list()
for member in committee.members:
with st.spinner(f'Member who concerns **{member.bias_type}** is proposing...'):
proposal = member.propose(instance)
st.subheader(f"Proposal from Member who concerns **{member.bias_type}**:")
st.markdown(proposal)
proposals += [proposal]
# Craft Motion
st.header("Motion")
with st.spinner(f'Chair is crafting a motion...'):
motion = committee.chair.craft_motion(proposals, instance)
st.subheader(f"Motion from the Chair:")
st.markdown(motion)
# Vote
st.header("Vote")
vote_results = list()
for member in committee.members:
with st.spinner(f'Member who concerns **{member.bias_type}** is voting...'):
vote_result = member.vote(motion, instance)
vote_result = json.loads(vote_result)
vote_results += [True if vote_result['decision'] != "Veto" else False]
vote_map = {
"Pass": "Pass βœ…",
"Veto": "Veto 🚫",
"Abstain": "Abstain 😴"
}
st.subheader(f"Member who concerns **{member.bias_type}** votes: {vote_map[vote_result['decision']]}")
# Final Decision
st.header("Final Decision")
st.text(f'Given the voting result, the motion has been ' + "Passed βœ…" if all(vote_results) else "Rejected" + "! 🚫")
st.balloons()