Tworzenie prompt贸w to technika, kt贸ra pozwala projektowa膰 precyzyjne i skuteczne pytania lub instrukcje dla modeli AI, aby generowa艂y sensowne i dok艂adne odpowiedzi. Uwa偶am, 偶e z narz臋dziami takimi jak LangChain i OpenAI ca艂y proces jest du偶o prostszy i mo偶na uzyska膰 naprawd臋 imponuj膮ce rezultaty. Ale jak to dzia艂a w praktyce? Zapraszam do lektury 馃檪
Pierwsze kroki
Na pocz膮tek trzeba zainstalowa膰 odpowiedni膮 bibliotek臋:
pip install langchain_openai
Nie zapomnij wybra膰 modelu i ustawi膰 swojego klucza API OpenAI:
OPENAI_API_KEY="paste your key here"
MODEL_ID="gpt-4o-mini"
Dlaczego LangChain?
Uwa偶am, 偶e integracja LangChain z OpenAI to 艣wietna sprawa – tworzenie i interakcja z modelami AI staj膮 si臋 naprawd臋 proste. Oto szybki przyk艂ad:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model=MODEL_ID,
openai_api_key=OPENAI_API_KEY
)
response = model.invoke("What is the wider meaning of life? Explain it in one sentence with simple and understandable language.")
print(response.content)
W tym przypadku model generuje odpowied藕:
The wider meaning of life often refers to the search for purpose and connection, where we find fulfillment through relationships, experiences, and contributions to something greater than ourselves.
Tworzenie prompt贸w pomaga ukierunkowa膰 odpowiedzi modelu, daj膮c mu jasne i konkretne instrukcje. A co, je艣li potrzebujesz wi臋kszej kontroli? Mo偶esz dostosowa膰 parametry, takie jak temperature
, max_tokens
czy timeout
:
model = ChatOpenAI(
model=MODEL_ID,
openai_api_key=OPENAI_API_KEY,
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2
)
result = model.invoke("What is the wider meaning of life? Explain it in one sentence with simple and understandable language.")
result.content
Taka elastyczno艣膰 pozwala dostosowa膰 zachowanie modelu do r贸偶nych zada艅. Dzi臋ki temu mo偶na uzyska膰 odpowiedzi wysokiej jako艣ci, kt贸re idealnie pasuj膮 do naszych cel贸w. Uwa偶am, 偶e tworzenie prompt贸w z LangChain i OpenAI to 艣wietny spos贸b na lepsze wykorzystanie AI. Wypr贸buj samodzielnie! 馃専
One-shot in-context learning
One-shot in-context learning to spos贸b na nauczenie modelu wykonania zadania, podaj膮c mu tylko jeden, jasny przyk艂ad. Zamiast trenowa膰 model na wielu danych, wystarczy, 偶e umie艣cisz pojedynczy przyk艂ad bezpo艣rednio w promptcie. Dzi臋ki temu model zrozumie zadanie bez wi臋kszego wysi艂ku czy dodatkowego szkolenia.
Jak to dzia艂a? Najpierw pokazujesz modelowi przyk艂ad tego, czego od niego oczekujesz. Na przyk艂ad, je艣li zadaniem jest klasyfikacja zda艅 jako zdanie “szcz臋艣liwe” lub “smutne”, mo偶esz napisa膰 co艣 takiego:
model.invoke("""
Classify the following sentence as either 'happy' or 'sad'.
Sentence: I love my friend!
Feeling: happy
Sentence: I am feeling unhappy today.
Feeling: """).content
Tutaj model widzi jeden kompletny przyk艂ad (“I love my friend!”) i na jego podstawie ma sklasyfikowa膰 nowe zdanie (“I am feeling unhappy today”). Odpowied藕, kt贸r膮 uzyskasz, to:
sad
One-shot learning jest 艣wietny, kiedy nie masz wystarczaj膮co du偶o danych, 偶eby pokaza膰 wi臋cej przyk艂ad贸w, ale zale偶y Ci, 偶eby model dobrze zrozumia艂 zadanie. Uwa偶am, 偶e to niesamowite, ile model potrafi zdzia艂a膰, maj膮c tylko jeden przyk艂ad, prawda? 馃槉
Ustrukturyzowana odpowied藕 z LLM
Dlaczego warto korzysta膰 ze strukturalnych odpowiedzi z modelu AI? Wyobra藕 sobie, 偶e tworzysz aplikacj臋, w kt贸rej dane wyj艣ciowe musz膮 by膰 jasne, uporz膮dkowane i 艂atwe do przetworzenia. Zamiast generowa膰 swobodny tekst, model mo偶e zwraca膰 dane w okre艣lonym formacie, na przyk艂ad jako obiekt lub JSON. To sprawia, 偶e odpowiedzi s膮 ustrukturyzowane i od razu gotowe do u偶ycia.
Uwa偶am, 偶e dobrym rozwi膮zaniem jest wykorzystanie w Pythonie biblioteki Pydantic, kt贸ra pozwala okre艣li膰 dok艂adn膮 struktur臋 wyj艣cia. Zobacz, jak to dzia艂a:
from pydantic import BaseModel, Field
class Feeling(BaseModel):
feeling: str = Field(description="either happy or sad")
model_with_structure = model.with_structured_output(Feeling)
response = model_with_structure.invoke("""
Classify the following sentence as either 'happy' or 'sad'.
Sentence: I love my friend!
Feeling: happy
Sentence: I am feeling unhappy today.
Feeling: """).feeling
print(response)
# Output: sad
W tym przyk艂adzie model upewnia si臋, 偶e odpowied藕 pasuje do struktury Feeling
. Dzi臋ki temu 艂atwiej jest zintegrowa膰 wynik z innymi cz臋艣ciami systemu, np. interfejsem u偶ytkownika lub baz膮 danych.
A co z JSON-em? Je艣li wolisz, mo偶esz poprosi膰 model o zwracanie danych w formacie JSON. Jest on szeroko stosowany i 艂atwy do przetwarzania w wielu j臋zykach programowania. Oto przyk艂ad:
from pydantic import BaseModel, Field
model_with_structure = model.with_structured_output(None, method="json_mode")
result = model_with_structure.invoke("""
Classify the following sentence as either 'happy' or 'sad'.
Return a JSON object.
Sentence: I love my friend!
Feeling: happy
Sentence: I am feeling unhappy today.
Feeling: """)
print(result['Feeling'])
# Output: sad
Kiedy korzystasz ze strukturalnych odpowiedzi, Twoja aplikacja staje si臋 bardziej niezawodna. Nie musisz ju偶 zgadywa膰 ani analizowa膰, co model mia艂 na my艣li. Dostajesz dok艂adnie to, o co prosisz – uporz膮dkowane i gotowe do u偶ycia dane. Wypr贸buj samodzielnie!
Named Entity Recognition
Named Entity Recognition (NER) to proces, w kt贸rym identyfikujemy konkretne informacje w tek艣cie, takie jak imiona, daty, zawody czy miejsca. Dlaczego to jest istotne? Wyobra藕 sobie, 偶e masz d艂ugi dokument i musisz szybko znale藕膰 kluczowe fakty. NER automatycznie oznacza te informacje, oszcz臋dzaj膮c czas i wysi艂ek.
Sp贸jrz na ten przyk艂ad promptu, w kt贸rym model ma zidentyfikowa膰 i oznaczy膰 jednostki w zdaniach. Dozwolone etykiety to: NAME, YEAR, JOB i CITY:
prompt = """
Identify and label the entities in the following sentence. Allowed labels are: NAME, YEAR, JOB, CITY.
Sentence: John Smith was born in New York. He started his own company in 2005.
Entities: NAME: John Smith, YEAR: 2005, JOB: self employed, CITY: New York
Sentence: Ann working on large datasets in modern logistic companies.
Entities: NAME: Ann, YEAR: None, JOB: data scientist, CITY: None
Sentence: Bob works in London since 2010. He owns a small shop with souvenirs.
Entities: """
model.invoke(prompt).content
Po wywo艂aniu modelu otrzymujemy odpowied藕, kt贸ra wyra藕nie identyfikuje istotne szczeg贸艂y:
NAME: Bob, YEAR: 2010, JOB: shop owner, CITY: London
Za pomoc膮 tego przyk艂adu wida膰, jak NER upraszcza wyci膮ganie informacji. Uwa偶am, 偶e to 艣wietne narz臋dzie, kt贸re mo偶e by膰 niezwykle przydatne – czy to do podsumowywania artyku艂贸w, organizowania danych, czy wspierania obs艂ugi klienta. Z jasnymi regu艂ami i przyk艂adami NER staje si臋 skutecznym sposobem na zrozumienie i uporz膮dkowanie informacji.
Chain-of-thought
Chain-of-thought to metoda, w kt贸rej model rozwi膮zuje problemy krok po kroku, dziel膮c z艂o偶one zadania na mniejsze, 艂atwiejsze do zrozumienia etapy. To podej艣cie jest jak nak艂onienie modelu do “my艣lenia na g艂os”, pomagaj膮c mu doj艣膰 do poprawnej odpowiedzi poprzez logiczne 艂膮czenie ka偶dego kroku. Wygl膮da to, jakby odtwarza艂 spos贸b, w jaki ludzie rozwi膮zuj膮 problemy, organizuj膮c swoje my艣li, co jest szczeg贸lnie pomocne przy zadaniach wymagaj膮cych rozumowania logicznego lub matematyki.
Sp贸jrz na poni偶szy prompt:
prompt = """
Problem: John has 11 books. He has lent one of them. How many books does John have now?
Phase1: John has 11 books.
Phase2: John has lent one of them.
Phase3: John has 11 - 1 = 10 books.
Answer: John has now 10 books.
Problem: Ann has 2 cars. She has rented one of them. After that she has bought one more. How many cars does Ann have now?
"""
model.invoke(prompt).content
Chain-of-thought pomaga modelowi rozwi膮za膰 problem w uporz膮dkowany spos贸b:
Phase 1: Ann has 2 cars.
Phase 2: Ann has rented one of them.
Phase 3: Ann has 2 - 1 = 1 car left.
Phase 4: Ann has bought one more car.
Phase 5: Ann now has 1 + 1 = 2 cars.
Answer: Ann has now 2 cars.
Dziel膮c problem na logiczne etapy, model zapewnia, 偶e ka偶dy krok jest jasny i 艂atwy do 艣ledzenia. Ta metoda jest pomocna zar贸wno dla uczni贸w, jak i profesjonalist贸w, poniewa偶 na艣laduje spos贸b, w jaki ludzie podchodz膮 do rozwi膮zywania problem贸w – krok po kroku, etap za etapem.
Multi-task Prompting
Jak nazwa wskazuje, prompting typu Multi-tasking sprawia aby model wykona艂 wi臋cej ni偶 jedn膮 rzecz naraz – pozwala na zadanie modelowi wykonania kilku zada艅 w jednym promptcie. To nie tylko oszcz臋dza czas, ale tak偶e zapewnia, 偶e wszystkie zadania s膮 powi膮zane z tym samyk kontekstem. Na przyk艂ad, wyobra藕 sobie, 偶e chcesz podsumowanie jakiegos tekstu i wypisania z niego kluczowych punkt贸w. Dlaczego pisa膰 dwa oddzielne prompty, skoro mo偶e to zrobi膰 jeden? 馃槉
Jak to dzia艂a:
prompt = """
Below this is a sample text.
1. Resume this text in 100 chars
2. Write down the three points.
Text: String theory is a scientific idea that suggests that the smallest building blocks of the universe are not tiny particles, like atoms, but rather tiny, vibrating strings. These strings can vibrate in different ways, and the way they vibrate determines the type of particle they represent, such as electrons or quarks. Essentially, string theory aims to explain how everything in the universe is connected and how the fundamental forces of nature work together.
"""
model.invoke(prompt).content
Wynik mo偶e wygl膮da膰 tak:
1. String theory posits that the universe's building blocks are tiny, vibrating strings, not particles.
2.
- Smallest building blocks are vibrating strings, not particles.
- Vibrations determine particle types (e.g., electrons, quarks).
- Aims to explain connections and fundamental forces in the universe.
To podej艣cie zapewnia, 偶e model generuje jasne i uporz膮dkowane wyniki, jednocze艣nie radz膮c sobie z 艂atwo艣ci膮 z wieloma zadaniami na raz. W praktyce jest to przydatne przy podsumowywaniu artyku艂贸w, analizowaniu tekst贸w czy przygotowywaniu informacji do prezentacji.
ChatPromptTemplate
ChatPromptTemplate
to przydatne narz臋dzie w LangChain, kt贸re pomaga tworzy膰 dynamiczne prompty poprzez wstawianie zmiennych do szablonu. Ale po co to w艂a艣ciwie robi膰? Wyobra藕 sobie, 偶e chcesz wyja艣ni膰 skomplikowane zagadnienia, takie jak “teoria strun”, w prostych s艂owach zrozumia艂ych dla dzieci. Chcesz by膰 gotowy na zmian臋 s艂owa na inne. Czy nie by艂oby 艣wietnie m贸c ponownie u偶y膰 tej samej struktury i po prostu zmieni膰 s艂owo, kt贸re wyja艣niasz? Dok艂adnie to robi ChatPromptTemplate
!
Oto przyk艂ad. W tym przypadku prosimy model o zdefiniowanie “teorii strun” w spos贸b, kt贸ry dzieci mog膮 艂atwo zrozumie膰:
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("Write down the definition of the word {word} in simple and understandable language, suitable for kiddie level.")
chain = prompt | model
chain.invoke({"word": "the string theory"}).content
String theory is an idea in science that says everything in the universe, like stars, planets, and even tiny particles, is made up of tiny, wiggly strings. These strings are so small that we can't see them, but they vibrate in different ways, kind of like guitar strings. The way they vibrate helps to create all the different things we see around us. So, instead of thinking of particles as little dots, string theory tells us to think of them as tiny strings that can make all sorts of shapes and sizes!
Tak jak w poprzednich przyk艂adach, mo偶emy uzyska膰 odpowied藕 w postaci tekstu dzi臋ki StrOutputParser
:
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template("Write down the definition of the word {word} in simple and understandable language, suitable for kiddie level.")
chain = prompt | model | StrOutputParser()
chain.invoke({"word": "the string theory"})
String theory is an idea in science that says everything in the universe, like stars, planets, and even tiny particles, is made up of tiny, wiggly strings. These strings are so small that we can't see them, but they vibrate in different ways, kind of like guitar strings. The way they vibrate helps to create all the different things we see around us. So, instead of thinking of particles as little dots, string theory tells us to think of them as tiny strings that make up everything!
A je艣li chcemy otrzyma膰 uporz膮dkowan膮 odpowied藕, na przyk艂ad obiekt JSON, mo偶emy doda膰 JsonOutputParser
:
from langchain_core.output_parsers import JsonOutputParser
prompt = ChatPromptTemplate.from_template("Write down the definition of the word {word} in simple and understandable language, suitable for kiddie level. Return the JSON object with the key: 'meaning'")
chain = prompt | model | JsonOutputParser()
response = chain.invoke({"word": "the string theory"})
response['meaning']
String theory is an idea in science that says everything in the universe is made up of tiny, tiny strings that are too small to see. These strings can vibrate, kind of like how a guitar string makes music when it vibrates. Depending on how they vibrate, they can create different things, like particles that make up atoms. So, string theory tries to explain how everything in the universe works by looking at these little strings!
Meta-prompting
Czym jest Meta-prompting? To sprytny spos贸b na ulepszenie promptu, wykorzystuj膮c samego LLM! Jak to dzia艂a? Najpierw tworzysz pocz膮tkowy prompt, a potem prosisz LLM o jego popraw臋. Celem jest uzyskanie bardziej szczeg贸艂owej, uporz膮dkowanej lub specyficznej wersji oryginalnego promptu. W poni偶szych przyk艂adach proces ten wykorzystuje zmienn膮 o nazwie meta_prompt
, kt贸ra zawiera oryginalny prompt, kt贸ry potrzebuje ulepszenia. Proste, prawda? 馃槉
Dlaczego warto u偶ywa膰 Meta-prompting? Czasami stworzenie idealnego promptu mo偶e by膰 trudne. Pozwalaj膮c LLM na jego dopracowanie, mo偶esz zaoszcz臋dzi膰 czas i zapewni膰 lepsze rezultaty. Na przyk艂ad, mo偶esz chcie膰, aby ulepszony prompt nakierowa艂 LLM do generowania bardziej uporz膮dkowanych lub dog艂臋bnych odpowiedzi. A oto m膮dry trik: u偶yj bardziej zaawansowanego modelu do poprawy promptu. W ten spos贸b nawet prostszy model poradzi sobie z zadaniem, poniewa偶 to w艂a艣nie ulepszony prompt wykona wi臋kszo艣膰 ci臋偶kiej pracy.
Oto przyk艂ad, jak zaimplementowa膰 Meta-prompting w kodzie:
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
def run_chain(prompt_template, model_name, inputs, key="article"):
prompt = ChatPromptTemplate.from_template(prompt_template)
model = ChatOpenAI(model=model_name, openai_api_key=OPENAI_API_KEY)
chain = prompt | model | StrOutputParser()
return chain.invoke(inputs)
simple_prompt = """
Summarize this news article: {article}
"""
meta_prompt = """
Improve the following prompt to generate a more detailed summary.
Adhere to prompt engineering best practices.
Make sure the structure is clear and intuitive and contains the type of news, tags, and sentiment analysis.
{simple_prompt}
Only return the prompt.
"""
inputs = {"simple_prompt": simple_prompt}
improved_prompt = run_chain(meta_prompt, "o1-preview", inputs, key="simple_prompt")
article = """String theory is an idea in science that says everything in the universe, like stars, planets,
and even tiny particles, is made up of tiny, wiggly strings. These strings are so small that we can't see them,
but they vibrate in different ways, kind of like guitar strings. The way they vibrate helps to create all the different things
we see around us. So, instead of thinking of particles as little dots, string theory tells us to think of them as tiny strings
that can make all sorts of shapes and sizes!"""
result = run_chain(improved_prompt, "gpt-4o-mini", {"article": article}, key="article")
print(result)
Prosty prompt ewoluuje z podstawowego:
Summarize this news article: {article}
do bardziej zaawansowanego i szczeg贸艂owego:
Please provide a detailed summary of the following news article, ensuring that the structure is clear and intuitive. Your summary should include the following elements:
- **Type of News**: Specify the category or genre of the news (e.g., Politics, Technology, Sports, etc.).
- **Tags**: List relevant keywords or topics associated with the article.
- **Sentiment Analysis**: Analyze the overall sentiment of the article (e.g., positive, negative, neutral) and provide a brief explanation for your assessment.
**Article:**
{article}
W rezultacie, ko艅cowe wywo艂anie API generuje wzbogacon膮 tre艣膰, tak膮 jak:
**Type of News**: Science
**Tags**: String Theory, Physics, Universe, Particles, Vibrations, Theoretical Physics
**Sentiment Analysis**: The overall sentiment of the article is positive. This is due to the tone of wonder and fascination conveyed through the description of string theory, which presents an intriguing and innovative perspective on the composition of the universe. The language used evokes curiosity about the nature of reality, indicating an optimistic embrace of scientific exploration and understanding.
Meta-prompting przekszta艂ca prosty prompt w pot臋偶ne narz臋dzie, umo偶liwiaj膮c dostarczanie precyzyjnych i uporz膮dkowanych wynik贸w przy minimalnym wysi艂ku.
Dla zainteresowanych: meta-prompting jest szeroko stosowany m.in w rozwi膮zaniach typu RAG.
Podsumowanie
Uwa偶am, 偶e korzystanie z LangChain razem z OpenAI z czasem zmieni艂o moje podej艣cie do in偶ynierii prompt贸w. Najwi臋ksz膮 zalet膮 jest to, jak bardzo upraszcza tworzenie i ulepszanie prompt贸w, co sprawia, 偶e ca艂y proces jest szybki i bardziej efektywny. Idealnie wpasowuje si臋 w ka偶dy workflow, niezale偶nie od tego, czy jeste艣 deweloperem, pisarzem, czy po prostu ciekawym jego u偶ycia. Wypr贸buj samodzielnie i zobacz, jak odmieni Twoje projekty! 馃槉
Be First to Comment