Use o VIM como uma ferramenta para projetar e executar com eficiência, depurar e salvar seus grandes modelos de idiomas (LLMS).
O Prompter.VIM transforma o editor do VIM em um ambiente de engenharia e eficiente, substituindo efetivamente os provedores proprietários da LLM Playgrounds Web, como: playground de serviço do Azure Openai ou playground OpenAi.
Na versão 0.2, o plug -in usa o Litellm como uma camada de abstração do provedor LLM.
Litellm chama todas as APIs LLM usando o formato OpenAI: Bedrock, Azure, OpenAi, Cohere, Antrópico, Ollama, Sagemaker, Huggingface, Replique (100+ LLMs). Então você pode usar o Prompter.vim com uma vasta lista de diferentes fornecedores de LLM!
<F9> (atalho de tecla para :PrompterSetup )<F12> (atalho de tecla para :PrompterGenerate ) para obter a conclusão da LLMmyexperiment.prompt ) ![]() |
|---|
| PROMPTER.VIM EM AÇÃO: Editando/interagindo com um aviso que simule uma conversa por telefone (com uma técnica abaixo descrita como "diálogos como parte do prompt de texto") |
O Prompter.vim não foi projetado principalmente como uma ferramenta de conclusão de código, embora você possa usá -lo também para esse fim.
Em vez disso, este plug-in pretende ser um substituto de uso geral para os playgrounds de conclusão de texto da Web, destinados a engenheiros rápidos que desejam testar e depurar os avisos de linguagem natural.
A idéia surgiu na primavera de 2023 enquanto eu estava escrevendo prompts LLM e experimentando técnicas de engenharia rápidas. Eu estava usando uma abordagem direta de "conclusão de texto", onde você insere seu Prompt de texto e solicita uma conclusão de um grande modelo de idioma (LLM).
Minha abordagem inicial foi utilizar os playgrounds da web oferecidos pelos provedores da LLM. No entanto, encontrei inúmeras questões, especialmente ao interagir com os playgrounds da Web do Azure Openai.
Por razões que ainda não compreendi, a interação da web no playground da Web do Azure diminui consideravelmente após um certo ponto. Suspeito que um bug dentro das caixas de conclusão. Além disso, não gosto da interface da Web do Azure para o modo "Conclusão de bate -papo". Uma bagunça total! Em vez disso, o playground original do Openai é melhor implementado e eu não encontrei os problemas acima mencionados.
No entanto, os dois playgrounds da web mencionados permitem apenas um prompt por guia do navegador. Portanto, ao lidar com vários avisos ativos (desenvolvendo um aplicativo composto composto de avisos de modelo aninhado/encadeado), você deve manter vários playgrounds abertos em guias distintas. Quando você obtém certos resultados notáveis (intermediários), você deve copiar todas as caixas de texto e salvá -las em arquivos de versão.
Realizar tudo isso com o Web Playgrounds é um processo complicado e propenso a erros. O pensamento final era: e se eu pudesse executar minha conclusão diretamente dentro do meu editor do VIM?
text ou chat ?Existem dois "modos de conclusão" comuns previstos no Openai ou LLMs atuais similares:
conclusão text
Modo de conclusão definido como text significa que o LLM é concluído, o texto do prompt de janela de contexto fornecido com um texto de conclusão (texto em -> texto para fora). Um exemplo dessa configuração de modelo é o modelo text-da-vinci-003 OpenAI. Para usar um modo de conclusão de texto, o modelo deve suportar esse modo através de uma API específica.
┌────────────────────────┐
┌─ │ │ ─┐
context │ │ bla bla bla │ │
window │ │ bla bla │ │
= │ │ bla bla bla bla │ │ prompt
prompt │ │ bla │ │
+ │ │ bla bla │ │
completion │ │ │ ─┘
│ └────────────────────────┘
│ |
│ LLM generation
│ |
│ v
│ ┌────────────────────────┐
│ │ │ ─┐
│ │ bla bla │ │
│ │ bla bla bla │ │ text completion
│ │ bla │ │
└─ │ │ ─┘
└────────────────────────┘
Conclusão chat
Modo de conclusão definido como chat significa que o LLM é ajustado para "papéis" de bate-papo (diz o usuário, digamos, diz: ...). Detalhes anteriores, leia isso. O prompt de janela de contexto é de fato feito por
gpt3.5-turbo Openai. Para usar um modo de conclusão de bate -papo, o modelo deve suportar esse modo, através da API específica. ┌────────────────────────┐
┌─ │ bla bla bla bla │ ─┐
│ │ bla bla bla │ │
│ │ bla bla │ │ system
│ │ bla bla bla bla │ │ prompt
context │ │ bla │ │
window │ │ bla bla │ ─┘
= │ └────────────────────────┘
system prompt │ ┌────────────────────────┐
+ │ │ user: blablabla │ ─┐
chat │ ├────────────────────────┤ │
+ │ │ assistant: bla bla bla │ │
completion │ ├────────────────────────┤ │ chat
│ │ user: bla bla bla │ │ prompt
│ ├────────────────────────┤ │
│ │ assistant: blabla bla │ │
│ ├────────────────────────┤ │
│ │ user: blabla bla │ ─┘
│ └────────────────────────┘
│ |
│ LLM generation
│ |
│ v
│ ┌────────────────────────┐
│ │ │ ─┐
└─ │ assistant: bla bla bla │ │ chat completion
│ │ ─┘
└────────────────────────┘
O plug -in Prompter.VIM é concebido para funcionar como Playground de prototipagem rápida de texto complique, evitando as complicações das funções de bate -papo.
Portanto, se um modelo que funcionar apenas no modo de bate-papo (por exemplo, OpenAI GPT3.5-Turbo ) for usado, nos bastidores (através de um método Litellm text_completion() ), o conteúdo de texto do editor (o prompt) for inserido como prompt de "sistema". Veja também: discussão.
Estou ciente de que o uso de um modelo baseado em bate-papo como modelo baseado em texto, como descrito acima, não é o uso ideal, mas é um compromisso entre a simplicidade de ter um único playground de conclusão de texto e a complexidade do gerenciamento de funções de bate-papo.
Este plug -in é feito em Python3. Verifique se o seu suporte de instalação do VIM Python3:
vim --version | grep " +python3 " | awk ' {print $3} ' No meu caso, recebi +python3 . Esse é o principal pré -requisito.
Verifique também que é a versão python que é compilada Vim. Extraia a versão precisa do Python com comando:
vim --version | grep -o -P ' (?<=/python)[0-9]+.[0-9]+ ' No meu caso, recebi 3.8 .
Observe que o VIM pode usar apenas a versão Python (e pacotes relacionados) que é compilado. Por exemplo, se o seu sistema Python Current versão (
python3 --version==Python 3.11.6) difere da versão Vim Python, digamosPython 3.8, lembre -se de que o Vim verá apenas os pacotesPython 3.8. Para usar os pacotesPython 3.11.6, você deve recomitar o VIM.
Instale o pacote Python litellm . Você deve instalar litellm usando pip da versão Python correspondente, por exemplo, pip3.8 .
pip3.8 install -U litellm Instale o plug-in usando seu gerenciador de plug-in preferido, por exemplo, usando o gerenciador de plug-in do Vim-Plug, insira seu arquivo .vimrc :
Plug ' solyarisoftware/prompter.vim ' # PROVIDER DEPENDENT SETTINGS USING LiteLLM CONFIGURATION
# https://docs.litellm.ai/docs/providers
# https://docs.litellm.ai/docs/providers/azure
# LLM PROVIDER MANDATORY SETTINGS
export AZURE_API_VERSION=2023-09-01-preview
export AZURE_API_BASE= " https://XXXXXXXXXXXXXXX.openai.azure.com/ "
export AZURE_API_KEY= " YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY "
export MODEL= " azure/your_deployment-name "
# LLM PARAMETERS OPTIONAL SETTINGS
# translated OpenAI model parameters
# https://docs.litellm.ai/docs/completion/input#translated-openai-params
export TEMPERATURE=0.3
export MAX_TOKENS=3000
export OPENAI_STOP= " " Uma boa idéia é editar e manter todas as variáveis acima em um arquivo oculto, por exemplo, vi ~/.prompter_azure.vim , e executá -lo com source ~/.prompter_azure.vim
Você pode executar comandos no modo de comando vim : :) ou a tecla associada:
| Comando | Chave | Ação |
|---|---|---|
:PrompterSetup | <F9> | Configuração do modelo e configurações iniciais |
:PrompterGenerate | <F12> | Execute a conclusão do texto LLM |
:PrompterInfo | <F10> | Relatar configuração atual |
:PrompterSetupQuando você entra no VIM, para ativar o ambiente de playground Prompter, antes de tudo executar no modo de comando:
:PrompterSetupSeguindo as configurações do ambiente, se for bem -sucedido, o comando imprime na linha de status As configurações do modelo:
Model: azure/gpt-35-turbo completion mode: chat temperature: 0.7 max_tokens: 100
Explicação dos valores no relatório da linha de status:
temperature preset value ───────────────────────────┐
│
max_tokens preset value ──────────┐ │
│ │
┌─────┐ ┌────────────┐ ┌────┐ ┌─┴─┐ ┌─┴─┐
Model:│azure│/│gpt-35-turbo│ completion mode:│chat│ temperature:│0.7│ max_tokens:│100│
└──┬──┘ └─────┬──────┘ └──┬─┘ └───┘ └───┘
│ │ │
│ │ └─ chat or text, depending on the model
│ │
│ └── name of the Azure deployment
│
└───────────── name of the LLM provider
:PrompterGenerateEdite seu prompt em um vim janelas e para executar a conclusão do LLM apenas
:PrompterGenerateA linha de status relata algumas estatísticas:
Latency: 1480ms (1.5s) Tokens: 228 (prompt: 167 completion: 61) Throughput: 154 Words: 28 Chars: 176, Lines: 7
Explicação dos valores no relatório da linha de status:
┌─ latency in milliseconds and seconds
│
│ ┌───────────────────────────────── total nr. of tokens
│ │
│ │ ┌──────────────────── nr. of tokens in prompt
│ │ │
│ │ │ ┌──── nr. of tokens in completion
│ │ │ │
┌─┴───────────┐ ┌─┴─┐ ┌─┴─┐ ┌─┴┐ ┌───┐ ┌──┐ ┌───┐ ┌─┐
Latency:│1480ms (1.5s)│Tokens:│228│(prompt:│167│completion:│61│) Throughput:│154│Words:│28│Chars:│176│ Lines:│7│
└─────────────┘ └───┘ └───┘ └──┘ └─┬─┘ └─┬┘ └─┬─┘ └┬┘
│ │ │ │
│ │ │ │
Latency / Tokens ───────────────────────┘ │ │ │
│ │ │
nr. of words ───────────┘ │ │
│ │
nr. of characters ─────────────────────┘ │
│
nr. of lines ────────────────────────────────┘
As estatísticas relatam essas métricas:
| Métrica | Descrição | Exemplo |
|---|---|---|
| Latência | Bot em milissegundos e segunda aproximação | 1480ms (1.5s) |
| Tokens | Quantidade total de tokens, subtotal e subtotal de conclusão | 228 |
| Taxa de transferência | Tokens de conclusão / taxa de latência (em segundos). Veja discussão sobre o conceito de rendimento aqui | 154 |
| Palavras | Número de palavras geradas na conclusão | 28 |
| Chars | Número de caracteres na conclusão | 176 |
| Linhas | Número de linhas geradas na conclusão | 7 |
Por padrão, o comando é atribuído à chave de função
F12. Dessa forma, você pode executar a conclusão apenas pressionando o pressionamento de tecla únicaF12.
:PrompterInfoRelata a versão atual do plug -in, a lista de comandos do plug -in, as configurações atuais do modelo.
:PrompterInfoO comando imprima estas informações:
Version:
prompter.vim, by [email protected], version 0.2 (November 28, 2023)
Model:
Model: azure/gpt-35-turbo completion mode: chat temperature: 0.5 max_tokens: 1500
Commands:
PrompterGenerate <F12>
PrompterInfo <F10>
PrompterSetup <F9>
Obtenha e defina o fundo e as cores do primeiro plano:
echo g: prompter_completion_ctermbg
echo g: prompter_completion_ctermfg
let g: prompter_completion_ctermbg = 3
let g: prompter_completion_ctermfg = 0Se você não gostar das cores de destaque padrão, poderá substituir os valores de
ctermbgectermfgusando um subconjunto de cores Cterm/Xterm 256. Para mostrar todas as cores disponíveis, você pode usar o comando:HighlightColorsparte do meu plug -in: destaque.
Para modificar o valor da temperatura
let g: temperature = 0.2Para modificar o valor máximo dos tokens
let g: max_tokens = 2000
Para modificar as seqüências de parada
let g: stop = [ ' x: ' , ' y: ' , ' z: ' ]Os comandos estão associados às teclas de função a esta configuração padrão:
let g: prompter_setup_keystroke = ' <F9> '
let g: prompter_info_keystroke = ' <F10> '
let g: prompter_generate_keystroke = ' <F12> '
let g: prompter_regenerate_keystroke = ' <F8> ' Mesmo que no VIM você possa atribuir um comando a um mapeamento de chave de sua preferência, pelo exemplo: map <F2> :PrompterGenerate<CR> :PrompterSetup você pode ver qual mapeamento para uma chave específica, por exemplo, F2 , você pode usar o comando vim: map <F12> , a maneira sugerida de prosseguir é modificar um ou mais dos variáveis mencionados acima.
Use (Vim-Included) verificador ortográfico
Quando você escreve um prompt de LLM, é muito importante evitar erros de digitação! Muitas vezes experimentei a conclusão do LLM pior se você confundir apenas um verbo.
As coisas ficam ainda piores se você estiver escrevendo instruções em mais de um idioma. Pessoalmente, geralmente escrevo instruções de conversação em inglês, por alguns motivos descritos no meu artigo, os idiomas que não são ingleses prometem trade-offs de engenharia, mas o idioma alvo do prompt de bate-papo é o meu idioma nativo: italiano. Ao todo, o prompt contém texto em inglês e italiano. Nesse caso, eu executo esta pequena função de vimscript:
function ! Spell ()
set spelllang = en_us,it
setlocal spell
echom " Spell check set for Italian and English languages "
endfunction
com ! SPELL call Spell ()Leia todas as suas estatísticas de conclusão anteriores
messagesO VIM mostrará as últimas informações sobre estatísticas de conclusão. Por exemplo, se você apenas executar 3 conclusões:
Latency: 961ms (1.0s) Tokens: 616 (prompt: 577 completion: 39) Throughput: 641 Words: 21 Chars: 134
Latency: 368ms (0.4s) Tokens: 648 (prompt: 642 completion: 6) Throughput: 1761 Words: 2 Chars: 15
Latency: 4227ms (4.2s) Tokens: 775 (prompt: 660 completion: 115) Throughput: 183 Words: 60 Chars: 377, Lines: 5
Ativando linhas Soft Wrap
Normalmente trabalho com uma configuração de VIM em tela cheia. Isso me ajuda a maximizar minha atenção. No entanto, ter filas muito longas (depois de um PrompterGenerate ) não ajuda a leitura.
Infelizmente, no VIM, não é fácil configurar uma largura fixa de largura da coluna. Veja discussão. Você pode definir uma urdidura suave com o seguinte comando:
set wrap linebreak nolist Uma técnica que estou usando para protótipo de solicitação de diálogo é inserir uma caixa de diálogo gira o bloco como no exemplo a seguir, onde o bloco de diálogo termina com a "Stop Sequence" (por a: , acionando o LLM para concluir a função de assistente:
TASK
You (a:) are a customer care assistant and you are assisting a user (u:).
...
...
DIALOG
a: Hello! How can I assist you today?
u: I want to open a report.
a: Fantastic! First, could you provide me with a detailed description of the issue you're experiencing?
u: The computer monitor won't turn on.
a: Thank you for the description. What is the name or model of the product or system you're having trouble with?
u: I can't read the brand. It's the company's PC monitor.
a: Thank you for the information. What is your preferred method of contact?
u: via email at [email protected]
a: Thank you. Please confirm the provided email address: [email protected]
u: that's correct!
a:
No caso acima, para definir o LLM Pare de esperar pela entrada do usuário, você pode definir a sequência de parada como u: com comando:
let g: stop = [ ' u: ' ] Observe que se você não definir a sequência de parada, conforme descrito acima, o LLM tentará concluir toda a conversa. Isso não é procurado, porque você deseja escrever a frase seguindo u: . No entanto, às vezes é útil despertar o g:stop apenas para ver como o LLM imagina a conversa fluindo.
Outros comandos VIM que podem ser úteis:
u: apenas pressionando a tecla F6 : map <F6> :normal ou: <CR> a: apenas pressionando a tecla F7 : map <F7> :normal oa: <CR> Versão 0.1
Primeiro lançamento. Somente os modelos OpenAI/Azure OpenAI são suportados via módulo Python versão 0.28.
Versão 0.2
As conclusões do LLMS são feitas através do pacote Python Litellm, LLMS Camada de abstração, permitindo usar uma infinidade de diferentes fornecedores de LLM.
Suporte a todos os parâmetros de entrada LLM
Até agora, o Prompter.vim suporta apenas temperature , max_tokens , stop os argumentos.
Litellm aceita e traduz os parâmetros de conclusão de bate -papo em todos os provedores.
Prompts de modelo de suporte
Você está projetando "avisos de modelo" compostos por várias peças que podem ser construídas dinamicamente em tempo de execução. Considere, por exemplo, que você deseja protótipo de um "Modelo Prompt" contendo variáveis de espaço reservado, que são referências a certas variáveis preenchidas por outros prompts ou arquivos, como assim:
TASK
{some_task_description}
DATA
{some_yaml}
DIALOG
{dialog_history}
No exemplo acima, ao usar playgrounds da web, você funciona como um intermediário de cola de cópia. Você deve abrir quatro guias da Web, executar as conclusões de texto em cada uma e, finalmente, colar manualmente as conclusões, substituindo variáveis como {some_data} , {dialog_history} . Além disso, pode ser necessário carregar um arquivo em uma variável, como {some_yaml} .
A idéia é suportar a edição de instruções do modelo, permitindo substituir na mosca (com um pressionamento de tecla) os espaços reservados variáveis, com o conteúdo de outros buffers/Windows.
Conclusão assíncrona LLM
Atualmente, o comando de conclusão do LLM PrompterGenerate é um comando síncrono: o editor está bloqueado até que a API LLM retorne um texto de conclusão. Pode ser tedioso para avisos muito complexos e longos que exigem muitos segundos para concluir (por exemplo, 10). Nesses casos, pode ser melhor se o comando pudesse ser assíncrono, permitindo que o desenvolvedor use o editor do VIM com a conclusão está em andamento.
Suporte de streaming
Até agora, a conclusão de streaming não está em consideração.
David Shapiro por seu enorme trabalho de disseminação no LLMS e IA generativa. Eu segui com entusiasmo, especialmente seus vídeos de codificação ao vivo de codificação ao vivo de engenharia do LLM!
Vivian de Smedt Vim Expert para sua ajuda para resolver um problema encontrado ao desenvolver esse plug -in.
Os criadores da Litellm por terem integrado alguns recursos sugeridos, como o formato de conclusão de texto!
Este projeto é a versão Alfa de prova de conceito em andamento!
Não sou um especialista em vimscript, portanto, qualquer contribuição ou sugestão é bem -vinda. Para qualquer proposta e emissão, envie aqui os problemas do GitHub para bugs, sugestões etc. Você também pode entrar em contato comigo por e -mail ([email protected]).
Se você gosta do projeto, por favor ender este repositório para mostrar seu apoio!
Copyright (c) 2023 Giorgio Robino
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
principal