views.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import csv
  2. from django.shortcuts import render
  3. from django.http import HttpResponse
  4. from .models import EvalSession, EvalAnswer, EvalConfig, QA
  5. def eval_download_results(request, session_id):
  6. session = EvalSession.objects.get(id=session_id)
  7. eval_answers = EvalAnswer.objects.filter(eval_session=session).order_by('question__id')
  8. response = HttpResponse(content_type='text/csv')
  9. writer = csv.writer(response)
  10. writer.writerow(['Question ID', 'Question', 'Correct Answer', 'Correct Answer Index', 'Instruction', 'Assistant answer', 'Is Correct'])
  11. for eval_answer in eval_answers:
  12. writer.writerow([
  13. eval_answer.question.id,
  14. eval_answer.question.question,
  15. eval_answer.question.correct_answer,
  16. eval_answer.question.correct_answer_idx,
  17. eval_answer.instruction,
  18. eval_answer.assistant_answer,
  19. eval_answer.is_correct])
  20. response['Content-Disposition'] = f'attachment; filename="{session.name}.csv"'
  21. return response
  22. def config_download_results(request, config_id):
  23. response = HttpResponse(content_type='text/csv')
  24. config = EvalConfig.objects.get(id=config_id)
  25. sessions = EvalSession.objects.filter(config=config).filter(is_active=True)
  26. extra_info_fields = []
  27. questions = dict()
  28. for qa in QA.objects.filter(dataset=config.dataset):
  29. questions[qa.id] = qa
  30. if not extra_info_fields and qa.extra_info:
  31. extra_info_fields = qa.extra_info.keys()
  32. models_data = {}
  33. for session in sessions:
  34. eval_answers = EvalAnswer.objects.filter(eval_session=session).order_by('question__id')
  35. data = {}
  36. for eval_answer in eval_answers:
  37. data[eval_answer.question.id] = 1 if eval_answer.is_correct else 0
  38. models_data[f"{session.llm_model.name} [{session.name}]"] = data
  39. writer = csv.writer(response)
  40. writer.writerow(['Question ID'] + ['Question Text'] +
  41. [x for x in extra_info_fields] +
  42. [model_name for model_name in models_data.keys()])
  43. for question_id in models_data[list(models_data.keys())[0]].keys():
  44. if questions[question_id].xid:
  45. qid = questions[question_id].xid
  46. else:
  47. qid = question_id
  48. row = [qid] + [questions[question_id].question] +\
  49. [questions[question_id].extra_info.get(field, '') for field in extra_info_fields] +\
  50. [data.get(question_id, '') for data in models_data.values()]
  51. writer.writerow(row)
  52. row = ['Accuracy'] + [''] + ['' for _ in extra_info_fields] + [f"{sum(data.values()) / len(data) * 100:.2f}%" for data in models_data.values()]
  53. writer.writerow(row)
  54. response['Content-Disposition'] = f'attachment; filename="{config.name}.csv"'
  55. return response