Prompt инженеринг, како што сугерира името, е за да се оди малку подлабоко од основните повици со создавање на специјализирани влезови кои (повеќе) ефикасно ги насочуваат моделите на AI за да произведат речиси совршени излези.
Вие не мора да користите програмски јазик или IDE за ова, како што повеќето луѓе сугерираат дека можете да го користите само предниот крај на ChatGPT.Тоа е технички точно, но тоа не ви дава точно вистинската "забава" на инстант инженеринг модел како со користење на програмски јазик, да не зборуваме дека тоа не е толку ефикасно како и.
Во оваа статија, ќе одиме низ тоа како да го направиме тоа во Python, користејќи го Phi-3-mini-4k-инструкцискиот модел од Microsoft. Ние ќе го користиме API за заклучување на Huggingface за ова, така што нема да треба да преземете модел од 7GB локално.
Размислете за ова какоmanipulatingмодел одвнатре, а не од основните разговор пораки. мешање со тоа, да бидете апстрактни.
Поставување на животната средина
- Ѕидот
- Креирајте Huggingface сметка и преземете API клуч (вашиот профил > пристапни токени) со пристап до "напишете".Ова не е спонзориран пост.Ако работите со LLMs, ќе мора да креирате Huggingface сметка во некој момент; тоа е сигурно. Ѕидот
- Бидете сигурни дека сте инсталирале Python 3.10+ во вашиот систем и сте поставиле IDE. Ѕидот
- Инсталирајте ја библиотеката 'huggingface_hub' користејќи 'pip install huggingface_hub' или друга команда, во зависност од вашиот оперативен систем. Ѕидот
Разбирање на основите
Пред да скокаме во кодот, ајде да научиме малку за инстант инженеринг.
Како што споменав порано, инстант инженеринг е во суштина создавање на специјализирани влезови за да се контролираат излезните модели врз основа на вашите барања.
Различни LLMs реагираат на различни техниките за инстант инженеринг поинаку. Ова значи дека не можете да го користите истиот шаблон за инстант инженеринг за сите и секој LLM. И ова повторно значи дека треба да ја прочитате документацијата на LLM за да дознаете која техника е најдобро да се користи.
Еве некои популарни:
- Ѕидот
- Нулево учење: Барање од моделот да изврши задача без никакви примери Класифицирајте го следниот текст како позитивен или негативен: "Навистина ми се допадна овој филм!" Ѕидот
Ова работи со добро обучени модели како што се GPT-4, Claude 3 Opus и Gemini Ultra.
Во моето искуство, Mistral-7B, и покрај тоа што е мал LLM, исто така има импресивни резултати во учењето со нула удар.
- Ѕидот
- Малку учење: Давање на неколку примери пред да побарате од моделот да изврши задача. Текст: „Храната беше ужасна.“ Чувство: негативен Текст: „Имав прекрасно време.“ Чувство: позитивно Ѕидот
Идеален за задачи кои може да бидат малку нејасни за моделот или каде што сакате да демонстрирате одреден формат.
- Ѕидот
- Прашање: Ако Џон има 5 јаболка и му дава 2 на Марија, колку има оставено? Да размислиме низ ова чекор по чекор: Првото нешто што може да ви дојде на ум е моделот DeepSeek R1. Ѕидот
- Повик врз основа на улога: Барање од моделот да преземе одредена улога или личност. Вие сте експерт во Python програмер. Ве молиме да го разгледате овој код и да предложите подобрувања: Ова мора да биде најпопуларната техника на повик меѓу не-програмери. ChatGPT, Claude и повеќето други chatbots се одлични во обезбедувањето на излези врз основа на улога. Ѕидот
- Системски повик: Поставување на контекст и инструкции пред вистинскиот кориснички прашање Ова е мојот омилен кога станува збор за "мешање" со LLM. И можете да го направите ова само во позадина во повеќето случаи, што е едноставно фасцинантно. Системскиот повик делува како "личност и инструкции" поставени за одреден модел. Тоа е корисно за дефинирање на правила или ограничувања.Што е повеќе, можете да го направите она што не можете да го направите со основните влезови кога дефинирате системска порака. Ако земеме мал LLM, на пример, ако побарате нешто штетно преку основна порака за влез, тоа ќе одбие да одговори на тоа. Ако го промените системскиот повик, сепак, постои голема веројатност дека ќе ги игнорира Ѕидот
Сите горенаведени техники може да се направат во корисничкиот интерфејс на ChatGPT или друг chatbot, со исклучок на системот за известување и процедурата за ланец на мисли (технички, ние исто така можеме да го направиме тоа, но не навистина ефикасно).
Затоа, ќе зборуваме за тие два во следниот дел.
Ланец на размислување
Во повеќето LLMs, не можете да го видите ланецот на мисли зад нивното размислување, но можете да го направите видливо преку инстант инженеринг во Python.
Пред да ја напишете функцијата, увезете ја библиотеката и дефинирајте го клиентот:
from huggingface_hub import InferenceClient
# Replace with your Hugging Face token
client = InferenceClient(token="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")
Потоа треба да утврдиме како можеме да го спроведеме ланецот на мислата.
LLM во моментов нема директна функција за да се направи нивниот внатрешен синџир на мисли видливи - освен за DeepSeek R1, каде што е вграден.
Ова значи дека ако сакаме да го направиме ова да се случи, ќе мораме да користиме системски повик. Сепак, не мешајте го ова со техниките што ги дискутиравме порано.
Еве како можеме да го кажеме:
Format your response as follows
1. THINKING: First, show all mental steps, considerations, and explorations. Include alternative hypotheses you consider and reject. Think about edge cases.
2. VERIFICATION: Double-check your logic and facts, identifying any potential errors.
3. ANSWER: Only after showing all thinking, provide your final answer.
Еве како можеме да го интегрираме во функцијата за да генерираме излез:
def generate_chain_of_thought_response(user_input):
# System message defines personality and expectations
system_prompt = (
"Format your response as follows:"
"1. THINKING: First, show all mental steps, considerations, and explorations. Include alternative hypotheses you consider and reject. Think about edge cases."
"2. VERIFICATION: Double-check your logic and facts, identifying any potential errors."
"3. ANSWER: Only after showing all thinking, provide your final answer."
)
# Alternating user input to encourage visible reasoning
formatted_user_input = f"{user_input}\nLet's think through this step by step."
# Phi-style formatting
prompt = (
f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
f"<|im_start|>user\n{formatted_user_input}<|im_end|>\n"
f"<|im_start|>assistant\n"
)
# Call the model
response = client.text_generation(
prompt,
model="microsoft/Phi-3-mini-4k-instruct",
max_new_tokens=500,
temperature=0.7,
top_p=0.95,
repetition_penalty=1.1,
stop_sequences=["<|im_end|>"]
)
# Cleanup
answer = response.strip().split("<|im_end|>")[0].strip()
return answer
Во овој код, ги означивме границите на LLM. Дозволете ми да ги објаснам еден по еден.
- Ѕидот
- max_new_tokens=500: Овој параметар го одредува максималниот број на токени на моделот е дозволено да се генерира во одговор на повикот за влез. Ѕидот
- температура = 0.7: Овој параметар се занимава со случајноста на излезот на моделот. Ако е пониска, како што е 0.2, одговорите на моделот се повеќе фокусирани и релевантни; тоа исто така може да резултира со повторување и недостаток на креативност. Кога е повисока, од друга страна, моделот генерира повеќе разновидни и креативни излези, но може да резултира со ирелевантни информации (добро, понекогаш). 0.7, сепак, удари во средината и се чини дека е погоден за овој модел. Ѕидот
- Ѕидот
- top_p=0.95: параметрот top_p користи јадрото за земање примероци за да го избере најмалиот сет на токени чија кумулативна веројатност е најмалку 95%. за разлика од top_k, кој ги ограничува изборите на фиксен број, top_p динамички го прилагодува токенот базен врз основа на веројатност. Ѕидот
- repetition_penalty=1.1: Ова се однесува на „казна“ за претходно повторени токени, што ги прави помалку веројатно да се појават во генерираниот текст одново и одново. Ѕидот
Исто така, забележете како го форматираме повикот тука:
f"<|im_start|>system\n{system_prompt}<|im_end|>\n"
f"<|im_start|>user\n{formatted_user_input}<|im_end|>\n"
f"<|im_start|>assistant\n"
Овој формат, кој ги интегрира `< Unibertsim_start Uniberts>` и `< Unibertsim_end Uniberts>`, зависи од типот на LLM. Најдобар начин да се утврди ова е да се побара ChatGPT да ја прочита документацијата на моделот.
Конечно, за интерактивниот разговор, имплементирајте го овој круг:
print("Chain-of-Thought Phi (type 'exit' to quit)")
while True:
user_input = input("\nYou: ")
if user_input.lower().strip() in {"exit", "quit"}:
break
output = generate_chain_of_thought_response(user_input)
print("\nAssistant:\n", output)
Извршете го сценариото и поставете прашање како што е "Што е 7 x 9 + 100?"
Firstly, let us break down the expression into two parts according to the order of operations (PEMDAS/BODMAS): parentheses first then exponents or powers, followed by multiplication and division from left to right, and finally addition and subtraction from left to right. There are no parentheses or exponents in our case; so we move on to multiplication before dealing with addition. Here’s how it breaks down:
Step 1 – Multiplication part: We need to multiply 7 times 9 which gives us \(7 \times 9 = 63\).
Next Step - Addition part: Now take that result and add 100 to it (\(63 + 100\)).
Adding these together yields \(63 + 100 = 163\).
So, when calculating \(7 \times 9 + 100\), following the correct arithmetic sequence will give us a total of 163.
Тоа можеби не изгледа како голема работа, но ако само го користите Phi-3-mini-4k-инструктот без никаква инстант инженеринг, излезот ќе биде многу поедноставен.
И тоа е за CoT; ајде да преминеме на системски повици за пораки.
Системот брза
Еден начин да се прогласат сорта-систем пораки без код е да се поттикне на почетокот на секој разговор во моделите на АИ. но кога разговорот продолжува понатаму, повеќето модели имаат тенденција да ја заборават почетната инструкција поради контекстните прозорци.
Сепак, кога ќе прогласите системски повик во позадината на LLM, моделот ќе се држи до него во текот на целиот разговор. Зошто? Пред да генерира било каков одговор, моделот прво ја чита системската порака за целиот разговор, без оглед на прозорецот на контекст.
Што се однесува до кодот, почнете со овластување, како што направивме порано:
from huggingface_hub import InferenceClient
# Replace 'YOUR_HF_API_TOKEN' with your actual Hugging Face API token
client = InferenceClient(token="YOUR_HF_API_TOKEN")
Во овој случај, ќе напишам системска порака за да го направам моделот спокоен и мирен, како во Зен будизмот. Имајте на ум дека Phi моделите имаат овозможено модерација на содржината (добра работа, Microsoft), и нема да можете да го промените повикот на нешто што се смета за штетно.
Еве го кодот што можеме да го користиме:
def generate_response(user_input):
system_message = (
"Use words often used in Zen buddhism"
"Act like you are a monk, staying calm and peaceful"
"Encourage the user to be calm and follow Zen practices too"
)
prompt = (
f"<|im_start|>system\n{system_message}<|im_end|>\n"
f"<|im_start|>user\n{user_input}<|im_end|>\n"
f"<|im_start|>assistant\n"
)
Поради некоја причина, излезот на овој модел завршува со <̧im_enḑ>. Тоа не влијае на перформансите на моделот, но можеме да го форматираме сепак.
# Clean up the result
answer = response.strip()
if answer.endswith("<|im_end|>"):
answer = answer.replace("<|im_end|>", "").strip()
formatted_answer = '\n'.join(answer[i:i + 190] for i in range(0, len(answer), 100))
return formatted_answer
Пополнете го кодот со кориснички влез како што следува:
print("Zen AI (type 'quit' to exit)")
while True:
user_input = input("\nYou: ")
if user_input.lower() in ["quit", "exit"]:
break
response = generate_response(user_input)
print("Assistant:", response)
Извршете брз тест и видете како излезот на моделот убаво се држи до системската порака.
ЅидотВие: Здраво
ЅидотАсистент: Намасте. Нека вашиот ден се одвива со спокојство и свесност како насоки.
Ѕидот
Вие: Здраво
Асистент: Намасте. Нека вашиот ден се одвива со спокојство и свесност како насоки.
Чувствувајте се слободни да ги промените max_new_tokens или други вредности за вашите потреби.
Успешно го натеравме мини-моделот Phi-3 да покаже синџир на мисли и потоа да стане џен монах.
Сумирање на
Што е важно е начинот на кој го замолувате моделот да го направи она што го сакате; и запомнете, не можете да го присилите моделот да го направи она што треба да го направи.
На пример, ако му кажеме на мини-моделот на Phi-3: „Ти си страшен џен монах! Дејствувај како еден! Не дозволувај ми да го повторам“, тој ќе се обиде да го направи она што го бараш, но не толку ефикасно.
И тоа е за денес.Благодарам за читањето досега.Се гледаме за... две недели?