From d0020d804290769762337ee8f8454c381afd187e Mon Sep 17 00:00:00 2001 From: RegiMaria Date: Sun, 29 Mar 2026 19:27:59 -0300 Subject: [PATCH 1/4] first commit --- .env.example | 10 ++ .github/workflows/eval.yml | 34 +++++ .gitignore | 23 +++ data/docs/historia_ia.txt | 27 ++++ outputs/golden_dataset.csv | 11 ++ pyproject.toml | 24 ++++ requirements.txt | 26 ++++ src/deepeval_project/__init__.py | 0 src/deepeval_project/rag_pipeline.py | 205 +++++++++++++++++++++++++++ tests/conftest.py | 84 +++++++++++ tests/test_evaluate.py | 128 +++++++++++++++++ tests/test_geval.py | 171 ++++++++++++++++++++++ 12 files changed, 743 insertions(+) create mode 100644 .env.example create mode 100644 .github/workflows/eval.yml create mode 100644 .gitignore create mode 100644 data/docs/historia_ia.txt create mode 100644 outputs/golden_dataset.csv create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 src/deepeval_project/__init__.py create mode 100644 src/deepeval_project/rag_pipeline.py create mode 100644 tests/conftest.py create mode 100644 tests/test_evaluate.py create mode 100644 tests/test_geval.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..bc26ff1 --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +# DeepEval-Project — variáveis de ambiente +# Copie para .env e preencha com suas chaves + +# Anthropic — juiz LLM e pipeline RAG +ANTHROPIC_API_KEY="sk-ant-..." + +# Confident AI — dashboard de visualização +# Crie sua conta gratuita em https://app.confident-ai.com +# Copie a API key em Settings > Project API Key +CONFIDENT_API_KEY="ck_..." diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml new file mode 100644 index 0000000..ee546da --- /dev/null +++ b/.github/workflows/eval.yml @@ -0,0 +1,34 @@ +name: DeepEval — RAG Evaluation + +on: + push: + branches: [main, develop] + pull_request: + branches: [main] + +jobs: + evaluate: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Login no Confident AI + env: + CONFIDENT_API_KEY: ${{ secrets.CONFIDENT_API_KEY }} + run: deepeval login --confident-api-key $CONFIDENT_API_KEY + + - name: Rodar avaliação + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + run: deepeval test run tests/ + + # resultados já sobem automaticamente ao Confident AI via deepeval login diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17a35e9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ + +.env +*.env + +# Windows metadata +*:Zone.Identifier + +# Python +__pycache__/ +*.py[cod] +*.egg-info/ +dist/ +build/ +.venv/ +venv/ + +# ChromaDB (gerado localmente) +data/chroma_db/ + +# Pytest / coverage +.pytest_cache/ +.coverage +htmlcov/ diff --git a/data/docs/historia_ia.txt b/data/docs/historia_ia.txt new file mode 100644 index 0000000..e3d3421 --- /dev/null +++ b/data/docs/historia_ia.txt @@ -0,0 +1,27 @@ +História da Inteligência Artificial + +A inteligência artificial (IA) é um campo da ciência da computação dedicado a criar sistemas capazes de realizar tarefas que normalmente exigiriam inteligência humana. + +Origens (1950s) +O termo "inteligência artificial" foi cunhado por John McCarthy em 1956, durante a Conferência de Dartmouth, considerada o marco fundador da área. Alan Turing, em 1950, propôs o famoso "Teste de Turing" como critério para avaliar se uma máquina pode exibir comportamento inteligente equivalente ao humano. + +Inverno da IA (1970s–1980s) +Após promessas exageradas nas décadas de 1950 e 1960, o campo enfrentou dois períodos de desinvestimento chamados de "Invernos da IA". O primeiro ocorreu entre 1974 e 1980, o segundo entre 1987 e 1993. Nesses períodos, financiamentos foram cortados devido à falta de progresso real. + +Machine Learning (1990s–2000s) +Com o aumento da capacidade computacional e a disponibilidade de dados, algoritmos de aprendizado de máquina ganharam força. Redes neurais artificiais, baseadas no funcionamento do cérebro humano, foram revisitadas com novas arquiteturas. + +Deep Learning e a Era Moderna (2010s) +Em 2012, a rede neural AlexNet venceu a competição ImageNet com uma margem impressionante, inaugurando a era do deep learning. Modelos como GPT (Generative Pre-trained Transformer), desenvolvido pela OpenAI, revolucionaram o processamento de linguagem natural. + +GPT e Modelos de Linguagem +O GPT-3, lançado em 2020, possui 175 bilhões de parâmetros e foi um marco em geração de texto. O ChatGPT, lançado em novembro de 2022, atingiu 1 milhão de usuários em apenas 5 dias, tornando-se o produto de crescimento mais rápido da história. + +Aplicações Atuais +A IA é aplicada hoje em: diagnóstico médico, veículos autônomos, reconhecimento de voz e imagem, tradução automática, sistemas de recomendação (Netflix, Spotify), e assistentes virtuais como Siri, Alexa e Google Assistant. + +Desafios Éticos +Entre os principais desafios éticos estão: viés algorítmico, privacidade de dados, substituição de empregos, e o alinhamento de sistemas de IA com valores humanos. Organizações como o Future of Life Institute e a Anthropic trabalham em segurança de IA. + +Brasil e IA +O Brasil aprovou em 2024 um marco regulatório para inteligência artificial, tornando-se um dos primeiros países da América Latina a regulamentar a área. Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA. diff --git a/outputs/golden_dataset.csv b/outputs/golden_dataset.csv new file mode 100644 index 0000000..7a5f348 --- /dev/null +++ b/outputs/golden_dataset.csv @@ -0,0 +1,11 @@ +question,ground_truth,question_type +Quem cunhou o termo 'inteligência artificial' e em que ano?,"O termo 'inteligência artificial' foi cunhado por John McCarthy em 1956, durante a Conferência de Dartmouth.",simple +O que foi o Teste de Turing e quem o propôs?,O Teste de Turing foi proposto por Alan Turing em 1950 como critério para avaliar se uma máquina pode exibir comportamento inteligente equivalente ao humano.,simple +Quais foram os períodos dos dois 'Invernos da IA' e qual foi a causa do desinvestimento?,"O primeiro Inverno da IA ocorreu entre 1974 e 1980, e o segundo entre 1987 e 1993. Os financiamentos foram cortados nesses períodos devido à falta de progresso real, após promessas exageradas nas décadas de 1950 e 1960.",multi_context +Qual foi a importância da rede neural AlexNet para a história da inteligência artificial?,"Em 2012, a rede neural AlexNet venceu a competição ImageNet com uma margem impressionante, inaugurando a era do deep learning.",simple +Quantos parâmetros possui o GPT-3 e quando foi lançado?,"O GPT-3 foi lançado em 2020 e possui 175 bilhões de parâmetros, sendo um marco em geração de texto.",simple +Por que o ChatGPT é considerado o produto de crescimento mais rápido da história?,"O ChatGPT, lançado em novembro de 2022, atingiu 1 milhão de usuários em apenas 5 dias, o que o tornou o produto de crescimento mais rápido da história.",reasoning +"Considerando a linha do tempo da IA, quanto tempo se passou entre a proposta do Teste de Turing e o lançamento do ChatGPT?","O Teste de Turing foi proposto por Alan Turing em 1950 e o ChatGPT foi lançado em novembro de 2022, portanto se passaram 72 anos entre os dois eventos.",reasoning +Quais são os principais desafios éticos da inteligência artificial mencionados no texto e quais organizações trabalham para mitigá-los?,"Os principais desafios éticos mencionados são: viés algorítmico, privacidade de dados, substituição de empregos e o alinhamento de sistemas de IA com valores humanos. As organizações Future of Life Institute e a Anthropic trabalham em segurança de IA.",multi_context +Qual é a situação do Brasil em relação à regulamentação e à pesquisa em inteligência artificial?,"O Brasil aprovou em 2024 um marco regulatório para inteligência artificial, tornando-se um dos primeiros países da América Latina a regulamentar a área. Em pesquisa, centros como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.",multi_context +Quais são as aplicações atuais da inteligência artificial citadas no texto?,"As aplicações atuais da IA citadas no texto incluem: diagnóstico médico, veículos autônomos, reconhecimento de voz e imagem, tradução automática, sistemas de recomendação (como Netflix e Spotify) e assistentes virtuais como Siri, Alexa e Google Assistant.",simple diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ef85f67 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,24 @@ +[project] +name = "deepeval-project" +version = "0.1.0" +description = "RAG evaluation system using DeepEval + Confident AI" +requires-python = ">=3.11" +dependencies = [ + "deepeval>=0.21.0", + "anthropic>=0.20.0", + "pandas>=2.0.0", + "python-dotenv>=1.0.0", + "pytest>=7.4.0", + "pytest-asyncio>=0.21.0", +] + +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.backends.legacy:build" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +asyncio_mode = "auto" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..be35cb4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,26 @@ +# DeepEval-Project — dependências +# Sem OpenAI. 100% Anthropic. + +# ── Avaliação ───────────────────────────────── +deepeval>=0.21.0 + +# ── LLM juiz ────────────────────────────────── +anthropic>=0.20.0 + +# ── RAG pipeline ────────────────────────────── +langchain-community>=0.3.0 +langchain-text-splitters>=0.3.0 +langchain-huggingface>=0.1.0 +langchain-anthropic>=0.3.0 +langchain-core>=0.3.0 +langchain-classic>=1.0.0 +chromadb>=0.5.0 +sentence-transformers>=3.0.0 + +# ── Dados ───────────────────────────────────── +pandas>=2.0.0 +python-dotenv>=1.0.0 + +# ── Testes ──────────────────────────────────── +pytest>=7.4.0 +pytest-asyncio>=0.21.0 diff --git a/src/deepeval_project/__init__.py b/src/deepeval_project/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/deepeval_project/rag_pipeline.py b/src/deepeval_project/rag_pipeline.py new file mode 100644 index 0000000..e0291b7 --- /dev/null +++ b/src/deepeval_project/rag_pipeline.py @@ -0,0 +1,205 @@ +""" +rag_pipeline.py +--------------- +Pipeline RAG completo: + 1. Carrega documentos da pasta data/docs/ + 2. Divide em chunks + 3. Gera embeddings e armazena no ChromaDB (local) + 4. Recupera contexto relevante para uma pergunta + 5. Chama o LLM para gerar a resposta final + +Uso: + python -m deepeval_project.rag_pipeline + ou importe RAGPipeline em outros scripts. +""" + +import os +from pathlib import Path +from dotenv import load_dotenv + +from langchain_community.document_loaders import DirectoryLoader, TextLoader +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain_huggingface import HuggingFaceEmbeddings +from langchain_anthropic import ChatAnthropic +from langchain_community.vectorstores import Chroma +from langchain_classic.chains import RetrievalQA +from langchain_core.documents import Document + +load_dotenv() # carrega ANTHROPIC_API_KEY do arquivo .env + + +# ───────────────────────────────────────────── +# Configurações +# ───────────────────────────────────────────── +DOCS_DIR = Path(__file__).parent.parent.parent / "data" / "docs" +CHROMA_DIR = Path(__file__).parent.parent.parent / "data" / "chroma_db" + +CHUNK_SIZE = 500 # tamanho de cada chunk em caracteres +CHUNK_OVERLAP = 50 # sobreposição entre chunks +TOP_K_RETRIEVAL = 3 # quantos chunks recuperar por pergunta +LLM_MODEL = "claude-haiku-4-5-20251001" # modelo Anthropic a usar + + +# ───────────────────────────────────────────── +# Classe principal +# ───────────────────────────────────────────── +class RAGPipeline: + """ + Pipeline RAG reutilizável. + + Exemplo de uso: + rag = RAGPipeline() + rag.build() + result = rag.query("Quando foi cunhado o termo inteligência artificial?") + print(result["answer"]) + print(result["contexts"]) + """ + + def __init__(self): + # Embeddings gratuitos via HuggingFace (roda localmente, sem API key) + self.embeddings = HuggingFaceEmbeddings( + model_name="sentence-transformers/all-MiniLM-L6-v2" + ) + self.llm = ChatAnthropic(model=LLM_MODEL, temperature=0) + self.vectorstore = None + self.retriever = None + self.qa_chain = None + + # ── 1. Carregar documentos ────────────────── + def load_documents(self) -> list[Document]: + """Carrega todos os .txt e .pdf da pasta de dados.""" + print(f"Carregando documentos de: {DOCS_DIR}") + + loader = DirectoryLoader( + str(DOCS_DIR), + glob="**/*.txt", + loader_cls=TextLoader, + loader_kwargs={"encoding": "utf-8"}, + show_progress=True, + ) + docs = loader.load() + print(f"{len(docs)} arquivo(s) carregado(s)") + return docs + + # ── 2. Dividir em chunks ──────────────────── + def split_documents(self, docs: list[Document]) -> list[Document]: + """Divide documentos em chunks menores.""" + splitter = RecursiveCharacterTextSplitter( + chunk_size=CHUNK_SIZE, + chunk_overlap=CHUNK_OVERLAP, + separators=["\n\n", "\n", ". ", " ", ""], + ) + chunks = splitter.split_documents(docs) + print(f"{len(chunks)} chunks gerados (tamanho={CHUNK_SIZE}, overlap={CHUNK_OVERLAP})") + return chunks + + # ── 3. Criar / carregar VectorStore ──────── + def build_vectorstore(self, chunks: list[Document]) -> Chroma: + """Cria embeddings e persiste no ChromaDB local.""" + print(f"Gerando embeddings e armazenando em: {CHROMA_DIR}") + vectorstore = Chroma.from_documents( + documents=chunks, + embedding=self.embeddings, + persist_directory=str(CHROMA_DIR), + ) + print(f"VectorStore criado com {vectorstore._collection.count()} vetores") + return vectorstore + + def load_vectorstore(self) -> Chroma: + """Carrega um VectorStore já existente (evita reprocessar).""" + print(f"Carregando VectorStore existente de: {CHROMA_DIR}") + return Chroma( + persist_directory=str(CHROMA_DIR), + embedding_function=self.embeddings, + ) + + # ── 4. Montar pipeline completo ───────────── + def build(self, force_rebuild: bool = False): + """ + Monta o pipeline completo. + Se o ChromaDB já existir, reutiliza (a menos que force_rebuild=True). + """ + if CHROMA_DIR.exists() and not force_rebuild: + self.vectorstore = self.load_vectorstore() + else: + docs = self.load_documents() + chunks = self.split_documents(docs) + self.vectorstore = self.build_vectorstore(chunks) + + self.retriever = self.vectorstore.as_retriever( + search_type="similarity", + search_kwargs={"k": TOP_K_RETRIEVAL}, + ) + + self.qa_chain = RetrievalQA.from_chain_type( + llm=self.llm, + chain_type="stuff", # "stuff" = concatena todos os chunks no prompt + retriever=self.retriever, + return_source_documents=True, # retorna os chunks usados + ) + print("Pipeline RAG pronto!\n") + + # ── 5. Consultar ──────────────────────────── + def query(self, question: str) -> dict: + """ + Faz uma pergunta ao sistema RAG. + + Retorna: + { + "question": str, + "answer": str, + "contexts": list[str], # textos dos chunks recuperados + "sources": list[str], # caminhos dos arquivos fonte + } + """ + if not self.qa_chain: + raise RuntimeError("Pipeline não iniciado. Chame .build() primeiro.") + + result = self.qa_chain.invoke({"query": question}) + + contexts = [doc.page_content for doc in result["source_documents"]] + sources = [doc.metadata.get("source", "desconhecido") for doc in result["source_documents"]] + + return { + "question": question, + "answer": result["result"], + "contexts": contexts, + "sources": sources, + } + + # ── 6. Consultas em batch ─────────────────── + def query_batch(self, questions: list[str]) -> list[dict]: + """Faz múltiplas perguntas e retorna lista de resultados.""" + results = [] + for i, q in enumerate(questions, 1): + print(f" [{i}/{len(questions)}] {q[:60]}...") + results.append(self.query(q)) + return results + + +# ───────────────────────────────────────────── +# Execução direta (teste rápido) +# ───────────────────────────────────────────── +if __name__ == "__main__": + rag = RAGPipeline() + rag.build() + + perguntas_teste = [ + "Quando foi cunhado o termo inteligência artificial?", + "O que foi o Inverno da IA?", + "Quantos parâmetros tem o GPT-3?", + "Como o ChatGPT cresceu rapidamente?", + ] + + print("=" * 60) + print("TESTE DO PIPELINE RAG") + print("=" * 60) + + for pergunta in perguntas_teste: + resultado = rag.query(pergunta) + print(f"\n❓ Pergunta: {resultado['question']}") + print(f"💬 Resposta: {resultado['answer']}") + print(f"📄 Contextos ({len(resultado['contexts'])} chunks):") + for i, ctx in enumerate(resultado["contexts"], 1): + print(f" [{i}] {ctx[:120]}...") + print("-" * 60) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..232bfa0 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,84 @@ +""" +conftest.py +Carregado automaticamente pelo Pytest antes de qualquer teste. + +ClaudeJudge: juiz LLM 100% Anthropic. +Sem OpenAI, sem LangchainLLMWrapper, sem ValueError. +""" + +import pytest +import pandas as pd +import anthropic +from deepeval.models import DeepEvalBaseLLM + + +# ───────────────────────────────────────────────────────── +# Juiz LLM +# ───────────────────────────────────────────────────────── + +class ClaudeJudge(DeepEvalBaseLLM): + """ + Juiz LLM usando Claude Sonnet via Anthropic. + + No RAGAS-Project, o llm_factory do RAGAS 0.3.x/0.4.x + só aceitava OpenAI nativamente — qualquer tentativa com Claude + gerava ValueError: Collections metrics only support modern InstructorLLM. + + Aqui não há esse problema: o DeepEval aceita qualquer LLM + que implemente esta interface. + """ + + def __init__(self, model: str = "claude-sonnet-4-6"): + self.model_name = model + self.client = anthropic.Anthropic() + + def load_model(self): + return self.client + + def generate(self, prompt: str) -> str: + response = self.client.messages.create( + model=self.model_name, + max_tokens=1000, + messages=[{"role": "user", "content": prompt}] + ) + return response.content[0].text + + async def a_generate(self, prompt: str) -> str: + return self.generate(prompt) + + def get_model_name(self) -> str: + return self.model_name + + +# ───────────────────────────────────────────────────────── +# Fixtures compartilhadas +# ───────────────────────────────────────────────────────── + +@pytest.fixture(scope="session") +def judge(): + """ + Instancia o ClaudeJudge uma única vez por sessão. + scope="session" evita criar N conexões com a API Anthropic. + """ + return ClaudeJudge() + + +@pytest.fixture(scope="session") +def golden_dataset(): + """ + Carrega o golden_dataset.csv gerado pelo RAGAS-Project. + Arquivo esperado em: data/golden_dataset.csv + + Colunas (mesmo formato do RAGAS-Project): + question → input do LLMTestCase + answer → actual_output (resposta do RAG) + contexts → retrieval_context (chunks recuperados) + ground_truth → expected_output + """ + df = pd.read_csv("outputs/golden_dataset.csv") + + # contexts vem como string no CSV — converter para lista + df["contexts"] = df["contexts"].apply( + lambda x: x.split("|||") if isinstance(x, str) else [str(x)] + ) + return df diff --git a/tests/test_evaluate.py b/tests/test_evaluate.py new file mode 100644 index 0000000..d10c61a --- /dev/null +++ b/tests/test_evaluate.py @@ -0,0 +1,128 @@ +""" +tests/test_evaluate.py +As 5 métricas equivalentes às do RAGAS-Project. + +Comparação direta: + + RAGAS-Project (evaluate.py) DeepEval-Project (este arquivo) + ───────────────────────────── ────────────────────────────────────── + Faithfulness → FaithfulnessMetric + Answer Correctness → AnswerCorrectnessMetric + Answer Relevance → AnswerRelevancyMetric + Context Precision → ContextualPrecisionMetric + Context Recall → ContextualRecallMetric + +Diferenças chave: + - Resultado é PASSED/FAILED, não um score solto + - Cada falha vem com reasoning explicando o motivo + - Não depende de OpenAI para embeddings (Answer Relevancy) + - Resultados sobem automaticamente ao Confident AI +""" + +import pytest +from deepeval import assert_test +from deepeval.test_case import LLMTestCase +from deepeval.metrics import ( + FaithfulnessMetric, + AnswerCorrectnessMetric, + AnswerRelevancyMetric, + ContextualPrecisionMetric, + ContextualRecallMetric, +) + + +# ───────────────────────────────────────────────────────── +# Helper +# ───────────────────────────────────────────────────────── + +def build_test_cases(golden_dataset): + """Converte o golden_dataset em lista de LLMTestCase.""" + test_cases = [] + for _, row in golden_dataset.iterrows(): + test_cases.append(LLMTestCase( + input=row["question"], + actual_output=row["answer"], + retrieval_context=row["contexts"], + expected_output=row["ground_truth"], + )) + return test_cases + + +# ───────────────────────────────────────────────────────── +# Testes — um por métrica para isolar falhas +# ───────────────────────────────────────────────────────── + +def test_faithfulness(judge, golden_dataset): + """ + RAGAS equivalente: Faithfulness + Pergunta: a resposta está baseada no contexto ou o LLM inventou? + + No RAGAS-Project, execução 1 deu 1.00 e execução 2 deu 0.81. + Aqui o threshold 0.7 resolve a variância: ambas seriam PASSED. + """ + metric = FaithfulnessMetric(threshold=0.7, model=judge) + for tc in build_test_cases(golden_dataset): + assert_test(tc, [metric]) + + +def test_correctness(judge, golden_dataset): + """ + RAGAS equivalente: Answer Correctness + Pergunta: a resposta corresponde ao ground truth? + + No RAGAS-Project: execução 1 = 0.86, execução 2 = 0.80. + """ + metric = AnswerCorrectnessMetric(threshold=0.7, model=judge) + for tc in build_test_cases(golden_dataset): + assert_test(tc, [metric]) + + +def test_relevancy(judge, golden_dataset): + """ + RAGAS equivalente: Answer Relevance + Pergunta: a resposta é relevante para a pergunta feita? + + Diferença crítica: o RAGAS 0.1.21 usava OpenAI Embeddings + internamente (text-embedding-ada-002) para calcular esta métrica, + independente da configuração. O DeepEval usa o juiz LLM — sem OpenAI. + """ + metric = AnswerRelevancyMetric(threshold=0.7, model=judge) + for tc in build_test_cases(golden_dataset): + assert_test(tc, [metric]) + + +def test_context_precision(judge, golden_dataset): + """ + RAGAS equivalente: Context Precision + Pergunta: os chunks recuperados são precisos para a pergunta? + """ + metric = ContextualPrecisionMetric(threshold=0.7, model=judge) + for tc in build_test_cases(golden_dataset): + assert_test(tc, [metric]) + + +def test_context_recall(judge, golden_dataset): + """ + RAGAS equivalente: Context Recall + Pergunta: o contexto cobriu o necessário para a resposta correta? + """ + metric = ContextualRecallMetric(threshold=0.7, model=judge) + for tc in build_test_cases(golden_dataset): + assert_test(tc, [metric]) + + +def test_suite_completa(judge, golden_dataset): + """ + Equivalente ao evaluate() do RAGAS — todas as métricas de uma vez. + Use para ter o panorama geral antes de investigar falhas individuais. + Os resultados desta run ficam no Confident AI para comparar com runs futuras. + """ + metrics = [ + FaithfulnessMetric(threshold=0.7, model=judge), + AnswerCorrectnessMetric(threshold=0.7, model=judge), + AnswerRelevancyMetric(threshold=0.7, model=judge), + ContextualPrecisionMetric(threshold=0.7, model=judge), + ContextualRecallMetric(threshold=0.7, model=judge), + ] + for tc in build_test_cases(golden_dataset): + assert_test(tc, metrics) diff --git a/tests/test_geval.py b/tests/test_geval.py new file mode 100644 index 0000000..709aa94 --- /dev/null +++ b/tests/test_geval.py @@ -0,0 +1,171 @@ +""" +tests/test_geval.py +Métricas G-Eval customizadas para o domínio do historia_ia.txt. + +Estas métricas não existem no RAGAS-Project. +Capturam erros que o RAGAS marcava como corretos porque +usava similaridade matemática, não julgamento de domínio. + +Problemas documentados no RAGAS-Project que estas métricas resolvem: + + 1. Variância entre execuções (0.81 vs 0.86): + → completude_resposta tem critério explícito, resultado estável + + 2. Faithfulness 1.00 mesmo com conhecimento externo: + → sem_conhecimento_externo detecta quando o LLM vai além do documento + + 3. Erros factuais históricos com score alto: + → precisao_historica penaliza datas e nomes errados explicitamente +""" + +import pytest +from deepeval import assert_test +from deepeval.test_case import LLMTestCase, LLMTestCaseParams +from deepeval.metrics import GEval + + +# ───────────────────────────────────────────────────────── +# Métricas G-Eval +# ───────────────────────────────────────────────────────── + +@pytest.fixture(scope="module") +def precisao_historica(judge): + """ + Detecta respostas com datas, nomes ou eventos históricos incorretos. + + Problema no RAGAS-Project: o RAGAS calculava similaridade semântica — + "anos 50" e "1950" são semanticamente próximos, score alto. + Mas "Conferência de Dartmouth em 1954" (errado) vs "1956" (correto) + também são próximos e o RAGAS não pegava o erro. + """ + return GEval( + name="precisao_historica", + criteria=""" + Avalie se as informações históricas na resposta estão corretas. + Verifique: datas, nomes de pesquisadores, nomes de marcos tecnológicos + e sequência cronológica dos eventos sobre história da Inteligência Artificial. + Qualquer erro factual — mesmo que a resposta pareça semanticamente correta — + deve resultar em score baixo. + Score 1.0 = todos os fatos históricos corretos e verificáveis. + Score 0.0 = contém pelo menos um erro factual histórico. + """, + evaluation_params=[ + LLMTestCaseParams.INPUT, + LLMTestCaseParams.ACTUAL_OUTPUT, + LLMTestCaseParams.EXPECTED_OUTPUT, + ], + threshold=0.85, + model=judge, + ) + + +@pytest.fixture(scope="module") +def sem_conhecimento_externo(judge): + """ + Detecta quando o RAG usa conhecimento do LLM além do documento. + + Problema no RAGAS-Project: Faithfulness marcava 1.00 em casos onde + o LLM completava respostas com conhecimento geral sobre IA que não + estava no historia_ia.txt. O RAGAS só verificava se as afirmações + podiam ser inferidas do contexto — não se vinham de outro lugar. + """ + return GEval( + name="sem_conhecimento_externo", + criteria=""" + Verifique se a resposta contém APENAS informações presentes + no contexto recuperado do documento. + O sistema RAG deve responder somente com base no texto fornecido — + não com conhecimento geral sobre Inteligência Artificial. + Se a resposta inclui detalhes corretos mas ausentes no contexto + recuperado, isso é uma falha: o LLM está usando conhecimento externo. + Score 1.0 = resposta 100% baseada no contexto recuperado. + Score 0.0 = resposta usa informações fora do contexto. + """, + evaluation_params=[ + LLMTestCaseParams.ACTUAL_OUTPUT, + LLMTestCaseParams.RETRIEVAL_CONTEXT, + ], + threshold=0.9, + model=judge, + ) + + +@pytest.fixture(scope="module") +def completude_resposta(judge): + """ + Detecta respostas parciais que o RAGAS marcava como corretas. + + Problema no RAGAS-Project: respostas que cobriam apenas parte + do ground truth geravam scores oscilando entre execuções (0.80, 0.86) + porque a similaridade semântica é sensível a pequenas variações. + Aqui o critério é explícito: omissões são penalizadas, extras não. + """ + return GEval( + name="completude_resposta", + criteria=""" + Verifique se a resposta cobre TODOS os aspectos relevantes da pergunta + com base no ground truth fornecido. + Penalize respostas que omitem partes importantes do que foi perguntado. + Não penalize por informações adicionais corretas. + Score 1.0 = cobre completamente o que o ground truth especifica. + Score 0.0 = omite aspectos centrais da resposta esperada. + """, + evaluation_params=[ + LLMTestCaseParams.INPUT, + LLMTestCaseParams.ACTUAL_OUTPUT, + LLMTestCaseParams.EXPECTED_OUTPUT, + ], + threshold=0.75, + model=judge, + ) + + +# ───────────────────────────────────────────────────────── +# Testes +# ───────────────────────────────────────────────────────── + +def test_precisao_historica(precisao_historica, golden_dataset): + """ + Garante que o RAG não erra fatos históricos mesmo quando + a resposta parece semanticamente correta ao RAGAS. + """ + for _, row in golden_dataset.iterrows(): + tc = LLMTestCase( + input=row["question"], + actual_output=row["answer"], + retrieval_context=row["contexts"], + expected_output=row["ground_truth"], + ) + assert_test(tc, [precisao_historica]) + + +def test_sem_conhecimento_externo(sem_conhecimento_externo, golden_dataset): + """ + Detecta alucinação fundamentada — o LLM completa com + conhecimento próprio mesmo quando o contexto é suficiente. + Este é o caso que o RAGAS-Project marcava como Faithfulness 1.00. + """ + for _, row in golden_dataset.iterrows(): + tc = LLMTestCase( + input=row["question"], + actual_output=row["answer"], + retrieval_context=row["contexts"], + expected_output=row["ground_truth"], + ) + assert_test(tc, [sem_conhecimento_externo]) + + +def test_completude_resposta(completude_resposta, golden_dataset): + """ + Resolve o problema de variância do RAGAS-Project. + Respostas parciais tinham scores oscilando entre execuções. + Aqui o critério é explícito — omissões são sempre penalizadas. + """ + for _, row in golden_dataset.iterrows(): + tc = LLMTestCase( + input=row["question"], + actual_output=row["answer"], + retrieval_context=row["contexts"], + expected_output=row["ground_truth"], + ) + assert_test(tc, [completude_resposta]) From e0eca4b83b861d71a2afba53c6b02566c1d250a1 Mon Sep 17 00:00:00 2001 From: RegiMaria Date: Sun, 29 Mar 2026 19:52:44 -0300 Subject: [PATCH 2/4] feat: generate RAG answers and contexts dynamically in pytest fixture --- tests/conftest.py | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 232bfa0..8c7b814 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -66,19 +66,35 @@ def judge(): @pytest.fixture(scope="session") def golden_dataset(): """ - Carrega o golden_dataset.csv gerado pelo RAGAS-Project. - Arquivo esperado em: data/golden_dataset.csv - - Colunas (mesmo formato do RAGAS-Project): - question → input do LLMTestCase - answer → actual_output (resposta do RAG) - contexts → retrieval_context (chunks recuperados) - ground_truth → expected_output + Carrega o golden_dataset.csv e enriquece com answer e contexts + gerados pelo pipeline RAG em tempo de execução. + + Colunas do CSV: + question → input do LLMTestCase + ground_truth → expected_output + question_type → informativo (simple, multi_context…) + + Colunas adicionadas pelo pipeline: + answer → actual_output (resposta gerada pelo RAG) + contexts → retrieval_context (chunks recuperados) """ + import sys + import os + sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src")) + from deepeval_project.rag_pipeline import RAGPipeline + df = pd.read_csv("outputs/golden_dataset.csv") - # contexts vem como string no CSV — converter para lista - df["contexts"] = df["contexts"].apply( - lambda x: x.split("|||") if isinstance(x, str) else [str(x)] - ) + rag = RAGPipeline() + rag.build() + + answers = [] + contexts_list = [] + for question in df["question"]: + result = rag.query(question) + answers.append(result["answer"]) + contexts_list.append(result["contexts"]) + + df["answer"] = answers + df["contexts"] = contexts_list return df From d9015037dcb8adc9cf859bc2636d382a942d40ba Mon Sep 17 00:00:00 2001 From: RegiMaria Date: Sun, 29 Mar 2026 20:00:51 -0300 Subject: [PATCH 3/4] fix: replace AnswerCorrectnessMetric with GEval due to deepeval 3.9.x compatibility --- tests/test_evaluate.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/tests/test_evaluate.py b/tests/test_evaluate.py index d10c61a..295c145 100644 --- a/tests/test_evaluate.py +++ b/tests/test_evaluate.py @@ -7,7 +7,7 @@ RAGAS-Project (evaluate.py) DeepEval-Project (este arquivo) ───────────────────────────── ────────────────────────────────────── Faithfulness → FaithfulnessMetric - Answer Correctness → AnswerCorrectnessMetric + Answer Correctness → GEval (corretude customizada) Answer Relevance → AnswerRelevancyMetric Context Precision → ContextualPrecisionMetric Context Recall → ContextualRecallMetric @@ -21,10 +21,10 @@ import pytest from deepeval import assert_test -from deepeval.test_case import LLMTestCase +from deepeval.test_case import LLMTestCase, LLMTestCaseParams from deepeval.metrics import ( FaithfulnessMetric, - AnswerCorrectnessMetric, + GEval, AnswerRelevancyMetric, ContextualPrecisionMetric, ContextualRecallMetric, @@ -71,8 +71,19 @@ def test_correctness(judge, golden_dataset): Pergunta: a resposta corresponde ao ground truth? No RAGAS-Project: execução 1 = 0.86, execução 2 = 0.80. + AnswerCorrectnessMetric não existe no deepeval 3.9.x — substituído por GEval. """ - metric = AnswerCorrectnessMetric(threshold=0.7, model=judge) + metric = GEval( + name="answer_correctness", + criteria="Determine se a resposta está correta e alinhada com o ground truth fornecido.", + evaluation_params=[ + LLMTestCaseParams.INPUT, + LLMTestCaseParams.ACTUAL_OUTPUT, + LLMTestCaseParams.EXPECTED_OUTPUT, + ], + threshold=0.7, + model=judge, + ) for tc in build_test_cases(golden_dataset): assert_test(tc, [metric]) @@ -119,7 +130,17 @@ def test_suite_completa(judge, golden_dataset): """ metrics = [ FaithfulnessMetric(threshold=0.7, model=judge), - AnswerCorrectnessMetric(threshold=0.7, model=judge), + GEval( + name="answer_correctness", + criteria="Determine se a resposta está correta e alinhada com o ground truth fornecido.", + evaluation_params=[ + LLMTestCaseParams.INPUT, + LLMTestCaseParams.ACTUAL_OUTPUT, + LLMTestCaseParams.EXPECTED_OUTPUT, + ], + threshold=0.7, + model=judge, + ), AnswerRelevancyMetric(threshold=0.7, model=judge), ContextualPrecisionMetric(threshold=0.7, model=judge), ContextualRecallMetric(threshold=0.7, model=judge), From 9a453eb3cb56ba68c4a27eee7957b7478ded4d6f Mon Sep 17 00:00:00 2001 From: RegiMaria Date: Sun, 29 Mar 2026 21:07:50 -0300 Subject: [PATCH 4/4] feat: add deepeval evaluation reports --- .deepeval/.deepeval-cache.json | 1 + .deepeval/.deepeval_telemetry.txt | 4 + .deepeval/.latest_test_run.json | 1 + .gitignore | 1 + index.html | 620 ++++++++++++++++++++++++++++++ resultados_deepeval_run2.html | 168 ++++++++ 6 files changed, 795 insertions(+) create mode 100644 .deepeval/.deepeval-cache.json create mode 100644 .deepeval/.deepeval_telemetry.txt create mode 100644 .deepeval/.latest_test_run.json create mode 100644 index.html create mode 100644 resultados_deepeval_run2.html diff --git a/.deepeval/.deepeval-cache.json b/.deepeval/.deepeval-cache.json new file mode 100644 index 0000000..5b6ebf1 --- /dev/null +++ b/.deepeval/.deepeval-cache.json @@ -0,0 +1 @@ +{"test_cases_lookup_map": {"{\"actual_output\": \"De acordo com o contexto fornecido, o termo \\\"intelig\\u00eancia artificial\\\" foi cunhado por **John McCarthy em 1956**, durante a Confer\\u00eancia de Dartmouth, que \\u00e9 considerada o marco fundador da \\u00e1rea.\", \"context\": null, \"expected_output\": \"O termo 'intelig\\u00eancia artificial' foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth.\", \"hyperparameters\": null, \"input\": \"Quem cunhou o termo 'intelig\\u00eancia artificial' e em que ano?\", \"retrieval_context\": [\"Brasil e IA\\nO Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\", \"Hist\\u00f3ria da Intelig\\u00eancia Artificial\\n\\nA intelig\\u00eancia artificial (IA) \\u00e9 um campo da ci\\u00eancia da computa\\u00e7\\u00e3o dedicado a criar sistemas capazes de realizar tarefas que normalmente exigiriam intelig\\u00eancia humana.\", \"Origens (1950s)\\nO termo \\\"intelig\\u00eancia artificial\\\" foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth, considerada o marco fundador da \\u00e1rea. Alan Turing, em 1950, prop\\u00f4s o famoso \\\"Teste de Turing\\\" como crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Faithfulness", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because the actual output is perfectly faithful to the retrieval context with no contradictions found!", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Truths (limit=None):\n[\n \"A intelig\u00eancia artificial (IA) \u00e9 um campo da ci\u00eancia da computa\u00e7\u00e3o dedicado a criar sistemas capazes de realizar tarefas que normalmente exigiriam intelig\u00eancia humana.\",\n \"O Brasil aprovou em 2024 um marco regulat\u00f3rio para intelig\u00eancia artificial.\",\n \"O Brasil tornou-se um dos primeiros pa\u00edses da Am\u00e9rica Latina a regulamentar a intelig\u00eancia artificial.\",\n \"O IMPA \u00e9 um centro de pesquisa brasileiro com grupos ativos de pesquisa em IA.\",\n \"A USP e a UNICAMP s\u00e3o universidades brasileiras que possuem grupos ativos de pesquisa em IA.\",\n \"O termo 'intelig\u00eancia artificial' foi cunhado por John McCarthy em 1956.\",\n \"A Confer\u00eancia de Dartmouth, realizada em 1956, \u00e9 considerada o marco fundador da intelig\u00eancia artificial.\",\n \"Alan Turing prop\u00f4s o 'Teste de Turing' em 1950.\",\n \"O Teste de Turing \u00e9 um crit\u00e9rio para avaliar se uma m\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\"\n] \n \nClaims:\n[\n \"The term 'artificial intelligence' was coined by John McCarthy in 1956.\",\n \"The term 'artificial intelligence' was coined during the Dartmouth Conference.\",\n \"The Dartmouth Conference is considered the founding milestone of the field of artificial intelligence.\"\n] \n \nVerdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": null\n },\n {\n \"verdict\": \"idk\",\n \"reason\": \"The retrieval context states that the term 'artificial intelligence' was coined by John McCarthy in 1956, and separately that the Dartmouth Conference was held in 1956. However, the context does not explicitly state that the term was coined during the Dartmouth Conference itself.\"\n },\n {\n \"verdict\": \"yes\",\n \"reason\": null\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}, {"metric_data": {"name": "answer_correctness [GEval]", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The Actual Output matches the Expected Output perfectly in all key facts: John McCarthy coined the term 'artificial intelligence' in 1956 during the Dartmouth Conference. The additional phrase 'considered the founding milestone of the field' is a minor elaboration that does not contradict any information. The response is accurate, relevant, and complete.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Criteria:\nDetermine se a resposta est\u00e1 correta e alinhada com o ground truth fornecido. \n \nEvaluation Steps:\n[\n \"Compare the Actual Output with the Expected Output to check if the core answer or conclusion matches, even if the wording differs.\",\n \"Evaluate whether the Actual Output correctly addresses the question or task presented in the Input, ensuring relevance and completeness.\",\n \"Check for factual accuracy in the Actual Output by verifying that all key information aligns with the Expected Output, identifying any contradictions or missing critical details.\",\n \"Determine if any discrepancies between the Actual Output and Expected Output are minor (e.g., formatting, synonyms) or major (e.g., incorrect facts, wrong conclusions), and classify the response as correct only if major discrepancies are absent.\"\n] \n \nRubric:\nNone \n \nScore: 1.0"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "criteria": "Determine se a resposta est\u00e1 correta e alinhada com o ground truth fornecido.", "include_reason": false, "evaluation_steps": ["Compare the Actual Output with the Expected Output to check if the core answer or conclusion matches, even if the wording differs.", "Evaluate whether the Actual Output correctly addresses the question or task presented in the Input, ensuring relevance and completeness.", "Check for factual accuracy in the Actual Output by verifying that all key information aligns with the Expected Output, identifying any contradictions or missing critical details.", "Determine if any discrepancies between the Actual Output and Expected Output are minor (e.g., formatting, synonyms) or major (e.g., incorrect facts, wrong conclusions), and classify the response as correct only if major discrepancies are absent."], "evaluation_params": ["input", "actual_output", "expected_output"]}}, {"metric_data": {"name": "Answer Relevancy", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because the response is perfectly relevant, directly addressing the question about who coined the term 'artificial intelligence' and in what year. No irrelevant statements were found!", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Statements:\n[\n \"The term 'artificial intelligence' was coined by John McCarthy in 1956.\",\n \"The term was introduced during the Dartmouth Conference.\",\n \"The Dartmouth Conference is considered the founding milestone of the field of artificial intelligence.\"\n] \n \nVerdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": null\n },\n {\n \"verdict\": \"yes\",\n \"reason\": null\n },\n {\n \"verdict\": \"idk\",\n \"reason\": \"This statement provides contextual background about the Dartmouth Conference being a founding milestone of AI, but does not directly address who coined the term or in what year.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}, {"metric_data": {"name": "Contextual Precision", "threshold": 0.7, "success": false, "score": 0.3333333333333333, "reason": "The score is 0.33 because the only relevant node, which explicitly states that 'O termo \"intelig\u00eancia artificial\" foi cunhado por John McCarthy em 1956, durante a Confer\u00eancia de Dartmouth', is ranked third (last) instead of first. The first node, which only provides a general definition of AI without mentioning who coined the term or in what year, and the second node, which discusses Brazil's AI regulatory framework and research centers and is completely unrelated to the question, are both ranked higher than the relevant node, negatively impacting the contextual precision score.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"no\",\n \"reason\": \"The context provides a general definition of AI but does not mention who coined the term or in what year, making it not useful for arriving at the expected output.\"\n },\n {\n \"verdict\": \"no\",\n \"reason\": \"The context discusses Brazil's AI regulatory framework and research centers, which is completely unrelated to who coined the term 'artificial intelligence' and in what year.\"\n },\n {\n \"verdict\": \"yes\",\n \"reason\": \"The context explicitly states that 'O termo \\\"intelig\\u00eancia artificial\\\" foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth', which directly matches the expected output.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}, {"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because the expected output is fully supported by node 3 in retrieval context, which explicitly contains the exact information about the term 'intelig\u00eancia artificial' being coined by John McCarthy in 1956 at the Dartmouth Conference.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The 3rd node in the retrieval context explicitly states: 'O termo \\\"intelig\\u00eancia artificial\\\" foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth...', which directly supports this sentence.\",\n \"expected_output\": \"O termo 'intelig\\u00eancia artificial' foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"O **Teste de Turing** foi proposto por **Alan Turing em 1950** como um crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\\n\\nBasicamente, o teste funciona como um m\\u00e9todo para determinar se uma m\\u00e1quina consegue demonstrar intelig\\u00eancia indistingu\\u00edvel da de um ser humano, atrav\\u00e9s de intera\\u00e7\\u00f5es e conversas.\", \"context\": null, \"expected_output\": \"O Teste de Turing foi proposto por Alan Turing em 1950 como crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\", \"hyperparameters\": null, \"input\": \"O que foi o Teste de Turing e quem o prop\\u00f4s?\", \"retrieval_context\": [\"Brasil e IA\\nO Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\", \"Machine Learning (1990s\\u20132000s)\\nCom o aumento da capacidade computacional e a disponibilidade de dados, algoritmos de aprendizado de m\\u00e1quina ganharam for\\u00e7a. Redes neurais artificiais, baseadas no funcionamento do c\\u00e9rebro humano, foram revisitadas com novas arquiteturas.\", \"Origens (1950s)\\nO termo \\\"intelig\\u00eancia artificial\\\" foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth, considerada o marco fundador da \\u00e1rea. Alan Turing, em 1950, prop\\u00f4s o famoso \\\"Teste de Turing\\\" como crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because sentence 1 is fully supported by node 1 in retrieval context, which directly attributes the proposal of the Teste de Turing to Alan Turing in 1950 as a criterion for evaluating machine intelligence equivalent to humans. Perfect match!", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The 1st node in the retrieval context directly states 'Alan Turing, em 1950, prop\\u00f4s o famoso \\\"Teste de Turing\\\" como crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano,' which fully supports this sentence.\",\n \"expected_output\": \"O Teste de Turing foi proposto por Alan Turing em 1950 como crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"# Os Dois Invernos da IA\\n\\n## Per\\u00edodos\\n\\n1. **Primeiro Inverno**: 1974 a 1980\\n2. **Segundo Inverno**: 1987 a 1993\\n\\n## Causa do Desinvestimento\\n\\nA principal causa foi a **falta de progresso real** no campo da IA. Ap\\u00f3s promessas exageradas feitas nas d\\u00e9cadas de 1950 e 1960, o campo n\\u00e3o conseguiu entregar os resultados esperados, o que levou ao corte de financiamentos durante esses per\\u00edodos.\", \"context\": null, \"expected_output\": \"O primeiro Inverno da IA ocorreu entre 1974 e 1980, e o segundo entre 1987 e 1993. Os financiamentos foram cortados nesses per\\u00edodos devido \\u00e0 falta de progresso real, ap\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960.\", \"hyperparameters\": null, \"input\": \"Quais foram os per\\u00edodos dos dois 'Invernos da IA' e qual foi a causa do desinvestimento?\", \"retrieval_context\": [\"Aplica\\u00e7\\u00f5es Atuais\\nA IA \\u00e9 aplicada hoje em: diagn\\u00f3stico m\\u00e9dico, ve\\u00edculos aut\\u00f4nomos, reconhecimento de voz e imagem, tradu\\u00e7\\u00e3o autom\\u00e1tica, sistemas de recomenda\\u00e7\\u00e3o (Netflix, Spotify), e assistentes virtuais como Siri, Alexa e Google Assistant.\", \"Desafios \\u00c9ticos\\nEntre os principais desafios \\u00e9ticos est\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos, e o alinhamento de sistemas de IA com valores humanos. Organiza\\u00e7\\u00f5es como o Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\", \"Inverno da IA (1970s\\u20131980s)\\nAp\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960, o campo enfrentou dois per\\u00edodos de desinvestimento chamados de \\\"Invernos da IA\\\". O primeiro ocorreu entre 1974 e 1980, o segundo entre 1987 e 1993. Nesses per\\u00edodos, financiamentos foram cortados devido \\u00e0 falta de progresso real.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because all sentences in the expected output are fully supported by node 1 in retrieval context, which explicitly mentions the dates of both AI Winters (1974-1980 and 1987-1993) and the reasons for funding cuts due to lack of real progress after exaggerated promises in the 1950s and 1960s. Great job!", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The 1st node in the retrieval context directly states 'O primeiro ocorreu entre 1974 e 1980, o segundo entre 1987 e 1993' and 'financiamentos foram cortados devido \\u00e0 falta de progresso real, ap\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960', which fully supports this sentence.\",\n \"expected_output\": \"O primeiro Inverno da IA ocorreu entre 1974 e 1980, e o segundo entre 1987 e 1993. Os financiamentos foram cortados nesses per\\u00edodos devido \\u00e0 falta de progresso real, ap\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960.\"\n },\n {\n \"verdict\": \"yes\",\n \"reason\": \"The 1st node in the retrieval context explicitly mentions 'Ap\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960...' and 'financiamentos foram cortados devido \\u00e0 falta de progresso real', directly attributing this sentence.\",\n \"expected_output\": \"O primeiro Inverno da IA ocorreu entre 1974 e 1980, e o segundo entre 1987 e 1993. Os financiamentos foram cortados nesses per\\u00edodos devido \\u00e0 falta de progresso real, ap\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"De acordo com o contexto fornecido, a rede neural AlexNet teve uma import\\u00e2ncia fundamental para a hist\\u00f3ria da intelig\\u00eancia artificial:\\n\\nEm 2012, a AlexNet venceu a competi\\u00e7\\u00e3o ImageNet com uma margem impressionante, **inaugurando a era do deep learning**. Essa vit\\u00f3ria marcou um ponto de inflex\\u00e3o, demonstrando o potencial das redes neurais profundas e levando a um avan\\u00e7o significativo no campo da IA.\\n\\nEssa conquista foi t\\u00e3o relevante que ajudou a impulsionar o desenvolvimento de modelos subsequentes, como o GPT (Generative Pre-trained Transformer), que revolucionaram o processamento de linguagem natural.\\n\\nEm resumo, a AlexNet foi importante porque provou a efic\\u00e1cia do deep learning em larga escala, abrindo caminho para a era moderna da intelig\\u00eancia artificial que vivemos hoje.\", \"context\": null, \"expected_output\": \"Em 2012, a rede neural AlexNet venceu a competi\\u00e7\\u00e3o ImageNet com uma margem impressionante, inaugurando a era do deep learning.\", \"hyperparameters\": null, \"input\": \"Qual foi a import\\u00e2ncia da rede neural AlexNet para a hist\\u00f3ria da intelig\\u00eancia artificial?\", \"retrieval_context\": [\"Deep Learning e a Era Moderna (2010s)\\nEm 2012, a rede neural AlexNet venceu a competi\\u00e7\\u00e3o ImageNet com uma margem impressionante, inaugurando a era do deep learning. Modelos como GPT (Generative Pre-trained Transformer), desenvolvido pela OpenAI, revolucionaram o processamento de linguagem natural.\", \"Hist\\u00f3ria da Intelig\\u00eancia Artificial\\n\\nA intelig\\u00eancia artificial (IA) \\u00e9 um campo da ci\\u00eancia da computa\\u00e7\\u00e3o dedicado a criar sistemas capazes de realizar tarefas que normalmente exigiriam intelig\\u00eancia humana.\", \"Machine Learning (1990s\\u20132000s)\\nCom o aumento da capacidade computacional e a disponibilidade de dados, algoritmos de aprendizado de m\\u00e1quina ganharam for\\u00e7a. Redes neurais artificiais, baseadas no funcionamento do c\\u00e9rebro humano, foram revisitadas com novas arquiteturas.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because the expected output is fully supported by node 2 in retrieval context, which contains an exact match of the sentence about AlexNet winning the ImageNet competition in 2012. Great job!", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The sentence is directly attributed to the 2nd node in the retrieval context, which states 'Em 2012, a rede neural AlexNet venceu a competi\\u00e7\\u00e3o ImageNet com uma margem impressionante, inaugurando a era do deep learning.'\",\n \"expected_output\": \"Em 2012, a rede neural AlexNet venceu a competi\\u00e7\\u00e3o ImageNet com uma margem impressionante, inaugurando a era do deep learning.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"De acordo com o contexto fornecido, o GPT-3 foi lan\\u00e7ado em 2020 e possui 175 bilh\\u00f5es de par\\u00e2metros.\", \"context\": null, \"expected_output\": \"O GPT-3 foi lan\\u00e7ado em 2020 e possui 175 bilh\\u00f5es de par\\u00e2metros, sendo um marco em gera\\u00e7\\u00e3o de texto.\", \"hyperparameters\": null, \"input\": \"Quantos par\\u00e2metros possui o GPT-3 e quando foi lan\\u00e7ado?\", \"retrieval_context\": [\"Brasil e IA\\nO Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\", \"Desafios \\u00c9ticos\\nEntre os principais desafios \\u00e9ticos est\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos, e o alinhamento de sistemas de IA com valores humanos. Organiza\\u00e7\\u00f5es como o Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\", \"GPT e Modelos de Linguagem\\nO GPT-3, lan\\u00e7ado em 2020, possui 175 bilh\\u00f5es de par\\u00e2metros e foi um marco em gera\\u00e7\\u00e3o de texto. O ChatGPT, lan\\u00e7ado em novembro de 2022, atingiu 1 milh\\u00e3o de usu\\u00e1rios em apenas 5 dias, tornando-se o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because sentence 1 is fully supported by node 1 in retrieval context, which directly states the GPT-3 launch year, parameter count, and its significance in text generation.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The sentence is directly attributed to the 1st node in the retrieval context, which states 'O GPT-3, lan\\u00e7ado em 2020, possui 175 bilh\\u00f5es de par\\u00e2metros e foi um marco em gera\\u00e7\\u00e3o de texto...'\",\n \"expected_output\": \"O GPT-3 foi lan\\u00e7ado em 2020 e possui 175 bilh\\u00f5es de par\\u00e2metros, sendo um marco em gera\\u00e7\\u00e3o de texto.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"De acordo com o contexto fornecido, o ChatGPT \\u00e9 considerado o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria porque **atingiu 1 milh\\u00e3o de usu\\u00e1rios em apenas 5 dias** ap\\u00f3s seu lan\\u00e7amento em novembro de 2022.\\n\\nEssa m\\u00e9trica de ado\\u00e7\\u00e3o t\\u00e3o r\\u00e1pida \\u00e9 o que o diferencia e o torna not\\u00e1vel em termos de velocidade de crescimento comparado a outros produtos hist\\u00f3ricos.\", \"context\": null, \"expected_output\": \"O ChatGPT, lan\\u00e7ado em novembro de 2022, atingiu 1 milh\\u00e3o de usu\\u00e1rios em apenas 5 dias, o que o tornou o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria.\", \"hyperparameters\": null, \"input\": \"Por que o ChatGPT \\u00e9 considerado o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria?\", \"retrieval_context\": [\"Desafios \\u00c9ticos\\nEntre os principais desafios \\u00e9ticos est\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos, e o alinhamento de sistemas de IA com valores humanos. Organiza\\u00e7\\u00f5es como o Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\", \"GPT e Modelos de Linguagem\\nO GPT-3, lan\\u00e7ado em 2020, possui 175 bilh\\u00f5es de par\\u00e2metros e foi um marco em gera\\u00e7\\u00e3o de texto. O ChatGPT, lan\\u00e7ado em novembro de 2022, atingiu 1 milh\\u00e3o de usu\\u00e1rios em apenas 5 dias, tornando-se o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria.\", \"Inverno da IA (1970s\\u20131980s)\\nAp\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960, o campo enfrentou dois per\\u00edodos de desinvestimento chamados de \\\"Invernos da IA\\\". O primeiro ocorreu entre 1974 e 1980, o segundo entre 1987 e 1993. Nesses per\\u00edodos, financiamentos foram cortados devido \\u00e0 falta de progresso real.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because the expected output is fully supported by node 1 in retrieval context, which directly states that ChatGPT reached 1 million users in just 5 days after its November 2022 launch, making it the fastest-growing product in history.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The sentence is directly supported by the 1st node in the retrieval context, which states 'O ChatGPT, lan\\u00e7ado em novembro de 2022, atingiu 1 milh\\u00e3o de usu\\u00e1rios em apenas 5 dias, tornando-se o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria.'\",\n \"expected_output\": \"O ChatGPT, lan\\u00e7ado em novembro de 2022, atingiu 1 milh\\u00e3o de usu\\u00e1rios em apenas 5 dias, o que o tornou o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"# C\\u00e1lculo do Tempo entre o Teste de Turing e o ChatGPT\\n\\nCom base nas informa\\u00e7\\u00f5es fornecidas:\\n\\n- **Teste de Turing**: proposto por Alan Turing em **1950**\\n- **ChatGPT**: lan\\u00e7ado em **novembro de 2022**\\n\\n**Tempo decorrido: 72 anos** (de 1950 a 2022)\\n\\nEsse per\\u00edodo abrange momentos significativos da hist\\u00f3ria da IA, incluindo os \\\"Invernos da IA\\\" (1974-1980 e 1987-1993) e o desenvolvimento de modelos modernos como o GPT-3 (2020), que precedeu o ChatGPT.\", \"context\": null, \"expected_output\": \"O Teste de Turing foi proposto por Alan Turing em 1950 e o ChatGPT foi lan\\u00e7ado em novembro de 2022, portanto se passaram 72 anos entre os dois eventos.\", \"hyperparameters\": null, \"input\": \"Considerando a linha do tempo da IA, quanto tempo se passou entre a proposta do Teste de Turing e o lan\\u00e7amento do ChatGPT?\", \"retrieval_context\": [\"GPT e Modelos de Linguagem\\nO GPT-3, lan\\u00e7ado em 2020, possui 175 bilh\\u00f5es de par\\u00e2metros e foi um marco em gera\\u00e7\\u00e3o de texto. O ChatGPT, lan\\u00e7ado em novembro de 2022, atingiu 1 milh\\u00e3o de usu\\u00e1rios em apenas 5 dias, tornando-se o produto de crescimento mais r\\u00e1pido da hist\\u00f3ria.\", \"Inverno da IA (1970s\\u20131980s)\\nAp\\u00f3s promessas exageradas nas d\\u00e9cadas de 1950 e 1960, o campo enfrentou dois per\\u00edodos de desinvestimento chamados de \\\"Invernos da IA\\\". O primeiro ocorreu entre 1974 e 1980, o segundo entre 1987 e 1993. Nesses per\\u00edodos, financiamentos foram cortados devido \\u00e0 falta de progresso real.\", \"Origens (1950s)\\nO termo \\\"intelig\\u00eancia artificial\\\" foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth, considerada o marco fundador da \\u00e1rea. Alan Turing, em 1950, prop\\u00f4s o famoso \\\"Teste de Turing\\\" como crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because the expected output is fully supported by nodes in retrieval context. Sentence 1 is supported by node 1, which mentions the Turing Test being proposed in 1950, and by node 2, which confirms ChatGPT's launch in November 2022. The 72-year calculation is a direct mathematical inference from these two dates.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The sentence states that the Turing Test was proposed by Alan Turing in 1950, which is supported by the 1st node ('Alan Turing, em 1950, prop\\u00f4s o famoso \\\"Teste de Turing\\\"...'), and that ChatGPT was launched in November 2022, supported by the 2nd node ('O ChatGPT, lan\\u00e7ado em novembro de 2022...'). The calculation of 72 years between the two events (2022 - 1950 = 72) is a mathematical inference that can be derived from these two dates found in the retrieval context.\",\n \"expected_output\": \"O Teste de Turing foi proposto por Alan Turing em 1950 e o ChatGPT foi lan\\u00e7ado em novembro de 2022, portanto se passaram 72 anos entre os dois eventos.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"De acordo com o texto, os principais desafios \\u00e9ticos da intelig\\u00eancia artificial s\\u00e3o:\\n\\n1. **Vi\\u00e9s algor\\u00edtmico** - quando os algoritmos apresentam preconceitos\\n2. **Privacidade de dados** - prote\\u00e7\\u00e3o das informa\\u00e7\\u00f5es pessoais\\n3. **Substitui\\u00e7\\u00e3o de empregos** - impacto no mercado de trabalho\\n4. **Alinhamento de sistemas de IA com valores humanos** - garantir que os sistemas funcionem de acordo com princ\\u00edpios \\u00e9ticos\\n\\nAs organiza\\u00e7\\u00f5es mencionadas que trabalham para mitigar esses desafios s\\u00e3o:\\n\\n- **Future of Life Institute**\\n- **Anthropic**\\n\\nAmbas trabalham especificamente em seguran\\u00e7a de IA.\", \"context\": null, \"expected_output\": \"Os principais desafios \\u00e9ticos mencionados s\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos e o alinhamento de sistemas de IA com valores humanos. As organiza\\u00e7\\u00f5es Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\", \"hyperparameters\": null, \"input\": \"Quais s\\u00e3o os principais desafios \\u00e9ticos da intelig\\u00eancia artificial mencionados no texto e quais organiza\\u00e7\\u00f5es trabalham para mitig\\u00e1-los?\", \"retrieval_context\": [\"Brasil e IA\\nO Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\", \"Desafios \\u00c9ticos\\nEntre os principais desafios \\u00e9ticos est\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos, e o alinhamento de sistemas de IA com valores humanos. Organiza\\u00e7\\u00f5es como o Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\", \"Hist\\u00f3ria da Intelig\\u00eancia Artificial\\n\\nA intelig\\u00eancia artificial (IA) \\u00e9 um campo da ci\\u00eancia da computa\\u00e7\\u00e3o dedicado a criar sistemas capazes de realizar tarefas que normalmente exigiriam intelig\\u00eancia humana.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because all sentences in the expected output are fully supported by node 2 in retrieval context, which directly mentions the key ethical challenges (algorithmic bias, data privacy, job displacement, and AI alignment with human values) as well as the organizations Future of Life Institute and Anthropic working on AI safety.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The 2nd node in the retrieval context directly states 'Entre os principais desafios \\u00e9ticos est\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos, e o alinhamento de sistemas de IA com valores humanos...', which matches this sentence exactly.\",\n \"expected_output\": \"Os principais desafios \\u00e9ticos mencionados s\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos e o alinhamento de sistemas de IA com valores humanos. As organiza\\u00e7\\u00f5es Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\"\n },\n {\n \"verdict\": \"yes\",\n \"reason\": \"The 2nd node in the retrieval context directly states 'Organiza\\u00e7\\u00f5es como o Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA...', which matches this sentence exactly.\",\n \"expected_output\": \"Os principais desafios \\u00e9ticos mencionados s\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos e o alinhamento de sistemas de IA com valores humanos. As organiza\\u00e7\\u00f5es Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"# Situa\\u00e7\\u00e3o do Brasil em IA\\n\\n## Regulamenta\\u00e7\\u00e3o\\nO Brasil aprovou em 2024 um **marco regulat\\u00f3rio para intelig\\u00eancia artificial**, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar essa \\u00e1rea. Isso representa um passo importante na governan\\u00e7a da IA no pa\\u00eds.\\n\\n## Pesquisa\\nO Brasil possui uma base s\\u00f3lida de pesquisa em IA, com:\\n- **Centros de pesquisa**: IMPA (Instituto de Matem\\u00e1tica Pura e Aplicada)\\n- **Universidades**: USP (Universidade de S\\u00e3o Paulo) e UNICAMP (Universidade Estadual de Campinas)\\n\\nEssas institui\\u00e7\\u00f5es possuem **grupos ativos de pesquisa em IA**, contribuindo para o desenvolvimento cient\\u00edfico e tecnol\\u00f3gico na \\u00e1rea.\\n\\nEm resumo, o Brasil est\\u00e1 em uma posi\\u00e7\\u00e3o de destaque na Am\\u00e9rica Latina, combinando avan\\u00e7os regulat\\u00f3rios com investimento em pesquisa acad\\u00eamica.\", \"context\": null, \"expected_output\": \"O Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Em pesquisa, centros como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\", \"hyperparameters\": null, \"input\": \"Qual \\u00e9 a situa\\u00e7\\u00e3o do Brasil em rela\\u00e7\\u00e3o \\u00e0 regulamenta\\u00e7\\u00e3o e \\u00e0 pesquisa em intelig\\u00eancia artificial?\", \"retrieval_context\": [\"Brasil e IA\\nO Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\", \"Desafios \\u00c9ticos\\nEntre os principais desafios \\u00e9ticos est\\u00e3o: vi\\u00e9s algor\\u00edtmico, privacidade de dados, substitui\\u00e7\\u00e3o de empregos, e o alinhamento de sistemas de IA com valores humanos. Organiza\\u00e7\\u00f5es como o Future of Life Institute e a Anthropic trabalham em seguran\\u00e7a de IA.\", \"Hist\\u00f3ria da Intelig\\u00eancia Artificial\\n\\nA intelig\\u00eancia artificial (IA) \\u00e9 um campo da ci\\u00eancia da computa\\u00e7\\u00e3o dedicado a criar sistemas capazes de realizar tarefas que normalmente exigiriam intelig\\u00eancia humana.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": true, "score": 1.0, "reason": "The score is 1.00 because both sentences in the expected output are fully supported by node 1 in retrieval context, covering Brazil's 2024 AI regulatory framework and the active AI research groups at institutions like IMPA, USP, and UNICAMP.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"yes\",\n \"reason\": \"The first sentence is directly attributed to the 1st node in the retrieval context: 'O Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea.'\",\n \"expected_output\": \"O Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Em pesquisa, centros como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\"\n },\n {\n \"verdict\": \"yes\",\n \"reason\": \"The second sentence is largely attributed to the 1st node in the retrieval context: 'Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.' However, the expected output adds 'Em pesquisa,' as an introductory phrase and replaces 'Centros de pesquisa' with just 'centros', which are minor paraphrasing differences but the core content is clearly supported.\",\n \"expected_output\": \"O Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Em pesquisa, centros como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}, "{\"actual_output\": \"O texto fornecido n\\u00e3o menciona aplica\\u00e7\\u00f5es atuais espec\\u00edficas da intelig\\u00eancia artificial. \\n\\nO texto aborda principalmente:\\n- A defini\\u00e7\\u00e3o de IA como um campo da ci\\u00eancia da computa\\u00e7\\u00e3o\\n- O marco regulat\\u00f3rio aprovado pelo Brasil em 2024\\n- Centros de pesquisa brasileiros que trabalham com IA\\n- As origens hist\\u00f3ricas da IA (1950s)\\n\\nPara conhecer as aplica\\u00e7\\u00f5es atuais da intelig\\u00eancia artificial, seria necess\\u00e1rio consultar outras fontes de informa\\u00e7\\u00e3o.\", \"context\": null, \"expected_output\": \"As aplica\\u00e7\\u00f5es atuais da IA citadas no texto incluem: diagn\\u00f3stico m\\u00e9dico, ve\\u00edculos aut\\u00f4nomos, reconhecimento de voz e imagem, tradu\\u00e7\\u00e3o autom\\u00e1tica, sistemas de recomenda\\u00e7\\u00e3o (como Netflix e Spotify) e assistentes virtuais como Siri, Alexa e Google Assistant.\", \"hyperparameters\": null, \"input\": \"Quais s\\u00e3o as aplica\\u00e7\\u00f5es atuais da intelig\\u00eancia artificial citadas no texto?\", \"retrieval_context\": [\"Brasil e IA\\nO Brasil aprovou em 2024 um marco regulat\\u00f3rio para intelig\\u00eancia artificial, tornando-se um dos primeiros pa\\u00edses da Am\\u00e9rica Latina a regulamentar a \\u00e1rea. Centros de pesquisa como o IMPA e universidades como USP e UNICAMP possuem grupos ativos de pesquisa em IA.\", \"Hist\\u00f3ria da Intelig\\u00eancia Artificial\\n\\nA intelig\\u00eancia artificial (IA) \\u00e9 um campo da ci\\u00eancia da computa\\u00e7\\u00e3o dedicado a criar sistemas capazes de realizar tarefas que normalmente exigiriam intelig\\u00eancia humana.\", \"Origens (1950s)\\nO termo \\\"intelig\\u00eancia artificial\\\" foi cunhado por John McCarthy em 1956, durante a Confer\\u00eancia de Dartmouth, considerada o marco fundador da \\u00e1rea. Alan Turing, em 1950, prop\\u00f4s o famoso \\\"Teste de Turing\\\" como crit\\u00e9rio para avaliar se uma m\\u00e1quina pode exibir comportamento inteligente equivalente ao humano.\"]}": {"cached_metrics_data": [{"metric_data": {"name": "Contextual Recall", "threshold": 0.7, "success": false, "score": 0.0, "reason": "The score is 0.00 because the expected output's sentence listing current AI applications (medical diagnosis, autonomous vehicles, voice and image recognition, automatic translation, recommendation systems like Netflix and Spotify, and virtual assistants like Siri, Alexa, and Google Assistant) cannot be attributed to any nodes in retrieval context, which only cover the history of AI, Brazil's regulatory framework, and the origins of the term 'artificial intelligence'.", "strictMode": false, "evaluationModel": "claude-sonnet-4-6", "evaluationCost": 0, "verboseLogs": "Verdicts:\n[\n {\n \"verdict\": \"no\",\n \"reason\": \"None of the retrieval context nodes mention the specific applications of AI such as medical diagnosis, autonomous vehicles, voice and image recognition, automatic translation, recommendation systems (Netflix and Spotify), or virtual assistants (Siri, Alexa, Google Assistant). The nodes only cover the history of AI, Brazil's regulatory framework, and the origins of the term 'artificial intelligence'.\",\n \"expected_output\": \"As aplica\\u00e7\\u00f5es atuais da IA citadas no texto incluem: diagn\\u00f3stico m\\u00e9dico, ve\\u00edculos aut\\u00f4nomos, reconhecimento de voz e imagem, tradu\\u00e7\\u00e3o autom\\u00e1tica, sistemas de recomenda\\u00e7\\u00e3o (como Netflix e Spotify) e assistentes virtuais como Siri, Alexa e Google Assistant.\"\n }\n]"}, "metric_configuration": {"threshold": 0.7, "evaluation_model": "claude-sonnet-4-6", "strict_mode": false, "include_reason": true}}]}}} \ No newline at end of file diff --git a/.deepeval/.deepeval_telemetry.txt b/.deepeval/.deepeval_telemetry.txt new file mode 100644 index 0000000..3d65f2d --- /dev/null +++ b/.deepeval/.deepeval_telemetry.txt @@ -0,0 +1,4 @@ +DEEPEVAL_ID=70e29e9b-ca6a-421a-99b6-be2441be93f7 +DEEPEVAL_STATUS=old +DEEPEVAL_LAST_FEATURE=evaluation +DEEPEVAL_EVALUATION_STATUS=old diff --git a/.deepeval/.latest_test_run.json b/.deepeval/.latest_test_run.json new file mode 100644 index 0000000..4696e63 --- /dev/null +++ b/.deepeval/.latest_test_run.json @@ -0,0 +1 @@ +{"testRunLink": "https://app.confident-ai.com/project/cmn90zmqs000bry1e5sjw8na3/test-runs/cmnceeu6w004ut41e4ed411uz/test-cases"} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 17a35e9..cade75b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ data/chroma_db/ .pytest_cache/ .coverage htmlcov/ +.env.local diff --git a/index.html b/index.html new file mode 100644 index 0000000..3f221cc --- /dev/null +++ b/index.html @@ -0,0 +1,620 @@ + + + + + +RAGAS vs DeepEval — Relatório Comparativo + + + + + +
+
+

Relatório Comparativo · Avaliação de Sistemas RAG

+

RAGAS vs DeepEval

+

O que muda quando você troca um número por um diagnóstico.

+
+ historia_ia.txt · 10 perguntas + Claude Sonnet 4.6 como juiz + Março 2026 +
+
+
+ +
+ + +
+

Diferença 01

+

O Reasoning — saber o que consertar

+ +

A mesma pergunta, o mesmo score, dois frameworks. A diferença está em o que você recebe além do número.

+ +
+
+
RAGAS · evaluation_scores.csv
+
context_precision: 0.33
+

Um número. Sem contexto. Você deduz o problema.

+
+
+
DeepEval · Reasoning do juiz
+
+ "The score is 0.33 because the only relevant node appears at rank 3. The first node only provides a general definition of AI. The second node is about Brazil's regulatory framework, which has no relevance. The relevant node should have been ranked first." + claude-sonnet-4-6 · Contextual Precision +
+
+
+ +

O número é o mesmo: 0.33. O que mudou é que agora você sabe exatamente o que consertar — o retriever está rankeando errado. No RAGAS você teria que deduzir isso. Aqui o juiz entrega o diagnóstico pronto.

+ +
+ O que fazer com isso + O ChromaDB está retornando o chunk sobre o marco regulatório do Brasil antes do chunk sobre Dartmouth/McCarthy. O índice precisa ser reconstruído com force_rebuild=True. +
+
+ + +
+

Diferença 02

+

O caso "aplicações atuais" — o erro que o RAGAS escondia

+ +

A pergunta "Quais são as aplicações atuais da IA citadas no texto?" é o exemplo mais revelador da diferença entre os dois frameworks.

+ +
+
+
RAGAS · comportamento esperado
+

Score mediano — provavelmente entre 0.4 e 0.7. A similaridade semântica entre "o texto não menciona aplicações" e "diagnóstico médico, Netflix, Siri" ainda gera alguma sobreposição vetorial. A falha passa.

+
+
+
DeepEval · resultado real
+

Correctness: 0.0 · Ctx Recall: 0.0

+

"The Actual Output claims the text does not mention any specific current applications — this is a direct contradiction of the Expected Output."

+
+
+ +

O RAG respondeu que o texto não mencionava aplicações. O ground truth listava: diagnóstico médico, veículos autônomos, reconhecimento de voz, tradução automática, Netflix, Spotify, Siri, Alexa, Google Assistant. Uma contradição direta que o RAGAS mascarava com scores medianos.

+
+ + +
+

Diferença 03

+

Confident AI — o que não existia no RAGAS-Project

+ +

No RAGAS-Project, o equivalente a cada análise era uma linha num CSV:

+ +
# outputs/evaluation_scores.csv
+question,faithfulness,answer_correctness,answer_relevance,context_precision,context_recall
+"Quem cunhou...",1.0,0.86,0.97,0.33,1.0
+ +

Sem chunks visíveis, sem reasoning, sem rastreabilidade, sem histórico de runs.

+ +

No Confident AI, para o mesmo test case você tem:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CampoO que você vêExistia no RAGAS?
Retrieval ContextOs 3 chunks em ordem — você vê visualmente que o chunk do Brasil veio antes do de DartmouthNão
ReasoningExplicação em linguagem natural de por que o score foi aquele valorNão
Test Case IDID único rastreável entre runs — você compara a mesma pergunta em execuções diferentesNão
Run Duration8.58s para esse caso específicoNão
Comparação de runsVerde = melhorou, vermelho = regrediu — linha por linha entre execuçõesNão
Score numérico0.33, 1.0, 0.0 etc.Sim
+
+
+ + +
+

Diferença 04

+

Métricas customizadas G-Eval — a diferença estrutural

+ +

No RAGAS as 5 métricas são fixas e calculadas por fórmulas matemáticas. Você não pode mudar o que elas medem. No DeepEval você define o critério de avaliação em linguagem natural, específico para o seu domínio:

+ +
from deepeval.metrics import GEval
+from deepeval.test_case import LLMTestCaseParams
+
+# Métrica que teria pego a falha das "aplicações atuais"
+metrica = GEval(
+    name="sem_negacao_incorreta",
+    criteria="""
+    Penalize respostas que afirmem que o texto não contém
+    informações quando o ground truth prova que contém.
+    Um RAG que nega a existência de informação presente
+    no documento é um erro crítico, não uma imprecisão.
+    """,
+    evaluation_params=[
+        LLMTestCaseParams.ACTUAL_OUTPUT,
+        LLMTestCaseParams.EXPECTED_OUTPUT,
+        LLMTestCaseParams.RETRIEVAL_CONTEXT,
+    ],
+    threshold=0.9,
+    model=judge,
+)
+ +

Essa métrica teria pego a falha da pergunta sobre aplicações antes mesmo de rodar — porque o critério é explícito sobre esse padrão de erro. O RAGAS não tem equivalente.

+
+ + +
+

Resultados

+

Todos os resultados desta execução

+

10 perguntas · 5 métricas · juiz: claude-sonnet-4-6

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PerguntaMétricaScoreStatusMotivo
Faithfulness — todas as 10 perguntas
Todas as 10Faithfulness1.0PASSEDRespostas 100% fiéis ao contexto. Nenhuma contradição encontrada.
Correctness (GEval)
Quem cunhou o termo "inteligência artificial"?Correctness1.0PASSEDMcCarthy, 1956, Dartmouth — todos os fatos corretos.
O que foi o Teste de Turing?Correctness1.0PASSEDTuring, 1950, critério de inteligência — correto e completo.
Quais foram os Invernos da IA?Correctness1.0PASSED1974–1980 e 1987–1993, promessas exageradas — idêntico ao ground truth.
Como o AlexNet mudou a IA em 2012?Correctness0.9PASSEDFatos corretos. Adicionou contexto sobre GPT além do necessário.
O que é o GPT-3?Correctness0.9PASSED2020, 175B parâmetros corretos. Omitiu "marco em geração de texto".
Por que o ChatGPT cresceu tão rápido?Correctness1.0PASSED1 milhão de usuários em 5 dias, novembro 2022 — correto.
Quanto tempo entre Turing e ChatGPT?Correctness1.0PASSED72 anos calculado corretamente. Contexto extra não prejudicou.
Desafios éticos da IA?Correctness1.0PASSEDBias, privacidade, empregos, alinhamento + Future of Life e Anthropic.
IA no Brasil?Correctness1.0PASSEDMarco regulatório 2024, IMPA, USP, UNICAMP — correto.
Quais aplicações atuais da IA no texto?Correctness0.0FAILEDRAG afirmou que o texto não menciona aplicações. Ground truth lista: diagnóstico médico, veículos autônomos, Netflix, Siri, Alexa. Contradição direta.
Answer Relevancy
7 perguntasRelevancy1.0PASSEDRespostas diretas e focadas, sem informações desnecessárias.
AlexNet (2012)Relevancy0.9PASSEDIncluiu menção ao GPT que não era necessária, mas não prejudicou.
Quanto tempo entre Turing e ChatGPT?Relevancy0.78PASSEDAdicionou detalhes sobre GPT-3 não solicitados. Passou no limite.
Contextual Precision
Quem cunhou o termo "inteligência artificial"?Ctx Precision0.33FAILEDChunk correto (McCarthy/1956/Dartmouth) veio em 3º lugar. Chunks 1 e 2 eram irrelevantes: definição geral de IA e marco regulatório do Brasil.
Contextual Recall
9 perguntasCtx Recall1.0PASSEDContexto recuperado cobriu completamente o necessário para responder.
Quais aplicações atuais da IA no texto?Ctx Recall0.0FAILEDNenhum chunk continha informações sobre aplicações. ChromaDB trouxe história da IA e regulação do Brasil em vez do chunk correto.
+
+
+ + +
+

Conclusão

+

+ O RAGAS te diz quanto o sistema errou. + O DeepEval te diz o que errou, onde errou, + por que errou — e te deixa definir + o que conta como erro para o seu caso específico. +

+
+ +
+ + + + + diff --git a/resultados_deepeval_run2.html b/resultados_deepeval_run2.html new file mode 100644 index 0000000..eaf2bc4 --- /dev/null +++ b/resultados_deepeval_run2.html @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PerguntaMétricaScoreStatusMotivo
Faithfulness — todas as 10 perguntas
Todas as 10Faithfulness1.0PASSEDRespostas 100% fiéis ao contexto. Nenhuma contradição encontrada.
Correctness (GEval)
Quem cunhou o termo "inteligência artificial"?Correctness1.0PASSEDMcCarthy, 1956, Dartmouth — todos os fatos corretos.
O que foi o Teste de Turing?Correctness1.0PASSEDTuring, 1950, critério de inteligência — correto e completo.
Quais foram os Invernos da IA?Correctness1.0PASSED1974–1980 e 1987–1993, promessas exageradas — idêntico ao ground truth.
Como o AlexNet mudou a IA em 2012?Correctness0.9PASSEDFatos corretos. Adicionou contexto sobre GPT além do necessário.
O que é o GPT-3?Correctness0.9PASSED2020, 175B parâmetros corretos. Omitiu "marco em geração de texto".
Por que o ChatGPT cresceu tão rápido?Correctness1.0PASSED1 milhão de usuários em 5 dias, novembro 2022 — correto.
Quanto tempo entre Turing e ChatGPT?Correctness1.0PASSED72 anos calculado corretamente. Contexto extra não prejudicou.
Desafios éticos da IA?Correctness1.0PASSEDBias, privacidade, empregos, alinhamento + Future of Life e Anthropic.
IA no Brasil?Correctness1.0PASSEDMarco regulatório 2024, IMPA, USP, UNICAMP — correto.
Quais aplicações atuais da IA no texto?Correctness0.0FAILEDRAG disse que o texto não menciona aplicações. Ground truth lista: diagnóstico médico, veículos autônomos, Netflix, Siri, Alexa. Contradição direta.
Answer Relevancy
7 perguntasRelevancy1.0PASSEDRespostas diretas e focadas, sem informações desnecessárias.
AlexNet (2012)Relevancy0.9PASSEDIncluiu menção ao GPT que não era necessária, mas não prejudicou.
Quanto tempo entre Turing e ChatGPT?Relevancy0.78PASSEDAdicionou detalhes sobre GPT-3 não solicitados. Passou no limite.
Contextual Precision
Quem cunhou o termo "inteligência artificial"?Ctx Precision0.33FAILEDChunk correto (McCarthy/1956/Dartmouth) veio em 3º lugar. Chunks 1 e 2 eram irrelevantes: definição geral de IA e marco regulatório do Brasil.
Contextual Recall
9 perguntasCtx Recall1.0PASSEDContexto recuperado cobriu completamente o necessário para responder.
Quais aplicações atuais da IA no texto?Ctx Recall0.0FAILEDNenhum chunk continha informações sobre aplicações. ChromaDB trouxe história da IA e regulação do Brasil em vez do chunk correto.