A prompt mérnöki, ahogy a neve is sugallja, egy kicsit mélyebbre megy, mint az alapvető promptek, speciális bemenetek létrehozásával, amelyek (több) hatékonyan irányítják az AI modelleket, hogy közel tökéletes kimeneteket hozzanak létre.
Ez nem feltétlenül kell használni egy programozási nyelvet vagy egy IDE-t erre, mivel a legtöbb ember azt sugallja, hogy csak a ChatGPT első végét használhatja.
Ebben a cikkben megvizsgáljuk, hogyan kell ezt megtenni a Pythonban a Microsoft Phi-3-mini-4k utasítási modelljével. erre a Huggingface inferencia API-t használjuk, így nem kell helyi szinten letöltenie a 7 GB-os modellt.
Gondolj erre, mintmanipulatingegy modell belülről, nem az alapvető csevegési üzenetekből.
Környezet kialakítása
- Az
- Hozzon létre egy Huggingface fiókot, és vegyen fel egy API-kulcsot (profilja > hozzáférési tokenek) a „írni” hozzáféréssel. Ez nem szponzorált bejegyzés. Az
- Győződjön meg róla, hogy telepítette a Python 3.10+ a rendszer és beállított egy IDE. Az
- Telepítse a „huggingface_hub” könyvtárat a „pip install huggingface_hub” vagy egy másik parancs használatával, az operációs rendszerétől függően. Az
Megérteni az alapokat
Mielőtt belemerülnénk a kódba, tanuljunk meg egy kicsit a gyors mérnöki.
Amint korábban említettem, a gyorsmérnöki gyakorlat alapvetően speciális bemeneteket hoz létre a modell kimeneteinek szabályozására az Ön igényeinek megfelelően.
Különböző LLM-k másképp reagálnak a különböző gyorsmérnöki technikákra. Ez azt jelenti, hogy nem használhatod ugyanazt a gyorsmérnöki sablont minden egyes LLM-hez.
Íme néhány népszerű:
- Az
- Zéró képzés: A modell felkérése egy feladat elvégzésére példák nélkül A következő szöveget pozitívnak vagy negatívnak minősítse: "Nagyon élveztem ezt a filmet!" Az
Ez olyan jól képzett modellekkel működik, mint a GPT-4, a Claude 3 Opus és a Gemini Ultra.
Tapasztalatom szerint a Mistral-7B, annak ellenére, hogy egy kis LLM, szintén lenyűgöző eredményeket ért el a nulla lövés tanulásában.
- Az
- Néhány tanulás: Néhány példa megadása, mielőtt megkérné a modellt, hogy végezzen egy feladatot. szöveg: „Az étel szörnyű volt.” érzelem: negatív szöveg: „Nagy időm volt.” érzelem: pozitív Az
Ideális olyan feladatokhoz, amelyek kissé homályosak lehetnek a modell esetében, vagy ahol bizonyos formátumot szeretne bemutatni.
- Az
- Kérdés: Ha John 5 almával rendelkezik, és 2 almát ad Máriának, hányan maradnak? Gondoljuk át ezt a lépést lépésről lépésre: Az első dolog, ami eszébe juthat, a DeepSeek R1 modell. Nos, ez helyes; valószínűleg ez volt az első közzétett modell látható gondolatlánccal, ezért volt egy játékváltó. Az
- Role-based prompting: Kérje meg a modellt, hogy vállaljon konkrét szerepet vagy személyiséget. Ön egy szakértő Python programozó. Kérjük, ellenőrizze ezt a kódot, és javasolja a fejlesztéseket: Ez a legnépszerűbb prompting technika a nem programozók körében. ChatGPT, Claude, és a legtöbb más chatbot kiváló szerep alapú kimenetek biztosításában. Az
- System prompt: Kontextus és utasítások beállítása a tényleges felhasználói lekérdezés előtt Ez az én kedvencem, amikor az LLM-vel való „összeomlásról” van szó. És ezt a legtöbb esetben csak a háttérben teheti meg, ami egyszerűen lenyűgöző. A rendszer prompt egy adott modell „személyiségét és utasítását” állítja be. Hasznos a szabályok vagy korlátozások meghatározásához.Még több, azt teheted, amit nem tudsz az alapvető bemenetekkel, amikor egy rendszerüzenetet definiálsz. Ha például egy kis LLM-t veszünk fel, ha egy alapvető bemeneti üzenet révén kérsz valamit, megtagadja a választ. Ha megváltoztatod a rendszer promptet, azonban nagy valószínűséggel figyelmen kívül hagyja a biztons Az
A fenti technikák mindegyike a ChatGPT vagy más chatbot felhasználói felületén végezhető el, kivéve a rendszer-megbízást és a gondolatlánc-eljárást (technikai szempontból ezt is megtehetjük, de nem igazán hatékony).
Ezért beszélni fogunk ezekről a kettőről a következő szakaszban.
Gondolatok láncolata
A legtöbb LLM-ben nem láthatja a gondolatok láncát az érvelésük mögött, de láthatóvá teheti azt a Python gyors mérnöki segítségével.
Mielőtt megírná a funkciót, importálja a könyvtárat, és határozza meg az ügyfelet:
from huggingface_hub import InferenceClient
# Replace with your Hugging Face token
client = InferenceClient(token="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")
Aztán meg kell határoznunk, hogyan tudjuk megvalósítani a gondolatláncot.
Az LLM-k jelenleg nem rendelkeznek közvetlen funkcióval, hogy láthatóvá tegyék belső gondolatláncukat - kivéve a DeepSeek R1-et, ahol be van építve.
Ez azt jelenti, hogy ha ezt meg akarjuk tenni, akkor egy rendszerjelzést kell használnunk. de ne tévesszük össze ezt a korábban megvitatott technikákkal.
Így mondhatjuk el ezt:
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.
Íme, hogyan integrálhatjuk a funkcióba a kimenet létrehozásához:
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
Ebben a kódexben megjelöltük az LLM határait. hadd magyarázzam el őket egyenként.
- Az
- max_new_tokens=500: Ez a paraméter meghatározza a modell által a bemeneti utasításra válaszul generált tokenek maximális számát.Egyetlen token lehet egy szó vagy egy szó egy része (a modell típusától függően), és célja annak biztosítása, hogy a válasz ne legyen túl hosszú. Az
- hőmérséklet = 0,7: Ez a paraméter kezeli a modell kimeneti véletlenszerűségét. Ha alacsonyabb, mint például a 0,2, a modell válaszai koncentráltabbak és relevánsak; ez is eredményezheti az ismétlést és a kreativitás hiányát. Az
- Az
- top_p=0.95: a top_p paraméter nukleáris mintavételt használ, hogy kiválassza a legkisebb tokenkészletet, amelynek kumulatív valószínűsége legalább 95%. Az
- repetition_penalty=1.1: Ez a „büntetést” alkalmazza a korábban ismételt tokenekre, így kevésbé valószínű, hogy újra és újra megjelenjenek a generált szövegben. Az
Azt is megjegyezzük, hogyan formázzuk a promptet itt:
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"
Ez a formátum, amely magában foglalja a `< Unibertsim_start Uniberts>` és `< Unibertsim_end Uniberts>` formátumot, az LLM típusától függ.
Végül, az interaktív csevegési élmény érdekében hajtsa végre ezt a hurkot:
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)
Indítsa el a forgatókönyvet, és tegyen fel egy kérdést, mint például: „Mi a 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.
Lehet, hogy ez nem tűnik nagy dolognak, de ha csak a Phi-3-mini-4k utasítást használja anélkül, hogy bármilyen gyors mérnöki munkát végezne, a kimenet sokkal egyszerűbb lenne.
És ez a CoT-ről szól; térjünk át a Rendszer üzenethívásokra.
Rendszer gyorsítás
Az egyik módja annak, hogy a sorta-rendszer üzeneteit kód nélkül jelentse be, az, hogy az AI-modellek minden csevegésének kezdetén felhívja őket.De amikor a beszélgetés tovább folytatódik, a legtöbb modell általában elfelejti az eredeti utasítást a kontextus ablakai miatt.
Azonban, amikor kijelenti, hogy egy rendszer utasítás a háttérben az LLM, a modell ragaszkodik hozzá az egész beszélgetés során. Miért? Mielőtt bármilyen választ, a modell olvassa el a rendszer üzenet először az egész beszélgetés, függetlenül attól, hogy a kontextus ablak.
Ami a kódot illeti, kezdjük az engedélyezéssel, mint korábban:
from huggingface_hub import InferenceClient
# Replace 'YOUR_HF_API_TOKEN' with your actual Hugging Face API token
client = InferenceClient(token="YOUR_HF_API_TOKEN")
Ebben az esetben egy rendszerüzenetet fogok írni, hogy a modell nyugodt és békés legyen, mint a Zen buddhizmusban. vegye figyelembe, hogy a Phi modellek tartalmazzák a tartalom moderálását (jó munkát, Microsoft), és nem fogja tudni megváltoztatni a felhívást semmire, ami károsnak tekinthető.
Íme a kód, amit használhatunk:
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"
)
Ennek a modellnek a kimenete valamilyen oknál fogva a < Áthaim_enḑ> értéken ér véget. Ez nem befolyásolja a modell teljesítményét, de formázhatjuk.
# 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
Töltse ki a kódot egy felhasználói bemeneti hurokkal a következőképpen:
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)
Végezzen egy gyors tesztet, és nézze meg, hogy a modell kimenete milyen gyönyörűen ragaszkodik a rendszer üzenetéhez.
AzSzólj hozzá: Hello
AzAsszisztens: Namaste. Legyen a napod nyugodt és figyelmes, mint irányadó elvek.
Az
Szólj hozzá: Hello
Asszisztens: Namaste. Legyen a napod nyugodt és figyelmes, mint irányadó elvek.
Kérjük, változtassa meg a max_new_tokeneket vagy más értékeket az Ön igényeinek megfelelően.
Sikeresen megkíséreltük a Phi-3 mini modellt, hogy megmutassa a gondolatok láncolatát, majd zen szerzetesré váljon.
Összefoglalva
Azonnali mérnöki, annak ellenére, hogy úgy hangzik, mint egy nagy dolog, nem sok üzlet. Ami számít, hogy hogyan kérjük a modell, hogy mit akar; és ne feledje, nem lehet FOGTATNI egy modellt, hogy azt tegye, amit meg kell tennie.
Például, ha azt mondjuk a Phi-3-mini modellnek, hogy „Te egy freakin Zen szerzetes vagy! Úgy viselkedj, mint egy! Ne hagyd, hogy ismételjem meg”, megpróbálja megtenni, amit kérsz, de nem olyan hatékonyan.
Köszönöm, hogy eddig elolvastad, találkozunk két hét múlva!