kyle8581's picture
.
594e237
import json
import logging
# ๋กœ๊น… ์„ค์ •
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def generate_question_recommendation(client, prompts, job_title, company_name, experience_level):
"""
๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
Args:
client: OpenAI ํด๋ผ์ด์–ธํŠธ
prompts: ํ”„๋กฌํ”„ํŠธ ๋”•์…”๋„ˆ๋ฆฌ
job_title: ์ง๋ฌด๋ช…
company_name: ํšŒ์‚ฌ๋ช…
experience_level: ๊ฒฝ๋ ฅ ์ˆ˜์ค€
Returns:
str: LLM ์‘๋‹ต ๊ฒฐ๊ณผ
"""
try:
# ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ํฌ๋งทํŒ…
user_prompt = prompts['user_prompt'].format(
job_title=job_title,
company_name=company_name,
experience_level=experience_level
)
logger.info(f"๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ ์š”์ฒญ - ์ง๋ฌด: {job_title}, ํšŒ์‚ฌ: {company_name}, ๊ฒฝ๋ ฅ: {experience_level}")
# OpenAI Responses API ํ˜ธ์ถœ (์›น ๊ฒ€์ƒ‰ ํ™œ์„ฑํ™”)
response = client.responses.create(
model="gpt-4o-mini",
tools=[{
"type": "web_search_preview",
"search_context_size": "high",
}],
input=f"{prompts['system_prompt']}\n\n{user_prompt}"
)
print(response)
result = response.output_text
logger.info("๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ ์ƒ์„ฑ ์™„๋ฃŒ")
return result
except Exception as e:
logger.error(f"๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
raise e
def parse_question_recommendation(response_text):
"""
LLM ์‘๋‹ต์—์„œ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ํ•จ์ˆ˜
Args:
response_text: LLM ์‘๋‹ต ํ…์ŠคํŠธ
Returns:
dict: ํŒŒ์‹ฑ๋œ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ ๊ฒฐ๊ณผ
"""
try:
# JSON ํ˜•ํƒœ๋กœ ํŒŒ์‹ฑ ์‹œ๋„
if response_text.strip().startswith('{') and response_text.strip().endswith('}'):
parsed_result = json.loads(response_text)
logger.info("JSON ํ˜•ํƒœ๋กœ ํŒŒ์‹ฑ ์„ฑ๊ณต")
return parsed_result
# JSON ๋ธ”๋ก ์ถ”์ถœ ์‹œ๋„
if '```json' in response_text:
start_idx = response_text.find('```json') + 7
end_idx = response_text.find('```', start_idx)
json_content = response_text[start_idx:end_idx].strip()
parsed_result = json.loads(json_content)
logger.info("JSON ๋ธ”๋ก์—์„œ ํŒŒ์‹ฑ ์„ฑ๊ณต")
return parsed_result
# ์ค‘๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ JSON ์ถ”์ถœ ์‹œ๋„
start_idx = response_text.find('{')
end_idx = response_text.rfind('}') + 1
if start_idx != -1 and end_idx != 0:
json_content = response_text[start_idx:end_idx]
parsed_result = json.loads(json_content)
logger.info("์ค‘๊ด„ํ˜ธ JSON์—์„œ ํŒŒ์‹ฑ ์„ฑ๊ณต")
return parsed_result
# JSON ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ ํ…์ŠคํŠธ์—์„œ ์งˆ๋ฌธ ์ถ”์ถœ
logger.warning("JSON ํŒŒ์‹ฑ ์‹คํŒจ, ํ…์ŠคํŠธ์—์„œ ์งˆ๋ฌธ ์ถ”์ถœ ์‹œ๋„")
# ๋”ฐ์˜ดํ‘œ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์งˆ๋ฌธ ์ฐพ๊ธฐ
lines = response_text.split('\n')
for line in lines:
line = line.strip()
if line and not line.startswith('#') and not line.startswith('-'):
# ๋”ฐ์˜ดํ‘œ ์ œ๊ฑฐ
question = line.strip('"').strip("'").strip()
if len(question) > 10: # ์ตœ์†Œ ๊ธธ์ด ์ฒดํฌ
return {"recommended_question": question}
# ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ ์งˆ๋ฌธ์œผ๋กœ ์‚ฌ์šฉ (์ตœํ›„์˜ ์ˆ˜๋‹จ)
clean_text = response_text.strip().strip('"').strip("'")
if len(clean_text) > 10:
return {"recommended_question": clean_text}
logger.error("๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ถœ ์‹คํŒจ")
return {"recommended_question": "์งˆ๋ฌธ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."}
except json.JSONDecodeError as e:
logger.error(f"JSON ํŒŒ์‹ฑ ์˜ค๋ฅ˜: {str(e)}")
# JSON ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ ํ…์ŠคํŠธ์—์„œ ์ง์ ‘ ์ถ”์ถœ
clean_text = response_text.strip().strip('"').strip("'")
return {"recommended_question": clean_text if clean_text else "์งˆ๋ฌธ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."}
except Exception as e:
logger.error(f"๋ฉด์ ‘ ์งˆ๋ฌธ ํŒŒ์‹ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}")
return {"recommended_question": "์งˆ๋ฌธ ํŒŒ์‹ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."}