jhhackaton/backend/openai_parser.py

73 lines
2.8 KiB
Python

import os
import json
from openai import OpenAI
from dotenv import load_dotenv
from models import ParsedRealEstate
load_dotenv()
class OpenAIParser:
"""OpenAI를 이용한 부동산 정보 파싱"""
def __init__(self):
api_key = os.getenv("OPENAI_API_KEY")
if not api_key or api_key == "your-api-key-here":
raise ValueError("OpenAI API key not configured in .env file")
self.client = OpenAI(api_key=api_key)
async def parse_real_estate_query(self, text: str) -> ParsedRealEstate:
"""자연어 텍스트에서 부동산 정보 추출"""
system_prompt = """
당신은 부동산 정보를 추출하는 전문가입니다.
사용자의 자연어 입력에서 다음 정보를 추출하세요:
1. price: 가격 (전세금, 월세, 매매가 등)
2. location: 위치 (지역명, 동, 구 등)
3. area: 면적 (평수, 제곱미터 등)
4. rooms: 방 개수 (숫자만)
5. transaction_type: 거래 유형 (전세, 월세, 매매)
6. property_type: 매물 형태 (아파트, 오피스텔, 주택, 빌라, 원룸, 투룸, 쓰리룸, 단독주택, 다가구주택, 연립주택, 상가주택 등)
JSON 형식으로만 응답하세요.
정보가 없는 항목은 null로 표시하세요.
rooms는 숫자(integer)로만 표현하세요.
"""
try:
response = self.client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": text}
],
temperature=0.1,
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
return ParsedRealEstate(
price=result.get("price"),
location=result.get("location"),
area=result.get("area"),
rooms=result.get("rooms"),
transaction_type=result.get("transaction_type"),
property_type=result.get("property_type"),
region_code=None, # 메인 서버에서 변환
region_name=None, # 메인 서버에서 변환
raw_text=text
)
except Exception as e:
# 에러 발생 시 기본값 반환
return ParsedRealEstate(
raw_text=text,
price=None,
location=None,
area=None,
rooms=None,
transaction_type=None,
property_type=None,
region_code=None,
region_name=None
)