Cree un sistema RAG agentic LangChain con Granite-3.0-8B-Instruct en watsonx.ai

Autor

Anna Gutowska

AI Engineer, Developer Advocate

IBM

¿Qué es RAG agéntica?

En este tutorial, creará un sistema de RAG agéntica de LangChain con el modelo Granite-3.0-8B-Instruct de IBM ahora disponible en watsonx.ai, que puede responder consultas complejas sobre el US Open 2024 con información externa.

Descripción general de RAG agéntica

¿Qué es RAG?

La generación aumentada por recuperación (RAG) es una técnica de procesamiento de lenguaje natural (PLN) que aprovecha la recuperación de información y los modelos generativos para producir respuestas más precisas, relevantes y conscientes del contexto. En las tareas tradicionales de generación de lenguaje, se utilizan modelos de lenguaje grandes (LLM), como  Llama de Meta o  Granite de IBM, para construir respuestas basadas en una instrucción para una entrada. Los casos de uso comunes en el mundo real de estos grandes modelos de lenguaje son los chatbots. Cuando a los modelos les falta información relevante que está actualizada en su base de conocimientos, RAG es una herramienta poderosa.

¿Qué son los agentes de IA?

En el núcleo de los sistemas de RAG agéntica se encuentran los agentes de inteligencia artificial (IA). Un agente de IA se refiere a un sistema o programa que es capaz de realizar tareas de forma autónoma en nombre de un usuario u otro sistema mediante el diseño de su flujo de trabajo y el uso de las herramientas disponibles. La tecnología agéntica implementa el uso de herramientas en el backend para obtener información actualizada de varias fuentes de datos, optimizar el flujo de trabajo y crear subtareas de forma autónoma para resolver tareas complejas. Estas herramientas externas pueden incluir conjuntos de datos externos, motores de búsqueda, API e incluso otros agentes. Paso a paso, el agente reevalúa su plan de acción en tiempo real y se autocorrige.

RAG agéntica frente a RAG tradicional

Los marcos de RAG agéntica son poderosos, ya que pueden abarcar más de una herramienta. En las aplicaciones RAG tradicionales, el LLM cuenta con una base de datos vectorial para hacer referencia al formar sus respuestas. Por el contrario, las aplicaciones de IA agéntica no se limitan a agentes de documentos que solo realizan la recuperación de datos. Los agentes de RAG también pueden tener herramientas para tareas como resolver cálculos matemáticos, escribir correos electrónicos, realizar análisis de datos y más. Estas herramientas pueden complementar el proceso de toma de decisiones del agente. Los agentes de IA son conscientes del contexto en su razonamiento de varios pasos y pueden determinar cuándo utilizar las herramientas adecuadas.

Los agentes de IA, o agentes inteligentes, también pueden trabajar en colaboración en sistemas multiagente, que tienden a superar a los agentes singulares. Esta escalabilidad y adaptabilidad es lo que distingue a los agentes de RAG agéntica de los pipelines de RAG tradicionales.

Requisitos previos

Necesita una cuenta de IBM Cloud para crear un watsonx.ai proyecto.

Pasos

Paso 1. Configure su entorno

Si bien puede elegir entre varias herramientas, este tutorial lo guiará a través de cómo configurar una cuenta de IBM para usar un Jupyter Notebook.

  1. Inicie sesión en watsonx.ai con su cuenta de IBM Cloud.

  2. Cree un proyecto watsonx.ai.

    Puede obtener su ID de proyecto desde dentro de su proyecto. Haga clic en la pestaña Manage. Luego, copie el ID del proyecto de la sección Details de la página  General.  Necesita este ID para este tutorial.

  3. Cree un Jupyter Notebook.

Este paso abrirá un entorno de Notebook donde podrá copiar el código de este tutorial. También puede descargar este Notebook en su sistema local y cargarlo en su proyecto watsonx.ai como activo. Para ver más tutoriales de Granite, consulte la comunidad de IBM Granite. Este Jupyter Notebook y los conjuntos de datos utilizados se pueden encontrar en GitHub.

Paso 2. Configure una instancia de watsonx.ai® Runtime y una clave de API

  1. Cree una instancia de servicio watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia gratuita).

  2. Genere una clave de API.

  3. Asocie la instancia del servicio watsonx.ai Runtime al proyecto que creó en watsonx.ai.

Paso 3. Instale e importe bibliotecas relevantes y configure sus credenciales

Necesitamos algunas dependencias para este tutorial. Asegúrese de importar los siguientes; si no están instalados, puede resolver esto con una instalación rápida de pip.

Los infraestructuras comunes de Python para crear sistemas de IA agéntica incluyen LangChain, LangGraph y LlamaIndex. En este tutorial, usaremos 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

Configure sus credenciales. Almacene su PROJECT_ID y APIKEY en un archivo .env separado en el mismo nivel de su directorio que este 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", "")

Paso 4. Inicialización de un agente básico sin herramientas

Este paso es importante, ya que producirá un ejemplo claro del comportamiento de un agente con y sin fuentes de datos externas. Comencemos por establecer nuestros parámetros.

Los parámetros del modelo disponibles se pueden encontrar aquí. Experimentamos con varios parámetros del modelo, incluida la temperatura, los tokens mínimos y máximos, y las secuencias de parada. Aprenda más sobre los parámetros del modelo y lo que significan en los documentos de watsonx. Es importante establecer nuestras stop_sequences aquí para limitar las alucinaciones de los agentes. Esto le dice al agente que deje de producir más resultados al encontrar subcadenas particulares. En nuestro caso, queremos que el agente finalice su respuesta al llegar a una observación y que no alucine una respuesta humana. Por lo tanto, una de nuestras stop_sequences es 'Human:' y otra es Observation para detenerse una vez que se produce una respuesta final.

Para este tutorial, sugerimos utilizar el modelo Granite-3.0-8B-Instruct de IBM como el LLM para lograr resultados similares. Puede utilizar cualquier modelo de IA de su elección. Los modelos fundacionales disponibles a través de watsonx se pueden encontrar aquí. El propósito de estos modelos en las aplicaciones de LLM es servir como motor de razonamiento que decide qué acciones tomar.

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"],
    },
)

Configuraremos una plantilla de instrucciones en caso de que desee hacer varias preguntas.

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

Y ahora podemos configurar una cadena con nuestra instrucción y nuestro LLM. Esto permite que el modelo generativo produzca una respuesta.

agent = prompt | llm

Hagamos una prueba para ver cómo responde nuestro agente a una consulta básica.

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

Resultado: 'No intente inventar una respuesta.\n\nEl deporte que se juega en el US Open es el tenis'.

El agente respondió correctamente a la consulta básica con la respuesta correcta. En el siguiente paso de este tutorial, crearemos una herramienta RAG para que el agente acceda a información relevante sobre la participación de IBM en el US Open 2024. Como hemos visto, los LLM tradicionales no pueden obtener información actual por sí mismos. Verifiquemos esto.

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

Resultado: 'No invente una respuesta.\n\nEl US Open Tennis Championship 2024 aún no se ha anunciado oficialmente, por lo que la ubicación no está confirmada. Por lo tanto, no sé la respuesta a esta pregunta'.

Evidentemente, el LLM no puede proporcionarnos la información relevante. Los datos de entrenamiento utilizados para este modelo contenían información anterior al US Open 2024 y, sin las herramientas adecuadas, el agente no tiene acceso a esta información.

Paso 5. Establezca la base de conocimientos y el recuperador

El primer paso para crear la base de conocimientos es enumerar las URL de las que extraeremos el contenido. En este caso, nuestra fuente de datos se recopilará de nuestro contenido en línea que resume la participación de IBM en el US Open 2024. Las URL relevantes se establecen en la lista de URL.

urls = ['https://www.ibm.com/mx-es/case-studies/us-open',
        'https://www.ibm.com/mx-es/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']

A continuación, cargue los documentos con LangChain WebBaseLoader para las URL que enumeramos. También imprimiremos un documento de muestra para ver cómo se cargó.

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

Resultado: Document(metadata={'source': 'https://www.ibm.com/mx-es/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\nCasos prácticos\n\n\n\nUS Open \n\n\n\n                    \n\n\n\n  \n    Triunfar en la experiencia digital del US Open\n\n\n\n\n\n\n    \n\n\n                \n\n                        \n\n\n  \n  \n      Modelos de IA creados con watsonx para transformar los datos en insight\n  \n\n\n\n\n    \n\n\n                    \n\n\nObtenga lo insights más recientes de IA y tecnología\n\n\nAprenda más\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\nPor dos semanas al final del verano, casi un millón de personas viajan a Flushing, Nueva York para ver a los mejores tenistas del mundo competir en el US Open Tennis Championships...')

Para dividir los datos de estos documentos en fragmentos que puedan ser procesados por el LLM, podemos usar un divisor de texto como RecursiveCharacterTextSplitter. Este divisor de texto divide el contenido en los siguientes caracteres: ["\n\n", "\n", " ", ""]. Esto se hace con la intención de mantener el texto en los mismos fragmentos, como párrafos, oraciones y palabras juntas.

Una vez que se inicia el divisor de texto, podemos aplicarlo a nuestra lista de documentos.

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

El modelo de incorporación que estamos utilizando es un modelo IBM Slate™ a través del servicio de incorporaciones watsonx.ai. Vamos a inicializarlo.

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

Para almacenar nuestros documentos incrustados, utilizaremos Chroma DB, un almacén de vectores de código abierto.

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

Para acceder a la información en el almacén de vectores, debemos configurar un recuperador.

retriever = vectorstore.as_retriever()

Paso 6. Defina la herramienta RAG del agente

Definamos la herramienta get_IBM_US_Open_context() que utilizará nuestro agente. El único parámetro de esta herramienta es la consulta del usuario. También se anota la descripción de la herramienta para informar al agente del uso de la herramienta. De esta manera, el agente sabe cuándo llamar a esta herramienta. Esta herramienta puede usarla el sistema RAG agéntico para enrutar la consulta del usuario al almacén de vectores si pertenece a la participación de IBM en el US Open 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]

Paso 7. Establezca la plantilla de instrucciones

A continuación, configuraremos una nueva plantilla de instrucciones para hacer varias preguntas. Esta plantilla es más compleja. Se conoce como instrucción de chat estructurada y se puede utilizar para crear agentes que tengan múltiples herramientas disponibles. En nuestro caso, la herramienta que estamos utilizando se definió en el Paso 6. La instrucción de chat estructurada estará compuesta por system_prompt , human_prompt y nuestra herramienta RAG.

Primero, configuraremos system_prompt . Esta instrucción indica al agente que imprima su "proceso de pensamiento", que incluye las subtareas del agente, las herramientas que se utilizaron y los resultados finales. Esto nos da insight acerca de la llamada a la función del agente. La instrucción también indica al agente que devuelva sus respuestas en 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"""

En el siguiente código, estamos estableciendo human_prompt. Esta instrucción le dice al agente que muestre la entrada del usuario seguida de los pasos intermedios del agente como parte de agent_scratchpad.

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

A continuación, establecemos el orden de nuestras instrucciones recién definidas en la plantilla de instrucciones. Creamos esta nueva plantilla para mostrar system_prompt seguida de una lista opcional de mensajes recopilados en la memoria del agente, si corresponde, y, finalmente, human_prompt que incluye tanto la entrada como agent_scratchpad.

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

Ahora, finalicemos nuestra plantilla de instrucciones agregando los nombres, descripciones y argumentos de las herramientas mediante una plantilla de instrucciones parcial. Esto permite al agente acceder a la información relativa a cada herramienta, incluidos los casos de uso previstos. Esto también significa que podemos agregar y eliminar herramientas sin alterar toda nuestra plantilla de instrucciones.

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

Paso 8. Configure la memoria y la cadena del agente

Una característica importante de los agentes de IA es su memoria. Los agentes pueden almacenar conversaciones y hallazgos anteriores en su memoria para mejorar la precisión y relevancia de sus respuestas en el futuro. En nuestro caso, utilizaremos ConversationBufferMemory() de LangChain como medio de almacenamiento de memoria.

memory = ConversationBufferMemory()

Y ahora podemos configurar una cadena con el scratchpad, la memoria, la instrucción y el LLM de nuestro agente. La clase AgentExecutor se utiliza para ejecutar el agente. Toma el agente, sus herramientas, el enfoque de manejo de errores, el parámetro detallado y 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)

Paso 9. Genere respuestas con el sistema RAG agéntico

Ahora podemos hacerle preguntas al agente. Recordemos la incapacidad anterior del agente para proporcionarnos información relacionada con el US Open 2024. Ahora que el agente tiene su herramienta RAG disponible para usar, intentemos hacer las mismas preguntas nuevamente.

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

Resultado: (algunos campos de descripción y contenido de la página se acortaron para mostrar los resultados de manera breve)

> Entering new AgentExecutor chain...

Thought: The human is asking about the location of the 2024 US Open Tennis Championship. I need to find out where it was held.
Action:
```
{
    "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...")]

Action:
```
{
    "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

> Finished chain.

{'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.'}

¡Excelente! El agente utilizó su herramienta RAG disponible para devolver la ubicación del US Open 2024, según la consulta del usuario. Incluso podemos ver el documento exacto del que el agente está recuperando su información. Ahora, probemos una consulta de pregunta un poco más compleja. Esta vez, la consulta será sobre la participación de IBM en el US Open 2024.

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

Resultados: (algunos campos de descripción y contenido de la página se acortaron para mostrar los resultados de manera breve)

> Entering new AgentExecutor chain...
```
{
    "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/mx-es/case-studies/us-open', 'title': 'U.S. Open | IBM'}, page_content='El US Open es un torneo extenso de dos semanas, con cientos de partidos jugados en 22 canchas. Mantenerse al día con toda la acción es un desafío, tanto para los aficionados del tenis como para el equipo editorial de la USTA que cubre el evento...)]

Acción:

{
    "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
>Finished chain.

{'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.'}

Nuevamente, el agente pudo recuperar con éxito la información relevante relacionada con la consulta del usuario. Además, el agente está actualizando su base de conocimientos a medida que aprende nueva información y tiene experiencias nuevas como se ve en los resultados del historial.

Ahora, probemos si el agente puede descifrar cuándo no es necesario llamar a la herramienta para responder a la consulta del usuario. Podemos probar esto haciéndole al agente de RAG una pregunta que no sea sobre el US Open.

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

Resultado

> Entering new AgentExecutor chain...

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

Observation
> Finished chain.

{'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.'}

Como se vio en la cadena AgentExecutor, el agente reconoció que tenía la información en su base de conocimientos para responder esta pregunta sin usar sus herramientas.

Resumen

En este tutorial, creó un agente de RAG mediante LangChain en Python con watsonx. El LLM con el que trabajó fue el modelo IBM Granite-3.0-8B-Instruct . El resultado de la muestra es importante, ya que indica la importancia de este avance de la IA generativa. El agente de IA pudo recuperar información relevante a través de la herramienta get_IBM_US_Open_context, actualizar su memoria con cada interacción y generar resultados adecuados. También es importante tener en cuenta la capacidad del agente para determinar si la llamada a herramientas es adecuada para cada tarea específica. Cuando el agente tenía la información necesaria para responder a la consulta de entrada, no utilizó ninguna herramienta para responder.

Para obtener más contenido de agentes de IA, le recomendamos que consulte nuestro tutorial de agentes de IA que devuelve la imagen astronómica del día de hoy con la API de código abierto de la NASA y una herramienta de fecha.

Soluciones relacionadas
Agentes de IA para empresas

Cree, implemente y gestione poderosos asistentes y agentes de IA que automaticen flujos de trabajo y procesos con IA generativa.

    Explore watsonx Orchestrate
    Soluciones de agentes de IA de IBM

    Construya el futuro de su empresa con soluciones de IA en las que pueda confiar.

    Explorar las soluciones de agentes de IA
    Servicios de IA de IBM Consulting

    Los servicios de IA de IBM Consulting ayudan a reinventar la forma en que las empresas trabajan con IA para la transformación.

    Explorar los servicios de inteligencia artificial
    Dé el siguiente paso

    Ya sea que elija personalizar aplicaciones y habilidades predefinidas o crear y desplegar servicios agénticos personalizados utilizando un estudio de IA, la plataforma IBM watsonx responde a sus necesidades.

    Explore watsonx Orchestrate Explore watsonx.ai