Um bate-papo de personagens com memória integrada de médio e longo prazo
Confira aqui!
Eu experimentei (e gostei) de muitos serviços de IA de RPG de personagens diferentes recentemente. Meus favoritos são Character.ai, Doppel.ai e Poly.ai da Cloud Whale Interactive Technology (não deve ser confundido com poly.ai, os desenvolvedores do chatbot de atendimento ao cliente)
No entanto, cada um destes sistemas tem limitações que podem ser agravantes. Tentei abordar alguns deles neste projeto.
Os bate-papos baseados em personagens são ótimos e envolventes, mas têm memória curta. Freqüentemente, eles perdem o controle do cenário, da situação e de eventos anteriores importantes. Embora o uso de janelas de contexto mais longas possa ajudar nisso, os tokens são caros! Como podemos dar a um personagem uma memória longa, mas limitar o número de tokens enviados para cada conclusão? Doppel.ai, entretanto, é muito melhor nisso do que o resto. Seus personagens têm memórias mais longas.
Os personagens perdem sua personalidade com o tempo ou tendem a ficar presos em ciclos de resposta repetitivos. Alguns serviços são melhores que outros nisso, mas já vi isso acontecer até certo ponto com todos eles.
Os personagens ficam estáticos depois de criados. Alguns serviços permitem adicionar ‘memórias’ adicionais a um personagem, mas ainda não encontrei nenhum que permita alterar a personalidade básica do personagem sem reiniciar a conversa.
O Agente é fornecido com uma "memória" de várias camadas, ou prompt do sistema que muda dinamicamente, que inclui níveis de informações de conversas anteriores, variando de muito específico para o mais recente a mais resumido para a maioria dos tópicos e informações à distância.
Janela de bate-papo com rolagem de memória de curto prazo Cada chamada ao modelo inclui uma lista bastante curta de mensagens anteriores literalmente. Isso ajuda o modelo a acompanhar o contexto da conversa atual e das mensagens recentes.
Meory Scratchpad intermediário Além disso, criei um scratchpad para o agente de IA usar para fazer anotações e acompanhar os destaques recentes da conversa. Este bloco de notas é atualizado continuamente com novas informações adicionadas ou atualizadas e informações antigas, que não são mais relevantes, descartadas. No entanto, nenhuma informação é realmente perdida porque os instantâneos de seu bloco de notas são salvos como entradas no banco de dados de vetores.
Como essas informações são resumidas, elas compactam as informações recentes, permitindo que o modelo tenha os benefícios de uma janela de bate-papo mais longa e de um contexto maior, ao mesmo tempo que minimiza os tokens reais incluídos no prompt.
Os nomes dos caracteres (não apenas 'usuário' e 'assistente') são incluídos em cada mensagem para ajudar no resumo. Isso também ajuda o modelo a acompanhar quem está dizendo o quê. Isso torna muito menos provável que o agente de IA fique confuso entre quem disse o quê (o que, de outra forma, seria um problema). Também ajuda a manter a etiqueta de troca de turnos no diálogo e evita que o agente fale pelo usuário (o que também pode ser um problema)
Memória de armazenamento vetorial de longo prazo Eu uso resumos de conversas para extrair informações importantes das conversas e, em seguida, armazená-las em um banco de dados vetorial. Cada consulta do usuário aciona uma pesquisa semântica no banco de dados vetorial para recuperar informações relevantes de resumos de conversas anteriores. Essas informações estão incluídas no prompt do modelo, bem como em algumas das mensagens mais recentes.
Dessa forma, a memória de um agente de IA pode exceder em muito o seu contexto. Na verdade, como os armazenamentos de vetores podem ocupar relativamente pouco espaço em disco, o tamanho efetivo potencial da memória do agente é funcionalmente ilimitado.
Quando as memórias são armazenadas, elas são armazenadas com carimbos de data e hora e quando são recuperadas são ordenadas cronologicamente. O agente é instruído a preferir informações mais recentes se as memórias forem conflitantes.
Resultado O modelo é capaz de recuperar com precisão informações anteriores na conversa na maior parte do tempo. As pesquisas em lojas de vetores geralmente são bem-sucedidas na recuperação de informações relevantes, mas o modelo nem sempre faz uso das informações em suas respostas. No geral, porém, fiquei satisfeito com os resultados.
Próximas etapas
Gostaria que o modelo fizesse referência de forma mais proativa a eventos anteriores. É mais bem sucedido na recordação se eu fizer perguntas diretamente sobre conversas anteriores, mas raramente faço referência espontânea a eventos anteriores. Vive muito no momento. Estou trabalhando na engenharia imediata para gerar esse comportamento, mas ainda está em andamento.
Também estou pensando em usar o reconhecimento de entidade nomeada para permitir que o agente construa perfis de personagens ou lugares e armazene informações relevantes para entidades específicas. Isso ajudaria o modelo a organizar as informações por entidade, em vez de serem apenas instantâneos de conversas.
Percebi que, embora os personagens muitas vezes começassem fortes com um estilo de fala único, com o tempo seu estilo se tornou muito brando e soou como sua IA básica. Eu experimentei algumas soluções, incluindo fazer com que ele escrevesse seu aviso em caráter. No entanto, isso desperdiçou muitos tokens na memória ao criar notas menos densas em tokens.
Em vez disso, armazeno uma amostra da primeira resposta que o modelo fornece como estilo de exemplo. Essa primeira resposta é então passada ao agente em cada prompt como um exemplo de estilo de fala para cada prompt. Descobri que isso é MUITO eficaz para ajudar o modelo a manter um estilo de fala consistente, mesmo em conversas longas (mais de 100 conclusões).
Próximos passos Embora o tom das mensagens seja consistente, gostaria de dar aos modelos personalidades ainda mais fortes, mais matizadas e consistentes. Eu suspeito que isso pode exigir um ajuste fino.
Em muitos sistemas de RPG LLM, os personagens são estáticos depois de criados. No entanto, na minha implementação, as descrições dos personagens e até os nomes podem ser alterados instantaneamente. De utilidade específica é a capacidade de alterar a localização e o nome de usuário.
Descrições dos personagens Às vezes, você deseja mudar devido a eventos recentes ou que seus objetivos ou motivações evoluam com o tempo. Isso é fácil de fazer ajustando diretamente a descrição do personagem na hora.
Localização Conversas e dramatizações muitas vezes podem se mover no mundo imaginário. Você pode ir de uma cidade para uma masmorra, ou de um dormitório para uma cafeteria, ou de casa para o trabalho. Meu site permite que você altere o local da conversa rapidamente.
Nome de usuário Outro desafio da maioria dos sistemas de RPG de personagens é incluir vários personagens. No meu sistema você pode alterar o nome do personagem pelo qual está falando na hora. Isso permite simular vários personagens em uma conversa ou situação.
Nome do personagem Alterar isso na verdade não é muito útil. Não funciona fazer com que o personagem interprete personagens diferentes e causará confusão quando o modelo tentar relacionar as conversas atuais com resumos de conversas anteriores.
Próximas etapas