✅ 개요
생성형 AI는 하루에 하나씩 각 카테고리별로 질문을 생성한다. 하지만 매일 비슷한 질문만 노출되면 서비스의 매력도가 떨어질 것이다. 따라서 생성된 질문에 대해 중복성을 검증해주는 부분이 필요하다.
✅ 텍스트 임베딩 모델
질문의 중복을 검증할 때, 단순히 단어의 중복만을 고려한다면 중복을 완전히 판별하기 어려울 것이다.
따라서 단어 자체를 넘어 문장의 의미까지 판단해줄 수 있는 솔루션이 필요하다.
이를 위해 텍스트 임베딩 모델을 고려했다.
텍스트 임베딩 모델이란, 텍스트를 특정 차원의 벡터로 변환해주는 모델을 말한다.
해당 벡터는 단순히 단어 간의 유사성 뿐만 아니라 문장의 맥락, 구조, 의미를 통합적으로 반영한다.
✅ 텍스트 임베딩 모델 선정
💡 API 형식으로만 고려
시중에는 수많은 텍스트 임베딩 모델이 존재한다. 이 모델들을 사용하려면 모델을 동작시키는 환경을 내가 직접 구축하는 방법과 해당 기업에서 제공하는 API를 활용하는 방법이 있는데
현재 프로젝트 상황상 자체적으로 AI 전용 서버를 구축하기엔 비용문제와 복잡성 때문에 어려울 것이라 판단했고 API를 활용하기로 했다.
🤖 선정 모델
- Open AI - https://platform.openai.com/docs/guides/embeddings
- 다국어 최적화가 되어 있음
- Naver Clova - https://api.ncloud-docs.com/docs/clovastudio-embedding
- 한국어로 학습 시킨 모델
- Spring AI 정식 지원 X - 코드의 유지보수성 ⬇️
- 공공 인공지능 오픈 API DATA 서비스 포털 - 문장 패러프레이즈 인식기술 API - https://aiopen.etri.re.kr/demo/ParaphraseQA
- 모델의 학습 데이터가 한국어 기반으로 되어 있음
- 문장 유사도를 측정해주는 API 자체를 제공하는 것이라 세부적인 튜닝은 어려움
- 무료 - 하루 5000건 제한.
Open AI 선정 이유
1. 기존의 질문생성을 GPT 4o-mini로 하고 있었기 때문에 비용을 한번에 처리하기 편리함
2. 다른 대안의 경우 Spring AI를 지원하지 않기 때문에 코드의 유지보수성이 많이 떨어질 것이라고 판단함
✅ Open AI 임베딩 모델 테스트
🤖 대상 모델
- text-embedding-3-small
- 가성비가 매우 뛰어남
- 1536차원
- 100만 토큰 당 0.02달러 (28원)(토큰 당 0.000028원)
- text-embedding-3-large
- 성능이 뛰어남
- 3072차원
- 100만 토큰 당 0.13달러 (182원) (토큰 당 0.000182원)
🧫 테스트 방식
- 파이썬 코드 활용
import openai
import numpy as np
# OpenAI API 키 설정
openai.api_key = "":
# 문장을 임베딩으로 변환하는 함수
def get_embedding(text, model="text-embedding-3-large"):
response = openai.Embedding.create(
input=text,
model=model,
encoding_format="float"
)
return response['data'][0]['embedding']
# 코사인 유사도 계산 함수
def cosine_similarity(vec1, vec2):
vec1 = np.array(vec1)
vec2 = np.array(vec2)
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
return dot_product / (norm_vec1 * norm_vec2)
- 두 문장을 벡터로 임베딩 한다
- 두 벡터의 코사인 유사도를 측정한다.
1️⃣ 동일하거나 유사한 의미
- 문장 1: "서울의 날씨는 오늘 맑습니다."
- 문장 2: "서울은 오늘 화창한 날씨를 보이고 있습니다."
- 기대 결과: 높은 유사도
- 결과:
- text-embedding-3-small: 0.7218
- text-embedding-3-large: 0.8465
2️⃣ 의미가 다른 문장
- 문장 1: "서울의 날씨는 오늘 맑습니다."
- 문장 2: "어제 부산에서는 비가 많이 내렸습니다."
- 기대 결과: 낮은 유사도
- 결과:
- text-embedding-3-small: 0.4071
- text-embedding-3-large: 0.2892
3️⃣ 같은 단어를 포함하지만 다른 의미
- 문장 1: "오늘의 축구 경기 점수는 3대 2였습니다."
- 문장 2: "오늘 점심으로 축구장에서 치킨을 먹었습니다."
- 기대 결과: 낮은 유사도
- 결과:
- text-embedding-3-small: 0.5107
- text-embedding-3-large: 0.4089
4️⃣ 문맥적으로 같은 개념
- 문장 1: "달리기는 건강에 좋다."
- 문장 2: "운동은 몸에 유익하다."
- 기대 결과: 높은 유사도
- 결과:
- text-embedding-3-small: 0.3166
- text-embedding-3-large: 0.6425
5️⃣ 완전히 무관한 문장
- 문장 1: "오늘은 날씨가 매우 덥습니다."
- 문장 2: "고양이는 귀엽다."
- 기대 결과: 매우 낮은 유사도
- 결과:
- text-embedding-3-small: 0.2385
- text-embedding-3-large: 0.2326
📄 유사도 정리
모델 \ 상황 | 1. 동일하거나 유사한 의미 | 2. 의미가 다른 문장 | 3. 같은 단어를 포함하지만 다른 의미 | 4. 문맥적으로 같은 개념 | 5. 완전히 무관한 문장 |
text-embedding-3-small | 0.7218 | 0.4071 | 0.5107 | 0.3166 | 0.2385 |
text-embedding-3-large | 0.8465 | 0.2892 | 0.4089 | 0.6425 | 0.2326 |
- 전체적으로 text-embedding-3-large가 매우 우수한 결과를 보여줌
- 특히 문맥을 파악하는 데 있어 두 배 이상의 차이를 보이고 있어 질문의 문맥을 중요하게 파악해야하는 서비스 특성 상 text-embedding-3-large가 적합하다고 생각함
💰 비용 비교
다음의 문장은 AI가 생성한 일반적인 질문이다.
최근에 넷플릭스나 극장에서 본 영화 중에 '인생 영화' 등극한 작품 있나요? 폭풍 공감할 스토리나 영상미가 뛰어난 영화 추천 부탁해요!
이 문장은 84개의 토큰으로 계산되어진다.
[질문 1개당 84개의 토큰을 사용한다고 가정하고 계산 시]
모델 | 가격(원) |
text-embedding-3-small | 0.002352원 |
text-embedding-3-large | 0.015288원 |
- text-embedding-3-large이 대략 7배 정도 비싸긴하지만 이 가격도 부담이 가는 가격이 아니기 때문에 text-embedding-3-large를 선정해도 크게 무리는 없을것으로 판단
🔬 모델 선정 결과
text-embedding-3-large
small모델에 비해 성능이 매우 뛰어나고 비용도 그렇게 부담이 가는 가격이 아니기 때문에 선정하게되었다.
'데브코스 > 실습 & 프로젝트' 카테고리의 다른 글
[최종 프로젝트] 질문 생성 기능 - 4. 질문 생성 로직 구현하기 (0) | 2024.12.30 |
---|---|
[최종 프로젝트] 질문 생성 기능 - 3. 질문의 벡터를 저장하기 위한 Redis Vector Database & Vector Search (Spring AI) (0) | 2024.12.30 |
[최종 프로젝트] 질문 생성 기능 - 1. 질문 생성을 위한 생성형 AI 모델 조사 (2) | 2024.12.28 |
[최종 프로젝트] Jira 도입기 ( + 회고) (2) | 2024.12.27 |
[2-3차 프로젝트] Prometheus 도입 (5) | 2024.11.05 |