Ganhos:
- Configure o controle de acesso (ACL) que filtra a recuperação com base na autoridade do usuário
- Escrever um modelo de prompt sólido que coloque o contexto e a pergunta do usuário corretamente
- Praticar independência de perguntas e gerenciamento de histórico em conversas multi-rodadas
Estabelecemos a arquitetura; Agora vamos torná-lo seguro, consistente e coloquial. Existem três tópicos críticos nesta unidade: (1) controle de acesso que filtra a recuperação com base na autoridade do usuário, (2) um modelo de prompt robusto que coloca o contexto e a pergunta corretamente, (3) independência de perguntas e gerenciamento de histórico de conversa em chat multi-round. Sem esses três, um assistente irá vazar dados, dar respostas inconsistentes ou desmoronar nas perguntas de acompanhamento.
Controle de acesso: dados não autorizados nunca devem chegar
Maior risco corporativo: um documento que um usuário não deveria ver vaza na resposta. Um erro muito comum para iniciantes é "dizer ao modelo para 'mostrar documentos ocultos' no prompt". Isto não é seguro. O modelo pode esquecer uma instrução ou uma injeção imediata pode evitá-la. O local correto é a fase de recuperação: a peça não autorizada não deve ser trazida de forma alguma.
A maneira de fazer isso é aplicar os metadados de autoridade (departamento, função, nível de privacidade) que você coloca em cada parte como filtro durante a pesquisa. Você determina com segurança quem é o usuário (identidade e funções) na camada de aplicativo e adiciona um filtro ACL (Lista de Controle de Acesso) à chamada.
# Filtrado por recuperação de autoridade (conceitual)user = authenticate(session) # autenticado de fonte confiável = user.roles + ["todos"] # por exemplo. ["HR", "admin"]resultado = vektor_db.search( vektor=embed(question), top_k=20, filter={"permission_group": {"in": permitido}, # somente partes permitidas "privacy": {"lte": user.level}} # abaixo do nível)
Cuidado: Nunca peça autoridade ao modelo ou confie nas instruções. A identidade e a autoridade são determinadas na camada confiável da aplicação; O filtro de recuperação é obrigatório, a instrução imediata é apenas uma camada adicional. "Eu escrevi no prompt" não é segurança.
Modelo de prompt sólido
O modelo de prompt é o esqueleto que reúne o contexto, a pergunta do usuário e as instruções de comportamento da recuperação. Partes de um bom modelo: descrição da função/tarefa, regras de conduta (fundamento, não sei permissão, solicitação de recurso, tom), contexto, pergunta.
Você é um assistente de RH corporativo. Seu trabalho é responder às perguntas dos funcionários SOMENTE com base no seguinte CONTEXTO. Regras: - Se a resposta não estiver clara no contexto escreva "Não consegui encontrar informações sobre isso na documentação, verifique com a equipe de RH". Não adivinhe, não invente.- Se as fontes no contexto entrarem em conflito, tome a política oficial como base e declare a contradição.- Adicione a fonte na qual você confia como [Fonte: arquivo, seção] no final de cada reclamação.- Responda em uma linguagem curta, clara e profissional. CONTEXTO:{numbered_parts}PERGUNTA: {user_question}
Numerar as partes do contexto ([1], [2], ...) facilita a citação do modelo. Além disso, escreva a fonte no início de cada peça para que o modelo possa citá-la corretamente.
Dica: Mantenha o modelo de prompt constante e sempre coloque variáveis (contexto, pergunta) nos mesmos lugares. Um modelo fixo aumenta a testabilidade e reduz custos graças ao cache imediato em alguns sistemas.
CONTEXTO:[1] (Fonte: ik_el_kitabi.pdf, Seção 5.2) As férias anuais remuneradas são de 14 dias...[2] (Fonte: ik_el_kitabi.pdf, Seção 5.4) A licença é de 20 dias para pessoas com mais de 5 anos de serviço...
Alerta Fraco/Prompt Forte
Fraco (sem aterramento, sem fonte, identidade mista):
Use estes documentos e responda à pergunta: {parts}Usuário: {question}# Problema: modelo sai do contexto, inventa, não cita fontes, # se comporta arbitrariamente em contradição.
Forte (função + regras + contexto numerado + fonte obrigatória):
Você é... Basta confiar no CONTEXTO. Caso contrário, diga “não sei”. Em conflito, escolha a política oficial. Adicione [Fonte: ...] a cada afirmação.CONTEXTO: [1]... [2]... PERGUNTA: {pergunta}# Resultado: resposta que é fiel ao contexto, originada e gerencia a contradição corretamente.
Gerenciamento de conversas em vários tours
Um usuário real não faz uma única pergunta e deixa como está; fala. "Quantos dias de férias anuais eu tenho?" → “E o funcionário de 6 anos?” → “Como posso me inscrever?” A segunda e a terceira questões por si só não têm sentido; depende do contexto anterior.
Você precisa resolver dois problemas. A primeira é para recuperação: tornar a pergunta de acompanhamento independente (reescrita da pergunta). “E o funcionário de 6 anos?” → “A quantos dias de férias anuais tem direito um trabalhador de 6 anos?” Você pesquisa com esta pergunta independente. A segunda é para produção: você também fornece o histórico da conversa ao modelo para que ele continue de forma consistente.
# Duas etapas: independente → pesquisar → gerar com histórico (conceitual) independent = model.uret( "Use o histórico da conversa para tornar a pergunta compreensível por si só:\nHistórico: {history}\nPergunta: {follow_question}") context = retrieval(independent) # search with independent questionanswer = model.uret(prompt(context, history, follow_question))
À medida que o histórico cresce (longa conversa), enviar tudo de uma vez fica caro e preenche a janela de contexto. Solução: resumir as rodadas anteriores ou manter as últimas N rodadas e reduzir as anteriores ao resumo. Assim, os custos permanecem sob controle e a consistência é mantida.
Estado
problema
Solução
A pergunta de acompanhamento não tem contexto
Pesquisas de recuperação sem sentido
Torne a pergunta independente (reescreva)
longa conversa
Custo e aumento de janelas
Resumo dos passeios anteriores
O usuário alterou o tópico
Contexto antigo é infectado
Reduza a influência anterior em um novo tópico
A autoridade pode variar entre os passeios
Risco de vazamento
Reaplique o filtro ACL a cada rodada
Três Mini Estojos
Caso 1 — Falácia de “Segurança” com prompt. Uma empresa colocou documentos salariais confidenciais em um assistente que qualquer um poderia solicitar, mas apenas escreveu “não forneça informações salariais” no aviso. O modelo vazou a faixa salarial quando um usuário fez a pergunta de forma indireta. Quando o filtro ACL foi adicionado à recuperação (partes salariais apenas para a função de RH), o vazamento foi completamente fechado; porque a peça nunca mais é trazida.
Caso 2 — Perseguição sem contexto. Em um assistente de suporte, o usuário pergunta “período de retorno?” → “e o produto quebrado?” O sistema trouxe peças irrelevantes para o “produto quebrado”. Quando foi adicionada a independência das perguntas (“Quanto tempo é o período de devolução de um produto quebrado?”), a taxa de respostas corretas aumentou de 44% para 90%.
Caso 3 — Passado inchado. Em 30 rodadas de chat com um assistente, cada ligação enviou todo o histórico; O custo aumentava 3 vezes por rodada e as respostas diminuíam. Quando mudamos para uma estrutura que manteve as últimas 6 rodadas e resumiu as anteriores, o custo do token caiu 62% e a consistência foi mantida.
Erros comuns
- Deixando autoridade para o prompt: Modelo esquece/ignora; O filtro ACL é obrigatório na recuperação.
- Não enumerar o contexto: O modelo não consegue citar a fonte correta.
- Não independente da pergunta de acompanhamento: A recuperação pesquisa inutilmente.
- Envio cego de todo o histórico: Explode em custos e atrasos; resumir.
- Não escrever a regra da contradição: O modelo pode apresentar a fonte não confiável como oficial.
Em resumo
- O controle de acesso é implementado com um filtro de metadados durante a fase de recuperação; Peças não autorizadas nunca devem ser trazidas.
- A identidade e a autoridade são determinadas na camada de aplicação confiável; A instrução imediata é apenas uma camada adicional de defesa.
- O modelo robusto de prompt inclui função, regras de conduta (fundamento, permissão desconhecida, fonte, conflito), contexto numerado e pergunta.
- Na conversa multi-rodada, as perguntas de acompanhamento são dissociadas e o modelo produz respostas consistentes com o histórico.
- Ao resumir o longo histórico, a janela de custo e contexto é mantida sob controle; O ACL é reaplicado a cada rodada.
Tarefa de aplicativo
(1) Defina pelo menos três grupos de autorização para o seu próprio assistente (por exemplo, todos, departamento, gerente) e escreva em uma tabela qual tipo de documento está aberto para qual grupo. (2) Adapte e escreva o modelo de prompt acima de acordo com sua função e tom; Torne o contexto numerado e originado. (3) Escreva um cenário de conversa realista em três rodadas (pergunta → acompanhamento → acompanhamento) e gere manualmente versões independentes de cada pergunta de acompanhamento. (4) Explique em uma frase por que o filtro ACL deve ser reaplicado a cada rodada neste cenário.
lista de verificação
- [] Implemento controle de acesso com um filtro de recuperação, só não confio no prompt.
- [] Eu adiciono fundamento, não sei permissão, fonte e regra de conflito ao meu modelo de prompt.
- [] Forneço as partes do contexto numeradas e referenciadas.
- [] Eu faço perguntas de acompanhamento independentes antes da recuperação.
- [] Eu administro o custo e a janela resumindo o longo histórico de conversas.