
들어가며 RAG 프로세스를 구상하던 중이었습니다. 사용자가 작성한 질문에서 A'라고 물어봤는데, 이거를 A로 단어를 바꾸어서 검색할 수 없나? A는 미리 정해놓은 범위 내에서 찾게 하고 싶은데 어떻게 바꿀 수 있을까..? 문제 상황은, 서비스 사용자들이 A를 A' 또는 A''라고 쓰기도 하고, AB라고 작성하기도 한다는 것입니다. 실제로 검색 대상인 문서에는 A라고 명확하게 정의된 데 반해, 사용자들은 각자 편하게 부르고 싶은 대로 작성하기도 하고 오타로 인해 잘못 작성하기도 한다는 것이죠. 사용자마다 가지각색으로 작성된 단어들을 표준화된 단어로 변경해주기 위해서는 사전 검색이 필요했습니다. 다만 사용자들이 어떤 식으로 작성할지를 구상해서 미리 모아두는 것이 실제로는 어렵죠. 때문에 어떤 단어가 ..

들어가며 최근 RAG 성능을 개선해야 하는 실험을 진행했습니다. 도메인 지식과 무관하게 빠르게 적용할 수 있는 기술을 알아보다 rerank를 알게 되었는데요. rerank는 말그대로 검색 결과를 다시(re-) 재정렬하는 사상을 갖고 있습니다. 질문과 답변 쌍을 갖고 있고 rerank를 위한 모델만 있으면 쉽고 빠르게 적용할 수 있어 바로 채택해 실험해보았습니다. 본 포스트에서는 rerank에 대해 간단하게 알아보겠습니다! [사전지식] LLM, RAG, Retrieval, Rank Rerank 도입 배경 사용자가 문장을 작성해 검색을 한다고 할 때 이 문장을 "질의(query)"라고 합니다. 검색 프로세스는 질의와 사전에 등록된 데이터를 비교하여 가장 유사한 데이터를 제공합니다. 질의와 데이터(문서, ..

들어가며 파이썬으로 운영을 위한 프로그램을 만들었습니다. 프로그램을 동작시키던 도중 예기치 못한 오류가 발생하여 재실행이 필요한 때는 언제든 발생할 수 있죠. 실제 운영 프로그램을 설계하면 API라던지 DB라던지 파이썬의 메인 프로그램과 다른 여러 환경들이 얽혀있다는 점을 잘 아실 겁니다. 이렇게 파이썬 밖에 있는 환경이 얽혀있을 때는 특히 통신 오류가 발생할 수 있는데요. 정확한 원인을 알 수 없는 오류가 발생하여 잠시 대기한 후에 재실행을 하면 다시 잘 되는 경우도 있죠. 이런 경우를 대비하기 위해 Tenacity 라이브러리를 적용하여 쉽게 코드를 재실행 할 수 있습니다. Tenacity 사용하기 Tenacity는 예외가 발생하는 경우에 다시 함수를 실행시켜서 사용자가 원하는 결과를 받고 안정적으로 ..

최근 새로운 자연어 처리라는 새로운 태스크를 접하게 되었습니다. 자연어 처리 과제 중에서도 텍스트에 내포된 감성에 대해 분석하는 과제인 "감성 분석(Sentiment Analysis)"과 "ABSA(Aspect-Based Sentiment Analysis)"에 대해 알아보았고, 간단하게 개념을 정리하기 위해 포스트로 남깁니다. 감성분석 ABSA에 대해 이해하기 위해서는 감성 분석에 대해 먼저 알아야겠습니다. 감성 분석이란, "텍스트에서 감정을 파악하는 자연어 처리(NLP, Natural Language Processing) 과제"입니다. 여기서 얘기하는 "텍스트"는 사람의 의견이 담긴 소비자 리뷰, 설문조사 응답, 채팅 등이 될 수 있습니다. 그 의견이 긍정적인지 부정적인지 혹은 중립적인지를 판단하는 것..

들어가며 분석 과제를 하던 도중 범주형 변수를 숫자로 인코딩하기 위해 LabelEncoder가 필요하겠다 싶었습니다. 사용법을 확인하기 위해 사이킷런 공식문서를 살펴봤는데.. LabelEncoder는 타겟 변수 y를 하기 위해 사용하라고 써있더군요. label이 붙는 범주형 변수면 으레 사용 가능하다고 생각했었는데, 제가 오해를 하고 있었습니다. 공식문서를 다시금 잘 살펴보자는 교훈을 얻었네요. 이번 포스트는 LabelEncoder 와 OrdinalEncoder를 각각 소개하고 비교하고자 합니다. 두 인코더 모두 범주형 변수를 숫자로 인코딩하기 위해 쓰이는데요, LabelEncoder는 위에서 언급한 바와 같이 범주형 타겟 변수를, OrdinalEncoder는 범주형 입력 변수를 대상으로 합니다. 각각의..

들어가며 오랜만에 파이썬을 사용하다가 유용해보이는 기능을 발견하여 공유하고자 합니다. 바로 pandas의 style 기능입니다. 데이터 분석을 하면 데이터프레임에 찍힌 숫자나 문자와 같은 값들을 보면서 무엇이 제일 크고 작은지, 관심있게 보려는 값이 어디있는지 찾아야하는 일이 생기죠. 이때 내가 원하는 값들이 쉽게 눈에 띄지 않은 경험을 한 번쯤은 해보셨을 것 같습니다. 행, 열이 많아지면 주의 깊게 봐야하는 값이 어디에 있는지 더욱 찾기 어려워지기도 하죠. 이런 일들을 해결하기 위해 데꾸, 데이터프레임 꾸미기를 활용할 수 있습니다. 판다스의 공식 문서를 보며 유용할 것 같은 일부 함수들을 가져와 소개 드립니다. 비어있는 값, nan 강조하기 import numpy as np import pandas a..

annoy: Approximate Nearest Neighbors annoy는 스포티파이에서 개발한 라이브러리로, 벡터들 간의 거리를 계산하여 빠르게 유사한 벡터들을 찾아주는 라이브러리이다. Approximate Nearest Neighbors Oh Yeah의 줄임말로, 직역하자면 근사한 이웃 찾기 아싸? 만세(?) 정도가 될 것 같다. 이름에서부터 느끼다 시피 annoy는 최근접 이웃 알고리즘을 사용한다. annoy를 추천시스템에 적용하기 위해 최근접 이웃을 찾아야하는 경우를 생각해보자. 1. 사용자의 로그가 없을 때: 일반적인 프로필 내용(성별, 나이, 지역 등)을 이용해 사용자와 유사한 특성을 가진 다른 유저들 찾기 → 다른 유저들이 선호했던 아이템들을 사용자에게 추천 2. 사용자의 로그가 쌓인 후..

최근 좌표를 포함하는 데이터를 전처리하면서 geopandas라는 라이브러리를 접하게 되어, 사용방법을 간단하게 포스팅하고자 한다. GeoPandas https://geopandas.org/en/stable/ GeoPandas 0.12.0 — GeoPandas 0.12.0+0.g31f8e6a.dirty documentation GeoPandas 0.12.0 GeoPandas is an open source project to make working with geospatial data in python easier. GeoPandas extends the datatypes used by pandas to allow spatial operations on geometric types. Geometric op..

판다스로 데이터프레임을 사용하면서 새로운 컬럼을 만들어야할 상황이 생겼다. 예를 들어 기존 값이 '1'이면 '01'로 대체하는 식의 작업이 필요했다. 이미 알고 있던 지식을 총동원하여 map을 적용하면 값을 변경된 새로운 컬럼을 만들 수 있을 것이라 판단했다. 그리고 실패했다.. 이유를 알아보았다. import pandas as pd df = pd.DataFrame({'a': ['x', 'y', 'z']}) df 예시로 사용할 데이터 프레임으로, a 컬럼에는 x, y, z 값이 들어있다. 이 값들을 딕셔너리를 이용해 맵핑하여 새로운 값으로 전환하려고 했다. x는 xx로, y는 yy로, w는 ww로 전환하고, 만약 딕셔너리에 기존 값이 키로 존재하지 않으면, 값을 그대로 보존하기를 바랬다. df['a_ma..

지난 포스트 pycaret 패키지를 이용한 분류모델 학습 (1) 에서는 머신러닝 학습을 위해 환경을 세팅하고, 평가지표를 추가하고, 다양한 모델을 학습하여 비교하는 실습을 했습니다. 이어서 본 포스트에서는 개별 모델 생성, 모델 튜닝, 모델을 이용해 예측하기, 모델 완성하고(finalize) 저장하기를 진행하겠습니다. 1) create_model 머신러닝 모델을 학습하고 Cross Validation을 이용해 검증을 진행하는 함수입니다. 분석가가 학습하고자 하는 알고리즘을 직접 지정하는데, 알고리즘에 적용하고 싶은 하이퍼파라미터도 직접 설정할 수 있습니다. 머신러닝 분석에 대한 방향성이 없을 때는 일단 적용할 수 있는 알고리즘들을 모두 적용해보는 compare_models 함수를 사용할 수 있겠습니다만,..