Use VIM como herramienta para diseñar y ejecutar de manera eficiente, depurar y guardar sus grandes indicaciones de modelos de idiomas (LLMS).
Promet.vim transforma el editor VIM en un entorno de ingeniería eficiente y eficiente, reemplazando efectivamente a los proveedores propietarios de LLM parques web como: Azure OpenAi Service Playground o OpenAI Playground.
De la versión 0.2, el complemento usa litellm como capa de abstracción del proveedor LLM.
Litellm llama a todas las API LLM usando el formato OpenAI: Bedrock, Azure, OpenAI, Cohere, Anthrope, Ollama, Sagemaker, Huggingface, Replicate (más de 100 LLM). ¡Por lo tanto, puede usar Prompter.vim con una amplia lista de diferentes proveedores de LLM!
<F9> (directo de tecla para :PrompterSetup )<F12> (acceso directo de tecla para :PrompterGenerate ) para completar el LLMmyexperiment.prompt ) ![]() |
|---|
| Prompter.vim en acción: edición/interacción con un mensaje que simula una conversación telefónica (con una técnica a continuación descrita como "diálogos como parte del mensaje de texto") |
Prompter.vim no está diseñado principalmente como una herramienta de finalización de código, aunque también puede usarla para ese propósito.
En cambio, este complemento tiene como objetivo ser un reemplazo de propósito general para los parques infantiles de finalización de texto web, destinado a ingenieros rápidos que desean probar y depurar las indicaciones de lenguaje natural.
La idea surgió en la primavera de 2023 mientras escribía las indicaciones de LLM y experimentaba con técnicas de ingeniería rápidas. Estaba utilizando un enfoque directo de "finalización de texto", donde ingresa el corpus de su mensaje de texto y solicita una finalización de un modelo de lenguaje grande (LLM).
Mi enfoque inicial era utilizar los parques infantiles web ofrecidos por los proveedores de LLM. Sin embargo, me encontré con numerosos problemas, especialmente mientras interactuaba con los parques infantiles web de Azure Operai.
Por razones que aún no comprendo, la interacción web en el patio web de Azure se desacelera considerablemente después de cierto punto. Sospecho que un error dentro de los cuadros de finalización. Además, no me gusta la interfaz web de Azure para el modo de "finalización de chat". ¡Un desastre total! En cambio, el patio de juegos Operai original se implementa mejor, y no encontré los problemas antes mencionados.
Sin embargo, mencionados ambos parques infantiles, permiten solo un aviso por pestaña del navegador. Por lo tanto, cuando se trata de múltiples indicaciones activas (desarrollando una aplicación compuesta compuesta de indicaciones de plantilla anidada/encadenada), debe mantener múltiples parques infantiles abiertos en pestañas distintas. Cuando logra ciertos resultados notables (intermedios), debe copiar todos los cuadros de texto y guardarlos en archivos versionados.
Empujar todo esto con los parques infantiles web es un proceso engorrosa y propenso a los errores. El pensamiento final fue: ¿Qué pasaría si pudiera ejecutar mi finalización directamente dentro de mi editor VIM?
text o finalización chat ?Hay dos "modos de finalización" comunes previstos en OpenAI o LLMS actual similar:
finalización text
El modo de finalización establecido como text significa que LLM se completa, el texto de la ventana de contexto dado con un texto de finalización (texto en -> text out). Un ejemplo de dicha configuración de modelo es el modelo text-da-vinci-003 OpenAI. Para usar un modo de finalización de texto, el modelo debe admitir ese modo a través de una 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 │ │
└─ │ │ ─┘
└────────────────────────┘
finalización chat
El modo de finalización establecido como chat significa que LLM está ajustado para los "roles" de chat (el usuario, por ejemplo, el asistente, digamos, ...). Detalles antes, lea esto. El indicador de la ventana de contexto se realiza de hecho por
gpt3.5-turbo OpenAI. Para usar un modo de finalización de chat, el modelo debe admitir ese modo, a través de la 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
│ │ ─┘
└────────────────────────┘
Prompter.vim El complemento está concebido para funcionar como patio de recreo de prototipos rápidos que completan de texto, evitando las complicaciones de los roles de chat.
Entonces, si se usa un modelo que funciona solo en modo de chat (por ejemplo, OpenAI GPT3.5-Turbo ), detrás de escena (a través de un método LitellM text_completion() ) El contenido de texto del editor (el mensaje) se inserta como un mensaje de rol de "sistema". Ver también: Discusión.
Soy consciente de que usar un modelo basado en chat como modelo basado en texto, como se describió anteriormente, no es el uso óptimo, pero es un compromiso entre la simplicidad de tener un solo patio de juegos de finalización de texto y la complejidad de administrar los roles de chat.
Este complemento está hecho en Python3. Compruebe si su instalación VIM es compatible con Python3:
vim --version | grep " +python3 " | awk ' {print $3} ' En mi caso obtuve +python3 . Ese es el requisito previo principal.
Verifique también cuál es la versión de Python que se compila VIM. Extraiga la versión precisa de Python con el comando:
vim --version | grep -o -P ' (?<=/python)[0-9]+.[0-9]+ ' En mi caso obtuve 3.8 .
Tenga en cuenta que VIM solo puede usar la versión de Python (y los paquetes relacionados) que se compila. Por ejemplo, si su sistema Python Version (
python3 --version==Python 3.11.6) difiere de la versión Vim Python, por ejemplo,Python 3.8, recuerde que Vim verá solo paquetesPython 3.8. Para usar paquetesPython 3.11.6, debe recompilar VIM.
Instale el paquete Python litellm . Debe instalar litellm utilizando pip de la versión de Python correspondiente, por ejemplo, pip3.8 .
pip3.8 install -U litellm Instale el complemento con su Administrador de complementos preferido, por ejemplo, con VIM-Plug EnglEn Manager, inserte en su archivo .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= " " Una buena idea es editar y mantener todas las variables anteriores en un archivo oculto, por ejemplo, vi ~/.prompter_azure.vim , y ejecutarlo con source ~/.prompter_azure.vim
Puede ejecutar comandos en modo de comando VIM ( : o la tecla asociada:
| Dominio | Llave | Acción |
|---|---|---|
:PrompterSetup | <F9> | Configuración del modelo y configuraciones iniciales |
:PrompterGenerate | <F12> | Ejecute la finalización del texto LLM |
:PrompterInfo | <F10> | Informe la configuración actual |
:PrompterSetupCuando ingresa a VIM, para activar el entorno del patio de recreo de Prompter, en primer lugar, ejecute en modo de comando:
:PrompterSetupSiguiendo la configuración del entorno, si tiene éxito, el comando imprime en la línea de estado de las configuraciones del modelo:
Model: azure/gpt-35-turbo completion mode: chat temperature: 0.7 max_tokens: 100
Explicación de los valores en el informe de la línea de estado:
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 su solicitud en un Vim Windows y ejecute la finalización de LLM solo
:PrompterGenerateLa línea de estado informa algunas estadísticas:
Latency: 1480ms (1.5s) Tokens: 228 (prompt: 167 completion: 61) Throughput: 154 Words: 28 Chars: 176, Lines: 7
Explicación de los valores en el informe de la línea de estado:
┌─ 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 ────────────────────────────────┘
Las estadísticas informan estas métricas:
| Métrico | Descripción | Ejemplo |
|---|---|---|
| Estado latente | Bot en milisegundos y segunda aproximación | 1480ms (1.5s) |
| Tokens | Monto total de tokens, subtotal rápido y finalización subtotal | 228 |
| Rendimiento | Tokens de finalización / relación de latencia (en segundos). Vea la discusión sobre el concepto de rendimiento aquí | 154 |
| Palabras | Número de palabras generadas en la finalización | 28 |
| Chares | Número de caracteres en la finalización | 176 |
| Pauta | Número de líneas generadas en la finalización | 7 |
Por defecto, el comando se asigna a la tecla de función
F12. De tal manera, puede ejecutar la finalización solo presionando la sola tecla de teclaF12.
:PrompterInfoInforma la versión actual del complemento, la lista de comandos de complemento, la configuración del modelo actual.
:PrompterInfoEl comando imprime esta información:
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>
Obtenga y establezca fondo y colores de primer plano:
echo g: prompter_completion_ctermbg
echo g: prompter_completion_ctermfg
let g: prompter_completion_ctermbg = 3
let g: prompter_completion_ctermfg = 0Si no le gustan los colores destacados predeterminados, puede reemplazar los valores de
ctermbgyctermfgutilizando un subconjunto de COMTER/XMMTER 256 COLORES. Para mostrar todos los colores disponibles, puede usar el comando:HighlightColorsparte de mi complemento: resaltar.
Para modificar el valor de temperatura
let g: temperature = 0.2Para modificar el valor de tokens máximo
let g: max_tokens = 2000
Para modificar las secuencias de parada (s)
let g: stop = [ ' x: ' , ' y: ' , ' z: ' ]Los comandos están asociados a las teclas de función con esta configuración predeterminada:
let g: prompter_setup_keystroke = ' <F9> '
let g: prompter_info_keystroke = ' <F10> '
let g: prompter_generate_keystroke = ' <F12> '
let g: prompter_regenerate_keystroke = ' <F8> ' Incluso si está en VIM, puede asignar un comando a una asignación clave de su preferencia, con el ejemplo: map <F2> :PrompterGenerate<CR> y puede ver qué mapeo para una clave en particular, por ejemplo, F2 , puede usar el comando VIM: map <F12> , la forma sugerida de proceder es modificar una o más de las variables mencionadas anteriormente y Run :PrompterSetup nuevamente.
Usar corrector ortográfico de uso (Vim)
Cuando escribe un indicador de LLM, ¡es muy importante evitar errores tipográficos! Muchas veces experimenté esa finalización de LLM si confundes solo un verbo.
Las cosas van aún peor si estás escribiendo indicaciones en más de un idioma. Personalmente, generalmente escribo indicaciones de conversación en inglés, por algunas razones descritas en mi artículo Idiomas no ingleses Las compensaciones de ingeniería rápida, pero el idioma de destino de la solicitud de chat es mi idioma nativo: italiano. En general, el mensaje contiene texto en inglés e italiano. En este caso ejecuto esta pequeña función VIMScript:
function ! Spell ()
set spelllang = en_us,it
setlocal spell
echom " Spell check set for Italian and English languages "
endfunction
com ! SPELL call Spell ()Lea todas sus estadísticas de finalización anteriores
messagesVIM mostrará la última información de estadísticas de finalización. Por ejemplo, si solo ejecuta 3 terminaciones:
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
Habilitando líneas suave
Normalmente trabajo con una configuración VIM de pantalla completa. Eso me ayuda a maximizar mi atención. Sin embargo, tener líneas muy largas (después de un PrompterGenerate ) no ayuda a la lectura.
Desafortunadamente, en VIM no es fácil de configurar una envoltura suave de ancho de columna fija. Ver discusión. Puede establecer el establecimiento de la deformación suave con el siguiente comando:
set wrap linebreak nolist Una técnica que estoy usando para prototipos de indicaciones de diálogo es insertar un bloque de diálogo como en el siguiente ejemplo, donde el bloque de diálogo termina con la "secuencia de parada" ( a: Ej.
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:
En el caso anterior, para establecer el LLM deja de esperar la entrada del usuario, puede establecer la secuencia de parada como u: con comando:
let g: stop = [ ' u: ' ] Tenga en cuenta que si no establece la secuencia de parada como se describe anteriormente, el LLM intentará completar toda la conversación. En general, esto no es querido porque desea escribir la oración que sigue u: . Sin embargo, es alguna vez útil desastar el g:stop solo para ver cómo el LLM imagina el flujo de conversación.
Otros comandos VIM que podrían ser útiles:
u: solo presionando la tecla F6 : map <F6> :normal ou: <CR> a: solo presionando la tecla F7 : map <F7> :normal oa: <CR> Versión 0.1
Primer lanzamiento. Solo los modelos OpenAI/Azure OpenAI se admiten a través del módulo Python de OpenAI Versión 0.28.
Versión 0.2
Las finalizaciones de LLMS se realizan a través del paquete LLMS Abstraction Layer Python, lo que permite usar una multitud de diferentes proveedores de LLM.
Admite todos los parámetros de entrada de LLM
Hasta ahora, Prompter.VIM Soporte solo temperature , max_tokens , stop los argumentos.
Litellm acepta y traduce los parámetros de finalización de Chat Operai en todos los proveedores.
Indicaciones de plantilla de soporte
Está diseñando "indicaciones de plantilla" compuestas por varias partes que pueden construirse dinámicamente en el tiempo de ejecución. Considere, por ejemplo, que desea prototipos de un "aviso de plantilla" que contenga variables de marcadores de posición, que son referencias a ciertas variables llenas por otras indicaciones o archivos, como así:
TASK
{some_task_description}
DATA
{some_yaml}
DIALOG
{dialog_history}
En el ejemplo anterior, cuando se usa parques infantiles web, funciona como un intermediario de copia y pasta. Debe abrir cuatro pestañas web, ejecutar completaciones de texto en cada una y finalmente pegar las finalizaciones manualmente, sustituir variables como {some_data} , {dialog_history} . Además, es posible que deba cargar un archivo en una variable, como {some_yaml} .
La idea es admitir la edición de la plantilla de la plantilla, lo que permite reemplazar la mosca (con una tecla de tecla) los marcadores de posición variables, con el contenido de otros buffers/ventanas.
Finalización de LLM asíncrono
Actualmente, el comando de finalización de LLM, PrompterGenerate es un comando sincrónico: el editor está bloqueado hasta que la API LLM devuelve un texto de finalización. Podría ser tedioso por indicaciones muy complejas y largas que requieren muchos segundos para completar (por ejemplo, 10). En estos casos, podría ser mejor si el comando pudiera ser asíncrito, lo que permite que el desarrollador use el editor VIM con la finalización está en curso.
Soporte de transmisión
Hasta ahora, la finalización de la transmisión no se tiene en cuenta.
David Shapiro por su enorme trabajo de difusión en LLM y IA generativa. ¡He seguido con entusiasmo, especialmente sus videos de YouTube de codificación en vivo de ingeniería LLM!
Vivian de Smedt Vim Expert por su ayuda para resolver un problema encontrado al desarrollar este complemento.
Creadores de litellm por haber integrado algunas características sugeridas, ¡como formateo del texto!
¡Este proyecto es la versión Alfa de prueba de concepto de trabajo en progreso!
No soy un experto en Vimscript, por lo que cualquier contribución o sugerencia es bienvenida. Para cualquier propuesta y problema, envíe aquí sobre problemas de GitHub para errores, sugerencias, etc. También puede contactarme por correo electrónico ([email protected]).
Si le gusta el proyecto, ¡estre en este repositorio para mostrar su soporte!
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.
arriba