Modelli di prompt few-shot

Includere esempi interattivi nei prompt aiuta il modello a comprendere meglio l'intento dell'utente e a fornire migliori risposte o svolgere compiti. I modelli di prompt few-shot si riferiscono all'uso di un piccolo set di esempi per guidare il modello nel gestire nuovi input. Questi esempi possono essere utilizzati per addestrare il modello in modo che possa comprendere meglio e rispondere a domande simili.

Esempio:

Q: Chi è Batman?
A: Batman è un personaggio di fantasia dei fumetti.

Q: Cos'è la torsalplessicità?
A: Sconosciuto.

Q: Cos'è un modello linguistico?
A:

Informa il modello che Q è la domanda e A è la risposta, e interagisci in questo formato.

Di seguito è riportata una spiegazione della classe di strumenti fornita da Lanchain per l'inserimento di un piccolo numero di esempi interattivi nel prompt.

Utilizzo dell'insieme di esempi

Creazione di un insieme di esempi

Definisci un array examples di seguito, che contiene un set di esempi di domande e risposte.

from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate

examples = [
  {
    "question": "Di chi è più lunga la vita, Muhammad Ali o Alan Turing?",
    "answer":
"""
Dobbiamo seguire la domanda: Sì.
Seguito: Quanti anni aveva Muhammad Ali quando è morto?
Risposta intermedia: Muhammad Ali aveva 74 anni quando è morto.
Seguito: Quanti anni aveva Alan Turing quando è morto?
Risposta intermedia: Alan Turing aveva 41 anni quando è morto.
Quindi la risposta finale è: Muhammad Ali
"""
  },
  {
    "question": "Quando è nato il fondatore di craigslist?",
    "answer":
"""
Dobbiamo seguire la domanda: Sì.
Seguito: Chi è il fondatore di craigslist?
Risposta intermedia: craigslist è stata fondata da Craig Newmark.
Seguito: Quando è nato Craig Newmark?
Risposta intermedia: Craig Newmark è nato il 6 dicembre 1952.
Quindi la risposta finale è: 6 dicembre 1952
"""
  },
  {
    "question": "Chi era la madre dei nonni di George Washington?",
    "answer":
"""
Dobbiamo seguire la domanda: Sì.
Seguito: Chi è la madre di George Washington?
Risposta intermedia: La madre di George Washington è Mary Ball Washington.
Seguito: Chi è il padre di Mary Ball Washington?
Risposta intermedia: Il padre di Mary Ball Washington è Joseph Ball.
Quindi la risposta finale è: Joseph Ball
"""
  },
  {
    "question": "I registi di 'Jaws' e 'Casino Royale' vengono dallo stesso paese?",
    "answer":
"""
Dobbiamo seguire la domanda: Sì.
Seguito: Chi è il regista di 'Jaws'?
Risposta intermedia: Il regista di 'Jaws' è Steven Spielberg.
Seguito: Da dove viene Steven Spielberg?
Risposta intermedia: Dagli Stati Uniti.
Seguito: Chi è il regista di 'Casino Royale'?
Risposta intermedia: Il regista di 'Casino Royale' è Martin Campbell.
Seguito: Da dove viene Martin Campbell?
Risposta intermedia: Dalla Nuova Zelanda.
Quindi la risposta finale è: No
"""
  }
]

Creazione di un formato per i piccoli esempi

Inserisci semplicemente gli esempi nel modello del prompt utilizzando l'oggetto PromptTemplate.

example_prompt = PromptTemplate(input_variables=["question", "answer"], template="Domanda: {question}\\n{answer}")

print(example_prompt.format(**examples[0]))

Output:

Domanda: Di chi è più lunga la vita, Muhammad Ali o Alan Turing?

Dobbiamo seguire la domanda: Sì.
Seguito: Quanti anni aveva Muhammad Ali quando è morto?
Risposta intermedia: Muhammad Ali aveva 74 anni quando è morto.
Seguito: Quanti anni aveva Alan Turing quando è morto?
Risposta intermedia: Alan Turing aveva 41 anni quando è morto.
Quindi la risposta finale è: Muhammad Ali

Fornire esempi e formattazione per FewShotPromptTemplate

Con l'oggetto FewShotPromptTemplate, è possibile inserire in blocco il contenuto dell'esempio.

prompt = FewShotPromptTemplate(
    examples=esempi,
    example_prompt=prompt_esempio,
    suffix="Domanda: {input}",
    input_variables=["input"]
)

print(prompt.format(input="Chi è il padre di George Washington?"))

Risultato:

Domanda: Di chi è più lunga la vita, Muhammad Ali o Alan Turing?

Abbiamo bisogno di seguire questa domanda: Sì.
Seguito: Quanti anni aveva Muhammad Ali quando è morto?
Risposta intermedia: Muhammad Ali aveva 74 anni quando è morto.
Seguito: Quanti anni aveva Alan Turing quando è morto?
Risposta intermedia: Alan Turing aveva 41 anni quando è morto.
Quindi la risposta finale è: Muhammad Ali

Domanda: Quando è nato il fondatore di craigslist?

Abbiamo bisogno di seguire questa domanda: Sì.
Seguito: Chi è il fondatore di craigslist?
Risposta intermedia: craigslist è stato fondato da Craig Newmark.
Seguito: Quando è nato Craig Newmark?
Risposta intermedia: Craig Newmark è nato il 6 dicembre 1952.
Quindi la risposta finale è: 6 dicembre 1952

Domanda: Chi è la madre dei nonni di George Washington?

Abbiamo bisogno di seguire questa domanda: Sì.
Seguito: Chi è la madre di George Washington?
Risposta intermedia: La madre di George Washington è Mary Ball Washington.
Seguito: Chi è il padre di Mary Ball Washington?
Risposta intermedia: Il padre di Mary Ball Washington è Joseph Ball.
Quindi la risposta finale è: Joseph Ball

Domanda: I registi di "Jaws" e "Casino Royale" vengono dallo stesso paese?

Abbiamo bisogno di seguire questa domanda: Sì.
Seguito: Chi è il regista di "Jaws"?
Risposta intermedia: Il regista di "Jaws" è Steven Spielberg.
Seguito: Da dove viene Steven Spielberg?
Risposta intermedia: Dagli Stati Uniti.
Seguito: Chi è il regista di "Casino Royale"?
Risposta intermedia: Il regista di "Casino Royale" è Martin Campbell.
Seguito: Da dove viene Martin Campbell?
Risposta intermedia: Dalla Nuova Zelanda.
Quindi la risposta finale è: No

Domanda: Chi è il padre di George Washington?

Utilizzo dei selettori di esempi

Fornire esempi a ExampleSelector

Qui riutilizziamo l'insieme di esempi e il modello di esempio dalla sezione precedente. Tuttavia, anziché fornire direttamente gli esempi all'oggetto FewShotPromptTemplate e inserire tutti gli esempi nel prompt, li forniremo a un oggetto ExampleSelector per inserire una parte degli esempi.

Utilizzeremo la classe SemanticSimilarityExampleSelector qui. Questa classe seleziona un piccolo esempio di esempio in base alla sua similarità con l'input. Utilizza un modello di embedding per calcolare la similarità tra l'input e i piccoli esempi di esempio, e quindi utilizza un database vettoriale per eseguire la ricerca di similarità e recuperare esempi simili all'input.

  • Nota: Questo coinvolge calcoli vettoriali e un database vettoriale, che vengono utilizzati principalmente nel campo dell'IA per la ricerca di similarità dei dati, come la query di contenuti simili degli articoli, immagini simili, video, ecc. Per ora, acquisire semplicemente una comprensione di base qui.
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
)

domanda = "Chi è il padre di George Washington?"
esempi_selezionati = example_selector.select_examples({"domanda": domanda})
print(f"L'esempio più simile: {domanda}")
for esempio in esempi_selezionati:
    print("\\n")
    for k, v in esempio.items():
        print(f"{k}: {v}")

Qui, vengono abbinati esempi simili alla domanda, e viene restituito quanto segue:

Esegui Chroma direttamente utilizzando l'API locale.
    Utilizzo del database in memoria DuckDB. I dati saranno transitori.
    L'esempio più simile: Chi è la madre dei nonni di George Washington?

    domanda: Chi è la madre di George Washington?
    risposta: 
    Abbiamo bisogno di seguire questa domanda: Sì.
    Seguito: Chi è la madre di George Washington?
    Risposta intermedia: La madre di George Washington è Mary Ball Washington.
    Seguito: Chi è il padre di Mary Ball Washington?
    Risposta intermedia: Il padre di Mary Ball Washington è Joseph Ball.
    Quindi la risposta finale è: Joseph Ball

Fornire il selettore dell'esempio a FewShotPromptTemplate

Infine, crea un oggetto FewShotPromptTemplate. Basandoti sul selettore dell'esempio dall'esempio precedente, seleziona un esempio simile alla domanda.

prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    suffix="Domanda: {input}",
    input_variables=["input"]
)

print(prompt.format(input="Chi è il padre di George Washington?"))

Ritorna:

Domanda: Chi è il padre dei nonni di George Washington?

Dobbiamo seguire con questa domanda: Sì.
Seguito: Chi è la madre di George Washington?
Risposta intermedia: La madre di George Washington è Mary Ball Washington.
Seguito: Chi è il padre di Mary Ball Washington?
Risposta intermedia: Il padre di Mary Ball Washington è Joseph Ball.
Quindi la risposta finale è: Joseph Ball

Domanda: Chi è il padre di George Washington?