본문으로 바로가기
Archive for AI Study
Project

[이미지기반 카페추천 프로젝트] SigLip으로 텍스트 임베딩

SigLip으로 텍스트 임베딩

SigLip으로 텍스트 임베딩

문제

  • SigLip은 64토큰만 임베딩할 수 있음 -> Captioning과 HyDE를 뽑아낼때 최대한 간결하게 뽑아내야됨 -> 따라서 기존의 캡셔닝과 HyDE의 프롬프트를 바꿔서 50자 미만의 단어위주로 출력하도록 바꾸기
  • 50자도 토큰이 130토큰 이상이므로 슬라이딩 윈도우 방식으로 services/loadmodel.py파일 변경 -> 기존에는 64토큰만 임베딩해서, 사실상 HyDE가 의미가 없는 수준이었음.

배경

아파치 라이센스에, 한국어를 잘 이해하는 모델인 siglip을 임베딩 모델로 선정했었는데, mvp를 뽑고나서 치명적인 문제가 발생했다. siglip은 64토큰으로 pretrain된 모델이라, 인풋을 64토큰으로만 사용할 수 있다는것을 모두 놓쳤다는것이다. 이 상황에서 기존의 임베딩으로 들어가던 텍스트는 64토큰으로 truncation되어 들어가고있음을 확인하고, 문제해결에 착수했다.

  • 해결안 1. 모델을 교체한다.
  • 해결안 2. 다른방법을 모색한다..

모델을 교체하기에는 코드로 구현까지 모두 끝난상황이었기 때문에, 모델을 교체하기에는 부담이 컸다. 따라서, 64토큰이라는 한계에 맞추어서 HyDE를 생성할때, 기존에 문장형식으로 길게 출력되던것을, 명사구 형식으로 간결하게 50자 이내로 출력하도록 바꾸었다.

50자로 바꾸어도 130토큰정도이므로, 다른방법이 추가로 필요했다. 따라서 인풋을 그대로 임베딩해서 넣는것이 아니라, stride를 32씩 갖고, 64토큰씩 임베딩을하고, 평균을 내는 sliding Window방식을 사용하기로 결정했다.

해결방안

  • HyDE에서 간결하게 분위기 정보 뽑아내도록 프롬프트 수정하기
            config={
                "system_instruction": (
                    """이 이미지를 보고 아래 지시에 따라 세부적으로 묘사해줘:
                너는 카페 인테리어 및 공간 디자인 전문가야.
                카페의 '공간 분위기'를 묘사해야 해.\n\n
                [작성 가이드]
                1. 문장 형식이 아닌, 콤마(,)로 구분된 '명사구' 나열식으로 작성할 것.
                2. 구체적인 사물 자체가 아니라 감성적인 분위기를 묘사할 것.
                3. '카페', '인테리어'처럼 당연한 단어는 생략하고 구체적인 분위기로 묘사할 것.
                4. 공백 포함 한국어 50자 이내로 작성할 것.

                아래 예시출력을 참고해서 출력해
                예시출력: 창가자리, 자연광, 바다전망, 대형 유리창, 소박한 인테리어, 편안한 의자, 야외 테라스, 감성조명, 일몰뷰
                """
                )

50자 이내로 간결하게 HyDE를 생성하도록 수정했다. 이전에는 문장형식으로 길게 생성했지만, 간결하게 분위기만 나타내도록 문장구형식으로 생성하도록 프롬프트를 수정했다.

  • service/loadmodel.py를 슬라이딩 윈도우 방식으로 벡터를 64토큰씩 구하고 stride를 32로 줘서 나온 HyDE의 벡터를 평균내서 임베딩 구하도록 코드구현

image

결과: 프롬프트 최적화 + 슬라이딩 윈도우 조합으로, 긴 텍스트도 전체 맥락이 검색에 반영됨

이미지기반 카페추천 프로젝트SigLip으로 텍스트 임베딩

Continue exploring

더 읽어보기

모든 글