Encadeamento de prompts com o LangChain: uma visão geral abrangente

Autora

Vrunda Gadesha

AI Advocate | Technical Content Author

O encadeamento de prompts é um conceito fundamental na criação de fluxos de trabalho avançados usando grandes modelos de linguagem (LLMs). Ele envolve vincular vários prompts em uma sequência lógica, em que a saída de um prompt serve como entrada para o próximo. Essa abordagem modular é poderosa para resolver tarefas complexas, como processamento de texto multietapas, sumarização, resposta a perguntas e muito mais.

O LangChain é um framework versátil projetado para simplificar a criação desses fluxos de trabalho. Ele fornece ferramentas para gerenciar LLMs, como os modelos IBM® Granite ou os modelos GPT (transformador pré-treinado generativo) da OpenAI, definir prompts personalizados e conectá-los a cadeias reutilizáveis. Ao abstrair a complexidade do gerenciamento de prompts, o LangChain permite que os desenvolvedores se concentrem na solução de problemas em vez de orquestrar interações com LLMs.

Neste tutorial, vamos:

  1. Explorar diferentes tipos de encadeamento de prompts (sequenciais, ramificados, iterativos e outros).
  2. Implementar um exemplo de encadeamento genérico combinando tipos de encadeamento sequencial, ramificado e iterativo.
  3. Aproveitar as classes internas do LangChain, como PromptTemplate, LLMChain e SequentialChain, para definir e gerenciar o fluxo de trabalho.

Como o LangChain gerencia o encadeamento de prompts

O LangChain oferece um framework poderoso para criar fluxos de trabalho modulares em aplicações de chatbots. Ao combinar prompts estruturados, encadeamento dinâmico e integração avançada de LLMs, ele permite que os desenvolvedores criem pipelines escaláveis e adaptáveis que aproveitam as técnicas de RAG e entregam saídas estruturadas como JSON. Veja como o LangChain lida com o encadeamento de prompts de forma eficaz:

Abstração de prompt: o LangChain aproveita o from_template para criar fluxos de trabalho de entrada/saída estruturados para cada etapa, facilitando o manuseio de operações complexas do chatbot. 

Integração de LLMs: o framework se integra sem dificuldades a vários LLMs, como IBM Granite, OpenAI e Hugging Face, permitindo o ajuste fino para tarefas personalizadas.

Gerenciamento de cadeia: o SequentialChain e o SimpleSequentialChain do LangChain permitem fluxos de trabalho modulares para pipelines de chatbot, enquanto o stroutputparser garante saídas estruturadas, como JSON. 

Fluxos de trabalho dinâmicos: usando ferramentas como ConditionalChain e modelos de mensagens do sistema, o LangChain é compatível com fluxos de trabalho adaptáveis, alinhando-se aos princípios da RAG (geração aumentada de recuperação) para geração dinâmica de conteúdo.

Ao final deste tutorial, você terá um conhecimento sólido de como usar o LangChain para construir fluxos de trabalho modulares e extensíveis para uma ampla gama de aplicações.

Tipos de encadeamentos de prompts

O encadeamento de prompts permite que você crie fluxos de trabalho nos quais as saídas de uma etapa são passadas para a próxima. Diferentes tipos de encadeamento são compatíveis com diversos fluxos de trabalho, que vão desde tarefas sequenciais simples até processos mais complexos e dinâmicos. Aqui está uma breve visão dos tipos de encadeamentos de prompts:

  • Encadeamento sequencial: o tipo mais direto de encadeamento, em que a saída de um prompt é passada diretamente como entrada para o próximo. Essa opção é ideal para tarefas com progressão linear.[1]

  • Encadeamento de ramificações: no encadeamento de ramificações, uma única saída é dividida em vários fluxos de trabalho paralelos. Cada ramificação processa a saída de forma independente. [2]

  • Encadeamento iterativo: o encadeamento iterativo envolve a execução repetida de um prompt ou cadeia até que uma condição específica seja atendida. Essa opção é útil para refinar saídas.[3]

  • Encadeamento hierárquico: esse tipo divide uma tarefa grande em subtarefas menores, que são executadas hierarquicamente. As saídas de nível inferior alimentam tarefas de nível superior. [4]

  • Encadeamento condicional: o encadeamento condicional escolhe dinamicamente a próxima etapa com base na saída de um prompt anterior. Ele permite a tomada de decisão dentro de fluxos de trabalho.

  • Encadeamento multimodal: o encadeamento multimodal integra prompts que lidam com diferentes tipos de dados (por exemplo, texto, imagens ou áudio). É adequado para aplicações que combinam múltiplas modalidades. [2]

  • Encadeamento dinâmico: o encadeamento dinâmico adapta o fluxo de trabalho com base em saídas em tempo real ou condições variáveis. Acrescenta flexibilidade ao encadeamento de prompts. [5]

  • Encadeamento recursivo: no encadeamento recursivo, grandes entradas são divididas em partes menores para processamento individual, e os resultados são, então, combinados. É útil para lidar com documentos ou conjuntos de dados longos. [6]

  • Encadeamento reverso: o encadeamento reverso começa com uma saída esperada e trabalha de trás para frente para determinar as entradas ou etapas necessárias para alcançá-la. É ótimo para resolução de problemas e depuração. [5]

Cada tipo de encadeamento atende a casos de uso únicos, tornando essencial escolher o encadeamento certo com base na complexidade e nos requisitos da tarefa.

Caso de uso - processamento de texto multietapas

Nesse fluxo de trabalho, processamos o feedback dos clientes com modelos de chat e engenharia de prompts para criar um pipeline de processamento de texto escalável. As etapas seguintes do tutorial demonstram técnicas sequenciais, ramificadas e de encadeamento iterativo alimentadas por IA generativa.

Extração de palavras-chave (encadeamento sequencial)

  • O texto de entrada ou a entrada do usuário fornecidos em linguagem natural são processados por meio de um modelo de prompts para identificar palavras-chave significativas.
  • Essa etapa usa encadeamento sequencial para garantir que as palavras-chave extraídas alimentem diretamente as tarefas subsequentes.

Gerar um resumo de sentimento (encadeamento de ramificações)

  • As palavras-chave extraídas são transmitidas para um modelo de chat para gerar um resumo do sentimento.
  • O encadeamento de ramificações permite caminhos paralelos para sumarização para adaptar saídas com base no contexto.

Refinar o resumo do sentimento (encadeamento iterativo)

  • Se o resumo do sentimento não atender aos critérios de qualidade predefinidos, ele é passado por um prompt de refinamento.
  • O encadeamento iterativo permite o reprocessamento até que a saída atenda ao nível esperado de precisão.

Saída final

  • O resumo refinado do sentimento é entregue como saída final, fornecendo insights aprimorados ao usuário.
  • Isso demonstra a integração de engenharia de prompts, IA generativa e técnicas avançadas de encadeamento.

Essa abordagem combina encadeamento sequencial, ramificado e iterativo em Python com modelos de chat e engenharia de prompts. Ela garante o processamento robusto do feedback dos clientes, aproveitando a IA generativa para extração de palavras-chave, análise de sentimento e refinamento.

Pré-requisitos

Você precisa de uma uma conta do IBM Cloud para criar um projeto do watsonx.ai .

Etapas

Etapa 1. Configure seu ambiente

Embora você possa escolher entre várias ferramentas, este tutorial explica como configurar uma conta da IBM para usar um Jupyter Notebook.

  1. Faça login no watsonx.ai usando sua conta do IBM Cloud.
  2. Crie um projeto do watsonx.ai. Você pode obter a ID do projeto a partir de seu projeto. Clique na guia Gerenciar. Em seguida, copie a ID do projeto da seção Detalhes da página Geral. Você precisa dessa ID para este tutorial.
  3. Crie um Jupyter Notebook.

Essa etapa abre um ambiente do notebook, onde você poderá copiar o código deste tutorial. Ou então, você pode baixar esse notebook em seu sistema local e carregá-lo como um ativo em seu projeto do watsonx.ai. Para ver mais tutoriais do Granite, consulte a Comunidade IBM Granite. Este tutorial também está disponível no GitHub.

Etapa 2. Configure o serviço watsonx.ai Runtime e a chave de API

  1. Crie uma instância do serviço watsonx.ai Runtime (escolha o plano Lite, que é uma instância gratuita).
  2. Gere uma chave de API.
  3. Associe o serviço watsonx.ai Runtime ao projeto que você criou no watsonx.ai.

Etapa 3. Instalação dos pacotes

Precisamos de bibliotecas para trabalhar com o framework Langchain e watsonxLLM. Vamos primeiro instalar os pacotes necessários.

Observação: se você estiver usando uma versão antiga do "pip", você pode usar o comando pip install --upgrade pip" para atualizá-la. Esta etapa ajuda você a instalar facilmente os pacotes mais recentes, que podem não ser compatíveis com uma versão mais antiga. Mas, se você já estiver usando a versão mais recente ou se tiver atualizado seus pacotes recentemente, pode ignorar este comando.

!pip install --upgrade pip
%pip install langchain
!pip install langchain-ibm

Etapa 4. Importe as bibliotecas necessárias

Este bloco de código importa bibliotecas e ferramentas essenciais do Python para construir e gerenciar uma aplicação LLM usando o LangChain e o IBM Watson LLM. 

O módulo os é usado para acessar variáveis de ambiente, como credenciais de projeto ou chaves de API.

O WatsonxLLM é um módulo do langchain_ibm que integra o IBM Watson LLM para gerar saídas a partir de modelos de IA generativa.

O PromptTemplate ajuda a criar modelos reutilizáveis para prompts, garantindo a estrutura da entrada e a flexibilidade na engenharia de prompts.

O LLMChain cria cadeias de tarefas individuais enquanto

o SequencialChain vincula várias etapas em um único fluxo de trabalho e o "getpass" recupera com segurança informações confidenciais (por exemplo, chaves de API) sem expô-las na tela.

import os
from langchain_ibm import WatsonxLLM
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SequentialChain
import getpass

Etapa 5. Configure as credenciais

Esse código configura credenciais para acessar a API do IBM Watson Machine Learning (WML) e garante que o PROJECT_ID seja configurado corretamente.

  • As credenciais de um dicionário são criadas com o URL do serviço WML e a chave de API. A chave de API é coletada com segurança usando gatepass.gatepass para evitar a exposição de informações confidenciais.
  • O código tenta buscar o PROJECT_ID das variáveis de ambiente usando a função os.environ. Se o PROJECT_ID não for encontrado, será solicitado que o usuário o insira manualmente por meio da entrada.
# Set up credentials
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com", # Replace with the correct region if needed
    "apikey": getpass.getpass("Please enter your WML API key (hit enter): ")
}

# Set up project_id
try:
    project_id = os.environ["PROJECT_ID"]
except KeyError:
    project_id = input("Please enter your project_id (hit enter): ")

Etapa 6. Inicialize um grande modelo de linguagem

Este código inicializa o IBM Watson LLM para uso na aplicação:

  1. Esse código cria uma instância do watsonxLLM usando o modelo ibm/granite-3-8b-instruct, projetado para tarefas de IA generativa baseadas em instruções.
  2. Os valores de url, apikey e project_id das credenciais configuradas anteriormente são passados para autenticação e conexão com o serviço do IBM Watson LLM.
  3. Configura o parâmetro max_new_tokens para limitar o número de tokens gerados pelo modelo em cada resposta (150 tokens neste caso).

Essa etapa prepara o LLM Watsonx para gerar respostas no fluxo de trabalho.

# Initialize the IBM LLM
llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials["url"],
    apikey=credentials["apikey"],
    project_id=project_id,
    params={
    "max_new_tokens": 150
    }
)   

Etapa 7. Defina modelos de prompts

Esse código define modelos de prompts para três estágios do fluxo de trabalho de processamento de texto:

  1. Extração de palavras-chave: o key_prompt foi criado para extrair as palavras-chave mais significativas do texto fornecido. Ele usa o espaço reservado {text} para inserir dinamicamente a entrada.
  2. Geração de resumo de sentimento: ssentimentot_prompt toma o {keywords} extraído como entrada e gera um resumo de sentimento do feedback. O modelo garante que a geração de sentimento esteja focada nas palavras-chave fornecidas.
  3. Refinamento do resumo: o refine_prompt melhora o resumo de sentimento usando {sentiment_summary} como entrada. Ele se concentra em tornar a saída concisa e precisa.

Essas instâncias do PromptTemplate permitem a engenharia de prompts reutilizáveis e estruturadas para a aplicação do LLM.

# Define Prompt Templates

# Prompt for extracting keywords
keyword_prompt = PromptTemplate(
    input_variables=["text"],
    template="Extract the most important keywords from the following text:\n{text}\n\nKeywords:"
)

# Prompt for generating sentiment summary
sentiment_prompt = PromptTemplate(
    input_variables=["keywords"],
    template="Using the following keywords, summarize the sentiment of the feedback:\nKeywords: {keywords}\n\nSentiment Summary:"
)

# Prompt for refining the summary
refine_prompt = PromptTemplate(
    input_variables=["sentiment_summary"],
    template="Refine the following sentiment summary to make it more concise and precise:\n{sentiment_summary}\n\nRefined Summary:"
)

Etapa 8. Crie cadeias

Esse código define cadeias de LLMs que conectam os prompts ao IBM Watson LLM inicializado, atribuindo chaves de saída exclusivas para cada estágio:

  1. Cadeia de palavras-chave: o key_chain utiliza o keyword_prompt para extrair palavras-chave do texto de entrada. O resultado é armazenado sob a chave exclusiva "keywords" para uso em etapas subsequentes.
  2. Cadeia de sentimento: o sentiment_chain pega as palavras-chave extraídas e gera um resumo de sentimento usando o sentiment_prompt. A saída é rotulada como "sentiment_summary".
  3. Cadeia de refinamento: o refine_chain processa o resumo de sentimento gerado usando o refine_prompt. A saída final refinada é armazenada com a chave "refined_summary".

Essas instâncias do LLMChain permitem a execução de tarefas modulares, facilitando um fluxo de trabalho da aplicação de LLM passo a passo.

# Define Chains with Unique Keys

# Chain to extract keywords
keyword_chain = LLMChain(
    llm=llm,
    prompt=keyword_prompt,
    output_key="keywords" # Unique key for extracted keywords
)

# Chain to generate sentiment summary
sentiment_chain = LLMChain(
    llm=llm,
    prompt=sentiment_prompt,
    output_key="sentiment_summary" # Unique key for sentiment summary
)

# Chain to refine the sentiment summary
refine_chain = LLMChain(
    llm=llm,
    prompt=refine_prompt,
    output_key="refined_summary" # Final refined output
)

Etapa 9. Combine cadeias

Esse código combina as cadeias definidas anteriormente em um fluxo de trabalho sequencial, permitindo um processo passo a passo para entrada de texto. O SequentialChain vincula o keyword_chain, o sentiment_chain e o refine_chain em uma ordem definida, garantindo que a saída de uma cadeia sirva como entrada para a próxima. O fluxo de trabalho é configurado para aceitar texto como entrada, com a saída final, um resumo refinado do sentimento, armazenado sob a chave "refined_summary". Essa configuração permite uma execução simplificada e eficiente da aplicação do LLM, garantindo um pipeline de processamento coerente e modular.

# Combine Chains into a Sequential Workflow

workflow = SequentialChain(
    chains=[keyword_chain, sentiment_chain, refine_chain],
    input_variables=["text"], # Initial input for the workflow
    output_variables=["refined_summary"] # Final output of the workflow
)

Etapa 10. Execute o fluxo de trabalho

Neste bloco de código, executaremos todo o fluxo de trabalho. Primeiro, temos uma string de feedback de várias linhas definida como feedback_text, contendo comentários positivos e negativos de usuários sobre um aplicativo. O método workflow.run processa o feedback por meio de cadeias sequenciais (extração de palavras-chave, análise de sentimento e refinamento) usando a entrada fornecido. E o resumo de sentimento refinado é impresso diretamente como o resultado final.

# Example Input Text

feedback_text = """
    I really enjoy the features of this app, but it crashes frequently, making it hard to use.
    The customer support is helpful, but response times are slow.

    I tried to reachout to the support team, but they never responded

    For me, the customer support was very much helpful. Ihis is very helpful app. Thank you for grate services.

"""

# Run the Workflow

result = workflow.run({"text": feedback_text})

# Display the Output

print("Refined Sentiment Summary:")
print(result) # Directly print the result since it is a string

SAÍDA

Resumo de sentimento refinado:

O sentimento do usuário é predominantemente negativo devido aos travamentos recorrentes do aplicativo e aos tempos de resposta lentos do suporte ao cliente, apesar da apreciação das funcionalidades do aplicativo e do suporte ocasional ao cliente útil. Para aumentar a satisfação do usuário, a equipe de desenvolvimento deve se concentrar em resolver falhas do aplicativo e acelerar as respostas do suporte ao cliente.

O resumo de sentimento refinado é uma avaliação concisa e clara do feedback. Ele destaca a apreciação do usuário pelas funcionalidades do aplicativo, mas expressa frustração com falhas frequentes e suporte ao cliente lento, refletindo a capacidade do fluxo de trabalho de refinar insights críticos de forma eficaz.

Como escolher o tipo de encadeamento correto

A seleção do tipo de encadeamento apropriado para a aplicação de LLM envolve a avaliação de fatores-chave para garantir eficiência e coerência:

Complexidade da tarefa: utilize fluxos de trabalho executáveis para tarefas com várias etapas. Exemplos de few-shot ou chatprompttemplate podem ajudar a estruturar tarefas complexas que exigem prompts diferentes.

Dependência: se as saídas de uma etapa forem espaços reservados para o próximo prompt, use o encadeamento sequencial. Analisadores de saída garantem uma transição suave de saídas para entradas estruturadas.

Adaptabilidade: para fluxos de trabalho dinâmicos, como aqueles que envolvem agentes do Langchain, o encadeamento iterativo permite ajustes em tempo real de parâmetros e prompts. 

Modalidade de dados: escolha fluxos de trabalho compatíveis com tipos de dados variados. Use métodos de embedding para dados de texto e vetoriais ou o LangChain Expression Language para operações flexíveis.

Ao considerar esses fatores, você pode criar uma aplicação de LLM robusta e adaptável com fluxos de trabalho coerentes.

Resumo

O encadeamento de prompts é uma técnica versátil para a construção de fluxos de trabalho sofisticados de processamento de linguagem natural. Neste tutorial, exploramos vários tipos de encadeamento e demonstramos um exemplo genérico integrando várias abordagens de encadeamento. Experimentando esses métodos, você libera todo o potencial dos modelos de linguagem para aplicações do mundo real.

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
Notas de rodapé

[1] Roegiest, A. e Chitta, R. (2024). Answering Questions in Stages: Prompt Chaining for Contract QA.

[2] Ge, J., Luo, H., Qian, S., Gan, Y., Fu, J. e Zhang, S. (2023). Chain of Thought Prompt Tuning in Vision Language Models.

[3] Sun, S., Yuan, R., Cao, Z., Li, W. e Liu, P. (2024). Prompt Chaining or Stepwise Prompt? Refinement in Text Summarization. , 7551-7558. https://arxiv.org/abs/2406.00507.

[4] Huang, Q., Zhu, J., Li, Z., Xing, Z., Wang, C. e Xu, X. (2023). PCR-Chain: Partial Code Reuse Assisted by Hierarchical Chaining of Prompts on Frozen Copilot. 2023 IEEE/ACM 45th International Conference on Software Engineering: Companion Proceedings (ICSE-Companion), 1-5. https://ieeexplore.ieee.org/document/10172550.

[5] Wu, T., Jiang, E., Donsbach, A., Gray, J., Molina, A., Terry, M. e Cai, C. (2022). PromptChainer: Chaining Large Language Model Prompts through Visual Programming. CHI Conference on Human Factors in Computing Systems Extended Abstracts. https://dl.acm.org/doi/10.1145/3491101.3519729.

[6] Trautmann, D. (2023). Large Language Model Prompt Chaining for Long Legal Document Classification. ArXiv, abs/2308.04138. https://arxiv.org/abs/2308.04138.