استخدم VIM كأداة لتصميم وتشغيل وتصحيح وإنقاذ نماذج لغتك الكبيرة (LLMS) بكفاءة.
يحول PROMPTER.VIM محرر VIM إلى بيئة هندسية فعالة فعالة ، واستبدل بشكل فعال مزودي الخدمات الخاصة بـ LLM Playgrounds مثل: Azure Openai Service Playground أو Openai Playground.
من الإصدار 0.2 ، يستخدم البرنامج المساعد Litellm كطبقة تجريد مزود LLM.
يدعو Litellm جميع واجهات برمجة التطبيقات LLM باستخدام تنسيق Openai: الأساس ، Azure ، Openai ، Cohere ، Anthropic ، Ollama ، Sagemaker ، Huggingface ، النسخ المتماثل (100+ LLMS). حتى تتمكن من استخدام prompter.vim مع قائمة واسعة من مزودي LLM المختلفين!
<F9> (اختصار المفتاح لـ :PrompterSetup )<F12> (اختصار المفتاح لـ :PrompterGenerate ) للحصول على إكمال LLMmyexperiment.prompt ) ![]() |
|---|
| prompter.vim في العمل: التحرير/التفاعل مع موجه يحاكي محادثة هاتفية (مع تقنية أدناه موصوفة بأنها "حوارات كجزء من موجه النص") |
Prompter.vim ليس مصممًا بشكل أساسي كأداة لإكمال رمز ، على الرغم من أنه يمكنك استخدامه أيضًا لهذا الغرض.
بدلاً من ذلك ، يهدف هذا المكون الإضافي إلى أن يكون بديلاً للأغراض العامة لملاعب إكمال نص الويب ، المخصصة للمهندسين المطالبين الذين يرغبون في اختبار ومطالبات اللغة الطبيعية وتصحيحها.
ظهرت الفكرة في ربيع عام 2023 بينما كنت أكتب مطالبات LLM وتجربة تقنيات هندسة سريعة. كنت أستخدم نهج "إكمال النص" المباشر ، حيث تقوم بإدخال مجموعة موجات النص الخاصة بك وطلب إكمال من نموذج لغة كبير (LLM).
كان نهائي الأولي هو الاستفادة من ملاعب الويب التي يقدمها مقدمو LLM. ومع ذلك ، واجهت العديد من المشكلات خاصة أثناء التفاعل مع ملاعب الويب Azure Openai.
لأسباب لم أفهمها بعد ، يتباطأ تفاعل الويب على ملعب Azure Web بشكل كبير بعد نقطة معينة. أظن وجود خطأ في صناديق الانتهاء. علاوة على ذلك ، لست مولعًا بواجهة الويب Azure لوضع "إكمال الدردشة". فوضى كاملة! بدلاً من ذلك ، يتم تنفيذ ملعب Openai الأصلي بشكل أفضل ، ولم أواجه القضايا المذكورة أعلاه.
ومع ذلك ، يسمح كلا ملعب الويب المذكورة ، بمطالبة واحدة فقط لكل علامة تبويب المتصفح. لذلك ، عند التعامل مع مطالبات نشطة متعددة (تطوير تطبيق مركب يتكون من مطالبات القالب المتداخلة/المربوط بالسلاسل) ، يجب عليك الحفاظ على ملاعب متعددة مفتوحة في علامات تبويب مميزة. عندما تحقق نتائج معينة (وسيطة) جديرة بالملاحظة ، يجب عليك نسخ جميع مربعات النص وحفظها في الملفات المصنوعة من الإصدار.
إن القيام بكل هذا مع ملاعب الويب هو عملية مرهقة ومعرضة للخطأ. كان الفكر النهائي: ماذا لو كان بإمكاني تشغيل إكمالي مباشرة داخل محرر VIM الخاص بي؟
text أو الانتهاء من chat ؟هناك نوعان شائعان "وضعين إكمال" متوقعان في Openai أو LLMs الحالي المماثل:
إكمال text
تعيين وضع الإكمال text يعني أن LLM يكمل ، نص مطالبة نافذة السياق المعطى بنص إكمال (نص في -> نص Out). مثال على هذا إعداد النموذج هو نموذج Openai text-da-vinci-003 . لاستخدام وضع إكمال النص ، يجب أن يدعم النموذج هذا الوضع من خلال واجهة برمجة تطبيقات معينة.
┌────────────────────────┐
┌─ │ │ ─┐
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 . لاستخدام وضع إكمال الدردشة ، يجب أن يدعم النموذج هذا الوضع ، واجهة برمجة تطبيقات محددة. ┌────────────────────────┐
┌─ │ 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 Plugin للعمل كملعب نماذج أولية لكمل النص ، وتجنب مضاعفات أدوار الدردشة.
لذلك إذا تم استخدام نموذج يعمل فقط في وضع الدردشة (مثل 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 . يجب عليك تثبيت 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 ، لتفعيل بيئة Prompter 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قم بتحرير مطالبك على Windows 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 |
| chars | عدد الأحرف في الانتهاء | 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باستخدام مجموعة فرعية من ألوان Cterm/Xterm 256. لإظهار جميع الألوان المتاحة ، يمكنك استخدام الأمر: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 مرة أخرى.
استخدم المدقق الإملائي (VIM-Included)
عندما تكتب موجه 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 ()اقرأ جميع إحصائيات الانتهاء السابقة
messagesسيظهر VIM معلومات إحصائيات الإكمال الأخيرة. على سبيل المثال ، إذا قمت فقط بتشغيل 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 ليس من السهل تكوين التفاف الناعم لعرض العمود الثابت. انظر المناقشة. يمكنك تعيين WARP SOME مع الأمر التالي:
set wrap linebreak nolist تتمثل التقنية التي أستخدمها في مطالبات الحوار النموذجية ، وهي إدراج حوار يحول كتلة كما هو الحال في المثال التالي ، حيث تنتهي كتلة الحوار مع "تسلسل الإيقاف" (على سبيل المثال a: مما يؤدي إلى إكمال دور المساعد:
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 توقف عن انتظار إدخال المستخدم ، يمكنك تعيين تسلسل STOP كما 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 فقط عبر Openai Version 0.28 Python.
الإصدار 0.2
تتم إكمال LLMS من خلال حزمة Python LLMS LLMS ، مما يتيح استخدام العديد من مزودي LLM المختلفين.
دعم جميع معلمات إدخال LLM
حتى الآن prodpter.vim دعم temperature فقط ، max_tokens ، stop الحجج.
يقبل Litellm ويترجم معاملات إكمال دردشة Openai في جميع مقدمي الخدمات.
مطالبات قالب الدعم
أنت تقوم بتصميم "مطالبات القالب" التي تتألف من أجزاء مختلفة يمكن بناؤها ديناميكيًا في وقت التشغيل. ضع في اعتبارك ، على سبيل المثال ، أنك ترغب في نموذج أولي "موجه قالب" يحتوي على متغيرات العناصر النائبة ، والتي تشير إلى بعض المتغيرات التي تملأها مطالبات أو ملفات أخرى ، مثل:
TASK
{some_task_description}
DATA
{some_yaml}
DIALOG
{dialog_history}
في المثال أعلاه ، عند استخدام ملاعب الويب ، تعمل كوسيط للنسخ. يُطلب منك فتح أربع علامات تبويب ويب ، وتنفيذ إكمال النص في كل منها ، وأخيراً لصق الإكمال يدويًا ، استبدال المتغيرات مثل {some_data} ، {dialog_history} . بالإضافة إلى ذلك ، قد تحتاج إلى تحميل ملف إلى متغير ، مثل {some_yaml} .
تتمثل الفكرة في دعم المطالبات التي يطالب القالب بالسماح باستبدالها على الطيران (بضغط مفتاح) العناصر النائبة المتغيرة ، مع محتوى المخازن المؤقتة/النوافذ الأخرى.
إكمال LLM غير متزامن
حاليًا ، يعد أمر PrompterGenerate LLM Completement أمرًا متزامنًا: يتم حظر المحرر حتى تُرجع LLM API نص الانتهاء. قد يكون الأمر مملاً لمطالبات معقدة للغاية وطويلة تتطلب عدة ثوانٍ لإكمالها (على سبيل المثال >> 10). في هذه الحالات ، قد يكون من الأفضل أن يكون الأمر غير متزامن ، مما يسمح للمطور باستخدام محرر VIM مع الانتهاء.
دعم الدفق
حتى الآن لا يأخذ الانتهاء من البث.
ديفيد شابيرو لأعمال النشر الضخمة على LLMS و AI التوليدي. لقد تابعت بالحماس وخاصة مقاطع فيديو YouTube Live Live Engineering LLM!
Vivian de Smedt Vim Expert لمساعدته في حل مشكلة مواجهتها عند تطوير هذا البرنامج المساعد.
المبدعون Litellm لدمج بعض الميزات المقترحة ، كتنسيق إكمال النص!
هذا المشروع هو إصدار ALFA دليل على Progress Proofress!
أنا لست خبيرًا في Vimscript ، لذا فإن أي مساهمة أو اقتراح مرحب به. للحصول على أي اقتراح ومشكلة ، يرجى تقديم هنا على مشكلات github للأخطاء والاقتراحات ، إلخ. يمكنك أيضًا الاتصال بي عبر البريد الإلكتروني ([email protected]).
إذا كنت تحب المشروع ، يرجى star هذا المستودع لإظهار دعمك!
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.
قمة