Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
Unischneider committed Nov 1, 2024
2 parents 4491564 + d40f66d commit 5a55917
Show file tree
Hide file tree
Showing 118 changed files with 583 additions and 57 deletions.
17 changes: 15 additions & 2 deletions app/api/question_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,22 @@ class UserRequest(BaseModel):

router = APIRouter(prefix="/api/v1/question", tags=["response"])


@router.post("/ask")
async def ask(request: UserRequest):
question = request.message
classification = request.study_program
language = request.language
if not question or not classification:
raise HTTPException(status_code=400, detail="No question or classification provided")

if len(question) > config.MAX_MESSAGE_LENGTH:
raise HTTPException(
status_code=400,
detail=f"Question length exceeds the allowed limit of {config.MAX_MESSAGE_LENGTH} characters"
)

logging.info(f"Received question: {question} with classification: {classification}")

if config.TEST_MODE:
answer, used_tokens, general_context, specific_context = request_handler.handle_question_test_mode(question,
classification,
Expand All @@ -44,6 +49,14 @@ async def chat(request: UserChat):
messages = request.messages
if not messages:
raise HTTPException(status_code=400, detail="No messages have been provided")

last_message = messages[-1].message
if len(last_message) > config.MAX_MESSAGE_LENGTH:
raise HTTPException(
status_code=400,
detail=f"Message length exceeds the allowed limit of {config.MAX_MESSAGE_LENGTH} characters"
)

logging.info(f"Received messages.")
answer = request_handler.handle_chat(messages, study_program=request.study_program)
return {"answer": answer}
Expand Down
6 changes: 3 additions & 3 deletions app/data/user_requests.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from pydantic import BaseModel
from typing import List
from typing import List, Optional

class ChatMessage(BaseModel):
message: str
type: str

class UserChat(BaseModel):
messages: List[ChatMessage]
study_program: str

study_program: Optional[str] = None
class SampleQuestion(BaseModel):
topic: str
question: str
Expand Down
7 changes: 4 additions & 3 deletions app/managers/request_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def handle_question(self, question: str, classification: str, language: str):
sample_questions = self.weaviate_manager.get_relevant_sample_questions(question=question, language=language)
sample_questions_formatted = self.prompt_manager.format_sample_questions(sample_questions, language)
messages = self.prompt_manager.create_messages(general_context, specific_context, sample_questions_formatted,
question, language)
question, language, classification)

return self.model.complete(messages)

Expand All @@ -46,7 +46,7 @@ def handle_question_test_mode(self, question: str, classification: str, language
sample_questions = self.weaviate_manager.get_relevant_sample_questions(question=question, language=language)
sample_questions_formatted = self.prompt_manager.format_sample_questions(sample_questions, language)
messages = self.prompt_manager.create_messages(general_context, specific_context, sample_questions_formatted,
question, language)
question, language, classification)
answer, tokens = self.model.complete_with_tokens(messages)
return answer, tokens, general_context_list, specific_context_list

Expand Down Expand Up @@ -76,7 +76,8 @@ def handle_chat(self, messages: List[ChatMessage], study_program: str):
question=last_message,
history=history_formatted,
sample_questions=sample_questions_formatted,
language=lang
language=lang,
study_program=study_program
)

# Generate and return the answer
Expand Down
43 changes: 34 additions & 9 deletions app/prompt/prompt_manager.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from typing import List
import logging
import re

from app.data.user_requests import ChatMessage
from app.managers.weaviate_manager import SampleQuestion
Expand Down Expand Up @@ -31,6 +32,8 @@ def __init__(self):
--------------------
**Study Program Specific Information:**
{study_program}
-----
{specific_context}
--------------------
Expand Down Expand Up @@ -80,6 +83,8 @@ def __init__(self):
--------------------
**Studiengangspezifische Informationen:**
{study_program}
-----
{specific_context}
--------------------
Expand Down Expand Up @@ -140,6 +145,8 @@ def __init__(self):
--------------------
**Study Program Specific Information:**
{study_program}
-----
{specific_context}
--------------------
Expand All @@ -155,8 +162,6 @@ def __init__(self):
- Be clear and concise.
- Use a friendly and professional tone.
- Keep the response within 200 words.
- Start the response with: "Dear <STUDENT NAME>,"
- End with "Best regards, Academic Advising"
- If a provided similar question from a student is thematically very similar to the question asked, rely heavily on the respective sample response from academic advising.
- If information that is **highly** relevant to the question is accompanied by a link (in the general or specific context), include the links in your response like this: "For more detailed information, please visit the following link(s): <LINKS>"
Expand Down Expand Up @@ -198,6 +203,8 @@ def __init__(self):
--------------------
**Studiengangspezifische Informationen:**
{study_program}
-----
{specific_context}
--------------------
Expand All @@ -221,16 +228,17 @@ def __init__(self):
"""

def create_messages(self, general_context: str, specific_context: str, sample_questions: str, question: str,
language: str):
language: str, study_program):
"""Converts the template into a message format suitable for LLMs like OpenAI's GPT."""

study_program_text = self.format_study_program(study_program, language)
# Construct the system prompt
if language.lower() == "english":
user_content = self.answer_prompt_template.format(
general_context=general_context,
specific_context=specific_context or "No specific context available.",
question=question,
sample_questions=sample_questions
sample_questions=sample_questions,
study_program=study_program_text
)
system_content = "You are an intelligent assistant that helps students of the Technical University of Munich (TUM) with questions related to their studies."

Expand All @@ -239,7 +247,8 @@ def create_messages(self, general_context: str, specific_context: str, sample_qu
general_context=general_context,
specific_context=specific_context or "Kein studienfachspezifischer Kontext verfügbar.",
question=question,
sample_questions=sample_questions
sample_questions=sample_questions,
study_program=study_program_text
)
system_content = "Sie sind ein intelligenter Assistent, der den Studierenden der Technischen Universität München (TUM) bei Fragen rund um ihr Studium hilft"

Expand All @@ -253,16 +262,18 @@ def create_messages(self, general_context: str, specific_context: str, sample_qu


def create_messages_with_history(self, general_context: str, specific_context: str, question: str, history: str,
sample_questions: str, language: str):
sample_questions: str, language: str, study_program: str):
"""Converts the template into a message format suitable for LLMs like OpenAI's GPT."""
study_program_text = self.format_study_program(study_program, language)
# Construct the system prompt including history
if language.lower() == "english":
user_content = self.answer_prompt_template_with_history.format(
general_context=general_context,
specific_context=specific_context or "No specific context available.",
question=question,
history=history or "No conversation history available.",
sample_questions=sample_questions
sample_questions=sample_questions,
study_program=study_program_text
)
system_content = "You are an intelligent assistant that helps students of the Technical University of Munich (TUM) with questions related to their studies."

Expand All @@ -272,7 +283,8 @@ def create_messages_with_history(self, general_context: str, specific_context: s
specific_context=specific_context or "Kein studienfachspezifischer Kontext verfügbar.",
question=question,
history=history or "Kein Verlauf verfügbar.",
sample_questions=sample_questions
sample_questions=sample_questions,
study_program=study_program_text
)
system_content = "Sie sind ein intelligenter Assistent, der den Studierenden der Technischen Universität München (TUM) bei Fragen rund um ihr Studium hilft"

Expand Down Expand Up @@ -322,3 +334,16 @@ def format_chat_history(self, chat_messages: List[ChatMessage], language: str) -
# Join formatted messages with separator
combined_string = "\n\n".join(formatted_strings)
return combined_string

# Format the study program
def format_study_program(self, study_program: str, language: str) -> str:
if not study_program or study_program.lower() == "general":
return "No study program specified" if language.lower() == "english" else "Kein Studiengang angegeben"

# Capitalize first letter of each word and replace hyphens with spaces
formatted_program = re.sub(r'-', ' ', study_program).title()

if language.lower() == "english":
return f"The study program of the student is {formatted_program}"
else:
return f"Der Studiengang des Studenten ist {formatted_program}"
1 change: 1 addition & 0 deletions app/utils/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@


class Config:
MAX_MESSAGE_LENGTH = 3000
# Weaviate Database
WEAVIATE_URL = os.getenv("WEAVIATE_URL", "localhost")
WEAVIATE_PORT = os.getenv("WEAVIATE_PORT", "8001")
Expand Down
6 changes: 6 additions & 0 deletions knowledge/documents/cit.tum.de_cit_school_leitbild_.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"link": "https://www.cit.tum.de/cit/school/leitbild/",
"content": "Leitbild - TUM - TUM School of Computation, Information and Technology\n\nUnser Leitbild\nUnser Leitbild\n\nSchool of Computation, Information and Technology\nUnser Leitbild > School of Computation, Information and Technology\nComputation, Information, Technology – drei Grundpfeiler, die uns in die Lage versetzen, die Welt zu verstehen und zu gestalten, miteinander in Kommunikation zu treten und aus Daten Wissen zu gewinnen. Grundpfeiler, die neue kreative Prozesse ermöglichen und alle Bereiche des Lebens durchdringen und bereichern.\nDie TUM School of Computation, Information, and Technology (CIT) vereint mit dem Zusammenschluss der Disziplinen Mathematik, Informatik sowie Elektrotechnik und Informationstechnik ein breites Spektrum unterschiedlichster Kompetenzen:\n- von den theoretischen Grundlagen bis zur anwendungsbezogenen Umsetzung,\n- von elementaren Komponenten über Hardware- und Software-Architekturen bis hin zu gesamtheitlichen technischen Systemen,\n- von mathematischer Abstraktion bis zu den technologischen Prozessen des Engineerings,\n- von der formalen Spezifikation bis zur teil-automatisierten Implementierung.\nRessourcen effizient zu nutzen und einen bestmöglichen Mehrwert für Gesellschaft und Stakeholder zu schaffen, sind uns dabei wichtige Leitgedanken. Unsere Forschung trägt zu einem besseren Verständnis der Natur und des Menschen bei.\n- Dazu arbeiten wir an der abstrakten Darstellung, Analyse, Modellierung und Simulation von Strukturen und Prozessen;\n- wir entwerfen Komponenten und Systeme; und\n- wir konzipieren und optimieren Prozesse.\nUnsere School ist damit Impulsgeber für zahlreiche aktuelle Herausforderungen. So finden sich hier alle Kernkompetenzen der Digitalisierung im weitesten Sinne unter einem Dach – im Bereich digitaler Technologien und weit darüber hinaus.\nMit der Gründung unserer School beschreiten wir gemeinsam neue Pfade. Wir bekennen uns zur Bedeutung unserer jeweiligen disziplinären Herkunft und schöpfen gleichzeitig fachübergreifende Potenziale konsequent aus – in Forschung, Lehre, Technologietransfer und unternehmerischem Handeln; innerhalb der School, in der Familie der TUM Schools und mit unseren Partnern auf nationaler und internationaler Ebene. Unseren Studierenden – aus unserer School wie aus allen anderen Fachbereichen der TUM – bieten wir eine moderne, bedarfsorientierte Ausbildung in Grundlagen und Anwendungen, über das gesamte Fächerspektrum unserer School.\nSubsidiarität stellt unser Leitprinzip dar. Wir begreifen unser Wirken nicht nur aus der Perspektive der Wissenschaft, sondern auch im Kontext unserer wirtschaftlichen und gesellschaftlichen Verantwortung. Wir wollen die zukünftige Entwicklung von Wissenschaft, Wirtschaft und Gesellschaft prägend mitgestalten. Daher hat es höchste Priorität, unsere Talente auf allen Ebenen und in allen Aspekten zu fördern. Schließlich bildet eine nachhaltige Wissenschaftsethik, die gesellschaftlicher Verantwortung nachkommt und Chancengleichheit ermöglicht, die Grundlage für ein respektvolles, gender-bewusstes Miteinander – ergänzt durch kreative Offenheit und Einbettung in die internationale Gemeinschaft.\nUnser Leitbild\n----------------------------------------\n\n",
"type": "CIT",
"study_program": "general"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"link": "https://www.cit.tum.de/cit/studienbeginn/vorkurse-ferienkurse-mathematik/elektrotechnik/",
"content": "Vorkurs Mathematik für Elektrotechnik - TUM - TUM School of Computation, Information and Technology\n\nVorkurs Mathematik für Elektrotechnik\nVorkurs Mathematik für Elektrotechnik\nSie beginnen ein Bachelorstudium im Professional Profile Elektrotechnik und Informationstechnik an der TUM? Dann ist der Vorkurs Mathematik für Elektrotechnik die ideale Vorbereitung für Sie.\nVorkurs Mathematik für Elektrotechnik\n----------------------------------------\n\nOrganisatorisches\nVorkurs Mathematik für Elektrotechnik > Organisatorisches\n\nWann?\nVorkurs Mathematik für Elektrotechnik > Organisatorisches > Wann?\nDer Vorkurs Mathematik für Elektrotechnik 2024 findet werktäglich vom 24. September bis 11. Oktober 2024 statt.\n\nWo?\nVorkurs Mathematik für Elektrotechnik > Organisatorisches > Wo?\nIn Präsenz am TUM-Stammgelände in der Arcisstraße 21 in München.\n\nAnmeldung\nVorkurs Mathematik für Elektrotechnik > Organisatorisches > Anmeldung\nWenn Sie am Vorkurs teilnehmen möchten, melden Sie sich bitte über das Campus-Management-System TUMonline an. Melden Sie sich dort (oben rechts) mit Ihren Login-Daten an und klicken Sie danach auf \"Zur LV-Anmeldung\". Die Anmeldung zur Vorlesung ist bis zum 15.09.2024 möglich. Die Anmeldung zu den Übungen wird zu einem späteren Zeitpunkt stattfinden.\nHinweis zur Anmeldung: Sie können sich in TUMonline – auch nach Zulassung, Studienplatzannahme und Bezahlung der Semesterbeiträge – erst anmelden, wenn das Immatrikulationsamt alle relevanten Unterlagen geprüft und auf \"ok\" gesetzt hat. Ein Brief-Symbol in Ihrem Bewerberaccount bedeutet, dass Dokumente beim Immatrikulationsamt eingegangen sind, aber noch nicht geprüft wurden. Warten Sie in diesem Fall bitte ab, bis als Symbol ein grüner Haken erscheint.\n\nKursunterlagen\nVorkurs Mathematik für Elektrotechnik > Organisatorisches > Kursunterlagen\nMit der Anmeldung zum Vorkurs haben Sie auch Zugang zu Moodle. Auf der Moodle-Seite zum Vorkurs stellen wir Ihnen sämtliche Lehrmaterialien und weitere Infos zur Verfügung. Wir versenden diese nicht per E-Mail oder auf sonstigen Wegen. Bitte sehen Sie von solchen Anfragen ab.\nOrganisatorisches\n----------------------------------------\n\nKursprogramm\nVorkurs Mathematik für Elektrotechnik > Kursprogramm\nDer Vorkurs dauert 13 Tage und findet von Montag bis Freitag statt. Er gliedert sich täglich in einen Vorlesungsteil und einen anschließenden Übungsteil:\n- Täglich 09:00 Uhr bis 11:00 Uhr: Vorlesung im Hörsaal 1200 der TUM\n- 11:00 bis 15:00 Uhr: Gruppenübungen in Kleingruppen\n\nInhalte\nVorkurs Mathematik für Elektrotechnik > Kursprogramm > Inhalte\nIm Vorkurs Mathematik für Elektrotechnik und Informationstechnik bereiten wir Themen aus der Schulmathematik auf und üben grundlegende Themen der Ingenieursmathematik ein, die Ihnen in den ersten Semestern Ihres Studiums begegnen werden. Schwerpunkte sind\n- Rechentechniken\n- Mathematische Symbole\n- Mengenlehre\n- Ungleichungen\n- Vektoren, Matrizen\n- Trigonometrie\n- Polynome\n- Differential- und Integralrechnung\n- Komplexe Zahlen\nParallel zu dieser Wiederholung lernen Sie die mathematische Arbeitsweise kennen, die an der Universität üblich ist. Darüber hinaus haben Sie während des Kurses genügend Zeit und Gelegenheit, um Ihre zukünftige Universität und Ihre Kommilitoninnen und Kommilitonen kennenzulernen.\nNeben der Schulmathematik gibt Ihnen der Vorkurs Einblick in die Ingenieursmathematik. Dieser Stoff ist jedoch für Ihr Studium keine Voraussetzung – zu Beginn des Semesters fangen Sie bei \"Null\" an.\n\nGruppenübungen\nVorkurs Mathematik für Elektrotechnik > Kursprogramm > Gruppenübungen\nIn den Übungen wiederholen, üben und vertiefen Sie die zuvor in der Vorlesung angesprochenen Themen anhand von Aufgaben und Beispielen in kleinen Arbeitsgruppen. Dabei unterstützen Sie kompetente Tutorinnen und Tutoren bei der Lösung der Übungsaufgaben. In welche Gruppe Sie eingeteilt werden und wo Ihre Übung stattfindet, erfahren Sie in Moodle.\nKursprogramm\n----------------------------------------\n\n",
"type": "CIT",
"study_program": "general"
"study_program": "bachelor-elektrotechnik-informationstechnik"
}
Loading

0 comments on commit 5a55917

Please sign in to comment.