File size: 1,944 Bytes
c97d8e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
from promptsplitembed import create_prompt, create_qamodel
from extractjson import extract_json

def compute_cosine_similarity(reference_embeddings: dict, student_embeddings: dict) -> float:
    similarity_results = {}
    for key in reference_embeddings.keys():
        if key not in student_embeddings:
            similarity_results[key] = 0
            continue
        reference_vector = np.array(reference_embeddings[key]).reshape(1, -1)
        student_vector = np.array(student_embeddings[key]).reshape(1, -1)
        if reference_vector.shape[1] != student_vector.shape[1]:
            min_dim = min(reference_vector.shape[1], student_vector.shape[1])
            reference_vector = reference_vector[:, :min_dim]
            student_vector = student_vector[:, :min_dim]
        similarity = cosine_similarity(reference_vector, student_vector)[0][0]
        similarity_results[key] = similarity
    
    total_similarity = sum(similarity_results.values())
    num_questions = len(similarity_results)
    average_similarity = total_similarity / num_questions if num_questions else 0
    
    return average_similarity

def llm_similarity(answers, student_result, llm_score_prompt_template):
    score_prompt = llm_score_prompt_template
    qa_chat_model = create_qamodel(model="gpt-4o-mini", temperature=0)

    score_prompt_template = create_prompt(score_prompt)
    student_score_chain = score_prompt_template | qa_chat_model
    
    student_score = student_score_chain.invoke({"source": answers, "student": student_result })
    llm_score_tokens = student_score.usage_metadata["total_tokens"]
    student_score = dict(extract_json(student_score)[0])
    
    total_score = sum(student_score.values())
    num_questions = len(student_score)
    average_score = total_score / num_questions if num_questions else 0
    
    return average_score, llm_score_tokens