:)
[RAG] Building Multimodal Search and RAG 본문
Overview of Multimodality
1. Understanding Contrastive Learning
- Text Encoder:
- 텍스트 데이터를 입력받아 텍스트 임베딩으로 변환.
- "Pepper the aussie pup"과 같은 텍스트 입력 → 각각의 텍스트는 T1, T2, ..., TN과 같은 고차원 벡터로 변환됨.
- Image Encoder:
- 이미지 데이터를 입력받아 이미지 임베딩(벡터 표현)으로 변환.
- 입력된 이미지는 I1, I2, ..., IN과 같은 고차원 벡터로 변환됨.
- 벡터 간 유사도 계산 (Similarity Matrix):
- 텍스트와 이미지의 임베딩 간 유사도를 계산하여 매트릭스 생성.
- I1과 T1은 같은 콘텐츠를 나타내기 때문에 유사도 값이 높아야 하고, I1과 T3은 다른 콘텐츠를 나타내기 때문에 유사도 값이 낮아야 함.
2. Code
1) Neural Network Architecture
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
self.conv1 = nn.Sequential(
nn.Conv2d(1, 32, 5),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Dropout(0.3)
)
self.conv2 = nn.Sequential(
nn.Conv2d(32, 64, 5),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Dropout(0.3)
)
self.linear1 = nn.Sequential(
nn.Linear(64 * 4 * 4, 512),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(512, 64),
)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = x.view(x.size(0), -1)
x = self.linear1(x)
return x
- 입력된 MNIST 이미지를 처리하기 위해 합성곱 신경망(CNN) 구조 사용.
- 두 개의 합성곱 계층으로 이미지의 특징을 추출하고, 완전 연결 계층(fully connected layers)으로 64차원 표현 벡터로 변환 → 데이터 간 유사성을 학습하는 데 사용됨
2) Contrastive Loss
class ContrastiveLoss(nn.Module):
def __init__(self):
super(ContrastiveLoss, self).__init__()
self.similarity = nn.CosineSimilarity(dim=-1)
def forward(self, anchor, contrastive, distance):
score = self.similarity(anchor, contrastive)
return nn.MSELoss()(score, distance)
- 유사도 측정: 앵커 이미지와 비교 대상 이미지 간의 코사인 유사도를 계산
- 손실 계산: 코사인 유사도와 실제 거리 간의 차이를 평균 제곱 오차(MSE)로 계산
Multimodal Search
1. Code
1) Retrieve content from the database
def retrieve_image(query):
resources = client.collections.get("Resources")
response = resources.query.near_text(
query=query,
filters=Filter.by_property("mediaType").equal("image"), # 이미지 데이터만 반환
return_properties=["path"],
limit=1, # 가장 관련성 높은 이미지 1개 반환
)
result = response.objects[0].properties
return result["path"]
- 데이터베이스에서 사용자가 입력한 쿼리를 기반으로 관련된 이미지를 검색.
- near_text 함수를 사용하여 텍스트 기반 검색을 수행하며, 특정 미디어 타입으로 결과를 필터링.
- 검색 결과 중 가장 적합한 이미지 경로를 반환.
2) Generate a description of the image
def call_LMM(image_path: str, prompt: str) -> str:
img = PIL.Image.open(image_path)
model = genai.GenerativeModel("gemini-1.5-flash")
response = model.generate_content([prompt, img], stream=True) # 이미지 + 프롬프트 입력
response.resolve()
return to_markdown(response.text)
- 검색된 이미지 경로를 입력으로 받아 모델을 사용해 이미지를 상세히 설명하는 텍스트 생성
Large Multimodal Models (LMMs)
Q. LLM은 어떻게 작동하는지?
- Autoregressive
: 모델은 한 번에 한 토큰(단어 또는 글자의 단위)을 생성함 - Future tokens are conditioned only on previously provided tokens
: Future tokens는 이전에 제공되거나 생성된 토큰들에만 의존 - Unsupervised Training
: 주어진 텍스트에서 다음 토큰을 예측하는 방식, 별도의 레이블 없이도 텍스트 데이터의 패턴과 구조 학습 - Probability distribution generated over tokens
: 각 단계에서 가능한 모든 토큰에 대해 확률 분포 계산
Multimodal RAG (MM-RAG)
- Step 1: 데이터 검색 및 입력 처리
- 입력 데이터 유형: 다양한 형태의 멀티모달 데이터를 처리.
- 검색 및 연결:
- 입력된 데이터는 벡터 데이터베이스에 연결되어 유사한 데이터 검색.
- 검색된 데이터를 기반으로 추가 작업을 수행.
- 프롬프트 생성: 검색된 데이터와 쿼리를 결합하여 프롬프트 생성.
- Step 2: LLM 기반 응답 생성
- LLM 처리:
- 생성된 프롬프트는 LLM으로 전달.
- LLM은 입력 데이터를 이해하고 학습된 정보를 활용해 사용자 요청에 대한 응답을 생성.
- 사용자에게 맞춤형 응답으로 제공
- LLM 처리:
Industry Applications
1. Code
call_LMM("invoice.png",
"""Identify items on the invoice, Make sure you output
JSON with quantity, description, unit price and amount."""
)
- 이미지에서 텍스트를 추출한 후 JSON 형식으로 구조화된 데이터 반환
Multimodal Recommender System
1. Search vs Recommendation
-Search: Objective
-Recommendation: Subjective
2. Code
1) Create Multivector collection
client.collections.create(
name="Movies",
properties=[
Property(name="title", data_type=DataType.TEXT),
Property(name="overview", data_type=DataType.TEXT),
Property(name="vote_average", data_type=DataType.NUMBER),
Property(name="release_year", data_type=DataType.INT),
Property(name="tmdb_id", data_type=DataType.INT),
Property(name="poster", data_type=DataType.BLOB),
Property(name="poster_path", data_type=DataType.TEXT),
],
vectorizer_config=[
Configure.NamedVectors.text2vec_openai(
name="txt_vector",
source_properties=["title", "overview"], # 텍스트 기반 검색용 데이터
),
Configure.NamedVectors.multi2vec_palm(
name="poster_vector",
image_fields=["poster"], # 이미지 기반 검색용 데이터
project_id="semi-random-dev",
location="us-central1",
model_id="multimodalembedding@001",
dimensions=1408, # 벡터 크기 설정
),
]
)
2) Text-search
response = movies.query.near_text(
query="Movie about lovable cute pets", # 텍스트 검색 질의
target_vector="txt_vector", # 텍스트 벡터 공간에서 검색
limit=3, # 검색 결과 최대 3개 제한
)
# 검색 결과 확인
for item in response.objects:
print(item.properties["title"])
print(item.properties["overview"])
display(Image(item.properties["poster_path"], width=200))
- 텍스트 질의: "Movie about lovable cute pets"라는 텍스트 입력을 바탕으로 유사한 영화 검색.
- txt_vector 사용: 텍스트 데이터(title, overview)의 의미적 유사성을 기준으로 검색 수행.
- 검색 결과 처리: 영화 제목, 개요, 포스터 이미지 출력.
'Coursera' 카테고리의 다른 글
[DL Specialization] C4W1A2 (1) | 2024.12.28 |
---|---|
[DL Specialization] C4W1A1 (1) | 2024.12.06 |
[DL Specialization] C2W3A1 (1) | 2024.09.17 |
[DL Specialization] C2W2A1 (0) | 2024.09.17 |
[DL Specialization] C2W1A3 (0) | 2024.09.14 |