File size: 8,021 Bytes
e113c43
2573737
 
2fac1a1
2573737
 
 
 
 
e113c43
9f384e1
320a430
 
034b0b1
67b732d
320a430
67b732d
2a45a92
320a430
 
 
 
 
 
 
 
 
12975d8
 
 
 
 
 
 
 
 
 
 
 
fe033a7
67b732d
320a430
 
 
 
361c6d6
9c9fc43
320a430
 
 
67b732d
9b1b6aa
12975d8
6f97c22
2fac1a1
7a25c6e
2fac1a1
320a430
38c7a83
320a430
948377f
67b732d
12975d8
9b1b6aa
6f97c22
2fac1a1
7a25c6e
2fac1a1
 
320a430
 
 
2fac1a1
320a430
 
 
e3a009b
320a430
 
b4a4316
2ff8426
 
7a8ea26
 
2ff8426
 
 
 
 
7a25c6e
 
 
2ff8426
 
b4a4316
2ff8426
 
 
 
2fac1a1
 
2ff8426
 
 
 
 
67b732d
2fac1a1
2ff8426
 
e3a009b
2ff8426
 
 
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
import gradio as gr
from openai import OpenAI
from os import getenv
import json

client = OpenAI(
  base_url="https://openrouter.ai/api/v1",
  api_key=getenv("OPENROUTER_API_KEY"),
)

# Initialize the chat log
with gr.Blocks() as app:
    dialog_state_var = gr.State([])
    
    def api_call(prompt, model_id):
        completion = client.chat.completions.create(
        model=model_id,
        max_tokens = 2000,
        messages=[
            {
                "role": "user",
                "content": prompt,
            },
        ],
        )
        answer = completion.choices[0].message.content
        return answer

    def format(str):
        s = str.split("\",")
        for i in range(len(s)):
            key = s[i].split(":")[0]
            value = s[i].split(":")[1]
            value = value.replace("\"", "")
            s[i]=key+":"+"\""+value+"\""
        str_new = ",".join(s)
        str_new = str_new.replace("}\"", "\"}")
        str_new = str_new.replace("\n", "")
        return str_new
    
    def generate_next(intro, setting, topic, student_identity, teacher_identity, student_start, student_base, teacher_base, dialog_state, llm_teacher, llm_student):
    
        dialog_prev = "\n\n".join(dialog_state)
    
        # STUDENT
        prompt_student = intro+"\n\nBisheriger Dialog:\n"+dialog_prev+"\n\Verlauf des Dialogs: "+setting+"\n\nThema, bei dem der Schüler Hilfe braucht:"+topic+"\n\nBeschreibung des Schülers:"+student_identity+"\n\n"
        if len(dialog_state) == 0:
            prompt_student+=student_start
        else:
            prompt_student+=student_base
        student = api_call(prompt_student, llm_student)
        print(student)
        student = format(student)
        student = json.loads(student,strict=False)
        analysis_student = student["analyse"]
        response = "Schüler: "+student["antwort"]
        dialog_state.append(response)
        dialog_prev = "\n\n".join(dialog_state)
    
        # TEACHER
        prompt_teacher = intro+"\n\nBisheriger Dialog:\n"+dialog_prev+"\n\Verlauf des Dialogs: "+setting+"\n\nThema, bei dem der Schüler Hilfe braucht:"+topic+"\n\nBeschreibung des Tutors:"+teacher_identity+"\n\n"+teacher_base
        teacher = api_call(prompt_teacher, llm_teacher)
        teacher = format(teacher)
        print(teacher)
        teacher = json.loads(teacher,strict=False)
        analysis_teacher = teacher["analyse"]
        response = "Tutor: "+teacher["antwort"]
        
        dialog_state.append(response)
        
        dialog_new = "\n\n".join(dialog_state)
        
        return prompt_student,prompt_teacher, dialog_new, dialog_state, analysis_student, analysis_teacher
    
    
    def reset():
        return "", "", "", []
        


    
    # Text boxes for user inputs
    txt_llm_teacher = gr.Textbox(label="LLM Tutor (https://openrouter.ai/models)", lines=1, value = "mistralai/mixtral-8x22b-instruct")
    txt_llm_student = gr.Textbox(label="LLM Schüler (https://openrouter.ai/models)", lines=1, value = "mistralai/mixtral-8x22b-instruct")
    txt_intro = gr.Textbox(label="Einleitung", lines=4, value = "Ich möchte einen möglichst realistischen Dialog zwischen einem Schüler und einem Tutor simulieren.") 
    txt_setting = gr.Textbox(label="Dialogverlauf", lines=4, value = "Der Schüler kommt bei seinen Hausaufgaben nicht weiter und bittet den Tutorum Hilfe. Der Tutor diagnostiziert welches Vorwissen der Schülers hat und welche Art von Hilfe er genau braucht. Dann erabeiten Tutor und Schüler Schritt für Schritt das Thema.")
    txt_topic = gr.Textbox(label="Thema des Dialogs", lines=4, value="Zellteilung - Die Phasen der Mitose")
    txt_student_identity = gr.Textbox(label="Schüler-Identität", lines=4, value="Der Schüler ist in der 8. Klasse. Er hat große Schwierigkeiten in der Schule und kann nicht selbständig arbeiten. Er hat kaum Vorwissen in dem Thema. Er braucht viel Unterstützung und muss in kleinen Schritten an eine Aufgabe herangeführt werden. Der Schüler ist sehr passiv, antwortet meist sehr kurz und umgangssprachlich und ist unsicher.")
    txt_teacher_identity = gr.Textbox(label="Tutor-Identität", lines=4, value="Der Tutor ist ein intelligenter KI-Assistent der speziell für die Unterstützung von Schülern entwickelt wurde. Er hat eine sehr starke didaktische Kompetenz,ist geduldig, motivierend und unterstützend. Er ist besonders gut darin, Schüler Schritt fürSchritt an ein Thema heranzuführen und komplexe Themen oder Aufgaben anschaulich und schüler-gerecht zu erklären. Der Tutor gibt niemals lange Erklärungen oder Verrät die Lösung zu einer Aufgabe, sondern er leitet den Schüler durch geschicktes Nachfragen und kleinere Tipps, bis dieser selbst auf die Lösung kommt.")
    txt_student_start = gr.Textbox(label="Schüler Start Prompt (wird nur für den Start des Dialoges verwendet)", lines=4, value="Basierend auf diesen Vorgaben, analysiere welches Vorwissen der Schüler hat und wie motiviert er ist. Basierend auf dieser analyse, schreibe einen möglichen Satz, wie  wie der Schüler den Dialog starten würde und schreibe einen realistischen ersten Satz des Schülers. Antworte im json Format mit folgenden variablen: {analyse:<DEINE_ANALYSE>, antwort:<DEIN_SATZ>}")
    txt_student_base = gr.Textbox(label="Base-Prompt Schüler", lines=4, value="Analysiere die Beschreibung des Szene und den bisherigen Dialog. Analysiere welchen Wissenstand der Schüler hat und was sein Ziel ist. Überlege auch wie er sich wohl gerade fühlt und wie motiviert er ist. Der Schüler antwortet sehr kurz, und verhält sich sehr passiv im Gespräch. Schreibe nun basierend auf deinen Analyse eine realistische Antwort des Schülers. Antworte im JSON Format mit folgenden Variablen: {analyse:<DEINE_ANALYSE>, antwort:<ANTWORT_DES_SCHÜLERS>}")
    txt_teacher_base = gr.Textbox(label="Base-Prompt Tutor", lines=4, value="Analysiere die Beschreibung der Szene, des Schülers und des Tutors sowie den bisherigen Dialog. Überlege genau, was das aktuelle Ziel des Tutors ist und wie gut er dieses bereits erfüllt hat. Überlege auch, welches Wissen der Schüler bereits hat und welches Problem er lösen möchte. Nutze ausschließlich Informationen und Wissen, dass der Tutor aus dem bisheren Dialogverlauf haben kann. Der Tutor ist der aktive Part in diesem Gespräch und leitet den Schüler mit geschickten Fragen und kleinen Aufgaben durch das Thema. Wenn der Schüler Rückfragen hat, nimmst sich der Tutor genügend Zeit diese zu beantworten, verliert aber auch nie das eigentliche Thema aus den Augen und übernimmt wieder den aktiven Part wenn die Frage des Schülers beantwortet ist. Überlege dir nun wie der Tutor am besten vorgehen sollte und schreibe dann eine realistische Antwort des Tutors. Antworte im JSON Format mit folgenden Variablen: {analyse:<DEINE_ANALYSE>, antwort:<ANTWORT_DES_TUTORS>}")
    btn_submit = gr.Button("Submit")
    btn_reset = gr.Button("Reset")

    
    # The chat display area
    prompt_student = gr.Textbox(label="Prompt Schüler", lines=10, interactive=False)
    prompt_teacher = gr.Textbox(label="Prompt Tutor", lines=10, interactive=False)
    analysis_student = gr.Textbox(label="Analyse Schüler", lines=10, interactive=False)
    analysis_teacher = gr.Textbox(label="Analyse Tutor", lines=10, interactive=False)
    chat_interface = gr.Textbox(label="Chat", lines=10, interactive=False)
    
    # Define the layout and how components interact
    btn_submit.click(
        fn=generate_next,
        inputs=[txt_intro, txt_setting, txt_topic, txt_student_identity, txt_teacher_identity,txt_student_start, txt_student_base, txt_teacher_base, dialog_state_var,txt_llm_teacher,txt_llm_student],
        outputs=[prompt_student,prompt_teacher, chat_interface, dialog_state_var, analysis_student, analysis_teacher],
    )
    
    btn_reset.click(fn=reset, inputs = [], outputs = [prompt_student,prompt_teacher, chat_interface, dialog_state_var])
    
    # Launch the interface
app.launch()