From e07a359c7537060ce242e6338a02023dad7ff80b Mon Sep 17 00:00:00 2001 From: Gustavo Araujo Costa Date: Thu, 4 Jul 2024 02:28:50 -0300 Subject: [PATCH] add json and qualitative grading. not sure if works. add stj --- README.md | 3 +- eval_prompts.py | 2 +- eval_variables.py | 172 ++++++++++++++++++++++++++++++++++++------ main.py | 12 +-- requirements.txt | 188 ---------------------------------------------- utils/display.py | 10 +-- utils/grading.py | 75 ++++++++++++------ utils/llm.py | 12 +-- utils/my_types.py | 2 +- utils/openai.py | 12 +-- 10 files changed, 226 insertions(+), 262 deletions(-) delete mode 100644 requirements.txt diff --git a/README.md b/README.md index 3ac6b82..b234b49 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,9 @@ Uses [ollama](https://github.com/ollama/ollama-python) to run LLMs locally. ## TODO +- add json grading +- add qualitative grading - add tests -- add qualitative eval - add [asyncio](https://github.com/ollama/ollama-python?tab=readme-ov-file#async-client) - add details on which answers tend to be wrong. summary expected diff --git a/eval_prompts.py b/eval_prompts.py index 5471253..c9c255c 100644 --- a/eval_prompts.py +++ b/eval_prompts.py @@ -10,7 +10,7 @@ 1. qual foi o resultado da decisão tomada? responda com "ACEITO", "PARCIAL" ou "NEGADO" 2. a decisão foi tomada em unanimidade? responda com "SIM" OU "NAO" -3. houve modificativos? responda "SIM" ou "NAO" +3. houve efeitos modificativos? responda "SIM" ou "NAO" 4. houve conhecer? responda com "SIM", "PARCIAL" ou "NAO" 5. qual ministro presidiu o julgamento? 6. houve algum ministro ausente? diff --git a/eval_variables.py b/eval_variables.py index 55dcde8..b8444d9 100644 --- a/eval_variables.py +++ b/eval_variables.py @@ -2,6 +2,10 @@ options = [] +## ? !!! ESTÃO TODOS ERRADOS POIS NAO CONSTA O RELATOR NO TEXTO DA DECISAO !!! + +## ??? terminar de fazer os comentados + variables: list[Variable] = [ Variable( id="recurso negado", @@ -11,30 +15,156 @@ ], options=options, ), - # Variable(id="recurso parcial"), - # Variable(id="recurso aceito"), - # Variable(id="agravo negado"), - # Variable(id="agravo parcial"), - # Variable(id="agravo aceito"), - # Variable(id="x negado"), - # Variable(id="x parcial"), - # Variable(id="x aceito"), - # Variable(id="maioria"), - # Variable(id="modificativos"), - # Variable(id="conhecer nan"), - # Variable(id="conhecer"), # Variable( - # id="conhecer parcial", - # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 26/09/2023 a 02/10/2023, por unanimidade, conhecer parcialmente do recurso, mas lhe negar provimento, nos termos do voto do Sr. Ministro Gurgel de Faria. Os Srs. Ministros Benedito Gonçalves, Sérgio Kukina, Regina Helena Costa e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + # id="recurso parcial", + # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 15/08/2023 a 21/08/2023, por unanimidade, dar parcial provimento ao recurso, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Sérgio Kukina, Regina Helena Costa, Gurgel de Faria e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + # expected=[ + # """```jsonl\n\n{"resultado": null,"unanimidade": null,"modificativos": null,"conhecer": null,"presidiu": null,"ausente": null,"aFavor": null,"vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + # ], + # options=options, + # ), + # Variable( + # id="recurso aceito", + # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 15/08/2023 a 21/08/2023, por unanimidade, dar provimento ao recurso, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Benedito Gonçalves, Sérgio Kukina, Regina Helena Costa e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + # expected=[ + # """```jsonl\n\n{"resultado": null,"unanimidade": null,"modificativos": null,"conhecer": null,"presidiu": null,"ausente": null,"aFavor": null,"vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + # ], + # options=options, + # ), + # Variable( + # id="agravo negado", + # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma, por unanimidade, acolher os embargos declaração, com efeitos modificativos, para anular o acórdão de fls. 596/601 e, em novo julgamento, negar provimento ao agravo interno de fls. 578/588, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Sérgio Kukina, Regina Helena Costa e Gurgel de Faria votaram com o Sr. Ministro Relator. Ausente, justificadamente, o Sr. Ministro Benedito Gonçalves.", + # expected=[ + # """```jsonl\n\n{"resultado": null,"unanimidade": null,"modificativos": null,"conhecer": null,"presidiu": null,"ausente": null,"aFavor": null,"vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + # ], + # options=options, + # ), + # Variable( + # id="agravo parcial", + # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma, por unanimidade, cancelar à afetação do feito à Primeira Seção e dar parcial provimento ao agravo regimental, apenas para tornar sem efeito a decisão de fls.135/141 e determinar o retorno dos autos à origem para nova apreciação do processo, considerando-se a tese vinculante fixada no Tema 1.007/STJ, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Benedito Gonçalves, Sérgio Kukina, Regina Helena Costa e Gurgel de Faria votaram com o Sr. Ministro Relator.", + # expected=[ + # """```jsonl\n\n{"resultado": null,"unanimidade": null,"modificativos": null,"conhecer": null,"presidiu": null,"ausente": null,"aFavor": null,"vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + # ], + # options=options, + # ), + # Variable( + # id="agravo aceito", + # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA, por unanimidade, dar provimento ao agravo interno, para arbitrar a verba honorária, com fundamento no art. 20, §§ 3º e 4º, do CPC/1973, no valor de R$ 60.000,00 (sessenta mil reais), nos termos do voto do Sr. Ministro Relator . Os Srs. Ministros Benedito Gonçalves, Sérgio Kukina e Gurgel de Faria votaram com o Sr. Ministro Relator. Impedida a Sra. Ministra Regina Helena Costa.", + # expected=[ + # """```jsonl\n\n{"resultado": null,"unanimidade": null,"modificativos": null,"conhecer": null,"presidiu": null,"ausente": null,"aFavor": null,"vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + # ], + # options=options, + # ), + # Variable( + # id="embargo negado (rejeitado)", + # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 07/11/2023 a 13/11/2023, por unanimidade, rejeitar os embargos de declaração, com aplicação de multa, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Benedito Gonçalves, Sérgio Kukina, Regina Helena Costa e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + # expected=[ + # """```jsonl\n\n{"resultado": null,"unanimidade": null,"modificativos": null,"conhecer": null,"presidiu": null,"ausente": null,"aFavor": null,"vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + # ], + # options=options, + # ), + Variable( + id="embargo parcial (acolhido parcialmente)", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 21/11/2023 a 27/11/2023, por unanimidade, acolher parcialmente os embargos de declaração, sem efeitos modificativos, nos termos do voto da Sra. Ministra Relatora. Os Srs. Ministros Benedito Gonçalves, Sérgio Kukina, Gurgel de Faria e Paulo Sérgio Domingues votaram com a Sra. Ministra Relatora. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + expected=[ + """```jsonl\n\n{"resultado": "PARCIAL","unanimidade": "SIM","modificativos": "NAO","conhecer": null,"presidiu": "Paulo","ausente": null,"aFavor": "Benedito, Sérgio, Gurgel, Paulo, Regina","vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + ], + options=options, + ), + # Variable( + # id="embargo aceito (acolhido)", + # content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA, por unanimidade, acolher os embargos de declaração, com efeitos modificativos, para tornar sem efeito as decisões de fls. 173, 195/196 e 219/222, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Benedito Gonçalves, Regina Helena Costa, Gurgel de Faria e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", # expected=[ - # """{"resultado": "NEGADO","unanimidade": "SIM","modificativos": "NAO","conhecer": "PARCIAL","presidiu": "Paulo","ausente": null,"aFavor": Benedito, Sérgio, Regina, Paulo","vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}""" + # """```jsonl\n\n{"resultado": null,"unanimidade": null,"modificativos": null,"conhecer": null,"presidiu": null,"ausente": null,"aFavor": null,"vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" # ], # options=options, # ), - # Variable(id="nao conhecer"), - # Variable(id="ausente"), - # Variable(id="lavrara"), - # Variable(id="desempate"), - # Variable(id="voto vista 1"), - # Variable(id="voto vista 2"), + Variable( + id="maioria", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma do Superior Tribunal de Justiça, prosseguindo o julgamento, por maioria, vencido o Sr. Ministro Gurgel de Faria (Relator), dar parcial provimento ao agravo interno para reconhecer o interesse de agir, em razão da necessidade de prestação judicial para reconhecimento e cômputo de tempo especial negado administrativamente, fixando o termo inicial da aposentadoria especial na data da citação, nos termos do voto-vista da Sra. Ministra Regina Helena Costa, que lavrará acórdão. Votaram com a Sra. Ministra Regina Helena Costa os Srs. Ministros Paulo Sérgio Domingues (Presidente), Benedito Gonçalves e Sérgio Kukina.", + expected=[ + """```jsonl\n\n{"resultado": "PARCIAL","unanimidade": "NAO","modificativos": null,"conhecer": null,"presidiu": "Sérgio","ausente": null,"aFavor": "Regina, Paulo, Benedito, Sérgio","vencidos": "Gurgel","lavrara": "Regina","desempate": null,"votoVista": "Regina"}\n\n```""" + ], + options=options, + ), + Variable( + id="modificativos", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 29/08/2023 a 04/09/2023, por unanimidade, acolher os embargos de declaração, com efeitos modificativos, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Sérgio Kukina, Regina Helena Costa, Gurgel de Faria e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + expected=[ + """```jsonl\n\n{"resultado": "ACEITO","unanimidade": "SIM","modificativos": "SIM","conhecer": null,"presidiu": "Paulo","ausente": null,"aFavor": "Sérgio, Regina, Gurgel, Paulo","vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + ], + options=options, + ), + Variable( + id="conhecer nan", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma, por unanimidade, dar provimento ao recurso especial, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Sérgio Kukina, Regina Helena Costa, Gurgel de Faria e Paulo Sérgio Domingues (Presidente) votaram com o Sr. Ministro Relator.", + expected=[ + """```jsonl\n\n{"resultado": "ACEITO","unanimidade": "SIM","modificativos": null,"conhecer": null,"presidiu": "Sérgio","ausente": null,"aFavor": "Sérgio, Regina, Gurgel, Paulo","vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + ], + options=options, + ), + Variable( + id="conhecer", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma, por unanimidade, conhecer do agravo para dar provimento ao recurso especial, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Sérgio Kukina, Regina Helena Costa, Gurgel de Faria e Paulo Sérgio Domingues (Presidente) votaram com o Sr. Ministro Relator.", + expected=[ + """```jsonl\n\n{"resultado": "ACEITO","unanimidade": "SIM","modificativos": null,"conhecer": "SIM","presidiu": "Sérgio","ausente": null,"aFavor": "Sérgio, Regina, Gurgel, Paulo", "vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + ], + options=options, + ), + Variable( + id="conhecer parcial", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 26/09/2023 a 02/10/2023, por unanimidade, conhecer parcialmente do recurso, mas lhe negar provimento, nos termos do voto do Sr. Ministro Gurgel de Faria. Os Srs. Ministros Benedito Gonçalves, Sérgio Kukina, Regina Helena Costa e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + expected=[ + """{"resultado": "NEGADO","unanimidade": "SIM","modificativos": "NAO","conhecer": "PARCIAL","presidiu": "Paulo","ausente": null,"aFavor": Benedito, Sérgio, Regina, Paulo","vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}""" + ], + options=options, + ), + Variable( + id="nao conhecer", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da PRIMEIRA TURMA do Superior Tribunal de Justiça, em sessão virtual de 21/11/2023 a 27/11/2023, por unanimidade, negar provimento ao agravo interno de fls. 28/33 e não conheçer do agravo interno de fls. 42/47, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Sérgio Kukina, Regina Helena Costa, Gurgel de Faria e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Presidiu o julgamento o Sr. Ministro Paulo Sérgio Domingues.", + expected=[ + """```jsonl\n\n{"resultado": "NEGADO","unanimidade": "SIM","modificativos": null,"conhecer": "NAO","presidiu": "Paulo","ausente": null,"aFavor": "Sérgio, Regina, Gurgel, Paulo","vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + ], + options=options, + ), + Variable( + id="ausente", + content="Vistos, relatados e discutidos estes autos, acordam os Ministros da Primeira TURMA do Superior Tribunal de Justiça, por unanimidade, negar provimento ao agravo interno, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Regina Helena Costa, Gurgel de Faria(que ressalvou o seu ponto de vista) e Paulo Sérgio Domingues votaram com o Sr. Ministro Relator. Ausente, justificadamente, o Sr. Ministro Benedito Gonçalves.", + expected=[ + """```jsonl\n\n{"resultado": "NEGADO","unanimidade": "SIM","modificativos": null,"conhecer": null,"presidiu": null,"ausente": "Benedito","aFavor": "Regina, Gurgel, Paulo", "vencidos": null,"lavrara": null,"desempate": null,"votoVista": null}\n\n```""" + ], + options=options, + ), + Variable( + id="lavrara", + content="Visto e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma do Superior Tribunal de Justiça, prosseguindo o julgamento, por maioria, vencidos os Srs. Ministros Benedito Gonçalves(Relator) e Gurgel de Faria(voto-vista), dar provimento ao recurso especial, a fim de reconhecer, in casu, a legitimidade ativa do Ministério Público Federal, nos termos do voto-vista da Sra. Ministra Regina Helena Costa, que lavrará o acórdão. Votaram com a Sra. Ministra Regina Helena Costa os Srs. Ministros Sérgio Kukina e Paulo Sérgio Domingues (Presidente).", + expected=[ + """```jsonl\n\n{"resultado": "ACEITO","unanimidade": "NAO","modificativos": null,"conhecer": null,"presidiu": "Paulo","ausente": null,"aFavor": "Regina, Sérgio, Paulo","vencidos": "Benedito, Gurgel", "lavrara": "Regina","desempate": null,"votoVista": "Gurgel, Regina"}\n\n```""" + ], + options=options, + ), + Variable( + id="desempate", + content="Vistos, relatados e discutidos os autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma do Superior Tribunal de Justiça, prosseguindo o julgamento, após o voto-desempate do Sr. Ministro Benedito Gonçalves, por maioria, vencidos os Srs. Ministros Sérgio Kukina e Regina Helena Costa, negar provimento ao agravo interno do MPF, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Manoel Erhardt (Desembargador convocado do TRF-5ª Região) e Benedito Gonçalves (Presidente) votaram com o Sr. Ministro Relator.", + expected=[ + """```jsonl\n\n{"resultado": "NEGADO","unanimidade": "NAO","modificativos": null,"conhecer": null,"presidiu": "Benedito","ausente": null,"aFavor": "Manoel, Benedito","vencidos": "Sérgio, Regina","lavrara": null,"desempate": "Benedito","votoVista": null}\n\n```""" + ], + options=options, + ), + Variable( + id="voto vista 1", + content="Vistos e relatados estes autos em que são partes as acima indicadas, acordam os Ministros da Primeira Turma do Superior Tribunal de Justiça, prosseguindo o julgamento, por unanimidade, negar provimento ao agravo interno, nos termos do voto da Sra. Ministra Relatora. Os Srs. Ministros Gurgel de Faria (voto-vista), Manoel Erhardt (Desembargador convocado do TRF-5ª Região) e Sérgio Kukina (Presidente) votaram com a Sra. Ministra Relatora. Impedido o Sr. Ministro Benedito Gonçalves. Presidiu o julgamento o Sr. Ministro Sérgio Kukina.", + expected=[ + """```jsonl\n\n{"resultado": "NEGADO","unanimidade": "SIM","modificativos": null,"conhecer": null,"presidiu": "Sérgio","ausente": "Benedito","aFavor": "Gurgel, Manoel, Sérgio","vencidos": null,"lavrara": null,"desempate": null,"votoVista": "Gurgel"}\n\n```""" + ], + options=options, + ), + Variable( + id="voto vista 2", + content="Vistos, relatados e discutidos estes autos, acordam os Ministros da Primeira TURMA do Superior Tribunal de Justiça, prosseguindo o julgamento, após o voto-vista do Sr. Ministro Benedito Gonçalves, por unanimidade, negar provimento ao agravo interno, nos termos do voto do Sr. Ministro Relator. Os Srs. Ministros Regina Helena Costa, Gurgel de Faria, Paulo Sérgio Domingues (Presidente) e Benedito Gonçalves (voto-vista) votaram com o Sr. Ministro Relator.", + expected=[ + """```jsonl\n\n{"resultado": "NEGADO","unanimidade": "SIM","modificativos": null,"conhecer": null,"presidiu": "Paulo","ausente": null,"aFavor": "Regina, Gurgel, Paulo, Benedito","vencidos": null,"lavrara": null,"desempate": null,"votoVista": "Benedito"}\n\n```""" + ], + options=options, + ), ] diff --git a/main.py b/main.py index d993b92..9948247 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,7 @@ from eval_variables import variables from eval_models import models -from utils.my_types import Result +from utils.my_types import Result, Model from utils.llm import query from utils.grading import grade_response @@ -20,8 +20,8 @@ PROMPTS = prompts VARIABLES = variables TEMPERATURE = 0.0 -GRADING_TYPE = "binary" -DANGER_MODE = True # does not ask permission about prices. use with care. +DANGER_MODE = True # does not ask permission about prices; use with care. +GRADING_TYPE = "json" # qualitative uses gpt4o; use with care. def main(): @@ -104,13 +104,13 @@ def main(): print("SUMMARY") print() print("BY MODEL") - generate_and_show_summary(outputs, MODELS) + generate_and_show_summary(outputs, MODELS, GRADING_TYPE) print() print("BY PROMPT") - generate_and_show_summary(outputs, PROMPTS) + generate_and_show_summary(outputs, PROMPTS, GRADING_TYPE) print() print("BY VARIABLE") - generate_and_show_summary(outputs, VARIABLES) + generate_and_show_summary(outputs, VARIABLES, GRADING_TYPE) print() print("BY EXPECTED") print("todo") diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index f73207a..0000000 --- a/requirements.txt +++ /dev/null @@ -1,188 +0,0 @@ -absl-py==2.1.0 -anyio==4.3.0 -argon2-cffi==23.1.0 -argon2-cffi-bindings==21.2.0 -arrow==1.3.0 -asttokens==2.4.1 -astunparse==1.6.3 -async-lru==2.0.4 -attrs==23.2.0 -autopep8==2.0.4 -Babel==2.14.0 -beautifulsoup4==4.12.3 -bleach==6.1.0 -blinker==1.4 -certifi==2024.2.2 -cffi==1.16.0 -charset-normalizer==3.3.2 -check50==3.3.11 -click==8.1.7 -comm==0.2.2 -command-not-found==0.3 -cryptography==3.4.8 -dbus-python==1.2.18 -debugpy==1.8.1 -decorator==5.1.1 -defusedxml==0.7.1 -distro==1.7.0 -distro-info==1.1+ubuntu0.1 -EditorConfig==0.12.4 -exceptiongroup==1.2.0 -executing==2.0.1 -fastjsonschema==2.19.1 -filelock==3.13.4 -flatbuffers==24.3.25 -fqdn==1.5.1 -fsspec==2024.3.1 -gast==0.5.4 -google-pasta==0.2.0 -greenlet==1.1.2 -grpcio==1.62.2 -h11==0.14.0 -h5py==3.11.0 -httpcore==1.0.5 -httplib2==0.20.2 -httpx==0.27.0 -huggingface-hub==0.22.2 -icdiff==2.0.7 -idna==3.6 -importlib-metadata==4.6.4 -iniconfig==2.0.0 -ipykernel==6.29.4 -ipython==8.23.0 -isoduration==20.11.0 -jedi==0.19.1 -jeepney==0.7.1 -jellyfish==0.11.2 -Jinja2==3.1.3 -joblib==1.4.0 -jsbeautifier==1.15.1 -json5==0.9.25 -jsonpointer==2.4 -jsonschema==4.21.1 -jsonschema-specifications==2023.12.1 -jupyter-events==0.10.0 -jupyter-lsp==2.2.5 -jupyter_client==8.6.1 -jupyter_core==5.7.2 -jupyter_server==2.14.0 -jupyter_server_terminals==0.5.3 -jupyterlab==4.1.6 -jupyterlab_pygments==0.3.0 -jupyterlab_server==2.27.0 -kaggle==1.6.12 -keras==3.3.2 -keyring==23.5.0 -launchpadlib==1.10.16 -lazr.restfulclient==0.14.4 -lazr.uri==1.0.6 -lib50==3.0.11 -libclang==18.1.1 -Markdown==3.6 -markdown-it-py==3.0.0 -MarkupSafe==2.1.5 -matplotlib-inline==0.1.7 -mdurl==0.1.2 -mistune==3.0.2 -ml-dtypes==0.3.2 -more-itertools==8.10.0 -msgpack==1.0.3 -namex==0.0.8 -nbclient==0.10.0 -nbconvert==7.16.3 -nbformat==5.10.4 -nest-asyncio==1.6.0 -netifaces==0.11.0 -nltk==3.8.1 -notebook==7.1.3 -notebook_shim==0.2.4 -numpy==1.26.4 -oauthlib==3.2.0 -ollama==0.2.1 -opt-einsum==3.3.0 -optree==0.11.0 -overrides==7.7.0 -packaging==24.0 -pandas==2.2.2 -pandocfilters==1.5.1 -parso==0.8.4 -pexpect==4.9.0 -pillow==10.3.0 -platformdirs==4.2.0 -pluggy==1.4.0 -polars==0.20.22 -prometheus_client==0.20.0 -prompt-toolkit==3.0.43 -protobuf==4.25.3 -psutil==5.9.8 -ptyprocess==0.7.0 -pure-eval==0.2.2 -pycodestyle==2.10.0 -pycparser==2.22 -pygame==2.5.2 -Pygments==2.17.2 -PyGObject==3.42.1 -PyJWT==2.3.0 -pynvim==0.4.2 -pyparsing==2.4.7 -pytesseract==0.3.10 -python-apt==2.4.0+ubuntu2 -python-dateutil==2.9.0.post0 -python-dotenv==1.0.1 -python-json-logger==2.0.7 -python-magic==0.4.27 -python-slugify==8.0.4 -pytz==2024.1 -PyYAML==6.0.1 -pyzmq==26.0.2 -referencing==0.34.0 -regex==2024.4.16 -requests==2.31.0 -rfc3339-validator==0.1.4 -rfc3986-validator==0.1.1 -rich==13.7.1 -rpds-py==0.18.0 -safetensors==0.4.3 -scikit-learn==1.4.2 -scipy==1.13.0 -SecretStorage==3.3.1 -Send2Trash==1.8.3 -six==1.16.0 -sniffio==1.3.1 -soupsieve==2.5 -stack-data==0.6.3 -style50==2.10.2 -submit50==3.1.4 -systemd-python==234 -tensorboard==2.16.2 -tensorboard-data-server==0.7.2 -tensorflow==2.16.1 -tensorflow-io-gcs-filesystem==0.36.0 -termcolor==1.1.0 -terminado==0.18.1 -text-unidecode==1.3 -tf_keras==2.16.0 -threadpoolctl==3.4.0 -tinycss2==1.2.1 -tokenizers==0.19.1 -tomli==2.0.1 -tornado==6.4 -tqdm==4.66.2 -traitlets==5.14.3 -transformers==4.40.1 -types-python-dateutil==2.9.0.20240316 -typing_extensions==4.11.0 -tzdata==2024.1 -ubuntu-advantage-tools==8001 -ufw==0.36.1 -unattended-upgrades==0.1 -uri-template==1.3.0 -urllib3==2.2.1 -wadllib==1.3.6 -wcwidth==0.2.13 -webcolors==1.13 -webencodings==0.5.1 -websocket-client==1.7.0 -Werkzeug==3.0.2 -wrapt==1.16.0 -zipp==1.0.0 diff --git a/utils/display.py b/utils/display.py index 5458ebc..dcdf074 100644 --- a/utils/display.py +++ b/utils/display.py @@ -4,16 +4,14 @@ def generate_and_show_summary( outputs: list[Result], category: list[Model] | list[Variable] | list[Prompt], - grading_type="binary", + grading_type: str, ): - if grading_type == "binary": + if grading_type == "binary" or grading_type == "json": max_grade_proportion = 1 - if grading_type == "out_of_ten": - raise NotImplementedError - if grading_type == "qualitative": - raise NotImplementedError + print("Grading type: qualitative. Read the logs.") + return for item in category: subset = get_result_subset(item, outputs) diff --git a/utils/grading.py b/utils/grading.py index 5ab6b78..fc03617 100644 --- a/utils/grading.py +++ b/utils/grading.py @@ -1,31 +1,60 @@ -from utils.my_types import Variable +from utils.my_types import Model, Variable, Prompt +from utils.llm import query +GRADING_MODEL = Model("gpt-4o") +GRADING_PROMPT = """Rate this AI response from 0 to 10. Be brief. -def grade_response(response: str, variable: Variable, grading_type: str) -> int: - if grading_type == "binary": - for expected in variable.expected: - if expected in response: - return 1 - return 0 +This was the expected response: + +{expected} + +### + +This was the AI response: - if grading_type == "qualitative": - raise NotImplementedError +{response} - if grading_type == "out_of_ten": - grade = 0 # out of 10 +### - expected = variable.expected - possible_responses = variable.options +Be """ - for expected in variable.expected: - if expected in response: - grade = 10 - # penalize if it cites other possible responses - if possible_responses: - other_responses = set(possible_responses) - {x for x in expected} - for other in other_responses: - if other in response: - grade -= 5 +def grade_response(response: str, variable: Variable, grading_type: str) -> int | str: + match grading_type: + case "json": + for expected in variable.expected: + _response = response.replace("\n", "").replace(" ", "") + _expected = expected.replace("\n", "").replace(" ", "") + if _response in _expected: + return 1 + return 0 + + case "binary": + for expected in variable.expected: + if response in expected: + return 1 + return 0 - return int(max(grade, 0)) + case "qualitative": + _model = GRADING_MODEL + _variable = Variable( + id="grading_variable", content=response, expected=[], options=[] + ) + _prompt = Prompt( + id="grading_prompt", + slots="XXX", + content=GRADING_PROMPT.replace( + "{expected}", variable.expected[0] + ).replace("{response}", response), + ) + response = query( + model=_model, + prompt=_prompt, + variable=_variable, + temp=0, + danger_mode=True, + ) + return response + + case _: + raise ValueError(f"Unknown grading type: {grading_type}") diff --git a/utils/llm.py b/utils/llm.py index 1f016cc..fe7b7a3 100644 --- a/utils/llm.py +++ b/utils/llm.py @@ -1,8 +1,8 @@ -from openai import OpenAI import sys -from utils.my_types import Model, Prompt, Variable -import ollama from dotenv import load_dotenv +import ollama +from openai import OpenAI +from utils.my_types import Model, Prompt, Variable from utils.openai import ( estimate_costs, get_n_tokens, @@ -27,9 +27,10 @@ def query( messages = build_messages(prompt, variable) n_tokens = get_n_tokens(model.id, str(messages)) - estimate_costs(model.id, n_tokens) if not danger_mode: + estimate_costs(model.id, n_tokens) + if not ask_permission(): sys.exit(0) @@ -41,7 +42,8 @@ def query( temperature=temp, ) - get_costs_gpt4o(response) + if not danger_mode: + get_costs_gpt4o(response) return response.choices[0].message.content # type: ignore diff --git a/utils/my_types.py b/utils/my_types.py index ab9fd9c..c1b0949 100644 --- a/utils/my_types.py +++ b/utils/my_types.py @@ -30,7 +30,7 @@ class Result: variable_id: str expected: list[str] response: str | None = None - grade: int | None = None + grade: int | str | None = None time_elapsed: float | None = None error: str | None = None diff --git a/utils/openai.py b/utils/openai.py index 0661e9e..c54518a 100644 --- a/utils/openai.py +++ b/utils/openai.py @@ -38,27 +38,21 @@ def estimate_costs(model: str, n_tokens: int) -> None: output_cost = n_tokens * MODEL_OUTPUT total_cost = input_cost + output_cost - print("Antiquarian AI Cleanup Cost Estimation:") - print("Model: ", model) - print(f"Tokens: {n_tokens} + {n_tokens}") - print(f"Total Estimated Cost: ${total_cost:.2f}") + print(f"Estimated Cost: {n_tokens} + {n_tokens} = ${total_cost:.2f}") def get_costs_gpt4o(response) -> None: MODEL_INPUT = OMNI_INPUT / 1_000_000 MODEL_OUTPUT = OMNI_OUTPUT / 1_000_000 - print("\nActual Cost: ") i_tokens = response.usage.prompt_tokens o_tokens = response.usage.completion_tokens - print(f"Tokens: {i_tokens} + {o_tokens}") input_cost = i_tokens * MODEL_INPUT output_cost = o_tokens * MODEL_OUTPUT total_cost = input_cost + output_cost - print(f"Cost: {input_cost:.4f} + {output_cost:.4f}") - print(f"Total Cost: ${total_cost:.2f}") + print(f"\nActual Cost: {i_tokens} + {o_tokens} = ${total_cost:.2f}") def get_n_tokens(model: str, text: str) -> int: @@ -79,5 +73,3 @@ def ask_permission(): return False else: print("Invalid input. Please enter 'y' or 'n'.") - -