O que é o DSPy?

Autor(es):

Joshua Noble

Data Scientist

O que é o DSPy?

Grandes modelos de linguagem (LLMs), fluxos de trabalho agênticos e armazenamentos de vetores tornaram-se consistentemente mais poderosos, e os frameworks para simplificar o desenvolvimento de aplicações de IA cresceram em popularidade. O DSPy é um toolkit que fornece módulos de uso geral que substituem a engenharia de prompts e a entrada direta de linguagem natural pela configuração usando código Python. 

Geralmente, trabalhar com LLMs ou modelos de base requer uma engenharia de prompts cuidadosa, onde o usuário ajusta os prompts de texto para obter a saída correta. Embora essa abordagem possa ser eficaz, é demorada e propensa a erros, além de criar cadeias de ferramentas frágeis que precisam ser atualizadas quando novas versões de um modelo são lançadas. Frameworks populares como o LangChain encadeiam modelos de linguagem para a construção de aplicações, e o LlamaIndex concentra-se em melhorar os recursos de pesquisa dentro dos textos. Com isso, os desenvolvedores ainda precisam de experiência em ajuste fino de prompts e tempo para testar cada prompt para obter a saída desejada. O DSPy simplifica esse processo de ajuste de prompts com uma abordagem programática para orientar e limitar o comportamento do modelo de linguagem.

O DSPy se concentra na automação da otimização da construção de prompts. Para substituir a invasão de prompts e geradores de dados sintéticos únicos, o DSPy fornece otimizadores gerais, que são algoritmos que atualizam parâmetros em seu programa. Sempre você modificar seu código, dados, asserções ou métricas, você poderá compilar seu programa novamente, e o DSPy fará a otimização de prompts para criar novos prompts eficazes que se ajustem às suas alterações.

Às vezes, as pessoas imaginam que a otimização automática de prompts significa criar um sistema onde os LLMs criticam e melhoram os prompts gerados pelo usuário. Essa não é a maneira mais eficaz de usar LLMs. O DSPy aproveita o poder de geração de ideias dos LLMs para gerar seus próprios prompts. Em seguida, testa essas variações usando um conjunto de métricas de avaliação para ver se elas resolvem melhor o problema. Se não tiverem um desempenho numérico melhor em uma métrica atribuída ao usuário, os prompts serão descartados. É semelhante a um algoritmo evolutivo em que os prompts são avaliados quanto à sua adequação e melhorados iterativamente.

Casos de uso do DSPy

O DSPy pode ser útil em vários tipos diferentes de fluxos de trabalho e cenários. Alguns dos mais comumente usados são geração aumentada de recuperação, resposta a perguntas com múltiplos saltos e sumarização de documentos.

Cadeia de pensamento

O prompt da cadeia de pensamento (CoT) simula processos de raciocínio semelhantes aos humanos, pedindo ao modelo que decomponha tarefas complexas em uma sequência de etapas lógicas em direção a uma resolução final. Essas etapas de raciocínio são alimentadas na janela de contexto do modelo, proporcionando mais fundamentação na tarefa em questão e, muitas vezes, levando a melhores respostas, mesmo em cenários complexos. O DSPy ajuda fazendo com que o modelo de linguagem gere prompts da cadeia de pensamento e estratégias e testando aqueles com o modelo de linguagem para gerar os prompts de CoT mais eficazes para o modelo fornecido.

Geração aumentada de recuperação

A geração aumentada de recuperação (RAG) é uma abordagem que permite que os LLMs aproveitem um grande corpus de conhecimento de fontes e consultem seu armazenamento de conhecimento para encontrar passagens ou conteúdo relevantes e produzir uma resposta bem refinada. A RAG garante que os LLMs possam usar dinamicamente o conhecimento em tempo real, mesmo que não tenham sido treinados originalmente no assunto, e deem respostas corretas. Esse poder adicional leva a uma maior complexidade na configuração dos pipelines de RAG. O DSPy oferece uma abordagem sem dificuldades para configurar pipelines de prompts e gerar prompts eficazes (ajuste de prompts) ou, no caso de modelos menores, realizar o ajuste fino dos próprios pesos do modelo.

Os pipelines de RAG podem ser otimizados com o DSPy de duas maneiras: usando exemplos rotulados ou usando exemplos de bootstrap. Os exemplos rotulados são simplesmente preexistentes; os exemplos rotulados manualmente são usados para treinar diretamente o modelo aluno. Bootstraps, no contexto do DSPy, significa usar um modo de linguagem em um paradigma de professor e aluno. O professor gera novos exemplos de treinamento com base em alguns prompts fornecidos pelo usuário. Esses exemplos de bootstrap são usados juntamente com ou em vez dos exemplos rotulados manualmente para treinar o módulo aluno até que ele forneça as respostas corretas. Os prompts que geram as respostas corretas são, então, atualizados de forma iterativa em todo o pipeline do DSPy.

Respostas a perguntas com vários saltos

Muitas vezes, uma única consulta de pesquisa não é suficiente para uma tarefa complexa de resposta a perguntas. O popular conjunto de dados de resposta a perguntas do HotPot  consiste em perguntas que exigem várias análises e recuperações de perguntas antes de poderem ser respondidas. Por exemplo: "Bill Nelson voou como especialista em carga em um ônibus espacial lançado pela primeira vez em que ano?" Esta resposta requer saber que Bill Nelson voou no ônibus espacial Columbia e, em seguida, ser capaz de determinar que o Columbia voou pela primeira vez em 1981.

A abordagem padrão para esse desafio na literatura de recuperação aumentada é a construção de um sistema de busca de vários saltos. Esses sistemas leem os resultados recuperados e geram consultas adicionais para reunir informações adicionais quando necessário, antes de chegar a uma resposta final. Usando o DSPy, você pode criar o mesmo sistema em algumas linhas de código de uma forma robusta, permitindo atualizar modelos e simplesmente executar novamente seu pipeline.

Sumarização

A sumarização condensa um trecho mais longo de texto em uma versão mais curta, enquanto retém as informações e as ideias principais. É uma habilidade poderosa para um LLM fazer bem, com aplicações que vão desde a criação de resumos de artigos até a geração de relatórios concisos a partir de documentos longos.

Avaliar a qualidade dos resumos produzidos por modelos de linguagem apresenta desafios significativos. Ao contrário de tarefas com respostas certas ou erradas, a qualidade da sumarização geralmente é subjetiva e dependente do contexto. O modelo precisa equilibrar a retenção de informações com a concisão, preservando o tom e a intenção do texto original, e garantindo a precisão dos fatos sem introduzir erros. A adaptação a diferentes tipos de material de origem e fins de resumo apresenta um desafio adicional. O DSPy permite que você use dados rotulados para ajustar os prompts de sumarização para obter as melhores respostas possíveis.

Conceitos no DSPy

O DSPy tem seu próprio vocabulário e terminologia, e aprender alguns desses termos importantes ajudará a esclarecer a arquitetura geral.

Compilação: esse processo é como o DSPy traduz um programa baseado em Python em instruções que um modelo de linguagem pode entender e executar com eficiência. 

Assinatura: é uma classe que define os tipos de entradas e saídas de um módulo, garantindo compatibilidade entre diferentes módulos em um programa DSPy. Alguns exemplos de assinaturas são tarefas como inserir uma pergunta e gerar o raciocínio e a resposta ou tomar um documento como entrada e gerar um resumo.

Otimizador: esse componente do DSPy realiza o ajusta fino do programa compilado para o modelo de linguagem específico que você está usando, por exemplo GPT3.5-Turbo, GPT-4.0 ou Llama 3.1. Os otimizadores garantem a maximização do desempenho e da precisão do programa. Em versões mais antigas do DSPy, eram chamados de teleprompters. Os programas DSPy consistem em várias chamadas para modelos de linguagem que são colocadas em stack juntas como módulos do DSPy. Cada módulo do DSPy tem três tipos de parâmetros internos: os pesos do LM, as instruções que ele deve seguir e demonstrações armazenadas do comportamento de entrada/saída.

Quando fornecida uma métrica, o DSPy cria prompts otimizados usando todos os pesos, instruções e comportamento do modelo com algoritmos de otimização de vários estágios. Eles podem combinar gradiente descendente (para pesos de modelos de linguagem) e otimização discreta orientada por modelos de linguagem, ou seja, para criar ou atualizar instruções e para criar ou validar demonstrações. As demonstrações do DSPy são semelhantes aos exemplos few-shot, mas são muito mais poderosas. Elas podem ser criadas a partir do zero, dado o seu programa, e sua criação e seleção podem ser otimizadas de muitas maneiras eficazes.

Em muitos casos, a compilação leva a melhores prompts do que a escrita humana, pois os otimizadores podem tentar mais coisas, de forma muito mais sistemática, e ajustar as métricas diretamente melhor do que um ser humano.

Pipeline: um "pipeline" é como o DSPy se refere a uma sequência de módulos conectados que trabalham juntos para realizar uma tarefa complexa. Por exemplo, um pipeline pode resumir um artigo, traduzi-lo de um idioma de origem para um idioma de destino e, em seguida, gerar perguntas sobre ele em um idioma de destino.

Métricas: o DSPy define várias métricas diferentes para medir o desempenho da saída. Por exemplo, você pode precisar que a saída seja uma correspondência exata para seu rótulo. Em outros casos, uma correspondência parcial pode ser adequada às suas necessidades. Uma métrica comumente usada fornecida pelo DSPy é a F1 semântica. Essa métrica mede o quanto das informações no rótulo estão contidas na resposta e quão poucos dados estranhos que não estão na resposta-alvo rotulada estão presentes na resposta. Se você precisar de uma maneira diferente de medir o desempenho, também poderá fornecer suas próprias métricas personalizadas.

Uso do DSPy

Começar a usar o DSPy é tão simples quanto chamar pip install dspy-ai. Nenhum hardware especial é necessário, pois a maioria dos modelos pode ser usada na nuvem por meio de uma API ou executados localmente. Ele pode ser executado localmente ou em ambientes de notebook hospedados, como Google Colab ou Watson Studio.

Um pipeline do DSPy típico para geração aumentada de recuperação consiste em um modelo de linguagem e um modelo de recuperação. Por exemplo, para trabalhar com o OpenAI GPT-3.5 Turbo como modelo de linguagem e com o recuperador ColBERTV2 como modelo de recuperação, configuraríamos o DSPy da seguinte forma:

import dspy
turbo = dspy.OpenAI(model=’gpt-3.5-turbo’)
colbertv2_wiki17_abstracts = dspy.ColBERTv2(url=’http://20.102.90.50:2017/wiki17_abstracts’)
# set the language model and the retrieval model
dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts)

 

Criação de assinaturas

As assinaturas são modelos que permitem configurar como os campos de entrada e saída para o modelo de linguagem e o modelo de recuperação podem ser estruturados. Por exemplo, este trecho de código mostra a sintaxe para um prompt para o modelo de linguagem com contexto e o modelo de recuperação com estrutura:

class GenerateAnswer(dspy.Signature):
    “””Answer questions with short factoid answers.”””
    context = dspy.InputField(desc=”may contain relevant facts”)
    question = dspy.InputField()
    answer = dspy.OutputField(desc=”often between 1 and 5 words”)

Incluímos pequenas descrições para os campos de contexto e resposta para definir diretrizes mais robustas sobre o que o modelo receberá e deve gerar.

Compilação

Depois de definir suas assinaturas, você pode executar seu programa e criar prompts ideais para sua tarefa usando um otimizador apropriado para sua tarefa. No DSPy. esse processo é chamado de compilação. A compilação de um programa atualiza os parâmetros armazenados em cada módulo. Na maioria dos cenários, isso ocorre principalmente na forma de coletar e selecionar boas demonstrações para inclusão no prompt.

A compilação exige:

• Um conjunto de treinamento ou exemplos de bootstrapping.

• Uma métrica para validação. Em um cenário de RAG, essa seria uma maneira de medir a precisão da resposta prevista e se o contexto recuperado contém a resposta.

• Um otimizador específico para gerar prompts para testes. Por exemplo, o otimizador BootstrapFewShot pode ser usado para gerar prompts e, em seguida, testar esses prompts gerados.

Para compilar um programa DSPy, você configura os modelos que deseja usar e os passa para o método de compilação do otimizador selecionado. Por exemplo, um programa para uma aplicação RAG conteria um modelo de linguagem e um modelo de recuperação. Esses seriam, então, passados para o método de compilação, e o otimizador usaria os dados recuperados para definir o contexto para a geração da linguagem.

Em seguida, você define uma métrica para avaliar a recuperação e o modelo de linguagem. Essa definição de métricas seria, então, fornecida a um otimizador, como o otimizador BootstrapFewShot ou LabeledFewShot, para usar enquanto avalia os prompts gerados pelo modelo de linguagem. Por fim, o otimizador compila um módulo personalizado contendo o método de encaminhamento definido junto com um conjunto de dados de treinamento.

A seleção do otimizador a ser usado normalmente exige experimentação, mas há diretrizes:

• Se você tiver pouquíssimos exemplos (aproximadamente 10), poderá começar com o BootstrapFewShot para gerar novos dados de treinamento.

• Se você tiver mais dados, por exemplo, 50 exemplos ou mais, experimente o BootstrapFewShotwithRandomSearch para gerar novos dados de treinamento em partes aleatórias de seus dados de treinamento.

• Se você precisar de um programa muito eficiente, poderá realizar um ajuste fino em um LLM pequeno para sua tarefa com o BootstrapFinetune.

Avaliação e iteração

Depois de compilar seu programa e comparar suas métricas, você poderá ficar satisfeito com os resultados. Você também pode descobrir que não gosta de algo no programa final ou nos resultados de acordo com a(s) métrica(s) escolhida(s). O desenvolvimento iterativo é fundamental. O DSPy fornece ferramentas para fazer isso de forma incremental, por meio da iteração nos dados, da atualização da estrutura do programa, da(s) métrica(s) escolhida(s) e do otimizador escolhido.

Saiba mais

O DSPy é de código aberto e, portanto, você pode inspecionar o código e ver o progresso do desenvolvimento. Os documentos do site StanfordNLP no Github contêm a documentação e vários tutoriais passo a passo e demonstrações de como começar a usar o DSPy.

Soluções relacionadas
IBM® watsonx.ai

Treine, valide, ajuste e implemente recursos de IA generativa, modelos de base e recursos de aprendizado de máquina com o IBM watsonx.ai, um estúdio empresarial de última geração para construtores de IA. Crie aplicações de IA em menos tempo com menos dados.

Explore o watsonx.ai
Soluções de inteligência artificial

Coloque a IA em ação na sua empresa com a experiência em IA líder do setor e com o portfólio de soluções da IBM.

Explore as soluções de IA
Consultoria e serviços em inteligência artificial (IA)

Os serviços de IA da IBM Consulting ajudam a reinventar a forma como as empresas trabalham com IA para gerar transformação.

Explore os serviços de IA
Dê o próximo passo

Ao utilizar a IA, o IBM Concert revela insights cruciais sobre suas operações e fornece recomendações específicas para cada aplicação com foco em melhorias. Descubra como o Concert pode impulsionar sua empresa.

Explorar Concert Explore as soluções de automação de processos de negócios