"""Embeddings compartilhados entre indexador e busca do RAG do G-ART. admin/update_rag.py já indexa (chunking por janela de linhas, incremental, rodado por admin/run.command). Este módulo só isola a chamada ao Ollama para que rag/search.py use exatamente o mesmo modelo/prefixo na consulta. Prefixos do embedding ---------------------- O nomic-embed-text espera `search_document: ` no que é indexado e `search_query: ` no que é consultado — sem isso a qualidade da busca cai. admin/update_rag.py já indexa com `search_document: ` (ver `_embed` lá). Trocar esse regime invalida os vetores antigos e exige reindexar tudo. """ import os import requests OLLAMA_URL = os.environ.get("OLLAMA_URL", "http://127.0.0.1:11434") EMBED_MODEL = os.environ.get("RAG_EMBED_MODEL", "nomic-embed-text") EMBED_DIM = int(os.environ.get("RAG_EMBED_DIM", "768")) DOC_PREFIX = "search_document: " QUERY_PREFIX = "search_query: " def _embed(text: str, prefix: str = DOC_PREFIX): response = requests.post( f"{OLLAMA_URL.rstrip('/')}/api/embeddings", json={"model": EMBED_MODEL, "prompt": f"{prefix}{text}"}, timeout=60, ) response.raise_for_status() vector = response.json()["embedding"] if len(vector) != EMBED_DIM: raise ValueError(f"embedding com {len(vector)} dimensões; esperado {EMBED_DIM}") return vector