使用VIM作为有效设计和运行,调试和保存大型语言模型(LLMS)提示的工具。
prompter.vim将VIM编辑器转换为有效的及时工程环境,有效地替换了LLM专有提供商网络操场,例如:Azure OpenAi Service Playground或OpenAI Playground。
从0.2版中,该插件将LITELLM用作LLM提供商抽象层。
Litellm使用OpenAi格式来调用所有LLM API:基岩,Azure,Openai,Cohere,Anthropic,Ollama,Ollama,Sagemaker,Huggingface,Replicate(100+ LLMS)。因此,您可以将Prompter.vim与大量不同的LLM提供商列表一起使用!
<F9> (键快捷方式:PrompterSetup )<F12> (键快捷方式:PrompterGenerate )以完成LLM完成myexperiment.prompt ) ![]() |
|---|
| prompter.vim在行动中:编辑/与提示进行编辑/互动,以模拟电话对话(以下技术被描述为“对话为文本提示的一部分”) |
prompter.vim并非主要设计为代码完成工具,尽管您也可以将其用于此目的。
取而代之的是,该插件旨在成为Web文本完成操场的通用替代品,该插件旨在为想要测试和调试自然语言提示的及时工程师提供。
当我编写LLM提示并尝试及时的工程技术时,这个想法出现在2023年春季。我正在使用一种直接的“文本完成”方法,您可以在其中输入文本提示语料库,并要求从大语言模型(LLM)完成完成。
我最初的方法是利用LLM提供商提供的网络操场。但是,我遇到了许多问题,尤其是在与Azure Openai Web游乐场进行互动时。
由于我尚未理解的原因,Azure Web游乐场上的Web互动在一定程度之后大大放慢了速度。我怀疑完成框中的错误。此外,我不喜欢“聊天完成”模式的Azure Web界面。一团糟!取而代之的是,原始的OpenAI游乐场可以更好地实施,我没有遇到上述问题。
尽管如此,提到的两个网络游乐场都只允许每个浏览器选项卡一个提示。因此,当处理多个主动提示(开发由嵌套/链式模板提示组成的复合应用程序)时,您必须在不同的选项卡中维护多个打开的游乐场。当您获得某些值得注意的结果时,必须复制所有文本框并将其保存在版本的文件中。
使用网络游乐场进行所有这些都是一个笨拙且容易出错的过程。最后的想法是:如果我可以直接在VIM编辑器中完成完成该怎么办?
text或chat完成?在OpenAI或类似Current LLMS中,有两种常见的“完成模式”:
text完成
完成模式集作为text表示LLM完成,给定上下文窗口提示文本带有完整文本( - > in -> text of Out)。这种模型设置的一个示例是text-da-vinci-003 OpenAI模型。要使用文本完成模式,该模型必须通过特定的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 s对聊天“角色”进行微调(用户说,助手说,...)。前面的细节,请阅读此内容。上下文窗口提示实际上是由
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
│ │ ─┘
└────────────────────────┘
prompter.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当前版本(
python3 --version==Python 3.11.6)与VIM Python版本有所不同,例如Python 3.8,请记住,VIM只会看到Python 3.8套餐。要使用Python 3.11.6软件包,您必须重新编译VIM。
安装Python软件包litellm 。您必须使用相应的Python版本的pip安装litellm ,例如pip3.8 。
pip3.8 install -U litellm 使用您首选的插件管理器安装插件,例如使用VIM插件插件管理器,在.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时,要激活求职者游乐场环境,首先以命令模式运行:
: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在VIM窗口上编辑您的提示,然后运行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如果您不喜欢默认的突出显示颜色,则可以使用CTERM/XTERM 256颜色的子集替换
ctermbg和ctermfg值。要显示所有可用的颜色,您可以使用命令:HighlightColors部分:突出显示。
修改温度值
let g: temperature = 0.2修改最大令牌值
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 :PromperSetUp。
使用(包括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 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: with命令:
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版本0.28 Python模块支持OpenAI/Azure OpenAI型号。
版本0.2
LLMS的完成是通过LLMS抽象层Python软件包完成的,可以使用多种不同的LLM提供商。
支持所有LLM输入参数
到目前为止,PROMPTER.VIM仅支持temperature , max_tokens , stop参数。
Litellm接受并翻译所有提供商的OpenAI聊天完成参数。
支持模板提示
您正在设计由可以在运行时动态构建的各个部分组成的“模板提示”。例如,考虑您希望原型原型一个包含占位符变量的“模板提示”,这些变量是对其他提示或文件填充的某些变量的引用,例如:
TASK
{some_task_description}
DATA
{some_yaml}
DIALOG
{dialog_history}
在上面的示例中,当使用Web Playgrounds时,您可以用作复制式中介机构。您需要打开四个Web选项卡,在每个标签中执行文本完成,最后手动粘贴完成,替换{some_data} , {dialog_history}之类的变量。此外,您可能需要将文件加载到变量中,例如{some_yaml} 。
这个想法是支持模板提示编辑,允许使用其他缓冲区/窗口的内容即时替换可变占位符。
异步LLM完成
当前,LLM完成命令PrompterGenerate是一个同步命令:编辑器被阻止,直到LLM API返回完成文本。对于非常复杂和长时间的提示可能需要许多秒的时间才能完成(例如10)。在这种情况下,如果命令可能是异步的,则可能会更好,从而允许开发人员在完成后使用VIM编辑器。
流支持
到目前为止,流媒体完成尚未考虑。
大卫·夏皮罗(David Shapiro)在LLM和生成AI上进行了巨大的传播工作。我一直热情洋溢,尤其是他的LLM及时工程现场编码YouTube视频!
Vivian de Smedt VIM专家为解决此插件时遇到的问题的帮助解决了。
Litellm的创建者将一些建议的功能集成为文本完成格式!
该项目是概念验证的Alfa版本!
我不是Vimscript专家,因此欢迎任何贡献或建议。有关任何建议和问题,请在此处提交有关错误,建议等问题的提交。您也可以通过电子邮件([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.
顶部