Notícias

Construindo um Agente de Notícias Avançado com Inteligência Artificial

“`html

Introdução ao Agente de Notícias Avançado

Este tutorial irá guiá-lo através da construção de um agente de notícias avançado com inteligência artificial que pode procurar na web as últimas notícias sobre um tópico específico e resumir os resultados.

Fluxo de Trabalho do Agente

O agente segue um fluxo de trabalho estruturado:

  • Navegação: Gera consultas de pesquisa relevantes e coleta informações da web.
  • Redação: Extrai e compila resumos de notícias a partir das informações coletadas.
  • Reflexão: Avalia os resumos verificando a correção dos fatos e sugere melhorias.
  • Refinamento: Melhora os resumos com base nas sugestões da avaliação.
  • Geração de Títulos: Gera títulos apropriados para cada resumo de notícia.

Configurando o Ambiente

Para começar, é necessário configurar as variáveis de ambiente, instalar as bibliotecas necessárias e importar as dependências necessárias:

pip install langgraph==0.2.53 langgraph-checkpoint==2.0.6 langgraph-sdk==0.1.36 langchain-groq langchain-community langgraph-checkpoint-sqlite==2.0.1 tavily-python streamlit

Em seguida, importe as bibliotecas e configure as chaves de API:

import os
import sqlite3
from langgraph.graph import StateGraph
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_groq import ChatGroq
from tavily import TavilyClient
from langgraph.checkpoint.sqlite import SqliteSaver
from typing import TypedDict, List
from pydantic import BaseModel
import streamlit as st

# Configurar Chaves de API
os.environ['TAVILY_API_KEY'] = 'sua_chave_tavily'
os.environ['GROQ_API_KEY'] = 'sua_chave_groq'

# Inicializar Banco de Dados para Checkpoint
sqlite_conn = sqlite3.connect('checkpoints.sqlite', check_same_thread=False)
memória = SqliteSaver(sqlite_conn)

# Inicializar Modelo e Cliente Tavily
modelo = ChatGroq(model='Llama-3.1-8b-instant')
tavily = TavilyClient(api_key=os.environ['TAVILY_API_KEY'])

Definindo o Estado do Agente

O agente mantém informações de estado ao longo de seu fluxo de trabalho:

  • Tópico: O tópico sobre o qual o usuário deseja as últimas notícias
  • Rascunhos: Os primeiros rascunhos dos resumos de notícias
  • Conteúdo: O conteúdo de pesquisa extraído dos resultados de busca do Tavily
  • Avaliação: A avaliação e recomendações geradas para o rascunho no estado de reflexão.
  • Resumos Refinados: Resumos de notícias atualizados após incorporar sugestões da avaliação
  • Títulos: Títulos gerados para cada artigo de notícia

Definindo Prompts

Definimos prompts de sistema para cada fase do fluxo de trabalho do agente:

PROMPT_NAVEGAÇÃO = 'Você é um pesquisador de notícias de IA encarregado de encontrar os artigos de notícias mais recentes sobre tópicos específicos. Gere até 3 consultas de pesquisa relevantes.'

PROMPT_REDAÇÃO = 'Você é um resumidor de notícias de IA. Escreva um resumo detalhado (1 a 2 parágrafos) com base no conteúdo fornecido, garantindo correção factual, clareza e coerência.'

PROMPT_AVALIAÇÃO = 'Você é um professor revisando rascunhos de resumos contra o conteúdo de origem. Certifique-se da correção factual, identifique detalhes ausentes ou incorretos e sugira melhorias.
----------
Conteúdo: {conteúdo}
----------'

PROMPT_REFINAMENTO = 'Você é um editor de notícias de IA. Dado um resumo e uma avaliação, refine o resumo de acordo.'

PROMPT_GERAÇÃO_DE_TÍTULOS = 'Você é um resumidor de notícias de IA. Gere um título curto e descritivo para cada resumo de notícia.'

Implementando os Agentes de IA

Implementamos os agentes de IA para cada fase do fluxo de trabalho:

def nó_navegação(estado: EstadoAgente):
    consultas = modelo.with_structured_output(Consultas).invoke([
        SystemMessage(content=PROMPT_NAVEGAÇÃO),
        HumanMessage(content=estado['tópico'])
    ])
    conteúdo = estado.get('conteúdo', [])
    for q in consultas.consultas:
        resposta = tavily.search(query=q, max_results=2)
        for r in resposta['results']:
            conteúdo.append(r['content'])
    return {'conteúdo': conteúdo}

def nó_redação(estado: EstadoAgente):
    conteúdo = '\n\n'.join(estado['conteúdo'])
    notícias = modelo.with_structured_output(Notícias).invoke([
        SystemMessage(content=PROMPT_REDAÇÃO),
        HumanMessage(content=conteúdo)
    ])
    return {'rascunhos': notícias.notícias}

def nó_avaliação(estado: EstadoAgente):
    conteúdo = '\n\n'.join(estado['conteúdo'])
    avaliações = []
    for rascunho in estado['rascunhos']:
        resposta = modelo.invoke([
            SystemMessage(content=PROMPT_AVALIAÇÃO.format(conteúdo=conteúdo)),
            HumanMessage(content='rascunho: ' + rascunho)
        ])
        avaliações.append(resposta.content)
    return {'avaliações': avaliações}

def nó_refinamento(estado: EstadoAgente):
    resumos_refinados = []
    for resumo, avaliação in zip(estado['rascunhos'], estado['avaliações']):
        resposta = modelo.invoke([
            SystemMessage(content=PROMPT_REFINAMENTO.format(resumo=resumo)),
            HumanMessage(content='Avaliação: ' + avaliação)
        ])
        resumos_refinados.append(resposta.content)
    return {'resumos_refinados': resumos_refinados}

def nó_títulos(estado: EstadoAgente):
    títulos = []
    for resumo in estado['resumos_refinados']:
        resposta = modelo.invoke([
            SystemMessage(content=PROMPT_GERAÇÃO_DE_TÍTULOS),
            HumanMessage(content=resumo)
        ])
        títulos.append(resposta.content)
    return {'títulos': títulos}

Construindo a Interface com Streamlit

Construímos a interface com Streamlit para que o usuário possa interagir com o agente:

# Definir aplicativo Streamlit
st.title('Chatbot de Resumo de Notícias')

# Inicializar estado da sessão
if 'mensagens' not in st.session_state:
    st.session_state['mensagens'] = []

# Exibir mensagens passadas
for mensagem in st.session_state['mensagens']:
    with st.chat_message(mensagem['role']):
        st.markdown(mensagem['content'])

# Campo de entrada para o usuário
entrada_usuario = st.chat_input('Pergunte sobre as últimas notícias...')

thread = 1
if entrada_usuario:
    st.session_state['mensagens'].append({'role': 'user', 'content': entrada_usuario})
    with st.chat_message('assistant'):
        texto_carregando = st.empty()
        texto_carregando.markdown('*Pensando...*')

        construtor = StateGraph(EstadoAgente)
        construtor.add_node('navegação', nó_navegação)
        construtor.add_node('redação', nó_redação)
        construtor.add_node('avaliação', nó_avaliação)
        construtor.add_node('refinamento', nó_refinamento)
        construtor.add_node('títulos', nó_títulos)
        construtor.set_entry_point('navegação')
        construtor.add_edge('navegação', 'redação')
        construtor.add_edge('redação', 'avaliação')
        construtor.add_edge('avaliação', 'refinamento')
        construtor.add_edge('refinamento', 'títulos')
        grafo = construtor.compile(checkpointer=memória)

        config = {'configurable': {'thread_id': f'{thread}'}}
        for s in grafo.stream({'tópico': entrada_usuario}, config):
            # texto_carregando.markdown(f'*{st.session_state['mensagem_carregando']}*')
            print(s)
        
        s = grafo.get_state(config).values
        resumos_refinados = s['resumos_refinados']
        títulos = s['títulos']
        thread+=1
        # Exibir resposta final
        texto_carregando.empty()
        texto_resposta = '\n\n'.join([f'{t}\n{s}' for t, s in zip(títulos, resumos_refinados)])
        st.markdown(texto_resposta)



O Streamlit é uma biblioteca de código aberto em Python que facilita a criação e o compartilhamento de aplicativos da web para aprendizado de máquina e ciência de dados. Com o Streamlit, você pode transformar scripts de dados em aplicativos da web interativos em questão de minutos, sem a necessidade de conhecimento em front-end, como HTML, CSS ou JavaScript.

**Principais Características do Streamlit:**

* **Simplicidade:** A principal vantagem do Streamlit é a sua simplicidade. Ele foi projetado para ser fácil de aprender e usar, mesmo para aqueles que não têm experiência prévia em desenvolvimento web.
* **Interatividade:** O Streamlit permite que você crie aplicativos da web interativos com facilidade. Você pode adicionar widgets, como controles deslizantes, caixas de seleção, botões e campos de entrada de texto, que permitem aos usuários interagir com seus dados e modelos.
* **Integração com Bibliotecas de Dados:** O Streamlit se integra perfeitamente com bibliotecas populares de ciência de dados em Python, como Pandas, NumPy, Matplotlib, Seaborn, Plotly e Altair. Isso facilita a visualização de dados e a criação de gráficos interativos.
* **Implantação Fácil:** O Streamlit oferece opções simples para implantar seus aplicativos da web. Você pode compartilhá-los localmente, em sua própria rede ou na nuvem, usando serviços como o Streamlit Cloud, Heroku, AWS ou Google Cloud Platform.
* **Personalização:** Embora o Streamlit seja projetado para ser simples, ele também oferece opções de personalização. Você pode ajustar o layout, as cores e o estilo do seu aplicativo para atender às suas necessidades.
* **Atualização automática:** Uma das melhores features do Streamlit é que, sempre que o código é alterado, o app web é atualizado com as novas informações, sem precisar reiniciar todo processo.

**Como o Streamlit Funciona:**

O Streamlit funciona como um servidor web local. Quando você executa um script Streamlit, ele inicia um servidor que renderiza seu script como um aplicativo da web. Sempre que você faz uma alteração em seu script, o Streamlit detecta automaticamente a alteração e atualiza o aplicativo da web em tempo real.

**Aplicações do Streamlit:**

O Streamlit é uma ferramenta versátil que pode ser usada para uma variedade de aplicações, incluindo:

* **Protótipos de Aprendizado de Máquina:** Crie rapidamente interfaces interativas para seus modelos de aprendizado de máquina, permitindo que você e outros experimentem diferentes entradas e visualizem os resultados.
* **Painéis de Visualização de Dados:** Crie painéis interativos para explorar e visualizar seus dados.
* **Ferramentas de Análise de Dados:** Crie ferramentas personalizadas para análise de dados que atendam às suas necessidades específicas.
* **Aplicativos Educacionais:** Crie aplicativos educacionais interativos para ensinar conceitos de ciência de dados e aprendizado de máquina.
* **Apresentações:** Crie apresentações interativas que permitam que você demonstre seus dados e modelos de forma dinâmica.
* **Tutoriais e Documentação:** Streamlit é uma ferramenta de construção rápida de aplicações web, o que possibilita a criação de protótipos em poucos minutos.
* **Web apps diversos**: A interface web do Streamlit permite a criação de dashboards e aplicativos de forma rápida e customizável

Se você está procurando uma maneira fácil de criar aplicativos da web interativos para seus projetos de ciência de dados, o Streamlit é uma excelente opção.

“`

Israel Cavalcante

Sou um entusiasta de tecnologia com mais de 10 anos de experiência, formado em Direito pelo Ibmec Rio e candidato ao MBA em Management pela PUC-Rio. Fundador da Uncraft, e de outras empresas, uma plataforma de mídia digital 100% gerida por IA. Por aqui, combino inovação, automação e estratégia para transformar a criação de conteúdo.

Me mande um e-mail!