diff --git a/evaluation/rag_runner.py b/evaluation/rag_runner.py index ce92281..7a7a8cf 100644 --- a/evaluation/rag_runner.py +++ b/evaluation/rag_runner.py @@ -54,6 +54,49 @@ MARKDOWN_URL_RE = re.compile( ) +TOOL_ROUTING_SYSTEM_PROMPT = """ +Si prvá fáza RAG agenta pre ZP Wiki. + +Tvojou úlohou je pri otázkach, ktoré vyžadujú informácie +zo ZP Wiki, zavolať dostupný retrieval tool. + +Pri vytváraní argumentu `query` zachovaj všetky významovo +rozlišujúce informácie z používateľovej otázky. + +Zachovaj najmä: +- meno alebo názov osoby, dokumentu alebo témy, +- typ práce alebo projektu, napríklad bakalárska práca, + diplomová práca, dizertačná práca, diplomový projekt + alebo tímový projekt, +- požadovaný atribút, napríklad názov, téma, rok, autor, + cieľ, metóda alebo zadanie, +- explicitne uvedený rok, +- ďalšie odborné alebo rozlišujúce kľúčové slová. + +Query môže byť stručnejší než pôvodná otázka, ale nesmie +stratiť významové obmedzenia potrebné na správne vyhľadanie. + +Napríklad otázku: +"Aká téma diplomovej práce je uvedená pri osobe Ján Novák?" +je vhodné previesť na query podobný: +"Ján Novák diplomová práca téma" + +Nevhodné je zredukovať ju iba na: +"Ján Novák" + +Podobne pri otázke na rok diplomovej práce musí query +zachovať meno osoby, pojem diplomová práca a informáciu, +že sa hľadá rok. + +Nevymýšľaj hodnoty, ktoré používateľ v otázke neuviedol. +Nevkladaj do query predpokladanú odpoveď. + +Ak je potrebné použiť ZP Wiki, najprv zavolaj retrieval tool. +Po získaní výsledku odpovedaj iba podľa informácií, +inštrukcií, kontextu a zdrojov vrátených toolom. +""".strip() + + class RequestError( RuntimeError ): @@ -766,6 +809,32 @@ def parse_tool_arguments( return parsed +def build_initial_messages( + question: str, +) -> list[dict[str, Any]]: + question = ( + question.strip() + ) + + if not question: + raise RuntimeError( + "Otázka je prázdna." + ) + + return [ + { + "role": "system", + "content": ( + TOOL_ROUTING_SYSTEM_PROMPT + ), + }, + { + "role": "user", + "content": question, + }, + ] + + def run_question( question: str, *, @@ -804,14 +873,11 @@ def run_question( str ] = [] - messages: list[ - dict[str, Any] - ] = [ - { - "role": "user", - "content": question, - } - ] + messages = ( + build_initial_messages( + question + ) + ) first_started = ( time.perf_counter()