Este repositório é o meu playground para testar solicitações que geram respostas adequadas dos LLMs locais. Como é um playground, ele não está bem estruturado, então fique à vontade para fazer qualquer pergunta, caso você tivesse. A Discord Autogen é um ótimo lugar para discussão, consulte o canal #Alt-Models dentro dele.
Estou investigando pontos no fluxo de trabalho automático (da base de código às descrições do agente) que precisam ser adaptadas para acomodar LLMs locais que não são tão capazes quanto grandes modelos privados como o ChatGPT da IA.
Atualmente testando com um cenário de debate "bate -papo em grupo" (ver debate.py) criado por Tevslin (veja seu repositório e postagem no blog, obrigado!) Usando Mixtral e vários outros LLMs locais para fazer com que o LLM retorne o nome do nome do Próximo agente/função de forma consistente. Este é um bom teste, porque envolve um LLM entender uma ordem de agentes, revisando onde o debate está fazendo e determinando o próximo agente. Quase poderíamos fazer isso em um formato redondo-robin, ou em uma máquina de estado finita (onde definimos quem pode conversar com quem), mas é importante poder solicitar um LLM a escolher a direita, em seguida, agente.
Vou colocar quaisquer descobertas nesta leitura. Observe que isso está evoluindo e eu sou apenas uma pessoa tentando fazer as coisas funcionarem?
Estou usando o Ollama ao testar contra bibliotecas automáticas e com Litellm ao testar através do AutoGenStudio.
O código com o qual estou testando está na seleção de alto -falantes - rodadas de teste.
Alto -falantes selecionados corretamente | |
---|---|
✅ | Todos os 5 corretos |
? | 4 de 5 corretos |
3 ou menos correto | |
? | não passou por ir |
Mesa larga - Roll ->
Etapa 1 Conteúdo | Selecione o alto -falante | Redução de contexto | Phind-Codellama: 34B-V2 | Mixtral 8x7b (Q4) | OpenHermes: 7B-Mistral-V2.5-Q6_K | orca2: 13b-q5_k_s | Solar: 10.7b-Instruct-v1-q5_k_m | CHAT neural: 7B-V3.3-Q6_K | llama2: 13b-chat | Qwen: 14b-chat-q6_k | Mistral: 7B-Instruct-Q6_K | Yi: 34b-chat-q3_k_m | Phi-2 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Original | Original | Nenhum | ? | ||||||||||
Original | Enfatize, sequência, concisa | Resumido | ✅ | ✅ | ✅ | ? | ? | ||||||
Original | Enfatize, sequência, concisa | Nenhum | ✅ | ✅ | ? | ? | |||||||
Enfatizar a ordem | Enfatize, sequência, concisa | Nenhum | ✅ | ? | ✅ | ? | ? | ? | ? | ||||
Enfatizar a ordem | Enfatize, sequência, concisa | Resumido | ✅ | ? | ✅ | ? | ? | ? | ? | ||||
Enfatize + exemplo | Enfatize, sequência, concisa | Nenhum | ✅ | ✅ | ? | ? | ? | ? | ? | ||||
Enfatize + exemplo | Enfatize, sequência, concisa | Resumido | ✅ | ✅ | ? | ? | ? | ? | ? | ||||
Original | Original | Apenas o nome do alto -falante | ✅ | ✅ | ? | ||||||||
Enfatize + exemplo | Enfatize, capitais, raciocínio, sem debate | Primeiros 300 caracteres | ? | ✅ | ? | ? | ? | ||||||
Enfatizar a ordem | Enfatize, sequência, concisa | Primeiros 300 caracteres | ? | ✅ | ? | ? | ? | ||||||
Enfatizar a ordem | Enfatize, sequência, concisa | Primeiros 100 chars e nome | ✅ | ? | ? | ? | ? | ||||||
Enfatizar a ordem | Enfatize, sequência, concisa | Apenas o nome do alto -falante | ? | ✅ | ? | ? | ? | ||||||
Enfatizar a ordem | Enfatize, capitais, raciocínio, sem debate | Primeiros 300 caracteres | ? | ✅ | ? | ? | |||||||
Enfatize + exemplo | Enfatize, sequência, concisa | Primeiros 300 caracteres | ✅ | ? | ? | ? | |||||||
Enfatize + exemplo | Enfatize, sequência, concisa | Apenas o nome do alto -falante | ? | ✅ | ? | ? | |||||||
Enfatize + exemplo | Enfatize, capitais, resposta única | Resumido | ? | ✅ | ? | ? | |||||||
Enfatize + exemplo | Enfatize, sequência, concisa | Primeiros 100 chars e nome | ? | ✅ | ? | ||||||||
Enfatize + exemplo | Enfatize, capitais, resposta única | Nenhum | ✅ | ? | ? | ||||||||
Enfatize + exemplo | Enfatize, capitais, resposta única | Apenas o nome do alto -falante | ✅ | ? | |||||||||
Enfatize + exemplo | Enfatize, capitais, raciocínio, sem debate | Nenhum | ? | ? | ? | ? | ? | ? | |||||
Enfatize + exemplo | Enfatize, capitais, raciocínio, sem debate | Resumido | ? | ? | ? | ? | ? | ? |
Vencedores:
Os resultados diferem significativamente entre os LLMs, sem surpresa. No entanto, os avisos de ajustes estavam mudando a maneira como se comportaram de forma independente - por exemplo, mudar uma palavra ou duas em um aviso significaria que o Mistral 7b, que estava produzindo o resultado certo, produziria algo inesperado, mas essa mesma mudança significaria que 10,7b solar, O que não estava produzindo o que eu queria, de repente estaria gerando o resultado correto.
Então, nesse estágio, acredito que precisamos adaptar muitos dos avisos (ambos que podemos controlar através das descrições de agentes e mensagens do sistema, até os avisos subjacentes, como a seleção do alto -falante) para se adequar aos LLMs que estamos usando . Isso é até que um padrão mínimo de raciocínio LLM possa ser alcançado.
Aprendi rapidamente que, para obter resultados consistentes, pelo menos para o prompt de seleção de alto -falantes, tive que definir a temperatura para zero (pode trabalhar com números baixos em vez de apenas zero). Embora, mesmo em zero, as respostas variem às vezes que geralmente são consistentes.
A capacidade de ser capaz de definir a temperatura para os modelos no Autogen é importante para esses pequenos LLMs.
À medida que as mensagens de bate -papo continuam a crescer em número, o mesmo acontece com a chance de um modelo parar de produzir boas respostas. Alguns, como o PHI-2 com um comprimento de contexto de 2k, parariam de gerar resultados menos da metade do meu teste com o bate-papo em grupo de debates. Outros, incluindo 8x7b mixtral com uma janela de contexto de 32k, mostraram melhora quando os comprimentos do contexto foram reduzidos (bem antes do conteúdo era tão longo).
Um exemplo disso, com o Mixtral, é que, quando a mensagem de bate -papo completa passada para o Mixtral era inferior a 8.700 caracteres (não tokens, eu não conseguia obter esse número), ele retornaria a resposta correta (constantemente para a contagem de personagens). Quando estava acima de 8.700 caracteres, não seguia as instruções e, em vez de devolver o nome do próximo orador, ele debatia como eles. Essa foi uma questão consistente, pois o comprimento continuou a aumentar além de 8.700. Eu imagino que outros modelos que esse ponto de comutação seria menor ainda.
No momento, não parece haver um mecanismo para comprimir o histórico de conversas, mas acho que isso pode ser útil para manter o contexto do bate -papo completo à medida que mais bate -papo ocorre.
Com o desafio de minimizar o comprimento do contexto, pensei em duas opções:
Acho que poderíamos combinar as duas opções, removendo o conteúdo das mensagens mais antigas e resumindo as mais recentes.
Para os testes de seleção de alto -falantes que estou fazendo, removendo o contexto e resumindo as mensagens do agente funcionou e produziu os resultados corretos. Isso é promissor.
Eu tenho me concentrado em testá -lo, pois é fundamental ter agentes selecionados corretamente. Essa tarefa, que é amplamente realizada no código automático subjacente, é adaptado para abrir o ChatGPT da IA. O prompt que gera provavelmente funciona com outros modelos muito grandes também. No entanto, o controle desse prompt é necessário para fornecer a direção específica para nossos LLMs locais menores.
O prompt padrão é
You are in a role play game. The following roles are available:n{self._participant_roles(agents)}.nnRead the following conversation.nThen select the next role from {[agent.name for agent in agents]} to play. Only return the role.
Para meus testes sobre o fluxo de trabalho de debate, estou continuamente adaptando o prompt e um exemplo de como ele se parece com o mixtral 8x7b é:
Read the above conversation and select the next role, the list of roles is ['Debate_Moderator_Agent', 'Affirmative_Constructive_Debater', 'Negative_Constructive_Debater', 'Affirmative_Rebuttal_Debater', 'Negative_Rebuttal_Debater', 'Debate_Judge']. What is the next role to speak, answer concisely please?
Curiosamente, mesmo um pequeno ajuste como mudar (no texto acima)
answer concisely please
para
return only the name of the role
Mudou a resposta para um incorreto para mixtral, mas para um correto para o LLAMA 13B.
Com o teste de debate, há uma mensagem de bate -papo introduzindo (este é um jogo de dramatização, ...) e depois uma mensagem de bate -papo para cada um dos debatedores. Passamos todas essas mensagens de bate -papo para o LLM para determinar o próximo alto -falante durante o processo de seleção do alto -falante.
A mensagem de bate -papo para cada debatedor tem o conteúdo (sua resposta ao debate), a função ("usuário") e o nome (nome do agente), como este:
{
"content": "<a whole lot of content here.>",
"role": "user",
"name": "Affirmative_Constructive_Debater",
},
Como tudo isso é passado para o LLM, pensei que usaria essa chave name
/valor para saber de qual agente essa mensagem veio.
Curiosamente, se eu adicionar o seguinte ao início do conteúdo para cada uma dessas mensagens
I am <the debater's name here>. <then the original content goes next>
... Mixtral foi muito melhor em pegar quem falou e escolhendo o próximo agente. Portanto, pode ser vantajoso inserir isso explicitamente no início da mensagem de cada agente, para que tenhamos certeza de que o LLM sabe quem era o agente. Ou, pelo menos neste caso, o nome do agente é importante para determinar a sequência.
A maioria dos modelos retornou respostas de texto simples e isso é importante para os nomes de agentes correspondentes ao texto retornado do LLM.
No entanto, e dolorosamente, como é o modelo principal que eu queria usar, o mixtral parece fornecer uma resposta no formato de marcação (?) Na maioria das vezes. Então, se um agente foi nomeado
Negative_Constructive_Debater
pode retornar
Negative_Constructive_Debater
ou
Negative Constructive Debater
E isso jogaria fora a Autogen de combiná -lo com o nome de um agente.
Tentei alterar os avisos para obter o Mixtral para fornecer uma saída de texto simples, mas não consegui fazê -lo de forma consistente.
Talvez uma tática aqui não seja usar sublinhados, embora eu ache que tenha sido mencionado para evitar espaços nos nomes dos agentes e usar sublinhados, por isso vale a pena enfrentar isso.
Alterações no código correspondente para acomodar _
e os espaços para sublinhos ajudariam muito a apoiar os LLMs locais que podem misturá -los.
Como advertência, estou no início dos meus testes e só tenho testado na seleção do alto -falante. Embora isso seja fundamental para o processo multi-agente, existem muitos outros aspectos dos LLMs (respostas de qualidade, geração de código, chamada de função etc.) que eu nem toquei.
Portanto, minhas anotações abaixo estão no teste antecipado de LLMs, escolhendo o próximo agente correto e retornando seu nome. Vou colocá -los na minha ordem de preferência.
Por fim, muitas delas são habilidades e não sou especialista :).
Llm | Pensamentos |
---|---|
Mixtral 8x7b v0.1 Instruct (Q4) | Como o maior modelo, eu esperava que isso lide com a direção melhor do que os outros. Minha experiência foi que ela fornece respostas consistentes e, com algumas alterações rápidas, você pode retirá -lo para obter o resultado necessário. Ele tem uma peculiaridade estranha, pois responde às vezes no formato de marcação. |
Mistral 7B v0.2 Instruto | Originalmente, isso forneceu as melhores respostas, resultados simples de texto e a capacidade de retornar um nome de agente único sem sair do curso. O levantamento mostrou que era bastante sensível a provar mudanças. Nem sempre entende as direções, mas não tão bem quanto mixtral |
LLAMA2 13B Chat | Bata e erra, quando estava no ponto, era perfeito, caso contrário, simplesmente não estava. Mais ajustes rápidos podem funcionar aqui. |
Solar 10.7b Instruct | Como os avisos foram ajustados, isso se tornou cada vez mais consistente |
Chat neural 7b | Semelhante ao LLAMA 13B, era excelente às vezes, mas tudo menos em outros |
OpenHermes 7b Mistral v2.5 (Q6) | Em um teste, foi perfeito, para todo o resto bombardeado. Descobriram que não seguiu bem as instruções. |
Orca 2 13b | Apenas completei bem um teste, não seguiu bem as instruções para o resto |
QWEN 14B Chat (Q6) | Eu não tinha usado esse modelo antes e tinha esperança, mas ele nunca passou em um teste e as instruções seguintes não eram o seu forte. |
Phi-2 | Infelizmente, o comprimento do contexto suportado por esse modelo acabou rapidamente. Além disso, ele realmente não seguiu as instruções com precisão. |
Phind Codellama 34b | Surpreendentemente bom! Com mixtral. No entanto, diz que não vai debater! |
Yi-34b Chat (Q3) | Isso me surpreendeu, foi realmente o pior do grupo. Estou classificando-o abaixo do PHI-2, pois é muito grande para ser tão ruim para seguir as direções. Talvez uma instrução / outra versão seja melhor. |
Veja mais informações em um dos meus documentos de conclusões imediatas que mostram como eu metoria através de prompts e qual foi o efeito em cada uma das respostas do LLMS.
Você já usou outros modelos que seguem bem as instruções, por favor me avise!
A implementação de alguns deles (temp = 0, resumindo, nomes de agentes de limpeza, alteração do prompt de seleção de função) significava que eu era capaz de obter mixtral para escolher o agente certo sempre durante a seleção de alto -falantes (5 sequências com 10 iterações cada). ?
Sem ajustar os avisos especificamente para esses outros modelos:
Acredito que isso é significativo porque tiveram menos sucesso antes dessas mudanças e bastante imprevisíveis.
É claro que meus testes e ajustes, principalmente em prompts, estão no bate -papo em testes em que estou trabalhando. Portanto, mais testes seriam bons.