eriquesouza commited on
Commit
0c57a2b
·
1 Parent(s): d617b55

Enhance seed memories in `seeds.py` with new semantic and episodic entries

Browse files

- Added multiple semantic memories reflecting user experiences and frustrations regarding internet services and TV subscriptions.
- Introduced episodic memories capturing specific user interactions and events.
- Improved context tagging and summaries for better categorization and understanding of user feedback.

Files changed (1) hide show
  1. seeds.py +262 -58
seeds.py CHANGED
@@ -6,80 +6,284 @@ def _ago(days: int, hour: int = 9, minute: int = 0) -> str:
6
  return dt.replace(hour=hour, minute=minute, second=0, microsecond=0).isoformat()
7
 
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  SEED_MEMORIES = [
10
- {
11
- # Oldest core domain knowledge absorbed months ago
12
- "content": "Feriados prolongados (3+ dias) tendem a aumentar o fluxo de clientes em até 30% comparado com fins de semana regulares, especialmente entre 10h e 16h.",
 
 
 
 
 
 
 
13
  "memory_type": "semantic",
14
- "context_tags": ["feriado", "fluxo", "demanda", "clientes"],
15
- "summary": "Feriados aumentam fluxo em ~30%",
16
- "created_at": _ago(90, hour=8),
17
  },
18
- {
19
- "content": "Temperaturas acima de 30°C aumentam significativamente a demanda por bebidas geladas — refrigerantes, água, sucos e isotônicos. O efeito é quase linear acima desse limiar.",
 
 
 
 
20
  "memory_type": "semantic",
21
- "context_tags": ["temperatura", "bebidas", "clima", "demanda", "calor"],
22
- "summary": "Calor acima de 30°C dispara vendas de bebidas",
23
  "created_at": _ago(75, hour=10),
24
  },
25
- {
26
- "content": "Produtos premium (vinhos importados, queijos finos, chocolates artesanais) têm menor elasticidade de demanda em períodos de calor intenso — consumidores priorizam conveniência e frescor sobre sofisticação.",
 
 
 
27
  "memory_type": "semantic",
28
- "context_tags": ["premium", "calor", "elasticidade", "comportamento_consumidor"],
29
- "summary": "Produtos premium vendem menos no calor",
30
- "created_at": _ago(60, hour=14),
31
  },
32
- {
33
- "content": "Snacks salgados têm alta correlação de compra com bebidas: clientes que adicionam bebidas ao carrinho têm 60% de probabilidade de adicionar snacks também. Posicionamento próximo aumenta o ticket médio.",
 
 
 
 
34
  "memory_type": "semantic",
35
- "context_tags": ["snacks", "bebidas", "cross_selling", "ticket_medio", "layout"],
36
- "summary": "Snacks e bebidas: 60% de cross-sell",
37
- "created_at": _ago(45, hour=11),
38
  },
39
- {
40
- "content": "Fins de semana prolongados aumentam a demanda por produtos de preparo rápido e conveniência (pratos prontos, lanches, bebidas) e reduzem a demanda por insumos de preparo longo (carnes especiais, massas).",
 
 
 
 
41
  "memory_type": "semantic",
42
- "context_tags": ["feriado", "conveniencia", "comportamento_consumidor", "mix"],
43
- "summary": "Feriados favorecem conveniência vs. preparo longo",
44
- "created_at": _ago(30, hour=9),
45
  },
46
- {
47
- # Procedural — stable process, learned a few weeks ago
48
- "content": "O processo padrão de reabastecimento leva 48 horas do momento do pedido ao produto na prateleira, considerando separação no CD, transporte e conferência na loja.",
49
- "memory_type": "procedural",
50
- "context_tags": ["reabastecimento", "logistica", "processo", "prazo"],
51
- "summary": "Reabastecimento padrão: 48h do pedido à prateleira",
52
- "created_at": _ago(20, hour=16),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  },
54
- {
55
- # State — most recent, volatile fact recorded last week
56
- "content": "O fornecedor principal de bebidas não realiza entregas às segundas-feiras. Pedidos feitos até sexta ao meio-dia chegam na quarta-feira da semana seguinte.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  "memory_type": "state",
58
- "context_tags": ["fornecedor", "bebidas", "logistica", "entrega", "calendario"],
59
- "summary": "Fornecedor de bebidas: sem entregas às segundas",
60
- "created_at": _ago(7, hour=13),
61
  },
62
- {
63
- # State — most recent, volatile fact recorded last week
64
- "content": "O fornecedor principal de bebidas não realiza entregas às segundas-feiras. Pedidos feitos até sexta ao meio-dia chegam na quarta-feira da semana seguinte.",
 
 
 
65
  "memory_type": "state",
66
- "context_tags": ["fornecedor", "bebidas", "logistica", "entrega", "calendario"],
67
- "summary": "Fornecedor de bebidas: sem entregas às segundas",
68
- "created_at": _ago(20, hour=13),
69
  },
70
- {
71
- "content": "Snacks salgados têm alta correlação de compra com bebidas: clientes que adicionam bebidas ao carrinho têm 60% de probabilidade de adicionar snacks também. Posicionamento próximo aumenta o ticket médio.",
72
- "memory_type": "semantic",
73
- "context_tags": ["snacks", "bebidas", "cross_selling", "ticket_medio", "layout"],
74
- "summary": "Snacks e bebidas: 60% de cross-sell",
75
- "created_at": _ago(45, hour=11),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  },
77
- {
78
- # Procedural — stable process, learned a few weeks ago
79
- "content": "O processo padrão de reabastecimento leva 48 horas do momento do pedido ao produto na prateleira, considerando separação no CD, transporte e conferência na loja.",
 
 
 
 
80
  "memory_type": "procedural",
81
- "context_tags": ["reabastecimento", "logistica", "processo", "prazo"],
82
- "summary": "Reabastecimento padrão: 48h do pedido à prateleira",
83
- "created_at": _ago(20, hour=16),
84
- }
85
- ]
 
6
  return dt.replace(hour=hour, minute=minute, second=0, microsecond=0).isoformat()
7
 
8
 
9
+ # ─── Mapa de tensões intencionais ──────────────────────────────────────────────
10
+ #
11
+ # CONTRADITÓRIAS (mesma situação, relatos opostos de usuários diferentes):
12
+ # SEM-01 vs SEM-04 → migração para fibra: usuário A ficou satisfeito vs usuário B teve problemas
13
+ # EPI-02 vs EPI-05 → desconto de retenção: funcionou vs gerou mais reclamações depois
14
+ #
15
+ # CONFLITANTES (não podem ser verdade ao mesmo tempo):
16
+ # STA-02 vs STA-03 → roteador AX-3000: disponível vs sem estoque
17
+ # PRO-03 vs PRO-04 → protocolo de desconto: oferecer logo vs só após escuta
18
+ #
19
+ # MEMÓRIAS RUINS (extraídas de conversa mas imprecisas ou desatualizadas):
20
+ # SEM-03 → usuário disse que TV a cabo "nunca dá problema" (generalização incorreta)
21
+ # EPI-03 → usuário relatou sucesso da campanha sem mencionar churn posterior
22
+ # STA-05 → usuário mencionou parceria com Operadora Y, pode estar desatualizado
23
+ #
24
+ # ───────────────────────────────────────────────────────────────────────────────
25
+
26
  SEED_MEMORIES = [
27
+
28
+ # ── SEMÂNTICAS ──────────────────────────────────────────────────────────────
29
+ # Padrões abstraídos de múltiplas conversas com usuários
30
+
31
+ { # SEM-01 ✅ BOA — contradiz SEM-04
32
+ "content": (
33
+ "Olha, eu até pensei em cancelar a internet para pegar outra mais barata, mas como eu tenho "
34
+ "o combo completo com vocês, incluindo a TV e o telefone fixo, acho que não vale a pena "
35
+ "cancelar nada agora porque eu acabaria perdendo todos os descontos e tudo junto de uma vez."
36
+ ),
37
  "memory_type": "semantic",
38
+ "context_tags": ["combo", "retenção", "cancelamento", "padrão", "fidelidade"],
39
+ "summary": "Clientes de combo relatam fricção natural para cancelar",
40
+ "created_at": _ago(90, hour=9),
41
  },
42
+ { # SEM-02 ✅ BOA
43
+ "content": (
44
+ "Acabei de instalar o plano faz 5 dias e fui medir a velocidade aqui, mas não está dando "
45
+ "o que eu contratei de jeito nenhum. O outro atendente me falou um monte de termos técnicos, "
46
+ "mas eu só quero entender por que estou recebendo menos megas do que vocês me venderam!"
47
+ ),
48
  "memory_type": "semantic",
49
+ "context_tags": ["velocidade", "internet", "onboarding", "frustração", "instalação"],
50
+ "summary": "Novos clientes sempre questionam velocidade real vs contratada",
51
  "created_at": _ago(75, hour=10),
52
  },
53
+ { # SEM-03 ❌ RUIM — generalização incorreta feita por um único usuário
54
+ "content": (
55
+ "Sou cliente de vocês há uns 5 anos e vou te falar: a TV a cabo de vocês nunca me dá problema. "
56
+ "É sério, pode cair chuva ou o que for, é o único serviço que nunca cai na minha casa."
57
+ ),
58
  "memory_type": "semantic",
59
+ "context_tags": ["TV", "confiabilidade", "percepção", "clientes antigos"],
60
+ "summary": "Cliente antigo relatou TV a cabo como serviço mais confiável",
61
+ "created_at": _ago(180, hour=14),
62
  },
63
+ { # SEM-04 ⚠️ CONTRADITÓRIA com SEM-01
64
+ "content": (
65
+ "Quero ver para tirar a TV do meu plano. Eu estou pagando essa TV a cabo do combo todo mês, "
66
+ "mas na realidade a gente só senta na sala para assistir Netflix e YouTube. Não faz sentido "
67
+ "continuar pagando por um negócio que ninguém aqui em casa usa."
68
+ ),
69
  "memory_type": "semantic",
70
+ "context_tags": ["TV", "streaming", "combo", "cancelamento", "downgrade"],
71
+ "summary": "Clientes de combo reclamam que pagam TV mas só usam streaming",
72
+ "created_at": _ago(20, hour=11),
73
  },
74
+ { # SEM-05 ✅ BOA
75
+ "content": (
76
+ "Minha internet caiu de novo! Isso já aconteceu na semana passada e vocês falaram que tinham "
77
+ "resolvido em definitivo. Estou cansado de ter que ligar toda vez pelo mesmo motivo e escutar "
78
+ "as mesmas desculpas de vocês sem que resolvam meu problema de verdade."
79
+ ),
80
  "memory_type": "semantic",
81
+ "context_tags": ["incidente", "rede", "frustração", "histórico", "atendimento"],
82
+ "summary": "Clientes pós-incidente chegam irritados; reconhecer histórico acalma",
83
+ "created_at": _ago(55, hour=15),
84
  },
85
+ { # SEM-06 ✅ BOA
86
+ "content": (
87
+ "Vocês me deixaram o fim de semana inteirinho sem internet, o sinal sumiu no sábado de manhã! "
88
+ "Agora já é segunda-feira, eu vi que a luz do modem normalizou agorinha, mas o transtorno que "
89
+ "eu passei nesses dois dias me deu vontade de cancelar tudo e ir para a concorrência."
90
+ ),
91
+ "memory_type": "semantic",
92
+ "context_tags": ["segunda-feira", "fim de semana", "indisponibilidade", "insatisfação", "cancelamento"],
93
+ "summary": "Problemas no fim de semana geram insatisfação amplificada na segunda",
94
+ "created_at": _ago(40, hour=8),
95
+ },
96
+
97
+ # ── EPISÓDICAS ──────────────────────────────────────────────────────────────
98
+ # Eventos específicos relatados por usuários em conversas
99
+
100
+ { # EPI-01 ✅ BOA
101
+ "content": (
102
+ "Meu nome é Carlos e eu pedi a portabilidade do meu número já faz 5 dias. Essa é a terceira vez "
103
+ "que eu ligo para cá e cada atendente me dá um prazo ou uma informação diferente! Se vocês não "
104
+ "resolverem isso agora, eu vou direto no Procon abrir uma reclamação contra a empresa."
105
+ ),
106
+ "memory_type": "episodic",
107
+ "context_tags": ["portabilidade", "telefonia", "reclamação", "Procon", "inconsistência"],
108
+ "summary": "Cliente relatou portabilidade travada há 5 dias com 3 informações diferentes",
109
+ "created_at": _ago(70, hour=10),
110
  },
111
+ { # EPI-02 ❌ RUIM / INCOMPLETA — contradiz EPI-05
112
+ "content": (
113
+ "Eu estava mesmo pensando em cancelar por causa do preço alto, mas esse desconto de 30% que "
114
+ "você me ofereceu agora foi excelente. Foi super rápido e resolveu meu problema, pode manter "
115
+ "o contrato ativo desse jeito."
116
+ ),
117
+ "memory_type": "episodic",
118
+ "context_tags": ["retenção", "desconto", "satisfação", "preço", "sucesso"],
119
+ "summary": "Cliente Ana: desconto de 30% resolveu intenção de cancelamento",
120
+ "created_at": _ago(90, hour=9),
121
+ },
122
+ { # EPI-03 ✅ BOA
123
+ "content": (
124
+ "Queria deixar um elogio para o técnico que veio fazer a migração para a fibra óptica na semana passada. "
125
+ "Ele foi super pontual e me explicou tudo direitinho. A velocidade dobrou na prática aqui em casa! "
126
+ "Tem algum programa onde eu possa indicar amigos para a empresa e ganhar algum desconto por isso?"
127
+ ),
128
+ "memory_type": "episodic",
129
+ "context_tags": ["fibra", "migração", "elogio", "indicação", "satisfação"],
130
+ "summary": "Cliente elogiou migração para fibra e perguntou sobre programa de indicação",
131
+ "created_at": _ago(50, hour=14),
132
+ },
133
+ { # EPI-04 ✅ BOA
134
+ "content": (
135
+ "Eu agendei a instalação para hoje cedo e o técnico simplesmente não apareceu, e ninguém se deu ao "
136
+ "trabalho de me avisar! Eu perdi meio dia de trabalho esperando igual uma boba. Se vocês não mandarem "
137
+ "alguém aqui para resolver isso ainda hoje, eu vou cancelar o pedido e não quero mais nada."
138
+ ),
139
+ "memory_type": "episodic",
140
+ "context_tags": ["instalação", "no-show", "técnico", "cancelamento", "escalamento"],
141
+ "summary": "Cliente perdeu meio dia por no-show do técnico e ameaçou cancelamento",
142
+ "created_at": _ago(34, hour=11),
143
+ },
144
+ { # EPI-05 ⚠️ CONTRADITÓRIA com EPI-02
145
+ "content": (
146
+ "Eu aceitei uma proposta de vocês de 30% de desconto há 3 meses para não cancelar, só que agora "
147
+ "a minha fatura veio no valor cheio de novo e ninguém me avisou nada que ia expirar! Estou me "
148
+ "sentindo enganado, parece que me deram o desconto só para eu ficar na época e depois esqueceram "
149
+ "de mim. Quero cancelar meu contrato agora."
150
+ ),
151
+ "memory_type": "episodic",
152
+ "context_tags": ["desconto", "retenção", "cancelamento", "transparência", "fatura"],
153
+ "summary": "Cliente cancelou após desconto de retenção expirar sem aviso prévio",
154
+ "created_at": _ago(12, hour=16),
155
+ },
156
+ { # EPI-06 ✅ BOA
157
+ "content": (
158
+ "A queda de internet que deu aqui em casa na semana passada me prejudicou muito, eu perdi uma reunião "
159
+ "de trabalho super importante. Eu moro sozinha e dependo 100% dessa internet para o meu home office. "
160
+ "Eu aceito esse abatimento de 3 dias na fatura que você propôs, mas preciso de uma garantia de "
161
+ "que isso não vai se repetir."
162
+ ),
163
+ "memory_type": "episodic",
164
+ "context_tags": ["queda", "internet", "home office", "compensação", "fatura"],
165
+ "summary": "Cliente home office teve reunião prejudicada por queda; aceitou compensação",
166
+ "created_at": _ago(7, hour=10),
167
+ },
168
+
169
+ # ── ESTADO ──────────────────────────────────────────────────────────────────
170
+ # Fatos atuais sobre a operação, relatados ou confirmados em conversas recentes
171
+
172
+ { # STA-01 ✅ BOA
173
+ "content": (
174
+ "Estou tentando abrir o aplicativo de vocês para emitir a segunda via do meu boleto, mas só dá "
175
+ "uma mensagem de erro na tela e não carrega o código de barras de jeito nenhum. Já tentei "
176
+ "ontem e hoje e continua quebrado."
177
+ ),
178
  "memory_type": "state",
179
+ "context_tags": ["app", "boleto", "instabilidade", "financeiro", "bug"],
180
+ "summary": "App com erro no módulo de boleto múltiplos clientes relatando",
181
+ "created_at": _ago(2, hour=9),
182
  },
183
+ { # STA-02 ⚠️ CONFLITANTE com STA-03
184
+ "content": (
185
+ "Falei com o pessoal do pátio aqui no centro de distribuição e o estoque do roteador AX-3000 "
186
+ "cheio. Tem bastante caixa aqui, pode mandar bala e agendar as instalações normalmente para a "
187
+ "galera dos planos de 300 Mega que tem equipamento para todo mundo."
188
+ ),
189
  "memory_type": "state",
190
+ "context_tags": ["roteador", "AX-3000", "estoque", "instalação", "técnico"],
191
+ "summary": "Técnico confirmou estoque AX-3000 disponível em 16/05",
192
+ "created_at": _ago(6, hour=14),
193
  },
194
+ { # STA-03 ⚠️ CONFLITANTE com STA-02
195
+ "content": (
196
+ "Vocês cancelaram a minha instalação de última hora! O técnico me ligou dizendo que não vinha "
197
+ "porque simplesmente não tinha o roteador AX-3000 no estoque para trazer. Como vocês me vendem "
198
+ "um plano de 300 Megas e não têm o aparelho para instalar?"
199
+ ),
200
+ "memory_type": "state",
201
+ "context_tags": ["roteador", "AX-3000", "ruptura", "instalação", "cancelamento"],
202
+ "summary": "Ruptura de estoque AX-3000 confirmada em 20/05 — instalações impactadas",
203
+ "created_at": _ago(2, hour=11),
204
+ },
205
+ { # STA-04 ✅ BOA
206
+ "content": (
207
+ "Moro aqui no Bairro Novo e faz uma semana que minha internet fica uma carroça à noite. É batata: "
208
+ "deu umas 19h o sinal despenca e a velocidade cai pela metade, e só volta a melhorar depois "
209
+ "das 22h. Não consigo assistir nada nesse horário."
210
+ ),
211
+ "memory_type": "state",
212
+ "context_tags": ["lentidão", "congestionamento", "Bairro Novo", "horário de pico", "rede"],
213
+ "summary": "Bairro Novo com lentidão 19h–22h esta semana — possível congestionamento",
214
+ "created_at": _ago(3, hour=16),
215
+ },
216
+ { # STA-05 ❌ RUIM / POTENCIALMENTE DESATUALIZADA
217
+ "content": (
218
+ "Eu preciso saber se vocês atendem em área rural, mais especificamente no interior do Pará. O "
219
+ "atendente que me atendeu em março me garantiu que vocês têm uma parceria com a Operadora Y "
220
+ "que cobre lá e eu achei ótimo, mas quero ter certeza absoluta antes de assinar."
221
+ ),
222
+ "memory_type": "state",
223
+ "context_tags": ["cobertura", "rural", "Pará", "parceria", "Operadora Y"],
224
+ "summary": "Agente informou parceria Operadora Y para cobertura rural (não verificado)",
225
+ "created_at": _ago(60, hour=11),
226
+ },
227
+
228
+ # ── PROCEDURAIS ─────────────────────────────────────────────────────────────
229
+ # Como o agente deve agir em situações específicas, aprendido em conversas
230
+
231
+ { # PRO-01 ✅ BOA
232
+ "content": (
233
+ "Minha internet está muito lenta hoje. Mas peraí, você me perguntou se eu estou usando o cabo de rede "
234
+ "ou o Wi-Fi... Deixa eu ver aqui... Realmente, no cabo de rede a velocidade está normal, o problema "
235
+ "é só quando eu vou para o quarto e o sinal do Wi-Fi fica fraquinho. Nem precisa mandar técnico então, "
236
+ "o problema é a distância do aparelho."
237
+ ),
238
+ "memory_type": "procedural",
239
+ "context_tags": ["lentidão", "Wi-Fi", "diagnóstico", "suporte", "N1"],
240
+ "summary": "Lentidão: perguntar cabeado vs Wi-Fi antes de qualquer outra coisa",
241
+ "created_at": _ago(80, hour=9),
242
+ },
243
+ { # PRO-02 ✅ BOA
244
+ "content": (
245
+ "Eu cansei de esperar e vou registrar uma reclamação agora mesmo na Anatel e no Procon! ... Olha, "
246
+ "gostei que você não ficou tentando me convencer a mudar de ideia e admitiu que eu tenho esse direito. "
247
+ "Como você me deu esse protocolo com um prazo travado de 24 horas para o supervisor me ligar com a "
248
+ "solução, eu vou aguardar esse prazo antes de enviar a reclamação."
249
+ ),
250
+ "memory_type": "procedural",
251
+ "context_tags": ["Procon", "Anatel", "reclamação", "escalamento", "protocolo"],
252
+ "summary": "Cliente ameaça Procon/Anatel: reconhecer direito + dar prazo concreto",
253
+ "created_at": _ago(65, hour=10),
254
+ },
255
+ { # PRO-03 ⚠️ CONFLITANTE com PRO-04
256
+ "content": (
257
+ "Eu liguei decidido a cancelar hoje, mas caramba, você já começou a conversa me oferecendo essa "
258
+ "proposta de desconto logo de cara? Desse jeito não tem nem como recusar, nem deu tempo de eu "
259
+ "reclamar de nada. Pode renovar o plano com esse valor novo aí."
260
+ ),
261
+ "memory_type": "procedural",
262
+ "context_tags": ["retenção", "desconto", "cancelamento", "timing", "oferta"],
263
+ "summary": "Retenção: oferecer desconto logo no início, antes do cliente se firmar",
264
+ "created_at": _ago(100, hour=14),
265
+ },
266
+ { # PRO-04 ⚠️ CONFLITANTE com PRO-03
267
+ "content": (
268
+ "Vocês ficam querendo me empurrar desconto na mensalidade, mas o meu problema não é dinheiro! Eu quero "
269
+ "cancelar porque a minha conexão cai todo santo dia e o suporte de vocês não resolve a fiação externa. "
270
+ "Não adianta me dar 30% de desconto para eu continuar sem internet e ter que cancelar daqui a dois meses."
271
+ ),
272
+ "memory_type": "procedural",
273
+ "context_tags": ["retenção", "desconto", "motivo", "cancelamento", "churn"],
274
+ "summary": "Após caso Paulo: entender motivo antes de oferecer desconto de retenção",
275
+ "created_at": _ago(10, hour=9),
276
  },
277
+ { # PRO-05 ✅ BOA
278
+ "content": (
279
+ "O motivo do meu cancelamento é estritamente financeiro, as coisas apertaram e o plano de vocês ficou "
280
+ "muito pesado no meu orçamento mensal. ... Ah, você tem um plano menor? Se eu fizer esse downgrade "
281
+ "para um pacote mais básico e a conta cair para quase metade do preço, eu topo sim! Não preciso cancelar "
282
+ "tudo, só precisava abaixar o custo."
283
+ ),
284
  "memory_type": "procedural",
285
+ "context_tags": ["cancelamento", "preço", "downgrade", "retenção", "plano"],
286
+ "summary": "Cancelamento por preço: oferecer downgrade de plano funciona melhor que desconto",
287
+ "created_at": _ago(25, hour=11),
288
+ },
289
+ ]