# 07. Delimitadores e Saídas Estruturadas

Agora estamos entrando no campo da programação, somada à utilização de LLMs. Para utilizarmos um modelo de forma sequencial, processando um grande volume de dados, precisamos criar prompts organizados e facilmente legíveis, onde seus elementos principais fiquem evidentes ao modelo. Para isso, os delimitadores são fundamentais:

## O que são delimitadores?

Os delimitadores delimitam os trechos mais importantes no prompt, elementos que não podem passar despercebidos pelo modelo. Podemos utilizar diversos delimitadores, como ####, """, --, etc. Anteriormente demos um exemplo de delimitador ao fazermos o prompt para criação de e-mails:

```python
Aqui está um exemplo do meu estilo de escrita de emails:
####
Fala, meu amigo!
Como estamos?
O que você acha de marcamos um dia para conversar?
Tamo junto!
Abraço
####

Imitando o estilo do email anterior, crie um novo email para realizar a ação a seguir.
Marcar uma conversa no "Bar do Antonio" às 20h e avisar que você convidou o Pedro também.
```

Você pode perceber que, neste caso, o exemplo de e-mail que foi passado ao modelo não pode passar despercebido. Por isso, adicionamos o delimitador ####. Ele não só demarca o ponto fundamental do prompt, como delimita seu início e fim. Caso contrário, o modelo poderia confundir o exemplo com a instrução, ou com o resto do contexto. Isso seria um grande problema, pois o exemplo dá o tom da resposta neste caso. Outra tática que gosto de utilizar é avisar ao modelo que estou utilizando um delimitador.

```python
Delimitado por #### está um exemplo do meu estilo de escrita de emails:

####
Fala, meu amigo!
Como estamos?
O que você acha de marcamos um dia para conversar?
Tamo junto!
Abraço
####

Imitando o estilo do email anterior, crie um novo email para realizar a ação a seguir.
Marcar uma conversa no "Bar do Antonio" às 20h e avisar que você convidou o Pedro também.
```

Ao escrever o `delimitado por ####` fica ainda mais claro ao modelo que ele deve prestar atenção neste trecho da mensagem.

Agora você percebe que, ao adicionarmos grandes volumes de dados aos nossos prompts, podemos organizar esta informação facilmente utilizando diferentes delimitadores. Outro ponto fundamental ao utilizarmos prompts com programação é conseguirmos estruturar a saída do modelo de forma que esta saída seja facilmente processada pelo seu script. Para isso, podemos fazer um trabalho de estruturação de saídas.

## O que são Saídas Estruturadas?

Você deve ter percebido que a resposta do modelo pode ser bem inusitada, caso não criemos formas de torná-la mais determinística. Por exemplo, podemos fazer a seguinte pergunta:

```python
Qual o nome das mães das seguintes pessoas:
Ronaldinho Gaúcho, Neymar, Rivaldo
```

A reposta é a seguinte:

```python
Mãe de Ronaldinho Gaúcho: Miguelina Elói Assis dos Santos
Mãe de Neymar: Nadine Santos
Mãe de Rivaldo: Ivone Vitor dos Santos
```

Mas a seguinte resposta tabém seria possível:

```python
Miguelina Elói Assis dos Santos, Nadine Santos, Ivone Vitor dos Santos
```

E esta resposta também:

```python
Os nomes das mães de Ronaldinho Gaúcho, Neymar e Rivaldo são: Miguelina Elói Assis dos Santos, Nadine Santos e Ivone Vitor dos Santos
```

Para conseguir processar essas informações em um script seria muito difícil, pois a cada interação com o modelo a estrutura da resposta é diferente. Mas podemos contornar este problema sendo específicos quanto à forma que queremos receber a resposta. Por exemplo, poderíamos fazer o seguinte:

```python
Qual o nome das mães das seguintes pessoas:
Ronaldinho Gaúcho, Neymar, Rivaldo
Retorne a resposta apenas com os nomes separados por vírgulas.
```

E perfeito, temos uma resposta facilmente processável por um programa de computador.

```python
Miguelina Eloísa da Silva, Nadine Santos, Rosângela Ferreira Chaves
```

Mas podemos pedir alguns formatos mais complexos:

```python
Qual o nome das mães das seguintes pessoas:
Ronaldinho Gaúcho, Neymar, Rivaldo
Retorne a resposta no formato de uma lista de Python.
```

E temos uma lista de Python:

```python
['Miguelina Eloi Assis dos Santos', 'Nadine Santos', 'Maria do Carmo Ferreira']
```

Ou poderíamos querer em formato JSON:

```python
Qual o nome das mães das seguintes pessoas:
Ronaldinho Gaúcho, Neymar, Rivaldo
Retorne a resposta no formato de Json, com chaves de nome_filho, nome_mae.
```

E temos um JSON com a chaves que solicitamos.

```python
{
    "nome_filho": "Ronaldinho Gaúcho",
    "nome_mae": "Miguelina Elói Assis dos Santos"
},
{
    "nome_filho": "Neymar",
    "nome_mae": "Nadine Santos"
},
{
    "nome_filho": "Rivaldo",
    "nome_mae": "Dona Marina" 
}
```

Poderíamos ainda solicitar na forma de uma tabela de html:

```python
Qual o nome das mães das seguintes pessoas:
Ronaldinho Gaúcho, Neymar, Rivaldo
Retorne a resposta no formato de uma tabela de Html com as colunas Nome do Filho e Nome da Mãe.
```

E temos uma tabela de html:

```python
<table>
  <tr>
    <th>Nome do Filho</th>
    <th>Nome da Mãe</th>
  </tr>
  <tr>
    <td>Ronaldinho Gaúcho</td>
    <td>Miguelina Eloi Assis dos Santos</td>
  </tr>
  <tr>
    <td>Neymar</td>
    <td>Nadine Santos</td>
  </tr>
  <tr>
    <td>Rivaldo</td>
    <td>Terezinha Ferreira Borba</td>
  </tr>
</table>
```