Sistema multi-agente com RAG para analise inteligente de cardapios de restaurantes.
O SaborAI responde perguntas sobre cardapios de restaurantes usando uma arquitetura multi-agente com RAG. Um agente supervisor roteia cada query para um ou mais agentes especialistas, agrega as respostas e entrega um resultado estruturado.
Casos de uso:
- "Quais pratos sao adequados para veganos com intolerancia a gluten?"
- "Monte um combo completo por ate R$60 para um casal."
- "Avalie a qualidade das descricoes do cardapio e sugira melhorias para aumentar a conversao."
Query do Usuario
|
v
SupervisorAgent <- roteamento via LLM (GPT-4o-mini)
|
|---> NutritionAgent (restricoes alimentares, alergenicos, calorias)
|---> RecommendationAgent (combos, filtro por budget, harmonizacoes) } asyncio.gather
\---> QualityAgent (score de qualidade descritiva, conversao) } (paralelo)
|
v
ChromaDB (vector store local)
^
|
Pipeline de Ingestao
(PDF/TXT -> chunking -> deduplicacao -> embedding -> persist)
| Decisao | Justificativa |
|---|---|
| Supervisor + especialistas | Separacao de responsabilidades; cada agente tem prompts focados e tunados |
| Roteamento via LLM | Flexivel — lida com queries ambiguas que abrangem multiplos dominios |
| Execucao paralela (async) | Agentes rodam em paralelo via asyncio.gather, cortando latencia em ~1/N |
| Retry com exponential backoff | Resiliencia contra rate limits e falhas transientes da API OpenAI |
| Streaming SSE | Respostas parciais via Server-Sent Events para UX responsiva |
| Deduplicacao por hash de conteudo | Evita drift de embedding ao re-ingerir o mesmo conteudo |
| LLM-as-judge nos evals | Metricas de qualidade escalaveis sem necessidade de dataset anotado manualmente |
| Dados sinteticos via LLM | Aumenta cobertura de dados para cuisines/faixas de preco com baixa representacao |
| Logging estruturado (JSON) | Rastreamento de requests com ID unico e metricas de latencia per-request |
O suite de evals mede 4 dimensoes por caso de teste:
| Metrica | Metodo |
|---|---|
| Relevancia | GPT-4o-mini como juiz (0-1) |
| Groundedness | GPT-4o-mini verifica se a resposta esta ancorada no contexto recuperado |
| Routing Accuracy | Agentes esperados vs. agentes selecionados |
| Keyword Coverage | Heuristica — termos esperados presentes na resposta |
Os resultados sao persistidos em data/eval_results/ como JSON com timestamp para rastreamento de experimentos.
Painel Streamlit para visualizacao interativa de metricas:
streamlit run dashboard.pyFuncionalidades:
- Metricas agregadas do ultimo run com delta vs run anterior
- Drill-down por caso de teste
- Grafico radar de scores por caso
- Trends de metricas ao longo do tempo
- Execucao de novas avaliacoes via UI
Script que gera cardapios realistas via LLM para aumentar a cobertura de dados:
# Gerar 5 cardapios de cuisines diversas
python -m scripts.generate_synthetic_menus --count 5
# Gerar para cozinha especifica e ingerir automaticamente
python -m scripts.generate_synthetic_menus --cuisine Japonesa --count 2 --ingest
# Gerar faixa premium
python -m scripts.generate_synthetic_menus --price-tier premium --count 3 --output data/sample_menus/O script gera um manifesto JSON com metadata (Pydantic) para rastreamento de qualidade dos dados gerados.
| Metodo | Endpoint | Descricao |
|---|---|---|
GET |
/health |
Health check |
POST |
/ingest/file |
Upload de cardapio em PDF ou TXT |
POST |
/ingest/text |
Ingestao de texto puro |
POST |
/query |
Query multi-agente (async, agentes em paralelo) |
POST |
/query/stream |
Query com streaming via Server-Sent Events |
POST |
/evaluate |
Executa o suite de evals |
Documentacao interativa disponivel em http://localhost:8000/docs (Swagger UI).
git clone https://github.com/nikolasdehor/CardapIA.git
cd CardapIA
cp .env.example .env
# Adicione sua OPENAI_API_KEY no .envdocker compose up --build
# API: http://localhost:8000/docs
# Dashboard: http://localhost:8501python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn api.main:app --reloadcurl -X POST http://localhost:8000/ingest/file \
-F "file=@data/sample_menus/bella_terra.txt" \
-F "menu_name=Bella Terra"# Recomendacao com budget
curl -X POST http://localhost:8000/query \
-H "Content-Type: application/json" \
-d '{"query": "Monte um combo completo por ate R$60 para um casal vegano."}'
# Avaliacao de qualidade
curl -X POST http://localhost:8000/query \
-H "Content-Type: application/json" \
-d '{"query": "Avalie a qualidade das descricoes do cardapio e sugira melhorias."}'
# Restricoes alimentares
curl -X POST http://localhost:8000/query \
-H "Content-Type: application/json" \
-d '{"query": "Quais pratos nao contem gluten nem laticinios?"}'python -m scripts.generate_synthetic_menus --count 3 --ingestcurl -X POST http://localhost:8000/evaluate \
-H "Content-Type: application/json" \
-d '{"suite": "default"}'streamlit run dashboard.py- Runtime: Python 3.11
- API: FastAPI + Uvicorn
- Orquestracao LLM: LangChain (agents, RAG, prompts)
- LLM: OpenAI GPT-4o-mini
- Embeddings: OpenAI text-embedding-3-small
- Vector Store: ChromaDB (persistencia local)
- Dashboard: Streamlit + Plotly
- Containerizacao: Docker + Docker Compose
- CI/CD: GitHub Actions (lint, test, build, deploy)
CardapIA/
├── agents/
│ ├── supervisor.py # Roteamento, consolidacao e execucao paralela
│ ├── nutrition.py # Especialista em dietas e alergenicos
│ ├── recommendation.py # Especialista em combos e harmonizacoes
│ ├── quality.py # Especialista em qualidade e conversao
│ └── retry.py # Retry com exponential backoff (sync + async)
├── api/
│ ├── main.py # App FastAPI e endpoints (incl. SSE streaming)
│ ├── settings.py # Configuracao via Pydantic-settings
│ └── middleware.py # Logging estruturado e request tracking
├── ingestion/
│ └── pipeline.py # Load -> chunk -> deduplica -> embed
├── evals/
│ └── runner.py # Framework LLM-as-judge
├── experiments/
│ └── compare_models.py # Experimentacao comparativa de modelos/configs
├── scripts/
│ └── generate_synthetic_menus.py # Geracao de dados sinteticos via LLM
├── data/
│ ├── sample_menus/ # Cardapios de exemplo e sinteticos
│ ├── eval_results/ # Resultados de avaliacoes
│ └── experiment_results/ # Resultados de experimentos
├── tests/
│ ├── conftest.py # Fixtures e configuracao de testes
│ ├── test_api.py # Testes de integracao (API endpoints)
│ ├── test_agents.py # Testes de inicializacao e configuracao
│ ├── test_supervisor.py # Testes de routing e orquestracao
│ ├── test_pipeline.py # Testes do pipeline de ingestao
│ └── test_retry.py # Testes do modulo de retry
├── .github/
│ └── workflows/
│ ├── ci.yml # Lint, test, build Docker
│ └── cd.yml # Deploy staging/production
├── dashboard.py # Dashboard Streamlit de evals
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
└── pyproject.toml
O pipeline de CI/CD roda no GitHub Actions:
CI (ci.yml):
- Lint & Format — Ruff check + format
- Tests — Unit tests (sem API key)
- Build Docker — Build e push para GitHub Container Registry
- Integration Tests — Testes com API key real (apenas na main)
CD (cd.yml):
- Build Release — Imagem com tag semver
- Deploy Staging — Deploy automatico
- Smoke Tests & Evals — Health check + eval suite no staging
- Deploy Production — Apenas apos smoke tests passarem
Script para rodar experimentos comparativos entre modelos, temperaturas e tamanhos de chunk:
# Comparar GPT-4o-mini vs GPT-4o com diferentes temperaturas
python -m experiments.compare_models --models gpt-4o-mini gpt-4o --temperatures 0 0.2 0.5
# Comparar diferentes chunk sizes
python -m experiments.compare_models --chunk-sizes 512 1024 2048Resultados salvos em data/experiment_results/ com metricas de relevancia, coerencia,
completude, cobertura de keywords e latencia por configuracao.
- Logging estruturado (JSON): Cada request carrega um
X-Request-IDunico, e todos os logs sao emitidos como JSON lines (compativeis com Loki, CloudWatch, etc.). - Metricas por request: Header
X-Response-Time-Msem toda resposta. - Retry com backoff: Chamadas a OpenAI com ate 3 retries automaticos com exponential backoff e jitter para lidar com rate limits e erros transientes.
- Sistema multi-agente com RAG (Supervisor + 3 especialistas)
- Pipeline de ingestao com deduplicacao
- Framework de avaliacao LLM-as-judge
- Geracao de dados sinteticos via LLM
- Dashboard de evals (Streamlit)
- CI/CD com GitHub Actions
- Execucao assincrona dos agentes (chamadas paralelas via asyncio.gather)
- Streaming de respostas via SSE (
/query/stream) - Retry com exponential backoff nas chamadas OpenAI
- Logging estruturado (JSON) com request tracking
- Framework de experimentacao comparativa de LLMs
- Suporte a cardapios em imagem (vision + OCR)
- Suporte multilingue
PRs sao bem-vindos! Abra uma issue descrevendo o que deseja implementar antes de comecar.
MIT