File size: 3,613 Bytes
fe1089d
 
 
 
 
 
 
 
58a02af
fe1089d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba1dc89
fe1089d
 
58a02af
ba1dc89
58a02af
fe1089d
 
 
 
 
 
 
 
 
c28c597
 
 
 
 
 
 
fe1089d
 
 
 
 
 
 
 
 
 
 
 
f5ebee7
fe1089d
 
 
 
d2116db
fe1089d
 
 
f5ebee7
fe1089d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f5ebee7
d2116db
fe1089d
 
 
 
f5ebee7
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
# controller for the application that calls the model and explanation functions
# and returns the updated conversation history

# external imports
import gradio as gr

# internal imports
from model import godel
from explanation import interpret_shap as sint, visualize as viz


# main interference function that that calls chat functions depending on selections
def interference(
    prompt: str,
    history: list,
    knowledge: str,
    system_prompt: str,
    xai_selection: str,
):
    # if no system prompt is given, use a default one
    if system_prompt == "":
        system_prompt = """
            You are a helpful, respectful and honest assistant.
            Always answer as helpfully as possible, while being safe.
        """

    # if a XAI approach is selected, grab the XAI instance
    if xai_selection in ("SHAP", "Attention"):
        match xai_selection.lower():
            case "shap":
                xai = sint
            case "attention":
                xai = viz
            case _:
                # use Gradio warning to display error message
                gr.Warning(f"""
                    There was an error in the selected XAI Approach.
                    It is "{xai_selection}"
                    """)
                raise RuntimeError("There was an error in the selected XAI approach.")

        # call the explained chat function
        prompt_output, history_output, xai_graphic, xai_markup = explained_chat(
            model=godel,
            xai=xai,
            message=prompt,
            history=history,
            system_prompt=system_prompt,
            knowledge=knowledge,
        )
    # if no (or invalid) XAI approach is selected call the vanilla chat function
    else:
        # call the vanilla chat function
        prompt_output, history_output = vanilla_chat(
            model=godel,
            message=prompt,
            history=history,
            system_prompt=system_prompt,
            knowledge=knowledge,
        )
        # set XAI outputs to disclaimer html/none
        xai_graphic, xai_markup = (
            """
            <div style="text-align: center"><h4>Without Selected XAI Approach,
            no graphic will be displayed</h4></div>
            """,
            [("", "")],
        )

    # return the outputs
    return prompt_output, history_output, xai_graphic, xai_markup


# simple chat function that calls the model
# formats prompts, calls for an answer and returns updated conversation history
def vanilla_chat(
    model, message: str, history: list, system_prompt: str, knowledge: str = ""
):
    # formatting the prompt using the model's format_prompt function
    prompt = model.format_prompt(message, history, system_prompt, knowledge)
    # generating an answer using the model's respond function
    answer = model.respond(prompt)

    # updating the chat history with the new answer
    history.append((message, answer))

    # returning the updated history
    return "", history


def explained_chat(
    model, xai, message: str, history: list, system_prompt: str, knowledge: str = ""
):
    # formatting the prompt using the model's format_prompt function
    prompt = model.format_prompt(message, history, system_prompt, knowledge)

    # generating an answer using the xai methods explain and respond function
    answer, xai_graphic, xai_markup = xai.chat_explained(model, prompt)

    # updating the chat history with the new answer
    history.append((message, answer))

    # returning the updated history, xai graphic and xai plot elements
    return "", history, xai_graphic, xai_markup