본문 바로가기
AI SCHOOL/TIL

[DAY 88] 파이널프로젝트 3일차 - KR-SBERT, OpenAI

2023. 5. 1.

파이널 프로젝트 3일차 허깅페이스의 모델을 사용하여 재료를 임베딩했다.

코사인 유사도 기반 추천을 구현했으며 OpenAI API를 사용하기 시작했다.

추천시스템 구현

서울대학교 컴퓨터언어학 연구실에서 개발한 KR-SBERT 모델을 이용하여 한글로 되어 있는 요리 재료를 임베딩했다.

model = SentenceTransformer('snunlp/KR-SBERT-V40K-klueNLI-augSTS')
df['embeddings'] = df['재료'].progress_apply(lambda x : model.encode(x))
df.head(2)

모델 문서 : https://huggingface.co/snunlp/KR-SBERT-V40K-klueNLI-augSTS

embedding

재료가 임베딩 된 값인 embeddings 컬럼 생성

def get_query_sim_top_k(query, model, df):
    """query와 embedding 값의 코사인 유사도 top5"""
    query_encode = model.encode(query)
    cos_scores = util.pytorch_cos_sim(query_encode, df['embeddings'])[0]
    top_results = torch.topk(cos_scores, k=5)
    return top_results

재료들을 쿼리로 입력하면 그것을 인코딩하고 embeddings 값과 비교하여 top 5 코사인 유사도를 얻는 함수를 작성했다.

query = '달걀 오이'
top_result = get_query_sim_top_k(query, model, df)
df.iloc[top_result[1].numpy(), :][['요리', '종류', '재료']]

달걀, 오이와 관련된 요리가 추천되는지 확인해 보자.

cucum

추천이 잘 된 것을 확인할 수 있다.

OpenAI API 사용

def get_chatgpt_msg(msg):
    completion = openai.ChatCompletion.create(
                    model='gpt-3.5-turbo',
                    messages=msg
                    )
    return completion['choices'][0]['message']['content']

GPT3.5 모델에 메시지를 전송하고 응답을 받는 함수 구현.

추천인지, 설명인지, 의도 파악인지에 따라 필요한 prompt도 설정했다.
코드 구현은 여기서 도움을 많이 받았다. https://github.com/lsjsj92/recommender_system_with_Python

query = "달걀, 대파, 마늘이 있는데 요리 추천해줘"
user_interact(query, model, copy.deepcopy(msg_prompt))

최종적으로 쿼리를 지정하고 결과를 확인해본다.

recom

사용자의 의도가 recommended로 파악되었고 그에 따른 응답을 받았으며 요리가 잘 추천되었다.

반응형

댓글