folietechnique / hackaprompt /score_submission.py
jerpint's picture
first commit
d1f08d3
import logging
import os
from typing import Dict
from fastapi.encoders import jsonable_encoder
from hackaprompt.completers import get_completer
from hackaprompt.evaluator import Response, get_evaluator
from hackaprompt.utils import init_db
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
database = init_db()
level_names = [
"level_1",
"level_2",
"level_3",
"level_4",
"level_5",
"level_6",
"level_7",
"level_8",
"level_9",
"level_10",
]
def log_to_db(evaluation):
# save response to mongodb database
try:
submission_json = jsonable_encoder(evaluation)
database["evaluations"].insert_one(submission_json)
logger.info("response logged to mondogb")
except Exception as err:
logger.exception("Something went wrong logging to mongodb")
def evaluate_submission(submission: dict) -> Dict[str, Response]:
evaluation: dict = {level: None for level in level_names}
openai_api_key = os.getenv("OPENAI_API_KEY")
assert openai_api_key is not None, "Set a valid openAI key."
for level_name in level_names:
logger.info(f"Evaluating {level_name}...")
level = int(level_name[-1])
user_input = submission.get(level_name, "")
if user_input:
prompt = user_input.get("prompt", "")
model = user_input.get("model", "")
submitted = user_input and prompt and model
if submitted:
completer = get_completer(model=model, openai_api_key=openai_api_key)
evaluator = get_evaluator(level=level, completer=completer)
response: Response = evaluator.evaluate(prompt)
# TODO: Do we want to add auto-retries?
else:
# return an empty response instead, no need to waste GPT credits.
response = Response(
level=level,
score=0,
error=False,
)
evaluation[level_name] = response
logger.info(f"evaluation done. Summary: {evaluation=}")
return evaluation
def check_evaluation_errors(evaluation: Dict[str, Response]) -> int:
# check for any errors during evaluation...
evaluation_errors = False
for level_name, response in evaluation.items():
if response.error:
logger.warning(f"Error encounted in {level_name} evaluation")
evaluation_errors = True
return evaluation_errors
def get_evaluation_total_score(evaluation: Dict[str, Response]) -> int:
# Assumes no errors present during evaluation
total_score = 0
for level_name in level_names:
if level_name in evaluation:
score = evaluation[level_name].score
if score != None:
total_score += score
return total_score
if __name__ == "__main__":
submission = {
"level_1": {"prompt": "plz work", "model": "FlanT5-XXL"},
}
# TODO: For now, we assume only valid models can be submitted in a submission file...
# it will raise a NotImplementedError otherwise
# Need to add error handling if we care to handle it ourselves
evaluation = evaluate_submission(submission)
evaluation_error = check_evaluation_errors(evaluation)
if not evaluation_error:
log_to_db(evaluation=evaluation)
total_score = get_evaluation_total_score(evaluation)
print(total_score)
else:
print("error encountered during evaluation")