Nesta etapa, sairemos da simples experimentação com modelos para construir uma solução de negócio completa com LLMs. O objetivo é desenvolver um produto capaz de gerar automaticamente uma brochura institucional de uma empresa, voltada a investidores, potenciais clientes e candidatos, a partir de apenas duas entradas: o nome da empresa e a URL do seu site principal.
Criar uma brochura de marketing realmente útil exige mais do que resumir uma única página. A aplicação precisa navegar pelo site com algum grau de inteligência, identificar páginas relevantes — como "Sobre", "Empresa", "Carreiras" ou equivalentes — e reunir essas informações para montar uma visão mais ampla e consistente da organização.
Para isso, a solução será estruturada em três etapas principais:
O primeiro passo técnico é instruir o modelo a analisar uma lista bruta de links e decidir quais deles são relevantes para compor uma brochura institucional. Para isso, utilizaremos a técnica de one-shot prompting, fornecendo um exemplo explícito do formato de saída esperado. O objetivo é aumentar a confiabilidade da resposta e garantir que ela venha em JSON válido.
import os
import json
from openai import OpenAI
from scraper import fetch_website_links, fetch_website_contents
from IPython.display import Markdown, display, update_display
# Inicialização do cliente
modelo_selecionado = "gpt-4o-mini"
cliente_openai = OpenAI()
prompt_sistema_link = """
Você recebe uma lista de links encontrados em uma página da web.
Seu papel é decidir quais desses links são mais relevantes para compor
uma brochura sobre a empresa, como páginas institucionais, páginas sobre
a empresa ou páginas de carreiras.
Você deve responder em JSON no formato abaixo:
{
"links": [
{"type": "about page", "url": "https://url.completa/sobre"},
{"type": "careers page", "url": "https://outra.url.completa/carreiras"}
]
}
"""
def obter_prompt_usuario_links(url):
lista_links = fetch_website_links(url)
prompt_usuario = f"""
Aqui está a lista de links encontrada no site {url}.
Decida quais links são relevantes para a criação de uma brochura sobre a empresa.
Responda usando URLs completas no formato JSON.
Não inclua links de Termos de Serviço, Política de Privacidade ou e-mail.
Links: {lista_links}
"""
return prompt_usuario
Observação: a variável lista_links armazena os links coletados pela função de scraping.
Com os prompts definidos, o próximo passo é encapsular a chamada ao modelo em uma função que receba a resposta, interprete o JSON retornado e o transforme em uma estrutura utilizável em Python.
O parâmetro response_format={"type": "json_object"} é especialmente importante aqui, porque reduz o risco de respostas fora do formato esperado e torna o fluxo mais previsível.
def selecionar_links_relevantes(url):
resposta = cliente_openai.chat.completions.create(
model=modelo_selecionado,
messages=[
{"role": "system", "content": prompt_sistema_link},
{"role": "user", "content": obter_prompt_usuario_links(url)}
],
response_format={"type": "json_object"}
)
resultado = resposta.choices[0].message.content
links_selecionados = json.loads(resultado)
return links_selecionados
Para tornar a experiência mais fluida, vamos usar streaming na geração do conteúdo final. Em vez de aguardar o texto completo para só então exibi-lo, o usuário acompanhará a brochura sendo construída em tempo real, token por token.
Essa abordagem melhora a percepção de velocidade e dá ao produto uma experiência mais sofisticada.
O prompt abaixo define o comportamento esperado do modelo para a etapa de geração final:
prompt_sistema_brochura = """
Você é um assistente que analisa o conteúdo de várias páginas relevantes do site de uma empresa
e cria uma brochura curta sobre essa empresa para possíveis clientes, investidores e candidatos.
Responda em Markdown, sem blocos de código.
Inclua informações sobre cultura da empresa, clientes e carreiras/vagas sempre que estiverem disponíveis.
"""
def criar_brochura(nome_empresa, url):
links_relevantes = selecionar_links_relevantes(url)
conteudo_site = fetch_website_contents(url)
for link in links_relevantes["links"]:
conteudo_site += "\n\n---\n\n"
conteudo_site += fetch_website_contents(link["url"])
prompt_usuario_brochura = f"Você está analisando a empresa chamada: {nome_empresa}\n"
prompt_usuario_brochura += "Aqui está o conteúdo da landing page e de outras páginas relevantes:\n"
prompt_usuario_brochura += conteudo_site
# Truncamento opcional para respeitar limites de contexto
prompt_usuario_brochura = prompt_usuario_brochura[:20000]
fluxo_resposta = cliente_openai.chat.completions.create(
model=modelo_selecionado,
messages=[
{"role": "system", "content": prompt_sistema_brochura},
{"role": "user", "content": prompt_usuario_brochura}
],
stream=True
)
alvo_exibicao = display(Markdown(""), display_id=True)
brochura_completa = ""
for pedaco in fluxo_resposta:
conteudo_token = pedaco.choices[0].delta.content or ""
brochura_completa += conteudo_token
update_display(Markdown(brochura_completa), display_id=alvo_exibicao.display_id)
Este projeto mostra, na prática, como combinar chamadas encadeadas de IA, saídas estruturadas em JSON e renderização via streaming para criar um produto de IA com valor de negócio real.
Em vez de apenas gerar texto, a aplicação segue um fluxo robusto: primeiro identifica links relevantes, depois coleta o conteúdo necessário, e por fim sintetiza tudo em uma brochura útil, clara e orientada a objetivos comerciais.
Essa arquitetura é simples o suficiente para ser compreendida rapidamente, mas poderosa o bastante para servir como base de produtos reais voltados ao mercado.