Implementare il prompt caching utilizzando LangChain per creare applicazioni LLM efficienti

Autore

Shalini Harkar

Lead AI Advocate

Cos'è il prompt caching?

Il caching dei prompt è un modo per memorizzare e quindi riutilizzare le risposte generate dai prompt eseguiti quando si lavora con modelli linguistici come quelli IBM® Granite. Se si incontra nuovamente lo stesso input (prompt), anziché effettuare una nuova chiamata API, l'applicazione recupererà la risposta precedentemente memorizzata nella cache dei prompt.

Si può pensare alla memorizzazione nella cache dei prompt come a una sorta di "memoria" per la propria applicazione. Il sistema conserva i risultati delle interrogazioni precedenti per risparmiare tempo nelle elaborazioni, non dovendo effettuare richieste ripetute sullo stesso input.

Perché è importante?

La memorizzazione dei prompt nella cache è importante perché evita chiamate ripetute all'application programming interface (API) riutilizzando le risposte esistenti per prompt ripetuti identici. Questa capacità si traduce in tempi di risposta più rapidi, output costanti e un minore utilizzo dell'API, il che è utile per rimanere entro i limiti di velocità. Inoltre, aiuta a scalare il flusso e a creare resilienza durante le interruzioni. La memorizzazione dei prompt nella cache è una caratteristica fondamentale che aggiunge valore a qualsiasi applicazione di AI conveniente, efficiente e facile da usare.

Prerequisiti

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

  2. È necessario anche Python versione 3.12.7

Passaggi 

Passaggio 1: configurare l'ambiente

Sebbene sia possibile scegliere tra diversi strumenti, questo tutorial illustra come configurare un account IBM per utilizzare 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 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 NotebookQuesto passaggio aprirà un ambiente Jupyter Notebook in cui puoi copiare il codice ottenuto 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.

Passaggio 2: configura un'istanza di watsonx.ai Runtime e una chiave API

  1. Crea un'istanza di servizio watsonx.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: installare dei pacchetti

Sono necessarie delle librerie in grado di funzionare con il framework langchain e con WatsonxLLM. Per prima cosa, installiamo i pacchetti richiesti. Questo tutorial è stato realizzato utilizzando Python 3.12.7

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

!pip install -q langchain langchain-ibm langchain_experimental langchain-text-splitters langchain_chroma transformers bs4 langchain_huggingface sentence-transformers

Passaggio 4: importare le librerie necessarie

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

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

ChatWatsonX Consente interazioni basate sulla chat utilizzando IBM® watsonx tramite LangChain.

SimpleDirectoryReader serve per caricare e leggere documenti da una directory per l'indicizzazione con LlamaIndex.

GenParams contiene chiavi di metadati per configurare i parametri di generazione di testo watsonx.

SQLiteCache consente di configurare un database SQLite .cache.db locale per evitare chiamate API ridondanti e accelerare lo sviluppo e il test.

Per questo tutorial, necessitiamo di alcune librerie e moduli. Assicurati di importare i seguenti elementi e, se non sono installati, una rapida installazione pip risolverà il problema.

import os
import getpass
import requests
import random
import json
from typing import Dict, List
from langchain_ibm import WatsonxLLM
from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams
from langchain_ibm import WatsonxLLM
from langchain_ibm import ChatWatsonx
from llama_index.core import SimpleDirectoryReader

Passaggio 5: Leggere i dati di testo

from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader(
input_files=["~/Artificial Intelligence/Generative_AI/files/FIle2.txt"],
).load_data()

document_text = documents[0].text
print(document_text[:200] + "...")

Passaggio 5: configurare le credenziali

Questo codice configura le credenziali per l'accesso all'API IBM Watson machine learning (WML) e garantisce che l'ID del progetto sia configurato correttamente.

  • Viene creato un dizionario di credenziali con l'URL del servizio WML e la chiave API. La chiave API viene raccolta in modo sicuro utilizzando getpass.getpas per evitare di esporre informazioni sensibili.
  • il codice cerca di recuperare il PROJECT_ID dalle variabili di ambiente utilizzando os.environ. Se il PROJECT_ID non viene trovato, all'utente viene chiesto di inserirlo manualmente tramite input.
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: inizializzare il modello linguistico di grandi dimensioni

Questo codice inizializza IBM® WatsonxLLM per l'utilizzo nell'applicazione:

  1. Questo codice crea un'istanza di WatsonxLLM utilizzando il modello ibm/granite-3-8b-instruct (Granite-3.1-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 IBM Watson LLM.
  3. Configura il parametro max_new_tokens per limitare il numero di token generati dal modello in ogni risposta (in questo caso, 2000 token).

Per saperne di più sui parametri del modello, come i limiti minimi e massimi dei token, consulta la documentazione.

llm = WatsonxLLM(
model_id= "ibm/granite-3-8b-instruct",
url=URL,
apikey=WATSONX_APIKEY,
project_id=WATSONX_PROJECT_ID,
params={
GenParams.DECODING_METHOD: "greedy",
GenParams.TEMPERATURE: 0,
GenParams.MIN_NEW_TOKENS: 5,
GenParams.MAX_NEW_TOKENS: 2000,
GenParams.REPETITION_PENALTY:1.2,
GenParams.STOP_SEQUENCES: ["\n\n"]
}
)

Passaggio 8: configurare la cache SQLite per risposte LLM più rapide

SQLiteCache è uno strumento di caching persistente offerto da LangChain che memorizza le risposte delle chiamate LLM in un file di database SQLite. SQLiteCache riduce in modo intelligente il tempo della CPU memorizzando elaborazioni costose, il che significa che si concentra sul recupero dei dati anziché sul ricalcolo. Invece di ripetere l'intero processo, estrae semplicemente i risultati dal disco, rendendo il processo efficiente, affidabile e riutilizzabile.

Workflow di memorizzazione dei prompt nella cache

La figura illustra come, con il prompt caching, i risultati vengono caricati istantaneamente dal disco; senza di esso, ogni query fa perdere tempo in elaborazioni ridondanti.

from langchain.cache import SQLiteCache
from langchain.globals import set_llm_cache
set_llm_cache(SQLiteCache(database_path=".langchain.db"))
%%time
prompt = "System: You are a helpful assistant.\nUser: Why did Paul Graham start YC?\nAssistant:"
resp = llm.invoke(prompt)
print(resp)

In questo caso, la CPU ha funzionato solo per 22 ms, ma il tempo effettivamente trascorso è stato di 1,43 secondi.

L'esempio suggerisce che la maggior parte del tempo sia stato impiegato in attesa, probabilmente per operazioni di I/O (ad esempio, lettura e scrittura su disco, accesso alla rete o chiamata API)

Ora eseguiamo il modello una seconda volta con il prompt e vediamo il tempo di risposta.

%%time
llm.predict(resp)

Chiaramente, usando SQLiteCache, la CPU viene utilizzata per soli 7,26 ms, ma il tempo totale è stato di 6,15 secondi.

Ciò indica chiaramente il blocco delle dipendenze esterne (come attendere una risposta da un server).

Conclusione

Il caching dei prompt accelera e riduce il costo delle richieste API ai modelli linguistici di grandi dimensioni, come GPT-4o. Richiede il contenuto della cache come token di input, token di output, embedding e messaggi dell'utente, un prompt di sistema o l'output di una funzione, che ora utilizza un contenuto memorizzato nella cache anziché le richieste di rete per una nuova revisione. Questo metodo offre prezzi più bassi, una maggiore latenza di risposta e migliori indicatori chiave delle prestazioni (KPI).

La memorizzazione nella cache rapida può essere utile per chatbot, sistemi RAG, assistenti di fine-tuning e assistenti di codifica. Una solida strategia di caching che includa funzioni come lettura e scrittura della cache, messaggio di sistema, controllo della cache e time to live (TTL) effettivo migliorerà i tassi di accesso alla cache e ridurrà i tassi di perdita.

L'uso coerente degli stessi token di prompt, del prefisso di prompt e le istruzioni di utilizzo del sistema aiuta a garantire prestazioni di prompt costanti nelle conversazioni a più turni e nelle richieste successive. Indipendentemente dall'utilizzo di Python, di un SDK o dalla collaborazione con OpenAI o un altro provider, capire come funziona la memorizzazione dei prompt nella cache ti consentirà di implementarla al meglio per utilizzarla in molti casi d'uso.

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