RAG multimodal în LlamaIndex (text și imagini) în LlamaIndex & Data RAG

Interogare & RAG Avansat Nivel: avansat

Indexarea și regăsirea textului împreună cu imaginile: MultiModalVectorStoreIndex ține vectori separați pentru text și imagini, iar un LLM care acceptă imagini primește la sinteză atât fragmentele de text, cât și imaginile găsite.

Sintaxă & invocare Python
from llama_index.core import SimpleDirectoryReader
from llama_index.core.indices import MultiModalVectorStoreIndex
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.llms.openai import OpenAI

documents = SimpleDirectoryReader("./manuale").load_data()   # text și imagini
index = MultiModalVectorStoreIndex.from_documents(documents)
qe = RetrieverQueryEngine.from_args(
    retriever=index.as_retriever(similarity_top_k=3, image_similarity_top_k=3),
    llm=OpenAI(model="gpt-6-astra"),
    multimodal=True,
)
raspuns = qe.query("Unde este siguranța F1 pe placă?")

Conceptele RAG (indexare, regăsire, sinteză) se extind la imagini: întrebarea, baza de cunoștințe și contextul pentru răspuns pot conține text sau imagini. MultiModalVectorStoreIndex (din llama_index.core.indices) păstrează două vector store-uri, unul pentru text și unul pentru imagini (StorageContext.from_defaults(vector_store=..., image_store=...)). Textul folosește modelul de embedding obișnuit, iar imaginile modelul image_embed_model, implicit CLIP ("clip:ViT-B/32", cere llama-index-embeddings-clip). Retriever-ul întoarce noduri de text (similarity_top_k) și noduri imagine (image_similarity_top_k).

Pentru sinteză, din llama-index-core 0.14.23 SimpleMultiModalQueryEngine (ce întoarce index.as_query_engine() la acest index) este depreciat. Codul sursă indică varianta nouă: RetrieverQueryEngine.from_args(retriever=..., llm=..., multimodal=True) cu un LLM de chat care acceptă blocuri de conținut (text și imagini). Clasele separate de tip OpenAIMultiModal au fost scoase din repository în octombrie 2025; modelele OpenAI cu imagini se folosesc prin OpenAI obișnuit, cu ChatMessage care conține ImageBlock și TextBlock.

Documentele cu imagini se încarcă cu SimpleDirectoryReader (imaginile devin ImageDocument, prin llama-index-readers-file). Pentru PDF-uri cu grafice și tabele, o alternativă este să le parsezi cu LlamaParse, care poate întoarce și capturi de pagină. Fiecare imagine trimisă modelului consumă tokeni, deci contează câte imagini păstrezi în context.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
MultiModalVectorStoreIndex.from_documents(docs, storage_context=...) Index cu vector store separat pentru imagini.
image_embed_model Modelul de embedding pentru imagini. Implicit CLIP.
image_store Vector store-ul pentru imagini, dat în StorageContext.
similarity_top_k / image_similarity_top_k Câte noduri de text, respectiv imagini, aduce retriever-ul.
RetrieverQueryEngine.from_args(..., multimodal=True) Sinteză cu text și imagini, printr-un LLM care acceptă blocuri de imagine.
ChatMessage(blocks=[TextBlock(...), ImageBlock(...)]) Mesaj cu imagini pentru un LLM, fără index.

Exemple practice și scenarii reale

Exemplul 1: Index multimodal cu Qdrant local

Adaptat după ghidul „Multi-modal models”.

import qdrant_client
from llama_index.core import StorageContext
from llama_index.vector_stores.qdrant import QdrantVectorStore

client = qdrant_client.QdrantClient(path="qdrant_mm_db")
storage_context = StorageContext.from_defaults(
    vector_store=QdrantVectorStore(client=client, collection_name="text"),
    image_store=QdrantVectorStore(client=client, collection_name="imagini"),
)
index = MultiModalVectorStoreIndex.from_documents(documents, storage_context=storage_context)

Exemplul 2: Întrebare despre o imagine, direct la LLM

from llama_index.core.llms import ChatMessage, ImageBlock, MessageRole, TextBlock
from llama_index.llms.openai import OpenAI

msg = ChatMessage(
    role=MessageRole.USER,
    blocks=[TextBlock(text="Descrie schema."), ImageBlock(path="./schema_placa.png")],
)
print(OpenAI(model="gpt-6-astra").chat(messages=[msg]))

Greșeli frecvente și capcane

  • Cod cu from llama_index.multi_modal_llms.openai import OpenAIMultiModal. Integrarea a fost scoasă din repository; folosește llama_index.llms.openai.OpenAI cu blocuri de imagine.
  • Să construiești un index multimodal fără llama-index-embeddings-clip sau alt image_embed_model. Imaginile nu au cu ce fi vectorizate.
  • Un LLM fără suport pentru imagini la sinteza cu multimodal=True. Imaginile regăsite nu pot fi citite de model.

Noțiuni și module înrudite