Concatenamento dei prompt con LangChain: una panoramica completa

Autore

Vrunda Gadesha

AI Advocate | Technical Content Author

Il concatenamento dei prompt è un concetto fondamentale nella creazione di workflow avanzati con modelli linguistici di grandi dimensioni (LLM). Implica il collegamento di più prompt in una sequenza logica, in cui l'output di un prompt funge da input per quello successivo. Questo approccio modulare è particolarmente potente per risolvere attività complesse come l'elaborazione di testi in più fasi, il riepilogo, la risposta alle domande e altro ancora.

LangChain è un framework versatile progettato per semplificare la creazione di workflow. Fornisce strumenti per gestire gli LLM come i modelli IBM® Granite o quelli di GPT (generative pre-training transformer) di OpenAI, per definire prompt personalizzati e collegarli in catene riutilizzabili. Riducendo la complessità della gestione dei prompt, LangChain consente agli sviluppatori di concentrarsi sulla risoluzione dei problemi piuttosto che sull'orcestrazione delle interazioni con gli LLM.

In questo tutorial, ci occuperemo di:

  1. Esplora diversi tipi di concatenamento dei prompt (sequenziale, ramificato, iterativo e altri).
  2. Implementa un esempio di concatenamento generico che combini tipi di concatenamento sequenziale, ramificato e iterativo.
  3. Utilizza le classi integrate di LangChain come PromptTemplate, LLMChain e SequentialChain per definire e gestire il workflow.

Come LangChain gestisce il concatenamento dei prompt

LangChain fornisce un potente framework per la creazione di workflow modulari in applicazioni chatbot. La combinazione di prompt, concatenamento dinamico e integrazione avanzata consente agli sviluppatori di creare pipeline scalabili e adattive che utilizzano le tecniche RAG e forniscono output come JSON. Ecco come LangChain gestisce efficacemente il concatenamento dei prompt:

Prompt: LangChain utilizza from_template per progettare workflow di input/output strutturati per ogni fase, facilitando la gestione delle operazioni di chatbot. 

Integrazione LLM: il framework si integra perfettamente con vari LLM, come IBM Granite, OpenAI e Hugging Face, consentendone la messa a punto per attività personalizzate.

Gestione della catena: SequentialChain e SimpleSequentialChain di LangChain consentono workflow modulari per pipeline di chatbot, mentre stroutputparser garantisce output strutturati come JSON. 

Flussi di lavoro dinamici: utilizzando strumenti come ConditionalChain e modelli di messaggistica di sistema, LangChain supporta workflow adattivi, in linea con i principi della RAG (retrieval-augmented generation) per la generazione dinamica di contenuti.

Diagramma del prompt Figura - 1 Framework di concatenamento dei prompt utilizzando langchain

Al termine di questo tutorial, avrai maturato una solida conoscenza di come usare LangChain per creare workflow modulari ed estensibili per un'ampia gamma di applicazioni.

Tipi di concatenamento prompt

Il concatenamento dei prompt consente di progettare workflow in cui gli output di una fase vengono passati a quella successiva. I vari tipi di concatenamento supportano workflow diversi che vanno da semplici attività sequenziali a processi più complessi e dinamici. Ecco una breve panoramica dei tipi di concatenamento dei prompt:

  • Concatenamento sequenziale: il tipo di concatenamento più semplice, in cui l'output di un prompt viene passato direttamente come input al successivo. Questa opzione è ideale per attività con una progressione lineare.[1]

  • Branching chaining: nel branching chaining, un output viene suddiviso in più workflow paralleli. Ogni ramo elabora l'output in modo indipendente. [2]

  • Concatenamento iterativo: il concatenamento iterativo comporta l'esecuzione ripetuta di un prompt o di una catena fino a quando non viene soddisfatta una condizione specificata. Questa opzione è utile per perfezionare gli output.[3]

  • Concatenamento gerarchico: suddivide un'attività di grandi dimensioni in attività secondarie più piccole, che vengono eseguite in modo gerarchico. Gli output di livello inferiore alimentano attività di livello superiore. [4]

  • Concatenamento condizionale: il concatenamento condizionale sceglie in modo dinamico i passaggi successivi in base all'output di un prompt precedente. Abilita il processo decisionale all'interno dei workflow.

  • Concatenamento multimodale: il concatenamento multimodale integra prompt che gestiscono diversi tipi di dati (ad esempio, testo, immagini o audio). È adatto per applicazioni che combinano più modalità. [2]

  • Concatenamento dinamico: il concatenamento dinamico adatta il workflow in base agli output in tempo reale o a condizioni mutevoli. Aggiunge flessibilità al concatenamento dei prompt. [5]

  • Concatenamento ricorsivo: nel concatenamento ricorsivo, gli input di grandi dimensioni vengono suddivisi in blocchi più piccoli per l'elaborazione individuale e i risultati vengono quindi combinati. È utile per la gestione di documenti o set di dati particolarmente lunghi. [6]

  • Concatenamento inverso: il concatenamento inverso inizia con un output e lavora a ritroso per determinare gli input o i passaggi necessari per raggiungerlo. È ottimo per la risoluzione dei problemi e per il debug. [5]

Ogni tipo di concatenamento soddisfa casi d'uso unici, rendendo essenziale scegliere quello giusto in base alla complessità e ai requisiti dell'attività.

Caso d'uso: elaborazione del testo in più passaggi

In questo workflow, elaboriamo il feedback con modelli di chat e prompt engineering per costruire una pipeline scalabile di elaborazione del testo. Le seguenti fasi del tutorial dimostrano tecniche di concatenamento sequenziale, ramificato e iterativo basate sull'AI generativa.

Estrazione di parole chiave (concatenamento sequenziale)

  • Il testo di input o l'input dell'utente fornito in linguaggio naturale viene elaborato tramite un modello di prompt per identificare le parole chiave significative.
  • Questo passaggio utilizza il concatenamento sequenziale per garantire che le parole chiave estratte vengano inserite direttamente nelle attività successive.

Generazione di un riepilogo del sentiment (branching chaining)

  • Le parole chiave estratte vengono trasmesse a un modello di chat per generare un riepilogo del sentiment.
  • Il branching chaining consente percorsi paralleli di riepilogo per adattare gli output in base al contesto.

Perfezionamento del riepilogo del sentiment (concatenamento iterativo)

  • Se il riepilogo del sentiment non soddisfa i criteri di qualità predefiniti, viene sottoposto a un prompt di perfezionamento.
  • Il concatenamento iterativo consente la rielaborazione fino a quando l'output non raggiunge il livello di precisione previsto.

Output finale

  • Il riepilogo del sentiment perfezionato viene fornito come output finale, fornendo insight dettagliati all'utente.
  • Questo dimostra l'integrazione d prompt engineering, AI generativa e tecniche di concatenamento avanzate.

Questo approccio combina il concatenamento sequenziale, ramificato e iterativo in Python con modelli di chat e prompt engineering. Garantisce una solida elaborazione del feedback, sfruttando l'AI generativa per l'estrazione delle parole chiave, l'analisi del sentiment e il perfezionamento.

Prerequisiti

Per creare un progetto watsonx.ai è necessario un account IBM Cloud .

Passaggi

Passaggio 1. Configurare il tuo ambiente

Sebbene sia possibile scegliere tra diversi strumenti, questo tutorial illustra come configurare un account IBM per l'utilizzo di un Jupyter Notebook.

  1. Accedi a watsonx.ai utilizzando il tuo account IBM Cloud.
  2. Crea un progetto watsonx.ai. Puoi ottenere l'ID del tuo progetto dall'interno del tuo progetto. Clicca sulla scheda Gestisci. Quindi, copia l'ID del progetto dalla sezione Dettagli della pagina Generali. Per questo tutorial ti serve questo ID.
  3. Crea un Jupyter Notebook.

Questo passaggio apre un ambiente notebook in cui è possibile copiare il codice da questo tutorial. In alternativa, puoi scaricare questo notebook sul tuo sistema locale e caricarlo nel tuo progetto watsonx.ai come asset. Per visualizzare altri tutorial su Granite, visita l'IBM Granite Community. Questo tutorial è disponibile anche su GitHub.

Passaggio 2. Configurare un servizio watsonx.ai Runtime e una chiave API

  1. Crea un'istanza di serviziowatsonx.ai Runtime (scegli il piano Lite, che è un'istanza gratuita).
  2. Genera una chiave API.
  3. Associa il servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.

Passaggio 3. Installazione dei pacchetti

Abbiamo bisogno di librerie che funzionino con il framework Langchain e WatsonxLLM. Installiamo prima i pacchetti richiesti.

Nota: se stai utilizzando una vecchia versione di 'pip', puoi utilizzare il comando pip install --upgrade pip' per aggiornarla. Questo passaggio consente di installare facilmente i pacchetti più recenti, che potrebbero non essere compatibili con una versione precedente. Se però stai già utilizzando l'ultima versione o hai aggiornato di recente i tuoi pacchetti, puoi saltare questo comando.

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

Passaggio 4. Importa le librerie necessarie

Questo blocco di codice importa le librerie e gli strumenti Python essenziali per creare e gestire un'applicazione LLM utilizzando LangChain e IBM Watson LLM. 

Il modulo os viene utilizzato per accedere alle variabili di ambiente, come le credenziali di progetto o le chiavi API.

WatsonxLLM è un modulo di langchain_ibm che integra IBM Watson LLM per generare output da modelli di AI generativa.

PromptTemplate aiuta a creare modelli riutilizzabili per i prompt, garantendo la struttura degli input e la flessibilità nella prompt engineering.

LLMChain costruisce catene di attività individuali mentre

SequencialChain collega più passaggi in un unico workflow e `getpass` recupera in modo sicuro le informazioni sensibili (ad esempio, le chiavi API) senza esporle sullo schermo.

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

Passaggio 5. Configura le credenziali

Questo codice configura le credenziali per l'accesso all'API IBM® watson Machine Learning (WML) e garantisce che il PROJECT_ID sia configurato correttamente.

  • Le credenziali di un dizionario vengono create con l'URL del servizio WML e la chiave API. La chiave API viene raccolta in modo sicuro utilizzando `getpass.getpass` per evitare di esporre informazioni sensibili.
  • Il codice tenta di recuperare il PROJECT_ID dalle variabili di ambiente utilizzando la funzione os.environ. Se il PROJECT_ID non viene trovato, all'utente viene richiesto di inserirlo manualmente attraverso input.
# 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): ")

Passaggio 6. Inizializza il modello linguistico di grandi dimensioni

Questo codice inizializza l'LLM di IBM® Watsonx perché venga utilizzato nell'applicazione:

  1. Questo codice crea un'istanza di WatsonXLLM utilizzando il modello ibm/granite-3-8b-instruct, progettato per attività di AI generativa basate su istruzioni.
  2. I valori url, apikey e project_id delle credenziali precedentemente impostate vengono passati per l'autenticazione e la connessione al servizio LLM di IBM watson.
  3. Configura il parametro max_new_tokens per limitare il numero di token generati dal modello in ogni risposta (150 token in questo caso).

Questo passaggio prepara l'LLM Watson per la generazione di risposte nel workflow.

# 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
    }
)   

Passaggio 7. Definisci i modelli di prompt

Questo codice definisce i prompt per tre fasi del workflow di elaborazione del testo:

  1. Estrazione di parole chiave: keyword_prompt è progettato per estrarre le parole chiave più significative dal testo fornito. Utilizza il segnaposto {text} per inserire dinamicamente l'input.
  2. Generazione di un riepilogo del sentiment: sentiment_prompt prende come input le {keywords} estratte e genera un riepilogo del feedback. Il modello garantisce che la generazione del sentiment sia focalizzata sulle parole chiave fornite.
  3. Perfezionamento del riepilogo: refine_prompt migliora il riepilogo del sentiment utilizzando {sentiment_summary} come input. Si concentra sul rendere l'output conciso e preciso.

Queste istanze PromptTemplate consentono la progettazione riutilizzabile e strutturata di prompt engineering per l'applicazione 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:"
)

Passaggio 8. Crea catene

Questo codice definisce le catene LLM che collegano i prompt con l'LLM IBM Watson inizializzato, assegnando chiavi di output univoche per ogni fase:

  1. Catena di parole chiave: keyword_chain utilizza il keyword_prompt per estrarre le parole chiave dal testo di input. Il risultato viene memorizzato sotto la chiave univoca "parole chiave" per essere utilizzato nei passaggi successivi.
  2. Catena del sentiment: sentiment_chain utilizza le parole chiave estratte e genera un riepilogo del sentiment utilizzando sentiment_prompt. L'output è etichettato come "sentiment_summary".
  3. Catena di perfezionamento: refine_chain elabora il riepilogo del sentiment generato utilizzando refine_prompt. L'output finale raffinato viene memorizzato con la chiave "refined_summary".

Queste istanze LLMChain consentono l'esecuzione modulare delle attività, facilitando un flusso di lavoro passo a passo dell'applicazione degli LLM.

# 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
)

Passo 9. Unisci le catene

Questo codice combina le catene precedentemente definite in un workflow sequenziale, consentendo una procedura dettagliata per l'input di testo. SequentialChain collega keyword_chain, sentiment_chain e refine_chain in un ordine definito, assicurando che l'output di una catena serva da input per la successiva. Il workflow è configurato per accettare il testo come input iniziale, con l'output finale, un riepilogo raffinato del sentiment memorizzato sotto la chiave "refined_summary". Questa configurazione consente un'esecuzione semplificata ed efficiente dell'applicazione dell'LLM, garantendo una pipeline di elaborazione coerente e modulare.

# 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
)

Passaggio 10. Esegui il workflow

In questo blocco di codice eseguiremo l'intero workflow. Innanzitutto, abbiamo una stringa di feedback multilinea definita feedback_text, contenente commenti positivi e negativi degli utenti su un'app. Il metodo workflow.run elabora il feedback attraverso le catene sequenziali (estrazione di parole chiave, analisi del sentiment e perfezionamento) utilizzando l'input fornito. Il riepilogo del sentiment affinato viene stampato direttamente come risultato finale.

# 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

OUTPUT

Riepilogo del sentiment perfezionato:

Il sentiment degli utenti è prevalentemente negativo a causa delle ricorrenti interruzioni dell'app e dei tempi di risposta lenti del supporto clienti, nonostante l'apprezzamento per le caratteristiche e l'occasionale utilità del l'assistenza. Per aumentare la soddisfazione degli utenti, il team di sviluppo dovrà concentrarsi sulla risoluzione delle interruzioni dell'app e sull'accelerazione delle risposte del supporto clienti.

Il riepilogo del sentiment raffinato è una valutazione concisa e chiara del feedback. Sottolinea l'apprezzamento dell'utente per le caratteristiche dell'app, ma esprime frustrazione per i frequenti crash e la lentezza del supporto clienti, riflettendo la capacità del workflow di distillare insight critici in modo efficace.

Come scegliere il tipo di concatenamento corretto

La selezione del tipo di concatenamento appropriato per l'applicazione LLM comporta la valutazione dei fattori chiave per garantire efficienza e coerenza:

Complessità delle attività: utilizza workflow eseguibili per attività con più passaggi. Esempi few-shot o modelli di chatprompt possono aiutare a strutturare attività complesse che richiedono prompt diversi.

Dipendenza: se gli output di un passaggio sono segnaposto per il prompt successivo, usi il concatenamento sequenziale. I parser di output assicurano una transizione fluida degli output in input strutturati.

Adattabilità: per i workflow dinamici, per esempio quelli che coinvolgono agenti langchain, il concatenamento iterativo consente regolazioni in tempo reale dei parametri e dei prompt successivi. 

Modalità dati: scegliere workflow compatibili con vari tipi di dati. Usa metodi di embedding per dati di testo e vettoriali o LangChain Expression Language per operazioni flessibili.

Considerando questi fattori, puoi creare un'applicazione LLM robusta e adattabile con workflow coerenti.

Riepilogo

Il concatenamento dei prompt è una tecnica versatile per costruire workflow sofisticati di elaborazione del linguaggio naturale (NLP). In questo tutorial, abbiamo esplorato vari tipi di concatenamento e dimostrato un esempio generico che integra più approcci di concatenamento. Sperimentando questi metodi, è possibile sbloccare il pieno potenziale dei modelli linguistici per applicazioni nel mondo reale.

Soluzioni correlate
IBM® watsonx.ai

Addestra, convalida, adatta e implementa le funzionalità di AI generativa, foundation model e machine learning con IBM watsonx.ai, uno studio aziendale di nuova generazione per builder AI. Crea applicazioni AI in tempi ridotti e una minima quantità di dati.

Esplora watsonx.ai
Soluzioni di intelligenza artificiale

Metti l'AI al servizio della tua azienda con l'esperienza leader di settore e il portfolio di soluzioni di IBM nel campo dell'AI.

Esplora le soluzioni AI
Consulenza e servizi per l'intelligenza artificiale (AI)

I servizi di AI di IBM Consulting aiutano a reinventare il modo in cui le aziende lavorano con l'AI per la trasformazione.

Esplora i servizi AI
Prossimi passi

Attraverso l'AI, IBM Concert scopre insight di importanza chiave sulle operazioni e fornisce raccomandazioni specifiche per migliorare le applicazioni. Scopri come Concert può migliorare il tuo business.

Esplora Concert Esplora le soluzioni di automazione dei processi aziendali
Note a piè di pagina

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

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

[3] Sun, S., Yuan, R., Cao, Z., Li, W., & 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., & 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., & 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.