Modelos de prompt de poucas amostras

Incluir exemplos interativos nos prompts ajuda o modelo a entender melhor a intenção do usuário e fornecer respostas melhores ou realizar tarefas. Modelos de prompt de poucas amostras referem-se ao uso de um pequeno conjunto de exemplos para orientar o modelo no tratamento de novas entradas. Esses exemplos podem ser usados para treinar o modelo, para que ele possa entender e responder melhor a perguntas semelhantes.

Exemplo:

Q: O que é o Batman?
A: Batman é um personagem fictício de quadrinhos.

Q: O que é torsalplexity?
A: Desconhecido.

Q: O que é um modelo de linguagem?
A:

Informe ao modelo que Q é a pergunta e A é a resposta, e interaja nesse formato.

A seguir, há uma explicação da classe de ferramentas fornecida pela Lanchain para inserir um pequeno número de exemplos interativos no prompt.

Uso do conjunto de exemplos

Criação do conjunto de exemplos

Defina uma matriz exemplos abaixo, que contém um conjunto de exemplos de perguntas e respostas.

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

exemplos = [
  {
    "question": "Qual é a vida útil mais longa, a de Muhammad Ali ou Alan Turing?",
    "answer":
"""
Precisamos dar seguimento à pergunta: Sim.
Segue: Quantos anos tinha Muhammad Ali quando morreu?
Resposta intermediária: Muhammad Ali tinha 74 anos quando morreu.
Segue: Quantos anos tinha Alan Turing quando morreu?
Resposta intermediária: Alan Turing tinha 41 anos quando morreu.
Então a resposta final é: Muhammad Ali
"""
  },
  {
    "question": "Quando nasceu o fundador do craigslist?",
    "answer":
"""
Precisamos dar seguimento à pergunta: Sim.
Segue: Quem é o fundador do craigslist?
Resposta intermediária: O craigslist foi fundado por Craig Newmark.
Segue: Quando Craig Newmark nasceu?
Resposta intermediária: Craig Newmark nasceu em 6 de dezembro de 1952.
Então a resposta final é: 6 de dezembro de 1952
"""
  },
  {
    "question": "Quem foi a mãe dos avós de George Washington?",
    "answer":
"""
Precisamos dar seguimento à pergunta: Sim.
Segue: Quem é a mãe de George Washington?
Resposta intermediária: A mãe de George Washington é Mary Ball Washington.
Segue: Quem é o pai de Mary Ball Washington?
Resposta intermediária: O pai de Mary Ball Washington é Joseph Ball.
Então a resposta final é: Joseph Ball
"""
  },
  {
    "question": "Os diretores de 'Tubarão' e '007 - Cassino Royale' são do mesmo país?",
    "answer":
"""
Precisamos dar seguimento à pergunta: Sim.
Segue: Quem é o diretor de 'Tubarão'?
Resposta intermediária: O diretor de 'Tubarão' é Steven Spielberg.
Segue: De onde é Steven Spielberg?
Resposta intermediária: Estados Unidos.
Segue: Quem é o diretor de '007 - Cassino Royale'?
Resposta intermediária: O diretor de '007 - Cassino Royale' é Martin Campbell.
Segue: De onde é Martin Campbell?
Resposta intermediária: Nova Zelândia.
Então a resposta final é: Não
"""
  }
]

Criação de um formatador para pequenos exemplos interativos

Basta inserir os exemplos no modelo de prompt usando o objeto PromptTemplate.

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

print(exemplo_prompt.format(**exemplos[0]))

Saída:

Pergunta: Qual é a vida útil mais longa, a de Muhammad Ali ou Alan Turing?

Precisamos dar seguimento à pergunta: Sim.
Segue: Quantos anos tinha Muhammad Ali quando morreu?
Resposta intermediária: Muhammad Ali tinha 74 anos quando morreu.
Segue: Quantos anos tinha Alan Turing quando morreu?
Resposta intermediária: Alan Turing tinha 41 anos quando morreu.
Então a resposta final é: Muhammad Ali

Fornecendo amostras e formatação para FewShotPromptTemplate

Com o objeto FewShotPromptTemplate, você pode inserir conteúdo de amostra em massa.

prompt = FewShotPromptTemplate(
    examples=exemplos,
    example_prompt=exemplo_prompt,
    sufixo="Pergunta: {input}",
    variáveis_de_entrada=["input"]
)

print(prompt.format(input="Quem é o pai de George Washington?"))

Retorna:

Pergunta: Qual a vida útil mais longa, Muhammad Ali ou Alan Turing?

Precisamos fazer um acompanhamento desta pergunta: Sim.
Acompanhamento: Quantos anos tinha Muhammad Ali quando morreu?
Resposta intermediária: Muhammad Ali tinha 74 anos quando morreu.
Acompanhamento: Quantos anos tinha Alan Turing quando morreu?
Resposta intermediária: Alan Turing tinha 41 anos quando morreu.
Então a resposta final é: Muhammad Ali

Pergunta: Quando nasceu o fundador do craigslist?

Precisamos fazer um acompanhamento desta pergunta: Sim.
Acompanhamento: Quem é o fundador do craigslist?
Resposta intermediária: O craigslist foi fundado por Craig Newmark.
Acompanhamento: Quando Craig Newmark nasceu?
Resposta intermediária: Craig Newmark nasceu em 6 de dezembro de 1952.
Então a resposta final é: 6 de dezembro de 1952

Pergunta: Quem é a mãe dos avós de George Washington?

Precisamos fazer um acompanhamento desta pergunta: Sim.
Acompanhamento: Quem é a mãe de George Washington?
Resposta intermediária: A mãe de George Washington é Mary Ball Washington.
Acompanhamento: Quem é o pai de Mary Ball Washington?
Resposta intermediária: O pai de Mary Ball Washington é Joseph Ball.
Então a resposta final é: Joseph Ball

Pergunta: Os diretores de "Jaws" e "Casino Royale" vêm do mesmo país?

Precisamos fazer um acompanhamento desta pergunta: Sim.
Acompanhamento: Quem é o diretor de "Jaws"?
Resposta intermediária: O diretor de "Jaws" é Steven Spielberg.
Acompanhamento: De onde é Steven Spielberg?
Resposta intermediária: Estados Unidos.
Acompanhamento: Quem é o diretor de "Casino Royale"?
Resposta intermediária: O diretor de "Casino Royale" é Martin Campbell.
Acompanhamento: De onde é Martin Campbell?
Resposta intermediária: Nova Zelândia.
Então a resposta final é: Não

Pergunta: Quem é o pai de George Washington?

Usando seletores de exemplos

Fornecendo exemplos para ExampleSelector

Aqui, reutilizamos o conjunto de exemplos e o modelo de prompt da seção anterior. No entanto, em vez de fornecer diretamente os exemplos para o objeto FewShotPromptTemplate e inserir todos os exemplos no prompt, os forneceremos a um objeto ExampleSelector para inserir uma parte dos exemplos.

Neste caso, usaremos a classe SemanticSimilarityExampleSelector. Esta classe seleciona um pequeno exemplo de amostra com base em sua similaridade com a entrada. Ela utiliza um modelo de incorporação para calcular a similaridade entre a entrada e os pequenos exemplos de amostra, e em seguida, usa um banco de dados vetorial para realizar a pesquisa de similaridade e recuperar exemplos semelhantes à entrada.

  • Observação: Isso envolve cálculos vetoriais e um banco de dados vetorial, que são principalmente utilizados no campo de IA para busca de similaridade de dados, como consulta de conteúdo de artigos similares, imagens similares, vídeos, etc. Apenas tenha um entendimento básico por agora.
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

seletor_de_exemplo = SemanticSimilarityExampleSelector.from_examples(
    exemplos,
    OpenAIEmbeddings(),
    Chroma,
    k=1
)

pergunta = "Quem é o pai de George Washington?"
exemplos_selecionados = seletor_de_exemplo.select_examples({"pergunta": pergunta})
print(f"Exemplo mais semelhante: {pergunta}")
for exemplo in exemplos_selecionados:
    print("\\n")
    for k, v in exemplo.items():
        print(f"{k}: {v}")

Aqui, exemplos similares à pergunta são correspondidos, e o seguinte é retornado:

Executando o Chroma diretamente usando a API local.
    Usando o banco de dados em memória DuckDB. Os dados serão transitórios.
    Exemplo mais semelhante: Quem é a mãe dos avós de George Washington?

    pergunta: Quem é a mãe de George Washington?
    resposta: 
    Precisamos fazer um acompanhamento com esta pergunta: Sim.
    Acompanhamento: Quem é a mãe de George Washington?
    Resposta intermediária: A mãe de George Washington é Mary Ball Washington.
    Acompanhamento: Quem é o pai de Mary Ball Washington?
    Resposta intermediária: O pai de Mary Ball Washington é Joseph Ball.
    Então a resposta final é: Joseph Ball

Fornecer o seletor de exemplo para FewShotPromptTemplate

Por fim, crie um objeto FewShotPromptTemplate. Com base no exemplo_selector do exemplo anterior, selecione um exemplo semelhante à pergunta.

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

print(prompt.format(input="Quem é o pai de George Washington?"))

Retorna:

Pergunta: Quem é a mãe dos avós de George Washington?

Precisamos seguir com esta pergunta: Sim.
Seguir: Quem é a mãe de George Washington?
Resposta intermediária: A mãe de George Washington é Mary Ball Washington.
Seguir: Quem é o pai de Mary Ball Washington?
Resposta intermediária: O pai de Mary Ball Washington é Joseph Ball.
Então a resposta final é: Joseph Ball

Pergunta: Quem é o pai de George Washington?