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>
38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
"""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
|