Spaces:
Sleeping
Sleeping
| # module3.py | |
| import requests | |
| from typing import Optional | |
| import logging | |
| from dotenv import load_dotenv | |
| import os | |
| # Set up logging | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| # .env ํ์ผ ๋ก๋ | |
| load_dotenv() | |
| # Hugging Face API ์ ๋ณด | |
| API_URL = "https://api-inference.huggingface.co/models/meta-llama/Meta-Llama-3-8B-Instruct" | |
| API_KEY = os.getenv("HUGGINGFACE_API_KEY") | |
| if not API_KEY: | |
| raise ValueError("API_KEY๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค. .env ํ์ผ์ ํ์ธํ์ธ์.") | |
| class AnswerVerifier: | |
| def verify_answer(self, question: str, choices: dict) -> Optional[str]: | |
| """์ฃผ์ด์ง ๋ฌธ์ ์ ๋ณด๊ธฐ๋ฅผ ๋ฐํ์ผ๋ก ์ ๋ต์ ๊ฒ์ฆ""" | |
| try: | |
| prompt = self._create_prompt(question, choices) | |
| headers = {"Authorization": f"Bearer {API_KEY}"} | |
| response = requests.post( | |
| API_URL, | |
| headers=headers, | |
| json={"inputs": prompt} | |
| ) | |
| response.raise_for_status() | |
| response_data = response.json() | |
| logger.debug(f"Raw API response: {response_data}") | |
| # API ์๋ต ์ฒ๋ฆฌ | |
| generated_text = "" | |
| if isinstance(response_data, list): | |
| if response_data and isinstance(response_data[0], dict): | |
| generated_text = response_data[0].get('generated_text', '') | |
| else: | |
| generated_text = response_data[0] if response_data else '' | |
| elif isinstance(response_data, dict): | |
| generated_text = response_data.get('generated_text', '') | |
| else: | |
| generated_text = str(response_data) | |
| verified_answer = self._extract_answer(generated_text) | |
| logger.info(f"Verified answer: {verified_answer}") | |
| return verified_answer | |
| except Exception as e: | |
| logger.error(f"Error in verify_answer: {e}") | |
| return None | |
| def _create_prompt(self, question: str, choices: dict) -> str: | |
| """๊ฒ์ฆ์ ์ํ ํ๋กฌํํธ ์์ฑ""" | |
| return f""" | |
| <|begin_of_text|> | |
| <|start_header_id|>system<|end_header_id|> | |
| You are an expert mathematics teacher checking student answers. | |
| Please analyze the following question and select the single best answer. | |
| Output ONLY the letter of the correct answer (A, B, C, or D) without any explanation. | |
| <|eot_id|> | |
| <|start_header_id|>user<|end_header_id|> | |
| Question: {question} | |
| A) {choices['A']} | |
| B) {choices['B']} | |
| C) {choices['C']} | |
| D) {choices['D']} | |
| Select the correct answer letter (A, B, C, or D): | |
| <|eot_id|> | |
| <|start_header_id|>assistant<|end_header_id|> | |
| """.strip() | |
| def _extract_answer(self, response: str) -> Optional[str]: | |
| """์๋ต์์ A, B, C, D ์ค ํ๋๋ฅผ ์ถ์ถ""" | |
| response = response.strip().upper() | |
| valid_answers = {'A', 'B', 'C', 'D'} | |
| # ์๋ต์์ ์ ํจํ ๋ต์ ์ฐพ๊ธฐ | |
| for answer in valid_answers: | |
| if answer in response: | |
| return answer | |
| return None |