Agente Educacional com LangChain

Escolha a base de conhecimento que o agente vai usar nesta sessão

Carregando bases...

Bases com ⚡ pronto carregam instantâneamente.
Bases sem índice precisam ser indexadas antes da palestra:
python -m agente_edu.rag.ingest --base=ID

🤖 Agente Educacional com LangChain

Do Piauí para o Mundo — Palestra ao vivo

📊 Carregando... LangChain + LangGraph + RAG
🔍 RAG
📝 Prompt
🧠 LLM
🛡 Guardrail
Resposta
💬 Converse com o agente
Persona:
👋 Olá! Sou um agente educacional construído com LangChain e LangGraph.

Pergunte sobre dados dos estados brasileiros — ou cole qualquer conteúdo novo no painel abaixo e o agente aprenderá na hora. 🧠
➕ Adicionar conhecimento ao agente (demo RAG dinâmico)
🔍 Por dentro do agente
⚡ Pipeline
🗺 Grafo
💻 Código
📖 Conceitos
💬
Envie uma pergunta e clique na resposta do bot para ver cada etapa aqui.
🗺
Carregando grafo...
🔗 chains/qa_chain.py — chain principal
# O operador | conecta os componentes em sequência
def construir_chain(persona):
    return (
        montar_prompt(persona)  # PromptTemplate
        | Soberano()           # BaseChatModel
        | StrOutputParser()    # parser
    )
🗺 graph/agent_graph.py — grafo LangGraph
class Estado(TypedDict):
    pergunta: str    # entrada do aluno
    contexto: str    # resultado do RAG
    resposta: str    # saída final
    tentativas: int  # contador de retries

grafo.add_node("recuperar", recuperar)
grafo.add_node("buscar_mais", buscar_mais)
grafo.add_node("responder", responder_no)
grafo.add_conditional_edges("recuperar", decidir)
grafo.add_edge("buscar_mais", "responder")
grafo.add_edge("responder", END)
🛡 guardrails/rules.py — dois níveis
# Nível 1: instrução no prompt (guardrail interno)
REGRA = "Só responda com base no Contexto..."

# Nível 2: validação no código (guardrail externo)
def validar(resposta, contexto):
    if not contexto:
        return FRASE_FALLBACK
    return resposta
📥 rag/retriever.py — ingestão dinâmica
def adicionar(self, texto, titulo):
    doc = Document(
        page_content=texto,
        metadata={"titulo": titulo,
                  "fonte": "ingestão_manual"}
    )
    self._vectorstore.add_documents([doc])
    # O agente já responde sobre o novo conteúdo
🔍 RAG — Retrieval-Augmented Generation
Geração aumentada por recuperação
Em vez de o modelo "lembrar" os dados, ele consulta uma base a cada resposta. O texto recuperado entra no prompt como contexto — eliminando invenções sobre o domínio.
Pergunta → Embedding → Busca vetorial → Documentos relevantes
📝 PromptTemplate
chains/prompt.py
Template com variáveis ({contexto}, {pergunta}, {persona}) preenchidas em tempo de execução. No LangChain, prompts são objetos combináveis com |.
🧠 BaseChatModel — interface padrão de LLM
llm/soberano.py
O Soberano 1.1 implementa BaseChatModel. Isso o torna compatível com qualquer chain ou ferramenta do ecossistema LangChain — mesmo sendo uma API personalizada na Mandu.
🛡 Guardrails — dois níveis
guardrails/rules.py
Nível 1 (prompt): instrui o modelo a recusar quando não tiver informação.
Nível 2 (código): bloqueia a resposta se o contexto estiver vazio, independente do que o modelo disse.
🗺 StateGraph — LangGraph
graph/agent_graph.py
Fluxos com decisões condicionais e loops. O estado (TypedDict) trafega entre os nós. Arestas condicionais decidem dinamicamente qual nó vem a seguir.
📥 Ingestão Dinâmica
rag/retriever.py + /ingest
O método add_documents() do FAISS adiciona vetores ao índice em memória sem reiniciar o servidor. É assim que sistemas RAG em produção incorporam novos documentos em tempo real.