Szablony promptów do uczenia maszynowego w trybie "few-shot"
Dodanie interaktywnych przykładów do promptów pomaga modelowi lepiej zrozumieć intencje użytkownika i udzielać lepszych odpowiedzi lub wykonywać zadania. Szablony promptów w trybie "few-shot" odnoszą się do użycia małego zestawu przykładów do kierowania modelem w obsłudze nowych wejść. Te przykłady mogą być wykorzystane do szkolenia modelu, aby mógł lepiej zrozumieć i odpowiadać na podobne pytania.
Przykład:
Q: Kim jest Batman?
A: Batman to fikcyjna postać z komiksów.
Q: Co to jest torsalpleksja?
A: Nieznane.
Q: Co to jest model językowy?
A:
Powiedz modelowi, że Q to pytanie, a A to odpowiedź, i interaguj w tym formacie.
Poniżej znajduje się wyjaśnienie klasy narzędzi dostarczonych przez Lanchain do wprowadzania niewielkiej liczby interaktywnych przykładów w narzędziu promptów.
Użycie zestawu przykładów
Tworzenie zestawu przykładów
Zdefiniuj tablicę examples
poniżej, która zawiera zestaw przykładów Q&A.
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
examples = [
{
"question": "Czyj żywot jest dłuższy, Muhammad Ali czy Alan Turing?",
"answer":
"""
Czy musimy skupić się na pytaniu: Tak.
Następne pytanie: W jakim wieku zmarł Muhammad Ali?
Odpowiedź pośrednia: Muhammad Ali miał 74 lata, gdy zmarł.
Następne pytanie: W jakim wieku zmarł Alan Turing?
Odpowiedź pośrednia: Alan Turing miał 41 lat, gdy zmarł.
Więc ostateczna odpowiedź to: Muhammad Ali
"""
},
{
"question": "Kiedy urodził się założyciel craigslist?",
"answer":
"""
Czy musimy skupić się na pytaniu: Tak.
Następne pytanie: Kto jest założycielem craigslist?
Odpowiedź pośrednia: craigslist zostało założone przez Craiga Newmarka.
Następne pytanie: Kiedy urodził się Craig Newmark?
Odpowiedź pośrednia: Craig Newmark urodził się 6 grudnia 1952 roku.
Więc ostateczna odpowiedź to: 6 grudnia 1952 roku
"""
},
{
"question": "Kim była matka dziadków George'a Washingtona?",
"answer":
"""
Czy musimy skupić się na pytaniu: Tak.
Następne pytanie: Kim jest matką George'a Washingtona?
Odpowiedź pośrednia: Matką George'a Washingtona jest Mary Ball Washington.
Następne pytanie: Kto jest ojcem Mary Ball Washington?
Odpowiedź pośrednia: Ojcem Mary Ball Washington jest Joseph Ball.
Więc ostateczna odpowiedź to: Joseph Ball
"""
},
{
"question": "Czy reżyserzy filmów 'Jaws' i 'Casino Royale' pochodzą z tego samego kraju?",
"answer":
"""
Czy musimy skupić się na pytaniu: Tak.
Następne pytanie: Kto jest reżyserem filmu 'Jaws'?
Odpowiedź pośrednia: Reżyserem filmu 'Jaws' jest Steven Spielberg.
Następne pytanie: Skąd pochodzi Steven Spielberg?
Odpowiedź pośrednia: Z United States.
Następne pytanie: Kto jest reżyserem filmu 'Casino Royale'?
Odpowiedź pośrednia: Reżyserem filmu 'Casino Royale' jest Martin Campbell.
Następne pytanie: Skąd pochodzi Martin Campbell?
Odpowiedź pośrednia: Z Nowej Zelandii.
Więc ostateczna odpowiedź to: Nie
"""
}
]
Tworzenie formatera dla małych przykładowych zestawów
Wstaw po prostu przykłady do szablonu promptu za pomocą obiektu PromptTemplate
.
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="Pytanie: {question}\\n{answer}")
print(example_prompt.format(**examples[0]))
Wynik:
Pytanie: Czyj żywot jest dłuższy, Muhammad Ali czy Alan Turing?
Czy musimy skupić się na pytaniu: Tak.
Następne pytanie: W jakim wieku zmarł Muhammad Ali?
Odpowiedź pośrednia: Muhammad Ali miał 74 lata, gdy zmarł.
Następne pytanie: W jakim wieku zmarł Alan Turing?
Odpowiedź pośrednia: Alan Turing miał 41 lat, gdy zmarł.
Więc ostateczna odpowiedź to: Muhammad Ali
Przykłady i formatowanie dla FewShotPromptTemplate
Dzięki obiektowi FewShotPromptTemplate
można masowo dodawać przykładowe treści.
prompt = FewShotPromptTemplate(
examples=przykłady,
example_prompt=przykład_zapowiedzi,
suffix="Pytanie: {input}",
input_variables=["input"]
)
print(prompt.format(input="Kto jest ojcem George'a Washingtona?"))
Zwraca:
Pytanie: Czyj żywot jest dłuższy: Muhammad Ali czy Alan Turing?
Czy musimy kontynuować to pytanie: Tak.
Kontynuacja: W jakim wieku zmarł Muhammad Ali?
Odpowiedź pośrednia: Muhammad Ali miał 74 lata, gdy zmarł.
Kontynuacja: W jakim wieku zmarł Alan Turing?
Odpowiedź pośrednia: Alan Turing miał 41 lat, gdy zmarł.
Więc ostateczna odpowiedź to: Muhammad Ali
Pytanie: Kiedy się urodził założyciel craigslist?
Czy musimy kontynuować to pytanie: Tak.
Kontynuacja: Kto jest założycielem craigslist?
Odpowiedź pośrednia: craigslist zostało założone przez Craiga Newmarka.
Kontynuacja: Kiedy się urodził Craig Newmark?
Odpowiedź pośrednia: Craig Newmark urodził się 6 grudnia 1952 roku.
Więc ostateczna odpowiedź to: 6 grudnia 1952 roku
Pytanie: Kto jest matką dziadków George'a Washingtona?
Czy musimy kontynuować to pytanie: Tak.
Kontynuacja: Kto jest matką George'a Washingtona?
Odpowiedź pośrednia: Matką George'a Washingtona jest Mary Ball Washington.
Kontynuacja: Kto jest ojcem Mary Ball Washington?
Odpowiedź pośrednia: Ojcem Mary Ball Washington jest Joseph Ball.
Więc ostateczna odpowiedź to: Joseph Ball
Pytanie: Czy reżyserzy "Szczęk" i "Casino Royale" pochodzą z tego samego kraju?
Czy musimy kontynuować to pytanie: Tak.
Kontynuacja: Kto jest reżyserem "Szczęk"?
Odpowiedź pośrednia: Reżyserem "Szczęk" jest Steven Spielberg.
Kontynuacja: Skąd pochodzi Steven Spielberg?
Odpowiedź pośrednia: Z USA.
Kontynuacja: Kto jest reżyserem "Casino Royale"?
Odpowiedź pośrednia: Reżyserem "Casino Royale" jest Martin Campbell.
Kontynuacja: Skąd pochodzi Martin Campbell?
Odpowiedź pośrednia: Z Nowej Zelandii.
Więc ostateczna odpowiedź to: Nie
Pytanie: Kto jest ojcem George'a Washingtona?
Korzystanie z selektorów przykładów
Dostarczanie przykładów do ExampleSelector
Tutaj ponownie wykorzystujemy zestaw przykładów i szablonu z poprzedniej sekcji. Jednak zamiast bezpośrednio dostarczać przykłady do obiektu FewShotPromptTemplate
i wstawiać wszystkie przykłady do zapowiedzi, dostarczymy je do obiektu ExampleSelector
, aby wstawić fragment przykładów.
Tutaj użyjemy klasy SemanticSimilarityExampleSelector
. Ta klasa wybiera mały przykład na podstawie podobieństwa do wejścia. Wykorzystuje model osadzeń do obliczenia podobieństwa między wejściem a małymi przykładami, a następnie korzysta z bazy danych wektorów do przeprowadzenia wyszukiwania podobieństwa i pobrania przykładów podobnych do wejścia.
- Uwaga: Wiąże się to z obliczeniami wektorowymi i bazą danych wektorów, które głównie są używane w dziedzinie sztucznej inteligencji do wyszukiwania podobnych danych, takich jak wyszukiwanie podobnej zawartości artykułów, podobnych obrazów, filmów, itp. Na razie pozostaje to jedynie proste zrozumienie.
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
Chroma,
k=1
)
question = "Kto jest ojcem George'a Washingtona?"
selected_examples = example_selector.select_examples({"question": question})
print(f"Najbardziej podobny przykład: {question}")
for example in selected_examples:
print("\\n")
for k, v in example.items():
print(f"{k}: {v}")
Tutaj dopasowane są przykłady podobne do pytania, a następnie zwracane jest:
Uruchamianie Chroma bezpośrednio za pomocą lokalnego interfejsu API.
Korzystanie z bazy danych w pamięci DuckDB. Dane będą przemijające.
Najbardziej podobne pytanie: Kto jest matką dziadków George'a Washingtona?
question: Kto jest matką George'a Washingtona?
answer:
Czy musimy kontynuować to pytanie: Tak.
Kontynuacja: Kto jest matką George'a Washingtona?
Odpowiedź pośrednia: Matką George'a Washingtona jest Mary Ball Washington.
Kontynuacja: Kto jest ojcem Mary Ball Washington?
Odpowiedź pośrednia: Ojcem Mary Ball Washington jest Joseph Ball.
Więc ostateczna odpowiedź to: Joseph Ball
Podaj przykładowy selektor do FewShotPromptTemplate
Na koniec utwórz obiekt FewShotPromptTemplate
. Na podstawie selektora przykładu z poprzedniego przykładu, wybierz przykład podobny do pytania.
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
suffix="Pytanie: {input}",
input_variables=["input"]
)
print(prompt.format(input="Kto jest ojcem Jerzego Waszyngtona?"))
Zwraca:
Pytanie: Kto jest matką dziadków Jerzego Waszyngtona?
Czy musimy kontynuować to pytanie: Tak.
Kontynuacja: Kto jest matką Jerzego Waszyngtona?
Odpowiedź pośrednia: Matką Jerzego Waszyngtona jest Mary Ball Washington.
Kontynuacja: Kto jest ojcem Mary Ball Washington?
Odpowiedź pośrednia: Ojcem Mary Ball Washington jest Joseph Ball.
Więc ostateczna odpowiedź to: Joseph Ball
Pytanie: Kto jest ojcem Jerzego Waszyngtona?