Используйте VIM в качестве инструмента для эффективного проектирования и запуска, отладки и сохранения ваших подсказок (LLMS).
PROMPTER.VIM превращает редактор VIM в эффективную инженерную среду, эффективную замену проприевочных поставщиков LLM, такие как игровые площадки Azure Openai Service Playground или Openai Playground.
Из версии 0.2 плагин использует Litellm в качестве слоя абстракции LLM.
Litellm называет все API LLM, используя формат OpenAI: коренная порода, azure, openai, couhere, anpropic, ollalama, sagemaker, huggingface, replicate (100+ llms). Таким образом, вы можете использовать repter.vim с обширным списком различных поставщиков LLM!
<F9> (ярлык клавиши для :PrompterSetup )<F12> (ярлык клавиши для :PrompterGenerate ), чтобы завершить LLMmyexperiment.prompt ) ![]() |
|---|
| PROMPTER.VIM В действии: Редактирование/взаимодействие с помощью подсказки, которая имитирует телефонную беседу (с помощью метода ниже, описанного как «диалоги как часть текстовой подсказки») |
PROMPTER.VIM не предназначен в первую очередь как инструмент завершения кода, хотя вы можете использовать его также для этой цели.
Вместо этого этот плагин направлен на замену общего назначения для игровых площадок для завершения веб-текста, предназначенных для бывших инженеров, которые хотят проверить и отлаживать подсказки естественного языка.
Идея появилась весной 2023 года, когда я писал подсказки LLM и экспериментировал с быстрыми техниками инженерных технологий. Я использовал простой подход «Завершение текста», где вы вводите свой текстовый корпус и запросите завершение из крупной языковой модели (LLM).
Мой первоначальный подход состоял в том, чтобы использовать веб -игровые площадки, предлагаемые поставщиками LLM. Тем не менее, я столкнулся с многочисленными проблемами, особенно во время взаимодействия с веб -игровыми площадками Azure Openai.
По причинам, которые я еще не понимаю, веб -взаимодействие на веб -игровой площадке Azure значительно замедляется после определенного момента. Я подозреваю ошибку в коробках завершения. Кроме того, я не люблю веб -интерфейс Azure для режима «Завершение чата». Полный беспорядок! Вместо этого оригинальная игровая площадка Openai лучше реализована, и я не сталкивался с вышеупомянутыми проблемами.
Тем не менее, обе упомянутые веб -игровые площадки разрешают только одну подсказку на вкладку браузера. Следовательно, при работе с несколькими активными подсказками (разработка составного приложения, состоящего из подсказок шаблона вложенных/цепочек), вы должны поддерживать несколько игровых площадок, открытых на различных вкладках. Когда вы достигаете определенных (промежуточных) заслуживающих внимания результатов, вы должны скопировать все текстовые поля и сохранить их в версии.
Предназначение всего этого с помощью веб-игровых площадок-это громоздкий и подверженный ошибкам процесс. Последняя мысль была: что, если бы я мог запустить свое завершение прямо в моем редакторе VIM?
text или chat ?Существует два распространенных «режима завершения», предусмотренных в OpenAI или аналогичных текущих LLMS:
Завершение text
Режим завершения, установленная в виде text , означает, что LLM завершается, данный текст для окна контекста с текстом завершения (текст в -> текст). Примером такой модели является модель text-da-vinci-003 Open. Чтобы использовать режим завершения текста, модель должна поддерживать этот режим через конкретный API.
┌────────────────────────┐
┌─ │ │ ─┐
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 │ │
└─ │ │ ─┘
└────────────────────────┘
Завершение chat
Режим завершения, установленная как chat означает, что LLM Smosted для чата «роли» (Пользователь говорит, помощник скажет, ...). Подробности, пожалуйста, прочитайте это. Подсказка окна контекста на самом деле производится
gpt3.5-turbo OpenAI. Чтобы использовать режим завершения чата, модель должна поддерживать этот режим, специфичный API -режим. ┌────────────────────────┐
┌─ │ 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
│ │ ─┘
└────────────────────────┘
Плагин Precpter.vim рассматривается как работать как завершающий текст, быстро прототипируя игровую площадку, избегая осложнений ролей в чате.
Таким образом, если используется модель, которая работает только в режиме чата (например, openai GPT3.5-Turbo ), за кулисами (с помощью метода Litellm text_completion() ) текстовый содержимое редактора (подсказка) вставляется в качестве подсказки «Система». См. Также: Обсуждение.
Я знаю, что использование модели, основанной на чате в качестве текстовой модели, как описано выше, не является оптимальным использованием, но это компромисс между простотой наличия односторонней игр для завершения текста и сложностью управления ролями в чате.
Этот плагин сделан в Python3. Проверьте, поддерживает ли ваша установка VIM Python3:
vim --version | grep " +python3 " | awk ' {print $3} ' В моем случае я получил +python3 . Это главная предпосылка.
Проверьте также, что является версией Python, которая составлена Vim. Извлеките точную версию Python с помощью команды:
vim --version | grep -o -P ' (?<=/python)[0-9]+.[0-9]+ ' В моем случае я получил 3.8 .
Обратите внимание, что VIM может использовать только скомпилированную версию Python (и связанные с ним пакеты). По примеру, если ваша система тока Python Python (
python3 --version==Python 3.11.6) отличается от версии Vim Python, скажем,Python 3.8, помните, что Vim увидит только пакетыPython 3.8. Чтобы использовать пакетыPython 3.11.6, вы должны перекомпилировать Vim.
Установите пакет Python litellm . Вы должны установить litellm , используя pip соответствующей версии Python, например pip3.8 .
pip3.8 install -U litellm Установите плагин, используя ваш предпочтительный диспетчер плагинов, например, с помощью менеджера плагина Vim-Plug, вставьте в свой файл .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= " " Хорошей идеей является редактирование и сохранение всех переменных выше в скрытом файле, например, vi ~/.prompter_azure.vim и выполните его с помощью source ~/.prompter_azure.vim
Вы можете запустить команды в командном режиме VIM ( : или связанный ключ:
| Командование | Ключ | Действие |
|---|---|---|
:PrompterSetup | <F9> | Настройка модели и начальные конфигурации |
:PrompterGenerate | <F12> | Запустите завершение текста LLM |
:PrompterInfo | <F10> | Сообщите о текущей конфигурации |
:PrompterSetupКогда вы входите в VIM, чтобы активировать среду Prespter Playground, прежде всего запустить в командном режиме:
:PrompterSetupСледуя настройкам среды, в случае успеха, команда печатает в строке состояния. Конфигурации модели:
Model: azure/gpt-35-turbo completion mode: chat temperature: 0.7 max_tokens: 100
Объяснение значений в отчете о строке статуса:
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
:PrompterGenerateОтредактируйте свою подсказку на Wim Windows и просто запустите LLM.
:PrompterGenerateСтрока статуса сообщает о некоторой статистике:
Latency: 1480ms (1.5s) Tokens: 228 (prompt: 167 completion: 61) Throughput: 154 Words: 28 Chars: 176, Lines: 7
Объяснение значений в отчете о строке статуса:
┌─ 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 ────────────────────────────────┘
Статистика сообщает об этих показателях:
| Показатель | Описание | Пример |
|---|---|---|
| Задержка | Бот в миллисекундах и второе приближение | 1480ms (1.5s) |
| Токены | Общая сумма токенов, быстро | 228 |
| Пропускная способность | Коэффициент завершения токенов / задержки (в секундах). Смотрите обсуждение концепции пропускной способности здесь | 154 |
| Слова | Количество слов, сгенерированных в завершении | 28 |
| Причал | Количество символов в завершении | 176 |
| Линии | Количество строк, сгенерированных в завершении | 7 |
По умолчанию команда присваивается функциональному ключу
F12. Таким образом, вы можете запустить завершение, просто нажав на один клавишF12.
:PrompterInfoСообщает текущую версию плагина, список команд плагина, текущие настройки модели.
:PrompterInfoКоманда печатает эти данные:
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>
Получить и установить фон завершения и цвета переднего плана:
echo g: prompter_completion_ctermbg
echo g: prompter_completion_ctermfg
let g: prompter_completion_ctermbg = 3
let g: prompter_completion_ctermfg = 0Если вам не нравятся цветы выделения по умолчанию, вы можете заменить значения
ctermbgиctermfg, используя подмножество цветов C -термины/XERM 256. Чтобы показать все доступные цвета, вы можете использовать команду:HighlightColorsчасть моего плагина: выделить.
Для изменения значения температуры
let g: temperature = 0.2Чтобы изменить значение MAX токенов
let g: max_tokens = 2000
Чтобы изменить последовательность остановки (ы)
let g: stop = [ ' x: ' , ' y: ' , ' z: ' ]Команды связаны с функционированными ключами с этим настройкой по умолчанию:
let g: prompter_setup_keystroke = ' <F9> '
let g: prompter_info_keystroke = ' <F10> '
let g: prompter_generate_keystroke = ' <F12> '
let g: prompter_regenerate_keystroke = ' <F8> ' Даже если в VIM вы можете назначить команду на картирование ключей вашего предпочтения, примером: map <F2> :PrompterGenerate<CR> , и вы можете увидеть, какое картирование для конкретного ключа, например, F2 , вы можете использовать команду VIM: map <F12> , предлагаемый способ продолжения - это изменить одну или несколько вышеупомянутых переменных и запустить :PrompterSetup .
Использовать (VIM-включенные) проверка орфографии
Когда вы пишете подсказку LLM, очень важно избегать опечаток! Я много раз испытал этот LLM, завершившись хуже всего, если вы ошибаетесь только с глаголом.
Дела становятся еще худшими, если вы пишете подсказки на более чем на одном языках. Лично я обычно пишу разговорные подсказки на английском языке, по некоторым причинам, описанным в моей статье, не являющихся английскими языками, предпринимают инженерные компромиссы, но целевым языком в чате является мой родной язык: итальянский. В целом, подсказка содержит текст как на английском, так и на итальянском языке. В этом случае я запускаю эту небольшую функцию Vimscript:
function ! Spell ()
set spelllang = en_us,it
setlocal spell
echom " Spell check set for Italian and English languages "
endfunction
com ! SPELL call Spell ()Прочитайте всю свою предыдущую статистику завершения
messagesVIM покажет информацию о статистике завершения. Например, если вы просто запускаете 3 завершения:
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
Включение линий мягкая обертка
Я обычно работаю с полноэкранной настройкой VIM. Это помогает мне максимизировать мое внимание. Тем не менее, наличие очень длинных очередей (после PrompterGenerate ) не помогает чтению.
К сожалению, в VIM нелегко настроить фиксированную ширину колонки мягкой обертывания. См. Обсуждение. Вы можете установить Set Soft Warp с помощью следующей команды:
set wrap linebreak nolist Методика, которую я использую для прототипа диалоговых подсказок, заключается в том, чтобы вставить диалоговое окно «Поворот», как в следующем примере, где диалоговый блок заканчивается с «последовательностью остановки» ( a: запуск LLM, чтобы выполнить роль помощника:
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:
В приведенном выше случае, чтобы установить остановку LLM в ожидании пользовательского ввода, вы можете установить последовательность остановки как u: с командой:
let g: stop = [ ' u: ' ] Обратите внимание, что если вы не установите последовательность остановки, как описано выше, LLM попытается завершить весь разговор. Это в целом не желает, потому что вы хотите написать предложение после u: Тем не менее, это когда -то полезно не считать g:stop , чтобы посмотреть, как LLM представляет разговор.
Другие команды VIM, которые могут быть полезны:
u: просто нажатие клавиши F6 : map <F6> :normal ou: <CR> a: просто нажатие клавиши F7 : map <F7> :normal oa: <CR> Версия 0.1
Первый релиз. Только модели Openai/Azure Openai поддерживаются через модуль Python Openai 0.28.
Версия 0.2
Завершение LLMS выполняется через пакет Litellm, LLMS абстракции Python, позволяя использовать множество различных поставщиков LLM.
Поддержать все входные параметры LLM
Пока что PRESPTER.VIM Поддерживаю только temperature , max_tokens , stop Arguments.
Litellm принимает и переводит параметры завершения чата Openai для всех поставщиков.
Поддержка шаблона подсказок
Вы проектируете «подсказки шаблона», состоящие из различных частей, которые могут быть динамически построены во время выполнения. Рассмотрим, например, что вы хотите создать прототип «подсказки шаблона», содержащую переменные заполнителя, которые являются ссылками на определенные переменные, заполненные другими подсказками или файлами, как так:
TASK
{some_task_description}
DATA
{some_yaml}
DIALOG
{dialog_history}
В примере выше, при использовании веб-игровых площадок вы функционируете в качестве посредника для копии. Вам необходимо открыть четыре веб -вкладки, выполнить завершение текста в каждом и, наконец, вставить заполнения вручную, заменить переменные, такие как {some_data} , {dialog_history} . Кроме того, вам может потребоваться загрузить файл в переменную, например {some_yaml} .
Идея состоит в том, чтобы поддержать подсказки шаблона, позволяющее заменить на лету (на клавиш) с переменными заполнителями с содержанием других буферов/окон.
Асинхронное завершение LLM
В настоящее время команда команды LLM завершения является синхронной PrompterGenerate : редактор блокируется до тех пор, пока API LLM не вернет текст завершения. Это может быть утомительно для очень сложных и длинных подсказок, которые требуют много секунд для завершения (например, >> 10). В этих случаях это может быть лучше, если команда может быть асинхронной, что позволяет разработчику использовать редактор VIM с завершением.
Потоковая поддержка
До сих пор завершение потоковой передачи не учитывается.
Дэвид Шапиро за его огромную работу по распространению в LLMS и генеративном ИИ. Я с энтузиазмом последовал, особенно его LLM -инженерные видеоролики на YouTube!
Vivian de Smedt Vim Expert за помощь в решении проблемы, возникающей при разработке этого плагина.
Создатели Litellm за то, что они интегрировали некоторые предлагаемые функции, как формат завершения текста!
Этот проект является версией Alfa с концепцией работы.
Я не эксперт Vimscript, поэтому приветствуется любой вклад или предложение. Для любого предложения и выпуска, пожалуйста, отправьте здесь по вопросам GitHub для ошибок, предложений и т. Д. Вы также можете связаться со мной по электронной почте ([email protected]).
Если вам нравится проект, пожалуйста, ️ Заверните этот репозиторий, чтобы показать вашу поддержку!
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.
вершина