Стварэнне прамптав для LLM, гатовых да вырабоцтва: семашаровая структура
Выучыце структураваную, апі-інспіраваную рамку з семі слоёў прамптов — інструкцыяў, контэксту, абмежэнняў і іншага — для стварэння надзеяных, прыменяемых у практыцы систем LLM.
21 дней адвансаванага інжынірингу запросоў
Практычны курс, які ведае вас ад базавых прынцыпаў стварэння запросоў да проектавання цэлых систем AI.
Большасць людзей супакоюецца з думкай, што запрос — гэта проста запытанне, якое вы передаеце LLM.
Напрыклад:
Classify this customer support ticket.
І ўсё працюе.
Пакуль не перестане.
Калькі вхідных дадзенняў можа даць самэ тое, чаго вы спадзяваліся. А потым прыходзіць адносна іншы запыт, і раптам модель:
- выбірае неправильную катэгорію,
- сфабрыкуе деталі, якіх не было ў вхідных дадзеннях,
- выдае формат, якога вы не прасілі,
- пішае абарот раз'яснення замест структураваных дадзенняў,
- альбо паводзіцца нэпасягліва проста таму, што змяніўся формат запытання.
Іменна ў гэтым моменты і пачынае маты значэнне разліка межаў між запросам, які вы прыметна пераблактарылі і запросам, створаным для практычнага викорыстоўвання.
У системе для практычнага викорыстоўвання запрос — гэта не проста запитанне.
Ён выступае як частка кантракту межы вашай аплікацыі і модэлю.
Разрабоцы вядомы, як проектаваць API з чыста визначанымі межамі:
Request → Validation → Business Logic → Response
Системы, створаныя на адной засадзе запросаў, таксама патрабуюць такой дисцыпліны:
Instructions
↓
Context
↓
Constraints
↓
Task
↓
Examples
↓
Output Contract
↓
Validation
У рэште гэтага матерыялу аддзельна рассматрываюцца кожны з гэтых слоёў, а пасля ўсе яны з’едынаюцца ў адны працоўны прыклад.
1. Проблема з фразай «Проста запытайце модэль»
Уявіце сабе функцыю на базе ШІ для платформы падтрымкі кліяў. Кожны надходзячы запит павінен быць направлены ў адну з чатырох категорый:
billing
technical
account
general
Мінімальны запрос можа выглядаць так:
Classify this customer support ticket:
"I was charged twice for my subscription."
І модэль можа адказаць:
Billing
На першы погляд усё выглядае нормальна.
Але ваш бэкенд зазвычай патрэбуе больш, чым простая атрыбут. Ён, верагодна, чакае чаго-то структураванага, напрыклад:
{
"category": "billing",
"priority": "high"
}
Сюды справы становяцца складнейшымі.
Як на самай працэ вылічваецца прыоритет?
Разглядзім тык-тэйк, у яком проста пісана:
"Я не магу заўязацца."
Чы гэта належыць пад account, чы ўсё-такі гэта справа technical?
Што будзе, як кліент у адной жа паведамленні выявіць проблему з оплатай і проблему з заўязкам?
Што, як катэгорія справды неодназначная?
Якое ў такім случае мае быць стандартнае поведэнне?
Ніякі з гэтых запытанняў нельга адпаведзець надзеямоўна за дапамогою модэлі, калі ваш запрос з самага пачатку не вказвае правіл.
Гэта сама прычына, чаму стварэнне запрасоў для працы ў практычных умовах пачынаецца з вызначэння спецыфікацыі, а не выглажвання формулюваń.
2. Структура запрасу высокай якосці
Якісны запрос для працы можа быць разбиты на семь адзінаковых складоў.
Этыя часткі не павінны буквальна выступаць як пазначаныя загаловкі ў самам тэксте запрасу.
Важна тое, каб вы розумелі, якую задачу выпаловае кожны слой.
Разберамы іх по аднаму.
3. Інструкцыі системы — вызначэнне ролі і поведання
Першы слой задае межы таго, за шта несе адпаведнасць модель.
Для прыкладу класіфікатора квітанцый:
You are a customer support classification assistant.
Your job is to classify incoming support tickets
according to the provided category definitions.Return only information supported by the ticket.
Do not invent customer information.
Гэта набагато корыстней, чым якась узэчаная формулія на кшталт:
You are an intelligent AI assistant.
Чаму гэта разлічэнне мае значэння?
Таму што адзначэнне моделі як "розумнага дапаможніка AI" не вказвае жадных конкрэтных формаў поведзення.
Болей спецыфічная версія паводзіць да:
- якую задачу выканае модель
- в якой сферы ён працуе
- якую інфармацыю ёму дазволена выкарыстоўваць
- якія формы поведзення заборанены
Інструкцыі системы можна спачатку вважаць контрактом паведзення для абмену.
4. Кантэкст — Даўце моделі тое, што ёй трэба
Наступны слой супляе всю інфармацыю, якая неабходна для фактычнага выканання задачы.
Напрыклад:
Available categories:
billing:
Questions about charges, invoices, refunds, or payments.technical:
Problems with product functionality, errors, or system behavior.account:
Login, password, profile, access, or account-management issues.general:
Questions that don't clearly belong to the above categories.
Пасля чаго следуе сам змест тыкета:
Customer ticket:
"I was charged twice for my subscription this month."
Разлік тут варта чытальна адзначыць:
Instructions = What to do
Context = Information needed to do it
Якщо змініць контекст, залишыўшы інструкцыі без змян, модель все рава должна можаць правільна обрабатваць новы вхідны даннэ.
Разлучэнне іх таксама значна спрыяе лёгкай падтроце шаблонаў запытаў з часам.
5. Абмежэнні — Скажыце модэлі, дзе паставіцца на пастаноўку
Абмежэнні — это слой, дзе усуваецца неяснасць.
Продаваючы прыклад:
Rules:
1. Select exactly one category.
2. Use only the four categories provided.
3. Do not create new categories.
4. Do not infer facts that are not present.
5. If the issue is unclear, use "general".
6. Priority must be one of: low, medium, high.
7. Return only the requested JSON.
Этыя правілы значна зменшаюць прастор можлівых адпаведзей.
Без іх запыт на кшталт:
Classify the ticket.
можа даць ў выніку ўсё такое:
This appears to be a billing-related issue because
the customer mentions being charged twice.
Это аблікованае адпаведзе для чалавечага чытальніка.
Але ваш API, верагодна, чакае чысты JSON, а не прозу.
Явна дадзіце абмежэнне:
Return only the requested JSON.
і адпаведныя дзеянні стануць без неяснасцей.
6. Заданне — Адаковаць точную операцыю
Калі вже заданы інструкцыі та абмежэння, неабяжна чыткая нарада пра самую операцыю, якой вы спакульватеся.
Task:
1. Identify the most appropriate category.
2. Determine the priority based on the rules.
3. Provide a short reason.
4. Return the result using the specified JSON structure.
Пораўняйце гэта з передачай нечыткага наказу, напрыклад:
Understand this customer issue.
Калі заданне напісана так чытка, вы можете пазнайсці пасля таго, чы рэальна модель выканала тое, што было запрасана.
Уявіце сабе поток у такім выглядзе:
Input
↓
Classify
↓
Determine priority
↓
Generate reason
↓
Return JSON
У такі момент заданне перестае быць простам здагадкам і становіцца чымось, што можна вымерыць та перапрацаваць.
7. Прыклады — Адказ на праблему
Інструкцыі паведамляюць модэлі, што робіць, на словах.
Прыклады паказваюць гэта безпосередна.
Возьміце гэты:
Example 1
Example 1Input:
"I was charged twice for the same subscription."Output:
{
"category": "billing",
"priority": "medium",
"reason": "The customer reports a duplicate subscription charge."
}
Другі прыклад можа паказаць абсалютна іншую сітуацыю, напрыклад адказ на тэхнічны баг:
Example 2Input:
"The application crashes every time I upload an image."Output:
{
"category": "technical",
"priority": "high",
"reason": "The customer reports a repeatable application failure."
}
Прыклады становяцца наўзначна корыстнымі, калі бажаная дзеяздатнасць важка адгукнуцца выключна за дапамой правіл, таму што яны дазваляюць модэлю зафіксавацца на конкрэтным шаблоне.
Тым не менш, існуе аспект, які трэба памятаць.
Больш прыкладоў ≠ апоштова лепшыя запиты
Накоплэнне прыкладаў адзін за іншым мае рэальныя наследкі. Яно падвышае:
- Размах запиту
- Спрытваранне токенаў
- Затрымку
- Пятачныя суперасункі
Болей розумная стратэгія — адбіраць маленькі, рашучы набор прыкладоў.
Прыорітэтаваць прыклады, якія представляюць значна разныя ситуацыі, ў чым служба неясныя, крайнія прыклады.
Напрыклад, такі трыяк:
Clear billing issue
Clear technical issue
Ambiguous issue
зазвычай будзе кращы за дзесяць практычна ідэнтычных прыкладаў вырахунку, складзеных адзін на другім.
8. Фармат выходных дадзеных — ставіцца да яго як да кантракта API
У запросах высокай якосці мало чаго ўзьмае такое важлівае значэнне, як гэты слой.
Якщо іншая система будзе аналізаваць тое, што вяртае модель, вы не можетэ залішаць форму таго адпаведзення на волю, у вигляде свабоднага тексту.
Замест таго чыткая апісацыя схемы.
Напрыклад:
{
"category": "billing | technical | account | general",
"priority": "low | medium | high",
"reason": "string"
}
Калі гэта встановлена, модель мае фіксаваную мету, да якоў ёй трэба прыціліцца, а код, які працуе пасля ёй, можа рыхтавацца на такі тэкст:
LLM
↓
JSON
↓
Parser
↓
Schema validation
↓
Business logic
замест чагосьці набагато болей хаотычнага, напрыклад:
LLM
↓
Some paragraph
↓
Regex
↓
Hope it works
Такая другая структура — це сапнёў, якія трэба стало вытрымліваць з часам.
Чыткая, структураваная выходная інфармацыя стварае чыстую межу між тым, што вырабляе LLM, і тым, чаго насправды патрэбуе ваша прыкладна програма.
9. Автапераканаленне — Модель не ўсё тое, што пераканаляе
Ось адна з памылак, якая постаўляецца стало ў системах, якія працуюць на AI.
Спадзейваючыся, што модель вярнуць:
{
"category": "billing",
"priority": "urgent",
"reason": "The customer has a billing issue."
}
З сінтаксычной точкі зору гэты JSON ў порядку.
Проблема крыўдзіцца тут:
"urgent"
„urgent“ ніколі не быў адным з дазволеных значэнняў.
З’явленне такой несувязі — задача вашага прыемніка, а не модэлю.
Ось як гэта выглядае з выкарыстоўваннем Pydantic:
from pydantic import BaseModel
from typing import Literal
class TicketClassification(BaseModel):
category: Literal[
"billing",
"technical",
"account",
"general"
]
priority: Literal[
"low",
"medium",
"high"
]
reason: str
Потым вы вызываеце:
result = TicketClassification.model_validate(llm_response)
А якщо модэль вяртае ўсё такое:
{
"category": "billing",
"priority": "urgent",
"reason": "Duplicate charge."
}
этап верыфікацыі павінен абоўсюдзе яго адхіліць.
Самэ гэта і є метай.
Ніколи не дазволяйце выходу модэлю праходзіць без перагляду.
Што прыводзіць да правіла, якое варта застаўляць практыкуя системы на базе LLM:
LLM генеруе. Ваш прыемнік верыфікуе.
Модель можа дапамагчы ў прыняцці рашэнняў, але любые трэбаванні, якія сапраўды є непрыемлівымі, павінны быць у коде прыкладнага програму, який іх безпасэродзе выкананае.
10. Полны запрос, адпрацоўваны для працы
Якшто з’едыніць усе слоі, то будзе ўтварацца нечага падобнага да гэтага:
SYSTEM
You are a customer support classification assistant.
Your job is to classify incoming support tickets
according to the provided category definitions.
Return only information supported by the ticket.
Do not invent customer information.
CONTEXT
Available categories:
billing:
Charges, invoices, refunds, or payment-related issues.
technical:
Product functionality, errors, crashes, or system behavior.
account:
Login, password, profile, access, or account-management issues.
general:
Issues that do not clearly belong to another category.
Customer ticket:
{{ticket_text}}
CONSTRAINTS
1. Select exactly one category.
2. Use only the categories provided above.
3. Do not create new categories.
4. Do not infer unsupported facts.
5. If the issue is unclear, use "general".
6. Priority must be "low", "medium", or "high".
7. Return only the requested JSON.
TASK
1. Classify the ticket.
2. Determine the priority.
3. Provide a short reason.
4. Return the result in the required JSON format.
EXAMPLE
Input:
"I was charged twice for the same subscription."
Output:
{
"category": "billing",
"priority": "medium",
"reason": "The customer reports a duplicate subscription charge."
}
OUTPUT FORMAT
{
"category": "billing | technical | account | general",
"priority": "low | medium | high",
"reason": "string"
}
Тепер разместіце гэта па боку там, дзе ўсё гэта запускалася:
Classify this customer support ticket.
Размак межы гэтых двух запросаў на самай справе не стосуецца колькасці слоў.
Тое, што змянілася, — гэта тое, як усё стала чыстая.
Кожны блак з дужэй версіі выкананае адпаведную задачу:
- Частка з системай выявляе, як модель павінна дзейсцоваць
- Частка з контэкстам падае інфармацыю, з якою ёй трэба працаваць
- Частка з абмежэннямі чытальна паказвае, якія правілы ёй не дозволеныя нарушаць
- Частка з задачай точна выявляе, што ёй павінна адрабатаць
11. Дизайн прыемпту супадае з дизайном API
Для інжынераў прымэтных програм гэта параджанне робіць стварэнне прыемпту ў працывыходным режыме майже мгновенным.
Уявіце сабе типавы канецца-тэп REST.
Вы моглі б задаць кашто-тапоўнае:
POST /tickets/classify
Тэла запытку:
{
"ticket": "I was charged twice."
}
І тэла адказу:
{
"category": "billing",
"priority": "medium",
"reason": "Duplicate charge reported."
}
Тепер перакладзіце тую ж самую логіку на прыемпт для LLM.
Прыемпт фактычна ёсць логікаяе адбудова, якая знаходзіцца за тым канецца-тэпам.
API
↓
Input
↓
Prompt Template
↓
LLM
↓
Structured Output
↓
Validation
↓
API Response
Гэта прычына, чаму інжынерыя прыемптав стае все бол дзялом інжынерыі прымэтных програм, а не толькі вправай у мастацтве пісьма.
Вы не шукаеце ідеальнага формулювання.
Вы ствараеце надзяйны інтерфейс на аднойчыне з системай, якая дзеяе прабаблістычна.
12. Частыя памылкі ў запитах у працоўным режыме
1. Нечыярые формулюванні
Analyze the ticket carefully.
Што значыць „атрыбутна“ тут?
Указаце точную форму дзейства, якую вы хачаце, замест таго каб застаўляць ўсё на інтэрпретацыю.
2. Запит на тое, чаго вам не трэба
Укажыце, што ваша прыкладна програма выкарыстоўвае толькі:
{
"category": "billing"
}
Тады не прасіце:
category
reason
summary
sentiment
customer mood
recommended response
next action
як толькі ваша програма практычна выкарыстоўвае гэтыя поля далей у сваёй роботе.
Кожна дапаможная палата, пра якую вы прасіце, — гэта ўсё новая прычына, чым выхадны результат можа змяніцца або стаць несупарадным.
3. Працоўная логіка ўся ў запыте
Прыклад такой памылкі:
If the customer has been waiting more than 48 hours,
has contacted support three times, and is a premium customer,
set priority to high...
Такі правіла частае патрабуецца ў дэтерміністычным кодзе вашага прыемлена, а не ў запитах.
Болей чыстыя варыянты выглядаюць так:
LLM → classify issue
Application → calculate priority
Раздзелэнне элементаў такім спосабам зазвычай робіць цэлую систему значна простейшай для тэставання.
4. Змена запитоў без ацэнкі
Спадзяймося, версія 1 працуе добра ў прыемленні.
Потым хтось яе правяць:
Classify the ticket.
у:
Analyze and intelligently classify the ticket.
Це выглядае як простая перакладба.
Аднак поведанне прыемлена можа значна змяніцца.
Самэ гэтая прычына, чаму запиты патрабуюць кантролю версій і ацэнкі, той самы прынцып, які вы застаўляеце для коду прыемлена.
5. Прыпуск, што модель завжды будзе следаваць інструкцыям
Памятайце, што LLM-ы за сваёй прыродой ўзмаўлівыя.
Нават адной чыста сконструаванай запіт можа ўсё раве вернуць тое, чаго вы не прасілі.
Самэтна прычына, чаму справжняя система для вырабаткі прыемліва больш, чым толькі хораша інструкцыя — яй патрабуе:
Prompt
+
Structured output
+
Validation
+
Monitoring
+
Fallback handling
Апоўнэнае паверненне толькі на формулюванне інструкцыі не ўсё такая безпечная стратэгія.
13. Для вырабаткі прыемліваў у працэсе вырабаткі патрэбна ацэнка
Главная разліка межва простым эксперыментаваннем з LLM і запускам рэальной функцыі AI заключаецца у ацэнцы.
Уявіце, што у вас ёсць 1 000 історычных заявкаў на падтрымку.
Вы можете стварыць з іх тэставы набор, структураваны так:
200 billing
200 technical
200 account
200 general
100 ambiguous
100 edge cases
Потым вы працаваеце з разнымі версіямі інструкцый над тым жа наборам і поручваеце рэзультаты.
Напрыклад:
Prompt V1 Prompt V2
----------------------------------------
Category accuracy 88% 93%
Schema failures 4% 1%
Invalid values 3% 0.5%
Average latency 1.8s 2.1s
Token usage 650 820
У такі момент работа з інструкцыямі перестае быць суб’ектываю.
Вы больш не запытваеце:
"Чы гэтая інструкцыя здаецца кращай?"
У замене вы запытваеце:
"Чы гэтае выданне параджуе лепшыя рэзультаты ў тых кейсах, якія насправды маюць значэнне для нашага прыемніка?"
Гэта ўжо зусім іншы, болей практычны вопыт.
14. Компрэс: больш інструкцый проты большай складнасці
Няма жаднага фіксаванага правила, якое казало б:
"Чым дэльней інструкцыя, тым лепшы рэзультат."
Інструкцыі абсалютна можу стаць занадта сложнымі.
Што-сабой на кшталт:
30 rules
+
20 examples
+
multiple exceptions
+
long explanations
+
repeated instructions
можа ператворыцца на трыбут для падтрымкі, а не ў дапамогу.
Корыстным прыкметнікам є постаўляць сабе пытанне:
Чы гэтая інструкцыя дзейсна спрямована на рэальную проблему, якую я заўважыў?
Якщо адказ "нет", то гэтая інструкцыя, верагодна, не павінна тут быць.
Найлепшая інструкцыя для практычнага вжытку — гэта не тая, якая мае найбольшы каліквіт нацёнка.
Это та версія, яка з’ядруе правильны контэкст, правія абмежэння і правільна прыемлівая ся поведзенне, адночасна застаўляючы як можно меньш непатрэбнага тыягучасці.
15. Практычны псіхалагічны модэль
Калі вы прыступаеце да стварэння запиту, корисна рассмотрыць семь керуючых пытанняў.
1. Каму належы модэль у гэтым процесе?
Інструкцыі системы
2. Чаго мусі знать модэль?
Контэкст
3. Чаго ён ніколі не мае робіць?
Абмежэння
4. Чаго саме ён мусі адрабатыць?
Заданне
5. Магчыма паказаць прыемлівую ся поведзенне?
Прыклады
6. Якім должна быць выгляд адпаведзення?
Фармат выходных даных
7. Як мая прыкладна програма будзе ведаць, што адпаведзенне ўзяўмэ?
Атрыбутызацыя
Разам гэтыя семь пытанняў ствараюць адзін канструкт.
Эта ментальная модель цягнуць значна большая цэнна, чым запам’ятовваўце адзін-едын шаблон запиту.
16. Інжынерыя запитоў працуе ў напрамку проектавання систем
Гэта можа быть найважлівейшая ідея ў всій гэтай дыскусіі.
На пачатковым этапе работа з LLM часта сводзіцца да такога пытання:
How can I phrase this question better?
Калі системы стаюць болей складнымі, гэта пытанне ператвараецца на ўсё іншае:
What does the model need to know?
What should it be allowed to do?
What should it return?
How do I validate it?
What happens when it fails?
How do I evaluate changes?
Гэтыя вже не ўсноўныя пытання — гэта пытанні інжынерыі працоўных програм.
Самэ гэтая прычына, чаму інжынерыя запитоў высокага стандарта мае меншае сувязі з пошукам „чароднай“ фразы, а большае — з проектаванням надзеянай взаімаўпрацы межу вашым прыкладнам програмам і модэлем, який дзейнае па правілам верыятносці.
Ключовыя выводы
Є калькі основных ідэй, якія варта запам’ятаваць з усьго гэтаго:
1. Прампт, готавы ў вырабоцтва, — гэта не проста адна запытка.
У ёму прызначаецца паведанне, даўаецца контэкст, вярнююцься межы, зазначаецца задача, прыводзяцься прыклады і визначаецца, як должна выглядаць рэзультатная выдатка.
2. Раздзеляйце інструкцыі ад дадзэнняў.
Модель должна магчыма быстра разбіраць, калі яе прасяць выконваць певную дзеянне, а калі — працаваць з певнымі дадзеннямі.
3. Чыстыя абмежэння зменшаюць колькість спробаў на угадку.
Не залішайце на рашэнне моделі, што делаць, калі дадзенняя недастатковыя, нечыстыя або з іншай структурой.
4. Прыклады існуюць для ілюстраціі паведання.
Іспользуйце іх цялеспрямована, а ў складных кейсах — особліва.
5. Структураваная выдатка должна адмаўляцца як кантракт API.
Калі-небудзь сервіс, які працюе пасуючы да модэлю, чытае яго адказ, неабяжна дакладна праціслаць, якаго формата павінен быць гэты адказ.
6. Не дазвольце, каб запит служыў як едынственны спосаб пераканання ў безпеці.
Праўядчыцтва павінна выконвалася ў вашай прыемлі, праз пераканання схэмы і детерміністычныя бізнес-правілы.
7. Ставіцеся да запитоў як да коду, які павінен быць адрабоўваны.
Ствараце ўсія версіі, працавайце з іх у репрэзентатыўных тэстовых кейсах і стежыце за ўжоўваннем іх.
8. Дзейсна дужэй запіт не значыць, што ён лепшы.
Кожная даданая вам лінія павінна мець сваю прычыну для наявнасці.
Заключэнне
Стварэнне запіту высокага стандарту не абыцца ў тым, каб змусіць LLM звучаць аднародзейш.
Гэта абыцца ў тым, каб зробіць адмену болей прыкметнай, болей працэйнаю і лёгкай да інтеграцыі ў рэальную систему.
Змена падчыннае адгуквець зазвычай выглядае так:
Simple question
↓
Structured instructions
↓
Clear context
↓
Explicit constraints
↓
Defined task
↓
Useful examples
↓
Structured output
↓
Application validation
↓
Evaluation + monitoring
Калі такое мышленьне становится зрозумелым, інжыніерыя запитоў перестае адчуватыся як пробны-памылковы процес стварэння тэкста і пачынае нагадваць процес разрабаткі контракта API для компонента, який дзейнае па правілам верыятносці.
Такая змена мае вельмі важлівыя наследкі, калі вы пераходзите за межы дэманстрацый і пачынаеце ствараць системы, якія будуць працаваць у рэальных умовах.
Спадневаная літэратура
- Стварэнне AI-агента з нуля: шаблоны, ReAct і LangGraph — Дзеясавайцеся пра основныя концэпцыі AI-агентаў — планаванне, викорыстоўванне інструментаў, рэфлексія і шаблон ReAct — а таксама пра тое, як LangChain і LangGraph дапамагаюць у ручнай стварэнні такога агента.