Importe und Datenladen
Wir beginnen mit dem Import einiger praktischer Bibliotheken und Module.
import json
from transformers import CLIPProcessor, CLIPTextModelWithProjection
from torch import load, matmul, argsort
from torch.nn.useful import softmax
Als Nächstes importieren wir Textual content- und Bildblöcke aus Multimodale LLMs Und Multimodale Einbettungen Blogbeiträge. Diese werden in .json-Dateien gespeichert, die als Liste von Wörterbüchern in Python geladen werden können.
# load textual content chunks
with open('knowledge/text_content.json', 'r', encoding='utf-8') as f:
text_content_list = json.load(f)# load photos
with open('knowledge/image_content.json', 'r', encoding='utf-8') as f:
image_content_list = json.load(f)
Obwohl ich den Datenvorbereitungsprozess hier nicht besprechen werde, befindet sich der von mir verwendete Code auf der GitHub-Repo.
Wir laden auch die multimodalen Einbettungen (von CLIP) für jedes Ingredient in text_content_list Und image_content_list. Diese werden als Pytorch-Tensoren gespeichert.
# load embeddings
text_embeddings = load('knowledge/text_embeddings.pt', weights_only=True)
image_embeddings = load('knowledge/image_embeddings.pt', weights_only=True)print(text_embeddings.form)
print(image_embeddings.form)
# >> torch.Measurement((86, 512))
# >> torch.Measurement((17, 512))
Wenn wir die Type dieser Tensoren ausdrucken, sehen wir, dass sie durch 512-dimensionale Einbettungen dargestellt werden. Und wir haben 86 Textblöcke und 17 Bilder.
Multimodale Suche
Nachdem unsere Wissensdatenbank geladen ist, können wir nun eine Abfrage für die Vektorsuche definieren. Dies besteht aus der Übersetzung einer Eingabeabfrage in eine Einbettung mithilfe von CLIP. Dies machen wir analog zu den Beispielen aus dem vorheriger Beitrag.
# question
question = "What's CLIP's contrastive loss operate?"# embed question (4 steps)
# 1) load mannequin
mannequin = CLIPTextModelWithProjection.from_pretrained("openai/clip-vit-base-patch16")
# 2) load knowledge processor
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch16")
# 3) pre-process textual content
inputs = processor(textual content=(textual content), return_tensors="pt", padding=True)
# 4) compute embeddings with CLIP
outputs = mannequin(**inputs)
# extract embedding
query_embed = outputs.text_embeds
print(query_embed.form)
# >> torch.Measurement((1, 512))
Wenn wir die Type ausdrucken, sehen wir, dass wir einen einzelnen Vektor haben, der die Abfrage darstellt.
Um eine Vektorsuche in der Wissensdatenbank durchzuführen, müssen wir Folgendes tun.
- Berechnen Sie Ähnlichkeiten zwischen der Abfrageeinbettung und allen Textual content- und Bildeinbettungen.
- Skalieren Sie die Ähnlichkeiten über die Softmax-Funktion neu, sodass sie von 0 bis 1 reichen.
- Sortieren Sie die skalierten Ähnlichkeiten und geben Sie die besten okay Ergebnisse zurück.
- Filtern Sie abschließend die Ergebnisse, um nur Elemente oberhalb eines vordefinierten Ähnlichkeitsschwellenwerts beizubehalten.
So sieht das im Code für die Textblöcke aus.
# outline okay and simiarlity threshold
okay = 5
threshold = 0.05# multimodal search over articles
text_similarities = matmul(query_embed, text_embeddings.T)
# rescale similarities by way of softmax
temp=0.25
text_scores = softmax(text_similarities/temp, dim=1)
# return prime okay filtered textual content outcomes
isorted_scores = argsort(text_scores, descending=True)(0)
sorted_scores = text_scores(0)(isorted_scores)
itop_k_filtered = (idx.merchandise()
for idx, rating in zip(isorted_scores, sorted_scores)
if rating.merchandise() >= threshold)(:okay)
top_k = (text_content_list(i) for i in itop_k_filtered)
print(top_k)
# prime okay outcomes({'article_title': 'Multimodal Embeddings: An Introduction',
'part': 'Contrastive Studying',
'textual content': 'Two key points of CL contribute to its effectiveness'})
Oben sehen wir die besten Textergebnisse. Beachten Sie, dass wir jedoch nur einen Artikel haben okay=5. Dies liegt daran, dass die 2. bis 5. Elemente unter dem Schwellenwert von 0,1 lagen.
Interessanterweise scheint dieser Artikel für unsere erste Anfrage nicht hilfreich zu sein „Was ist die Kontrastverlustfunktion von CLIP?“ Dies unterstreicht eine der größten Herausforderungen der Vektorsuche: Elemente, die einer bestimmten Anfrage ähneln, helfen möglicherweise nicht unbedingt bei der Beantwortung dieser Frage.
Eine Möglichkeit, dieses Downside abzumildern, besteht darin, unsere Suchergebnisse durch Erhöhen weniger streng einzuschränken okay und die Ähnlichkeit verringern Schwelleund hoffe dann, dass der LLM herausfinden kann, was hilfreich ist und was nicht.
Dazu packe ich zunächst die Schritte der Vektorsuche in eine Python-Funktion.
def similarity_search(query_embed, target_embeddings, content_list,
okay=5, threshold=0.05, temperature=0.5):
"""
Carry out similarity search over embeddings and return prime okay outcomes.
"""
# Calculate similarities
similarities = torch.matmul(query_embed, target_embeddings.T)# Rescale similarities by way of softmax
scores = torch.nn.useful.softmax(similarities/temperature, dim=1)
# Get sorted indices and scores
sorted_indices = scores.argsort(descending=True)(0)
sorted_scores = scores(0)(sorted_indices)
# Filter by threshold and get prime okay
filtered_indices = (
idx.merchandise() for idx, rating in zip(sorted_indices, sorted_scores)
if rating.merchandise() >= threshold
)(:okay)
# Get corresponding content material gadgets and scores
top_results = (content_list(i) for i in filtered_indices)
result_scores = (scores(0)(i).merchandise() for i in filtered_indices)
return top_results, result_scores
Legen Sie dann umfassendere Suchparameter fest.
# search over textual content chunks
text_results, text_scores = similarity_search(query_embed, text_embeddings,
text_content_list, okay=15, threshold=0.01, temperature=0.25)# search over photos
image_results, image_scores = similarity_search(query_embed, image_embeddings,
image_content_list, okay=5, threshold=0.25, temperature=0.5)
Dies führt zu 15 Textergebnissen und 1 Bildergebnis.
1 - Two key points of CL contribute to its effectiveness
2 - To make a category prediction, we should extract the picture logits and consider
which class corresponds to the utmost.
3 - Subsequent, we are able to import a model of the clip mannequin and its related knowledge
processor. Observe: the processor handles tokenizing enter textual content and picture
preparation.
4 - The fundamental thought behind utilizing CLIP for 0-shot picture classification is to
move a picture into the mannequin together with a set of attainable class labels. Then,
a classification may be made by evaluating which textual content enter is most just like
the enter picture.
5 - We will then match the perfect picture to the enter textual content by extracting the textual content
logits and evaluating the picture similar to the utmost.
6 - The code for these examples is freely obtainable on the GitHub repository.
7 - We see that (once more) the mannequin nailed this straightforward instance. However let’s attempt
some trickier examples.
8 - Subsequent, we’ll preprocess the picture/textual content inputs and move them into the mannequin.
9 - One other sensible software of fashions like CLIP is multimodal RAG, which
consists of the automated retrieval of multimodal context to an LLM. Within the
subsequent article of this sequence, we are going to see how this works beneath the hood and
assessment a concrete instance.
10 - One other software of CLIP is actually the inverse of Use Case 1.
Quite than figuring out which textual content label matches an enter picture, we are able to
consider which picture (in a set) finest matches a textual content enter (i.e. question)—in
different phrases, performing a search over photos.
11 - This has sparked efforts towards increasing LLM performance to incorporate
a number of modalities.
12 - GPT-4o — Enter: textual content, photos, and audio. Output: textual content.FLUX — Enter: textual content.
Output: photos.Suno — Enter: textual content. Output: audio.
13 - The usual strategy to aligning disparate embedding areas is
contrastive studying (CL). A key instinct of CL is to symbolize totally different
views of the identical data equally (5).
14 - Whereas the mannequin is much less assured about this prediction with a 54.64%
chance, it appropriately implies that the picture will not be a meme.
15 - (8) Mini-Omni2: In direction of Open-source GPT-4o with Imaginative and prescient, Speech and Duplex
Capabilities
Aufforderndes MLLM
Obwohl die meisten dieser Textelementergebnisse für unsere Abfrage nicht hilfreich zu sein scheinen, ist das Bildergebnis genau das, wonach wir suchen. Lassen Sie uns dennoch anhand dieser Suchergebnisse sehen, wie LLaMA 3.2 Imaginative and prescient auf diese Anfrage reagiert.
Wir werden die Suchergebnisse zunächst als intestine formatierte Zeichenfolgen strukturieren.
text_context = ""
for textual content in text_results:
if text_results:
text_context = text_context + "**Article title:** "
+ textual content('article_title') + "n"
text_context = text_context + "**Part:** "
+ textual content('part') + "n"
text_context = text_context + "**Snippet:** "
+ textual content('textual content') + "nn"
image_context = ""
for picture in image_results:
if image_results:
image_context = image_context + "**Article title:** "
+ picture('article_title') + "n"
image_context = image_context + "**Part:** "
+ picture('part') + "n"
image_context = image_context + "**Picture Path:** "
+ picture('image_path') + "n"
image_context = image_context + "**Picture Caption:** "
+ picture('caption') + "nn"
Beachten Sie die Metadaten, die jedem Textual content- und Bildelement beiliegen. Dies wird dem LLaMA helfen, den Kontext des Inhalts besser zu verstehen.
Als nächstes verschachteln wir die Textual content- und Bildergebnisse zu einer Eingabeaufforderung.
# assemble immediate template
immediate = f"""Given the question "{question}" and the next related snippets:{text_context}
{image_context}
Please present a concise and correct reply to the question, incorporating
related data from the offered snippets the place attainable.
"""
Die letzte Eingabeaufforderung ist ziemlich lang, daher werde ich sie hier nicht abdrucken. Es wird jedoch vollständig im angezeigt Beispiel-Notizbuch auf GitHub.
Endlich können wir es verwenden Ollama um diese Aufforderung an LLaMA 3.2 Imaginative and prescient weiterzuleiten.
ollama.pull('llama3.2-vision')response = ollama.chat(
mannequin='llama3.2-vision',
messages=({
'function': 'consumer',
'content material': immediate,
'photos': (picture("image_path") for picture in image_results)
})
)
print(response('message')('content material'))
The picture depicts a contrastive loss operate for aligning textual content and picture
representations in multimodal fashions. The operate is designed to reduce the
distinction between the similarity of constructive pairs (text-image) and unfavourable
pairs (text-text or image-image). This loss operate is often utilized in CLIP,
which stands for Contrastive Language-Picture Pre-training.**Key Parts:**
* **Optimistic Pairs:** Textual content-image pairs the place the textual content describes a picture.
* **Damaging Pairs:** Textual content-text or image-image pairs that don't belong to
the identical class.
* **Contrastive Loss Operate:** Calculates the distinction between constructive
and unfavourable pairs' similarities.
**The way it Works:**
1. **Textual content-Picture Embeddings:** Generate embeddings for each textual content and pictures
utilizing a multimodal encoder (e.g., CLIP).
2. **Optimistic Pair Similarity:** Calculate the similarity rating between every
text-image pair.
3. **Damaging Pair Similarity:** Calculate the similarity scores between all
unfavourable pairs.
4. **Contrastive Loss Calculation:** Compute the contrastive loss by
minimizing the distinction between constructive and unfavourable pairs' similarities.
**Advantages:**
* **Multimodal Alignment:** Aligns textual content and picture representations for higher
understanding of visible content material from textual content descriptions.
* **Improved Efficiency:** Enhances efficiency in downstream duties like
picture classification, retrieval, and technology.
Das Modell erkennt richtig, dass das Bild die benötigten Informationen enthält und erklärt die allgemeine Instinct seiner Funktionsweise. Allerdings ist es missversteht die Bedeutung von positiven und negativen Paarendenkend, dass ein negatives Paar einem Paar derselben Modalität entspricht.
Während wir die Implementierungsdetails Schritt für Schritt durchgingen, habe ich hier mithilfe von Gradio alles in eine schöne Benutzeroberfläche gepackt Notizbuch im GitHub-Repo.
Multimodale RAG-Systeme können in verschiedenen Formaten gespeichertes Wissen synthetisieren und so die Möglichkeiten von KI erweitern. Hier haben wir drei einfache Strategien zur Entwicklung eines solchen Methods besprochen und dann eine Beispielimplementierung eines multimodalen Weblog-QS-Assistenten gesehen.
Obwohl das Beispiel für diese Demonstration intestine genug funktionierte, gibt es klare Einschränkungen beim Suchvorgang. Einige Techniken, die dies verbessern können, umfassen die Verwendung von a Reranker zur Verfeinerung der Ähnlichkeitssuche Ergebnisse und zur Verbesserung der Suchqualität über fein abgestimmte multimodale Einbettungen.
Wenn Sie zukünftige Beiträge zu diesen Themen sehen möchten, lassen Sie es mich in den Kommentaren wissen 🙂
Mehr zu multimodalen Modellen 👇