background image

 

 

42 

 

def get_unasked_question(user_id, knowledge_topic): 
    answered_questions =get_answered_questions(user_id, knowledge_topic) 

    answered_texts  =  [f"Question:  {question}  Answer:  {answer}"  for  question,  answer  in 
answered_questions] 
    user_age = get_last_user_age() 

    llm_prompt = (f"Generate a unique question and answer related to {knowledge_topic} suitable 
for age {user_age}. " 
                  f"Ensure that the generated question and answer do not repeat the following: 
{', '.join(answered_texts)} " 

                  f"Provide  the  question  starting  with  'question:'  and  the  correct  answer 
starting with 'answer:'.") 
    try: 
        llm_run = ['ollama', 'run', 'llama3:latest', llm_prompt] 

        output = subprocess.check_output(llm_run, encoding='utf-8', stdin=subprocess.DEVNULL) 
        print("Output is", output) 
  #set the position of what is printed as answer and question without extra information 
        question_start_index = output.lower().find('question:') 

        answer_start_index = output.lower().find('answer:') 
        if question_start_index != -1 and answer_start_index != -1: 
            question=output[question_start_index+len('question:'):answer_start_index].strip() 

            answer = output[answer_start_index + len('answer:'):].strip() 
            if (question, answer) not in answered_questions: 
                print(f"Generated New Question: {question}") 
                print(f"Generated New Answer: {answer}") 

                return question, answer 
        return None, None 
    except subprocess.CalledProcessError as e: 
        print("Error generating new question:", e) 

        return None, None 

 

Έλεγχος Σημασιολογικής Ομοιότητας Απαντήσεων 

Η αναγνώριση σωστής απάντησης πλέον δεν περιορίζεται στην αυστηρά πανομοιότυπη 

διατύπωση της ήδη αποθηκευμένης. Το LLM ελέγχει τη σημασιολογική ομοιότητα μεταξύ της 

απάντησης που έδωσε ο χρήστης και αυτής που αποθηκεύτηκε ως ορθή στη βάση δεδομένων. 

Αυτή η διαδικασία αποδείχθηκε αναγκαία, καθώς η μοναδική απάντηση που θεωρούταν ορθή 

ήταν η κατά γράμμα απόδοση αυτής που αποθηκεύτηκε στη βάση, συμπεριλαμβανομένων των 

σημείων στίξης. Πλέον σωστή απάντηση μπορεί να θεωρηθεί, οποιαδήποτε απάντηση έχει την 

ίδια σημασία και το ίδιο νόημα με την αποθηκευμένη. 

def check_meaning_with_llm(user_answer, correct_answer, user_id): 
    global no_more_questions 

    llm_prompt  =  (f"Determine  if  the  following  user  answer  is  semantically  equivalent  to  the 
correct answer. " 
                  f"User Answer: '{user_answer}' " 
                  f"Correct Answer: '{correct_answer}' " 

                  f"Answer with 'Yes' or 'No' and provide an explanation if needed. " 
                  f"Note:  Both  answers  should  be  considered  correct  if  they  convey  the  same 
meaning even if the formatting is different.") 
    try: 

        llm_run = ['ollama', 'run', 'llama3:latest', llm_prompt] 
        output = subprocess.check_output(llm_run, encoding='utf-8', stdin=subprocess.DEVNULL)