파이널 프로젝트 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
재료가 임베딩 된 값인 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(), :][['요리', '종류', '재료']]
달걀, 오이와 관련된 요리가 추천되는지 확인해 보자.
추천이 잘 된 것을 확인할 수 있다.
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))
최종적으로 쿼리를 지정하고 결과를 확인해본다.
사용자의 의도가 recommended로 파악되었고 그에 따른 응답을 받았으며 요리가 잘 추천되었다.
반응형
'AI SCHOOL > TIL' 카테고리의 다른 글
[DAY 90] 파이널프로젝트 5일차 - 프로토타입 (0) | 2023.05.03 |
---|---|
[DAY 89] 파이널프로젝트 4일차 - 중간 제출 (0) | 2023.05.03 |
[DAY 87] 파이널프로젝트 2일차 - 데이터 전처리 (0) | 2023.04.28 |
[DAY 86] 파이널프로젝트 시작 - 데이터 수집 (0) | 2023.04.27 |
[DAY 85] AI School 8기 마지막 강의 Github, Streamlit (0) | 2023.04.26 |
댓글