:)

[RAG] Building Multimodal Search and RAG 본문

Coursera

[RAG] Building Multimodal Search and RAG

andre99 2024. 11. 30. 23:40

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은 입력 데이터를 이해하고 학습된 정보를 활용해 사용자 요청에 대한 응답을 생성.
    • 사용자에게 맞춤형 응답으로 제공

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