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ștellama_index.llms.openai.OpenAIcu blocuri de imagine. - Să construiești un index multimodal fără
llama-index-embeddings-clipsau altimage_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.