feat(rag): provisiona busca RAG do G-ART e corrige indexação que abortava em chunk grande
Cria rag/ (schema, busca híbrida densa+lexical com RRF em search.py/ search_gart.sh, SETUP.md) — o projeto já tinha admin/update_rag.py para indexar, mas nenhuma forma de consultar o índice. Corrige admin/update_rag.py: um chunk denso em tokens (code/fcpxml/font_metrics.py) estourava o contexto do modelo de embedding e derrubava a transação inteira; agora só aquele chunk é pulado. Banco rag_gart provisionado no rag-hub-db compartilhado e primeira indexação completa rodada (304 arquivos, 1702 chunks). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
d13f643ebc
commit
e9a17c1b62
@@ -0,0 +1,37 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user