Costruisci un sistema RAG basato su agenti LangChain usando Granite-3.0-8B-Instruct in watsonx.ai

Autore

Anna Gutowska

AI Engineer, Developer Advocate

IBM

Cos'è l'agentic RAG?

In questo tutorial, creerai un sistema di agentic RAG LangChain utilizzando il modello IBM Granite-3.0-8B-Instruct ora disponibile su watsonx.ai in grado di rispondere a domande complesse sugli US Open 2024 utilizzando informazioni esterne.

Panoramica dell'agentic RAG

Cos'è la RAG?

La retrieval-augmented generation (RAG) è una tecnica di elaborazione del linguaggio naturale (NLP) che utilizza il recupero delle informazioni e i modelli generativi per produrre risposte più accurate, pertinenti e contestualizzate. Nelle attività tradizionali di generazione del linguaggio, vengono utilizzati modelli linguistici di grandi dimensioni (LLM) come i Llama Models di Meta o i Granite Models di IBM per costruire risposte in base al prompt di input. Un caso d'uso comune di questi grandi modelli linguistici nel mondo reale sono i chatbot. Quando ai modelli mancano informazioni rilevanti e aggiornate nella loro knowledge base, la RAG è uno strumento potente.

Cosa sono gli agenti AI?

Al centro dei sistemi di agentic RAG ci sono gli agenti di intelligenza artificiale (AI). Un agente AI si riferisce a un sistema o programma in grado di eseguire autonomamente attività per conto di un utente o di un altro sistema, progettando il proprio workflow e utilizzando gli strumenti disponibili. La tecnologia agente implementa l'uso degli strumenti sul backend per ottenere informazioni aggiornate da varie fonti dati, ottimizzare il workflow e creare attività secondarie in modo autonomo per risolvere compiti complessi. Questi strumenti esterni possono includere set di dati esterni, motori di ricerca, API e persino altri agenti. Passo dopo passo, l'agente rivaluta il suo piano d'azione in tempo reale e si corregge da solo.

Agentic RAG versus RAG tradizionale

I framework di agentic RAG sono potenti in quanto possono comprendere più di uno strumento. Nelle applicazioni RAG tradizionali, l'LLM è dotato di un database vettoriale a cui fare riferimento per formare le risposte. Al contrario, le applicazioni di agentic AI non si limitano agli agenti di documenti che eseguono solo il recupero dei dati. Gli agenti RAG possono anche disporre di strumenti per attività come la risoluzione di calcoli matematici, la scrittura di e-mail, l'esecuzione di analisi dei dati e altro ancora. Questi strumenti possono essere complementari al processo decisionale dell'agente. Gli agenti AI sono consapevoli del contesto nel loro ragionamento multifase e possono determinare quando utilizzare gli strumenti appropriati.

Gli agenti AI, o agenti intelligenti, possono lavorare in modo collaborativo anche in sistemi multiagente, che tendono a sovraperformare gli agenti singoli. Questa scalabilità e adattabilità è ciò che distingue gli agenti di agentic RAG dalle pipeline RAG tradizionali.

Prerequisiti

È necessario un account IBM Cloud per creare un progetto  watsonx.ai.

Passaggi

Passaggio 1: configura 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 usando il tuo account IBM Cloud.

  2. Crea un progetto watsonx.ai.

    Puoi ottenere l'ID del tuo progetto dall'interno del tuo progetto. Fare clic sulla scheda Gestisci. Quindi, copia l'ID del progetto dalla sezione Dettagli della pagina Generale. Per questo tutorial ti serve questo ID.

  3. Crea un Jupyter Notebook.

Questo passaggio aprirà un ambiente Notebook in cui potrai incollare 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 Jupyter Notebook insieme ai set di dati utilizzati sono disponibili su GitHub.

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

  1. Crea un'istanza di servizio watsonx.ai Runtime (seleziona l'area geografica appropriata e scegli il piano Lite, che è un'istanza gratuita).

  2. Genera una chiave API.

  3. Associa l'istanza del servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.

Passaggio 3: installa e importa le librerie pertinenti e configura le tue credenziali

Abbiamo bisogno di alcune dipendenze per questo tutorial. Assicurati di importare le seguenti e, se non sono installate, puoi risolvere il problema con una rapida installazione pip.

I framework Python comuni per la creazione di sistemi di agentic AI includono LangChain, LangGraph e LlamaIndex. In questo tutorial useremo LangChain.

# installations
!pip install langchain | tail -n 1
!pip install langchain-ibm | tail -n 1
!pip install langchain-community | tail -n 1
!pip install ibm-watsonx-ai | tail -n 1
!pip install ibm_watson_machine_learning | tail -n 1
!pip install chromadb | tail -n 1
!pip install tiktoken | tail -n 1
!pip install python-dotenv | tail -n 1
!pip install bs4 | tail -n 1
# imports import os
from dotenv import load_dotenv
from langchain_ibm import WatsonxEmbeddings, WatsonxLLM
from langchain.vectorstores import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.prompts import PromptTemplate
from langchain.tools import tool
from langchain.tools.render import render_text_description_and_args
from langchain.agents.output_parsers import JSONAgentOutputParser
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.agents import AgentExecutor
from langchain.memory import ConversationBufferMemory
from langchain_core.runnables import RunnablePassthrough
from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watsonx_ai.foundation_models.utils.enums import EmbeddingTypes

Configura le tue credenziali. Memorizza il tuo PROJECT_ID e APIKEY in un file .env separato nello stesso livello della tua directory di questo notebook.

load_dotenv(os.getcwd()+"/.env", override=True)
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com",
    "apikey": os.getenv("WATSONX_APIKEY", ""),
}
project_id = os.getenv("PROJECT_ID", "")

Passaggio 4: inizializzazione di un agente di base senza strumenti

Questo passaggio è importante in quanto produrrà un chiaro esempio del comportamento di un agente con e senza fonti di dati esterne. Iniziamo impostando i nostri parametri.

I parametri del modello disponibili possono essere trovati qui. Abbiamo sperimentato vari parametri del modello, tra cui la temperatura, i nuovi token minimi e massimi e le sequenze di arresto. Scopri di più sui parametri del modello e sul loro significato nei documenti watsonx. È importante impostare qui le nostre stop_sequences per limitare le allucinazioni degli agenti. Questo dice all'agente di smettere di produrre ulteriore output quando incontra particolari sottostringhe. Nel nostro caso, vogliamo che l'agente interrompa la sua risposta al raggiungimento di un'osservazione e non allucini una risposta umana. Quindi, una delle nostre stop_sequences è "Human" e un'altra è l'interruzione dell'osservazione una volta prodotta una risposta finale.

Per questo tutorial, consigliamo di utilizzare il modello IBM Granite-3.0-8B-Instruct come LLM per ottenere risultati simili. Puoi utilizzare liberamente il modello AI che preferisci. I modelli di base disponibili tramite watsonx sono disponibili qui. Lo scopo di questi modelli nelle applicazioni LLM è quello di fungere da motore di ragionamento che decide quali azioni intraprendere.

llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials.get("url"),
    apikey=credentials.get("apikey"),
    project_id=project_id,
    params={
        GenParams.DECODING_METHOD: "greedy",
        GenParams.TEMPERATURE: 0,
        GenParams.MIN_NEW_TOKENS: 5,
        GenParams.MAX_NEW_TOKENS: 250,
        GenParams.STOP_SEQUENCES: ["Human:", "Observation"],
    },
)

Imposteremo un template di prompt nel caso in cui desideri fare più domande.

template = "Answer the {query} accurately. If you do not know the answer, simply say you do not know."
prompt = PromptTemplate.from_template(template)

E ora possiamo creare una catena con il nostro prompt e il nostro LLM. Ciò consente al modello generativo di produrre una risposta.

agent = prompt | llm

Facciamo un test per vedere come il nostro agente risponde a una query di base.

agent.invoke({"query": 'What sport is played at the US Open?'})

Output: "Non provare a inventare una risposta.\n\n Lo sport praticato agli US Open è il tennis."

L'agente ha risposto correttamente alla query di base con la risposta corretta. Nella fase successiva di questo tutorial, creeremo uno strumento RAG per consentire all'agente di accedere alle informazioni pertinenti sul coinvolgimento di IBM negli US Open 2024. Come abbiamo visto, i modelli LLM tradizionali non sono in grado di ottenere autonomamente informazioni aggiornate. Verifichiamolo.

agent.invoke({"query": 'Where was the 2024 US Open Tennis Championship?'})

Output: "Non inventare una risposta.\n\n Il campionato di tennis degli US Open 2024 non è stato ancora annunciato ufficialmente, quindi la sede non è confermata. Pertanto, non conosco la risposta a questa domanda".

Evidentemente, l'LLM non è in grado di fornirci le informazioni pertinenti. I dati di allenamento utilizzati per questo modello contenevano informazioni precedenti agli US Open del 2024 e senza gli strumenti appropriati, l'agente non ha accesso a queste informazioni.

Passaggio 5: stabilisci la knowledge base e il retriever

Il primo passo per creare la knowledge base consiste nell'elencare gli URL da cui estrarremo i contenuti. In questo caso, la nostra fonte di dati verrà raccolta dai nostri contenuti online che riassumono il coinvolgimento di IBM negli US Open 2024. Gli URL pertinenti sono stabiliti nell'elenco degli url.

urls = ['https://www.ibm.com/it-it/case-studies/us-open',
        'https://www.ibm.com/it-it/sports/usopen',
        'https://newsroom.ibm.com/US-Open-AI-Tennis-Fan-Engagement',
        'https://newsroom.ibm.com/2024-08-15-ibm-and-the-usta-serve-up-new-and-enhanced-generative-ai-features-for-2024-us-open-digital-platforms']

Quindi, carica i documenti utilizzando LangChain WebBaseLoader per gli URL che abbiamo elencato. Stamperemo anche un documento di esempio per vedere come è stato caricato.

docs = [WebBaseLoader(url).load() for url in urls]
docs_list = [item for sublist in docs for item in sublist]
docs_list[0]

Output: Document(metadata={'source': 'https://www.ibm.com/it-it/case-studies/us-open', 'title': 'U.S. Open | IBM', 'description': 'To help the US Open stay on the cutting edge of customer experience, IBM Consulting built powerful generative AI models with watsonx.', 'language': 'en'}, page_content='\n\n\n\n\n\n\n\n\n\nU.S. Open | IBM\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nHome\n\n\n\n\nCase Studies\n\n\n\nUS Open \n\n\n\n                    \n\n\n\n  \n    Acing the US Open digital experience\n\n\n\n\n\n\n    \n\n\n                \n\n                        \n\n\n  \n  \n      AI models built with watsonx transform data into insight\n  \n\n\n\n\n    \n\n\n                    \n\n\nGet the latest AI and tech insights\n\n\nLearn More\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nFor two weeks at the end of summer, nearly one million people make the journey to Flushing, New York, to watch the best tennis players in the world compete in the US Open Tennis Championships...')

Per dividere i dati in questi documenti in blocchi che possono essere elaborati dall'LLM, possiamo utilizzare uno splitter di testo come RecursiveCharacterTextSplitter . Questo divisore di testo suddivide il contenuto sui seguenti caratteri: ["\n\n", "\n", " ", ""]. Questo viene fatto con l'intenzione di mantenere il testo negli stessi blocchi, come paragrafi, frasi e parole insieme.

Una volta avviato lo splitter di testo, possiamo applicarlo al nostro docs_list.

text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=250, chunk_overlap=0)
doc_splits = text_splitter.split_documents(docs_list)

Il modello di incorporamento che stiamo utilizzando è un modello IBM Slate tramite il servizio di incorporamento watsonx.ai. Inizializziamolo.

embeddings = WatsonxEmbeddings(
    model_id=EmbeddingTypes.IBM_SLATE_30M_ENG.value,
    url=credentials["url"],
    apikey=credentials["apikey"],
    project_id=project_id,
)

Per memorizzare i nostri documenti incorporati, utilizzeremo Chroma DB, un database vettoriale open source.

vectorstore = Chroma.from_documents(
    documents=doc_splits,
    collection_name="agentic-rag-chroma",
    embedding=embeddings,
)

Per accedere alle informazioni nel database vettoriale, dobbiamo configurare un retriever.

retriever = vectorstore.as_retriever()

Passaggio 6: definisci lo strumento RAG dell'agente

Definiamo lo strumento get_IBM_US_Open_context() che il nostro agente utilizzerà. L'unico parametro di questo strumento è la query dell'utente. La descrizione dello strumento viene annotata anche per informare l'agente sull'uso dello strumento. In questo modo, l'agente sa quando chiamare questo strumento. Questo strumento può essere utilizzato dal sistema agentic RAG per indirizzare la query dell'utente al database vettoriale se riguarda il coinvolgimento di IBM negli US Open del 2024.

@tool
def get_IBM_US_Open_context(question: str):
    """Get context about IBM's involvement in the 2024 US Open Tennis Championship."""
    context = retriever.invoke(question)
    return context

tools = [get_IBM_US_Open_context]

Passaggio 7.: stabilisci il modello di prompt

Successivamente, imposteremo un nuovo modello di prompt per porre più domande. Questo modello è più complesso. Viene definito un prompt di chat strutturato e può essere utilizzato per creare agenti con più strumenti disponibili. Nel nostro caso, lo strumento che stiamo utilizzando è stato definito nel passaggio 6. Il prompt strutturato della chat sarà composto da un system_prompt, un human_prompt e il nostro strumento RAG.

Innanzitutto, imposteremo il system_prompt. Questo prompt indica all'agente di stampare il suo "processo di pensiero", che include le attività secondarie dell'agente, gli strumenti utilizzati e l'output finale. Questo ci dà insight nella funzione che chiama l'agente. Il prompt indica inoltre all'agente di restituire le risposte in formato JSON Blob.

system_prompt = """Respond to the human as helpfully and accurately as possible. You have access to the following tools: {tools}
Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input).
Valid "action" values: "Final Answer" or {tool_names}
Provide only ONE action per $JSON_BLOB, as shown:"
```
{{
"action": $TOOL_NAME,
"action_input": $INPUT
}}
```
Follow this format:
Question: input question to answer
Thought: consider previous and subsequent steps
Action:
```
$JSON_BLOB
```
Observation: action result
... (repeat Thought/Action/Observation N times)
Thought: I know what to respond
Action:
```
{{
"action": "Final Answer",
"action_input": "Final response to human"
}}
Begin! Reminder to ALWAYS respond with a valid json blob of a single action.
Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation"""

Nel codice seguente stabiliamo human_prompt. Questo prompt indica all'agente di visualizzare l'input dell'utente seguito dai passaggi intermedi eseguiti dall'agente come parte dell'agent_scratchpad.

human_prompt = """{input}
{agent_scratchpad}
(reminder to always respond in a JSON blob)"""

Successivamente, stabiliamo l'ordine dei nostri prompt appena definiti nel modello di prompt. Creiamo questo nuovo modello per presentare le caratteristiche del system_prompt seguito da un elenco opzionale di messaggi raccolti nella memoria dell'agente, se presenti, e infine, l'human_prompt che include sia l'input che l'agent_scratchpad.

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        MessagesPlaceholder("chat_history", optional=True),
        ("human", human_prompt),
    ]
)

Ora, finalizziamo il nostro modello di prompt aggiungendo i nomi, le descrizioni e gli argomenti degli strumenti utilizzando un modello di prompt parziale. Ciò consente all'agente di accedere alle informazioni relative a ciascuno strumento, inclusi i casi d'uso previsti. Ciò significa anche che possiamo aggiungere e rimuovere strumenti senza alterare l'intero modello di prompt.

prompt = prompt.partial(
    tools=render_text_description_and_args(list(tools)),
    tool_names=", ".join([t.name for t in tools]),
)

Passaggio 8: configura la memoria e la catena dell'agente

Una caratteristica importante degli agenti AI è la loro memoria. Gli agenti sono in grado di memorizzare le conversazioni passate e le scoperte passate per migliorare l'accuratezza e la pertinenza delle loro risposte in futuro. Nel nostro caso, utilizzeremo ConversationBufferMemory () di LangChain come mezzo di storage.

memory = ConversationBufferMemory()

E ora possiamo creare una catena con lo scratchpad, la memoria, il prompt e l'LLM del nostro agente. La classe AgentExecutor viene utilizzata per eseguire l'agente. Richiede l'agente, i suoi strumenti, error handling approach, i parametri dettagliati e la memoria.

chain = ( RunnablePassthrough.assign(
    agent_scratchpad=lambda x: format_log_to_str(x["intermediate_steps"]),
    chat_history=lambda x: memory.chat_memory.messages,
    )
    | prompt | llm | JSONAgentOutputParser())

agent_executor = AgentExecutor(agent=chain, tools=tools, handle_parsing_errors=True, verbose=True, memory=memory)

Passaggio 9: genera risposte con il sistema di agentic RAG

Ora siamo in grado di porre domande all'agente. Ricordiamo la precedente incapacità dell'agente di fornirci informazioni relative agli US Open 2024. Ora che l'agente ha a disposizione il suo strumento RAG, riproviamo a fare le stesse domande.

agent_executor.invoke({"input": 'Where was the 2024 US Open Tennis Championship?'})

Output: (alcuni campi della descrizione e del contenuto della pagina sono stati abbreviati per visualizzare brevemente i risultati)

> Entro in una nuova catena di AgentExecutor...

Pensiero: l'umano sta chiedendo dove si è svolto il campionato di tennis degli US Open 2024. Devo scoprire dove si è svolto.
Azione:
```
{
    "action": "get_IBM_US_Open_context",
    "action_input": "Where was the 2024 US Open Tennis Championship held?"
}
```
Observation[Document(metadata={'description': "IBM and the United States Tennis Association (USTA) announced several watsonx-powered fan features coming to the US Open digital platforms ahead of this year's tournament. These new and enhanced capabilities – a product of collaboration between IBM and the USTA digital team – aim to deliver a more informative and engaging experience for millions of tennis fans around the world.", 'language': 'en-us', 'source': 'https://newsroom.ibm.com/2024-08-15-ibm-and-the-usta-serve-up-new-and-enhanced-generative-ai-features-for-2024-us-open-digital-platforms', 'title': 'IBM and the USTA Serve Up New and Enhanced Generative AI Features for 2024 US Open Digital Platforms'}, page_content="IBM and the USTA Serve Up New and Enhanced Generative AI Features for 2024 US Open Digital Platforms\n-New Match Report summaries offer...")]

Azione:
```
{
    "action": "Final Answer",
    "action_input": "The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York."
}
```
Observation

> Catena finita.

{'input': 'Where was the 2024 US Open Tennis Championship?',
  'history': '',
  'output': 'The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.'}

Ottimo! L'agente ha utilizzato lo strumento RAG disponibile per restituire la sede degli US Open 2024, in base alla richiesta dell'utente. Possiamo persino vedere il documento esatto da cui l'agente sta recuperando le informazioni. Proviamo ora con una query leggermente più complessa. Questa volta, la domanda riguarderà il coinvolgimento di IBM negli US Open 2024.

agent_executor.invoke({"input": 'How did IBM use watsonx at the 2024 US Open Tennis Championship?'})

Output: (alcuni campi della descrizione e del contenuto della pagina sono stati abbreviati per visualizzare brevemente i risultati)

> Entro in una nuova catena di AgentExecutor...
```
{
    "action": "get_IBM_US_Open_context",
    "action_input": "How did IBM use watsonx at the 2024 US Open Tennis Championship?"
}
```
Observation[Document(metadata={'description': 'To help the US Open stay on the cutting edge of customer experience, IBM Consulting built powerful generative AI models with watsonx.', 'language': 'en', 'source': 'https://www.ibm.com/it-it/case-studies/us-open', 'title': 'U.S. Open | IBM'}, page_content='The US Open is a sprawling, two-week tournament, with hundreds of matches played on 22 different courts. Keeping up with all the action is a challenge, both for tennis fans and the USTA editorial team covering the event...)]

Azione:
```
{
    "action": "Final Answer",
    "action_input": "IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI     Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team."
}
```
Observation
> Catena finita.

{'input': 'How did IBM use watsonx at the 2024 US Open Tennis Championship?',
 'history': 'Human: Where was the 2024 US Open Tennis Championship?\nAI: The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.',
 'output': 'IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team.'}

Ancora una volta, l'agente è riuscito a recuperare con successo le informazioni pertinenti relative alla richiesta dell'utente. Inoltre, l'agente sta aggiornando con successo la sua base di conoscenza man mano che apprende nuove informazioni e ha nuove esperienze, come si vede dall'output della cronologia.

Ora, verifichiamo se l'agente è in grado di determinare quando non è necessario ricorrere a uno strumento per rispondere alla domanda dell'utente. Possiamo verificarlo ponendo all'agente RAG una domanda che non riguarda gli US Open.

agent_executor.invoke({"input": 'What is the capital of France?'})

Output: 

> Entro in una nuova catena di AgentExecutor...

{
    "action": "Final Answer",
    "action_input": "The capital of France is Paris."
}

Observation
> Catena finita.

{'input': 'What is the capital of France?',
 'history': 'Human: Where was the 2024 US Open Tennis Championship?\nAI: The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.\nHuman: How did IBM use watsonx at the 2024 US Open Tennis Championship?\nAI: IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team.',
 'output': 'The capital of France is Paris.'}

Come si è visto nella catena di AgentExecutor, l'agente ha riconosciuto di avere le informazioni nella sua base di conoscenza per rispondere a questa domanda senza utilizzare i suoi strumenti.

Riepilogo

In questo tutorial hai creato un agente RAG utilizzando LangChain in Python con Watsonx. L'LLM con cui hai lavorato era il modello IBM Granite-3.0-8B-Instruct. L'output del campione è importante in quanto dimostra l'importanza di questo progresso dell'AI generativa. L'Agente AI è riuscito a recuperare con successo le informazioni rilevanti tramite lo strumento get_IBM_US_open_context, aggiornarne la memoria ad ogni interazione e fornire output appropriati. È anche importante notare la capacità dell'agente di determinare se la chiamata dello strumento è appropriata per ogni attività specifica. Quando l'agente disponeva delle informazioni necessarie per rispondere alla query di input, non utilizzava alcuno strumento per rispondere alle domande.

Per ulteriori contenuti sugli agenti AI, ti invitiamo a consultare il nostro tutorial Agente AI che restituisce l'immagine astronomica del giorno di oggi utilizzando l'API open source della NASA e uno strumento di datazione.

Soluzioni correlate
Agenti AI per il Business

Crea, implementa e gestisci assistenti e agenti AI potenti che automatizzano workflow e processi con l'AI generativa.

    Scopri watsonx Orchestrate
    Soluzioni per agenti AI IBM

    Costruisci il futuro della tua azienda con soluzioni AI di cui puoi fidarti.

    Esplora le soluzioni basate su agenti AI
    Servizi AI di IBM Consulting

    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 di intelligenza artificiale
    Prossimi passi

    Sia che tu scelga di personalizzare app e competenze precostituite o di creare e implementare servizi di agenti personalizzati utilizzando uno studio di AI, la piattaforma IBM watsonx è la soluzione che fa per te.

    Scopri watsonx Orchestrate Esplora watsonx.ai