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?