Calculate Grading Summary Logic
This commit is contained in:
88
grading_summary/grading_summary.py
Normal file
88
grading_summary/grading_summary.py
Normal file
@@ -0,0 +1,88 @@
|
||||
import json
|
||||
|
||||
import openai
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
openai.api_key = os.getenv("OPENAI_API_KEY")
|
||||
|
||||
chat_config = {'max_tokens': 1000, 'temperature': 0.2}
|
||||
section_keys = ['reading', 'listening', 'writing', 'speaking', 'level']
|
||||
grade_top_limit = 9
|
||||
|
||||
tools = [{
|
||||
"type": "function",
|
||||
"function": {
|
||||
"name": "save_evaluation_and_suggestions",
|
||||
"description": "Saves the evaluation and suggestions requested by input.",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"evaluation": {
|
||||
"type": "string",
|
||||
"description": "A comment on the IELTS section grade obtained in the specific section and what it could mean without suggestions.",
|
||||
},
|
||||
"suggestions": {
|
||||
"type": "string",
|
||||
"description": "A small paragraph text with suggestions on how to possibly get a better grade than the one obtained.",
|
||||
},
|
||||
},
|
||||
"required": ["evaluation", "suggestions"],
|
||||
},
|
||||
}
|
||||
}]
|
||||
|
||||
|
||||
def calculate_grading_summary(body):
|
||||
extracted_sections = extract_existing_sections_from_body(body, section_keys)
|
||||
|
||||
ret = []
|
||||
|
||||
for section in extracted_sections:
|
||||
openai_response_dict = calculate_section_grade_summary(section)
|
||||
ret = ret + [{'code': section['code'], 'name': section['name'], 'grade': section['grade'],
|
||||
'evaluation': openai_response_dict['evaluation'],
|
||||
'suggestions': openai_response_dict['suggestions']}]
|
||||
|
||||
return {'sections': ret}
|
||||
|
||||
|
||||
def calculate_section_grade_summary(section):
|
||||
res = openai.ChatCompletion.create(
|
||||
model="gpt-3.5-turbo",
|
||||
max_tokens=chat_config['max_tokens'],
|
||||
temperature=chat_config['temperature'],
|
||||
tools=tools,
|
||||
messages=[
|
||||
{
|
||||
"role": "user",
|
||||
"content": "You are a IELTS test section grade evaluator. You will receive a IELTS test section name and the grade obtained in the section. You should offer a comment on this grade with also suggestions on how to possibly get a better grade.",
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": "Section: " + str(section['name']) + " Grade: " + str(section['grade']),
|
||||
},
|
||||
{"role": "user", "content": "Speak in third person."},
|
||||
{"role": "user", "content": "Please save the evaluation and suggestions generated."}
|
||||
])
|
||||
|
||||
return parse_openai_response(res)
|
||||
|
||||
|
||||
def parse_openai_response(response):
|
||||
if 'choices' in response and len(response['choices']) > 0 and 'message' in response['choices'][
|
||||
0] and 'tool_calls' in response['choices'][0]['message'] and isinstance(
|
||||
response['choices'][0]['message']['tool_calls'], list) and len(
|
||||
response['choices'][0]['message']['tool_calls']) > 0 and \
|
||||
response['choices'][0]['message']['tool_calls'][0]['function']['arguments']:
|
||||
return json.loads(response['choices'][0]['message']['tool_calls'][0]['function']['arguments'])
|
||||
else:
|
||||
return {'evaluation': "", 'suggestions': ""}
|
||||
|
||||
|
||||
def extract_existing_sections_from_body(my_dict, keys_to_extract):
|
||||
if 'sections' in my_dict and isinstance(my_dict['sections'], list) and len(my_dict['sections']) > 0:
|
||||
return list(filter(
|
||||
lambda item: 'code' in item and item['code'] in keys_to_extract and 'grade' in item and 'name' in item,
|
||||
my_dict['sections']))
|
||||
Reference in New Issue
Block a user