[draft] Add reference app to markup reference. #30
Draft
gitnnolabs wants to merge 7 commits into
Draft
Conversation
Co-authored-by: Cursor <cursoragent@cursor.com>
Collaborator
Author
|
@robertatakenaka ainda está em draft — estou ajustando a máquina com GPU e a infra para reunir evidências mais consistentes no PR. Também quero deixar uma versão disponível com um tempo aceitável de marcação no ambiente de homologação: https://tools-hml.scielo.org/ |
Envia o few-shot uma vez por lote (REFERENCE_BATCH_SIZE) em vez de por linha; fallback 1-a-1 se a resposta do lote for inválida.
…ew-shot uma vez por lote (REFERENCE_BATCH_SIZE) e limita Envia o few-shot uma vez por lote (REFERENCE_BATCH_SIZE) e limita o contexto Ollama via options.num_ctx (REFERENCE_NUM_CTX=8192).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Marcação de referências com IA (infra, prompt e API REST)
O que esse PR faz?
Entrega a capacidade de marcar citações bibliográficas (texto livre → JSON estruturado → XML JATS/SPS) no SciELO Tools, usando modelo local via Ollama (sem API comercial de IA), com:
reference/data_utils.py(conversão JSON→JATS e orquestração), proveniente da implementação anterior do Edgar.Detalhe das três partes e dos testes com IA abaixo.
Parte 1 — Infraestrutura: container Ollama
O Compose local (
local.yml) passa a incluir o serviçoollama(ollama/ollama:latest), com:11434:11434ollama_data→/root/.ollama(persiste o modelo entre restarts)django,celeryworkerecelerybeatdependem deollamallama3.2:3b(REFERENCE_MODEL) pode ser alterado para máquina com menos capacidade de processamento (sem GPU)REFERENCE_URL=http://ollama:11434(hostname Docker ou um endereço de um privedor de IA podendo ser o SciELO para parceiros da rede SciELO)Operação típica:
docker compose -f local.yml up -d make ollama_pull # ollama pull llama3.2:3b dentro do containerIMPORTANTE: O Django não carrega GGUF in-process (
llama-cpp-pythonremovido deste fluxo). A inferência fica no processo Ollama; a aplicação só fala HTTP (POST {REFERENCE_URL}/api/chat), isso evita que tenhamos uma arquivo grande no repositório.Em ambientes SciELO (intranet/servidor) o mesmo protocolo serve: basta apontar
REFERENCE_URLpara o endpoint Ollama institucional (e opcionalmenteREFERENCE_TOKEN). Em maquinas sem GPU/RAM suficiente, o Compose local pode ser omitido e a URL remota usada.Atende aos casos em que não é possível ter máquinas com GPU:
Variáveis relevantes (
.envs/ settings):REFERENCE_ENABLED— liga/desliga a marcação via LlamaREFERENCE_URL— base URL Ollama (http://ollama:11434ou URL SciELO)REFERENCE_MODEL— ex.llama3.2:3bREFERENCE_TIMEOUT— timeout HTTP (default 300s)REFERENCE_TOKEN— Bearer opcional para Ollama protegidoParte 2 — Estratégia de utilização do prompt
A marcação não depende de fine-tuning: usa prompt de sistema + exemplos few-shot + schema JSON, definidos em
reference/prompts.pye enviados peloreference/providers/http.py.system@publication-typeSPS (journal,book,data,software,legal-doc, …); regras de título/source por tipo; autores pessoa vscollab; DOI nu; no máximo uma URIRESPONSE_FORMATjson_objectpassado ao Ollama (format), reduzindo saída fora do contratotemperature=0.0,top_p=0.1— favorece estabilidade na avaliaçãoO que significa
roleemreference/prompts.pyA lista
MESSAGESé o histórico de chat enviado ao Ollama (POST …/api/chat). Cada item temrole+content— o papel de quem “fala” naquela mensagem:rolesystemreftype), quando usar{"is_reference": false}(figuras, tabelas, títulos de secção), regras de autores/DOI/etc.userassistantOs pares
user/assistantsão few-shot: ensinam o formato pelo exemplo. Em runtime,Provider.run()copiaMESSAGESe acrescenta um novousercom a linha a marcar; o modelo responde comoassistant(JSON).Fluxo resumido do prompt:
system(regras) → exemplos few-shot →user(texto atual) → resposta JSON do modelo.Fluxo:
mark_reference/mark_referencesmontam o provider comMESSAGES+RESPONSE_FORMAT.user.reftype,authors,title,source, …).data_utils.get_xml/build_ref_listtransformam JSON em<element-citation>/<ref-list>SPS.A evolução do prompt é o principal alavanca de qualidade: os testes golden (
@pytest.mark.llama) medem o efeito de mudanças no prompt ou no modelo.Parte 3 — Ollama como backend; SciELO Tools como API REST
Há duas camadas de API:
API do Ollama (interna ao stack ou ao serviço SciELO de modelos)
reference/providers/http.pyPOST {REFERENCE_URL}/api/chatcommodel,messages,format,options,stream=falsemarking(choices[].message.content)API REST do SciELO Tools (produto para editores, integrações e outros apps)
reference/api/v1/views.pyconfig/api_router.py→POST /api/v1/reference/…/reference/docx/)type=json(estruturado),type=xml/type=jats(ref-listcommixed-citation+element-citation)Assim, sistemas editoriais externos não precisam falar com o Ollama diretamente: usam a API REST autenticada do SciELO Tools; a plataforma abstrai modelo, prompt, persistência e formato SPS.
Legado —
data_utils(implementação anterior do Edgar)O módulo
reference/data_utils.pyconcentra a lógica herdada / adaptada do desenvolvimento anterior (Edgar), em especial:resolve_references_result,get_reference);get_xml→<element-citation>comperson-group,pub-id, páginas,ext-link,date-in-citation, etc.);<ref-list>SPS (build_ref_list);Reference/ElementCitatione checksum do texto.Neste PR, o
data_utilsdeixa de depender de um appiagenérico e passa a consumir a marcação do próprio appreference(mark_references+ provider HTTP Ollama), mantendo o contrato de saída JATS/SPS alinhado aos Critérios SciELO.Testes com IA (Ollama / Llama)
A suíte distingue testes determinísticos (CI /
make test) de avaliação com modelo real (make test-llama).O que roda no CI / default
HttpProviderStub, monkeypatch).data_utils, serializers, views, parsing DOCX,get_xmlcom JSON fixo.test_eval_corpus_aligned: garante alinhamento do corpusreference/fixtures/references.txt↔references.xml(103 pares).llamaexcluído — não chama Ollama no pipeline padrão.O que é avaliação com IA
make test-llama # pytest -m llama reference/tests/test_references.pyRequisitos: stack com Ollama no ar, modelo puxado (
make ollama_pull),REFERENCE_URLapontando para o serviço.test_eval_llama_json_matches_goldenreftype, autores, título, source, DOI, volume, páginas, URI, …)test_eval_llama_jats_matches_goldenget_xml+build_ref_list, comparando<element-citation>gerado ao goldenNotas para o revisor:
make testé necessário rodarmos esses teste em uma máquina com GPU.Onde a revisão poderia começar?
local.yml— serviçoollamae volumereference/providers/http.py— clientePOST /api/chatreference/prompts.py— system + few-shot + schemareference/api/v1/views.py— API REST SciELO (json/jats/docx)reference/data_utils.py— JSON → JATS /ref-list(legado Edgar)reference/tests/test_references.py— corpus alinhado +@pytest.mark.llamaComo este poderia ser testado manualmente?
docker compose -f local.yml up -dmake ollama_pull.envs/.local/.django):REFERENCE_ENABLED=true,REFERENCE_URL=http://ollama:11434,REFERENCE_MODEL=llama3.2:3bmake testmake test-llamaé muito lento e precisa de revisão já que não foi possível rodar em uma máquina com GPU.ref_listcom<mixed-citation>e<element-citation publication-type="journal">.Algum cenário de contexto que queira dar?
REFERENCE_URLserve (Compose) ou endpoint Ollama como o SciELO sendo o provedor de IA.data_utilspreserva o investimento já feito na conversão JATS; o PR troca a fonte da marcação (HTTP Ollama) sem reescrever o gerador SPS do zero.iagenérico (quando no âmbito do ramo) evita provedores cloud e concentra o fluxo de referências no appreference.Screenshots
Uso no admin, pós enviar um arquivo .docx:
Uso da API no DRF Django:
Quais são tickets relevantes?
Tíquete: #19
Referências
ref-list,mixed-citation,element-citation): https://docs.google.com/document/d/1GTv4Inc2LS_AXY-ToHT3HmO66UT0VAHWJNOIqzBNSgA/edit?tab=t.0#heading=h.2upcpyuv6r4o;O que ainda falta?
Segurança da informação (NSI.04)
Este PR manipula dados sensíveis ou pessoais (LGPD)?
Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?
Este PR introduz, atualiza ou remove dependências de terceiros?
Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?
Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?
Este PR expõe novos endpoints, telas ou serviços?
Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?