Tiempo de lectura estimado: 5 minutos
Introducción a Langgraph
Langgraph es un marco poderoso de Langchain diseñado para crear aplicaciones estatales de múltiples actores con LLM. Proporciona la estructura y las herramientas necesarias para construir agentes de IA sofisticados a través de un enfoque basado en gráficos.
Piense en Langgraph como la tabla de redacción de un arquitecto: nos brinda las herramientas para diseñar cómo nuestro agente pensará y actuará. Así como un arquitecto dibuja planos que muestran cómo las diferentes habitaciones se conectan y cómo las personas fluirán a través de un edificio, Langgraph nos permite diseñar cómo se conectarán diferentes capacidades y cómo fluirá la información a través de nuestro agente.
Características clave:
- Gestión estatal: Mantener un estado persistente en todas las interacciones
- Enrutamiento flexible: Definir flujos complejos entre componentes
- Persistencia: Guardar y reanudar flujos de trabajo
- Visualización: Ver y comprender la estructura de su agente
En este tutorial, demostraremos a Langgraph construyendo una tubería de análisis de texto de varios pasos que procesa el texto a través de tres etapas:
- Clasificación de texto: Clasificar el texto de entrada en categorías predefinidas
- Extracción de entidad: Identificar entidades clave del texto
- Resumen del texto: Genere un resumen conciso del texto de entrada
Esta tubería muestra cómo Langgraph se puede usar para crear un flujo de trabajo modular y extensible para tareas de procesamiento del lenguaje natural.
Configuración de nuestro entorno
Antes de sumergirnos en el código, establezcamos nuestro entorno de desarrollo.
Instalación
# Install required packages
!pip install langgraph langchain langchain-openai python-dotenv
Configuración de las teclas API
Necesitaremos una tecla API de OpenAI para usar sus modelos. Si aún no lo has hecho, puedes obtener uno de https://platform.openai.com/signup.
Mira el Códigos completos aquí
import os
from dotenv import load_dotenv
# Load environment variables from .env file (create this with your API key)
load_dotenv()
# Set OpenAI API key
os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY')
Probar nuestra configuración
Asegurémonos de que nuestro entorno funcione correctamente creando una prueba simple con el modelo Operai:
from langchain_openai import ChatOpenAI
# Initialize the ChatOpenAI instance
llm = ChatOpenAI(model="gpt-4o-mini")
# Test the setup
response = llm.invoke("Hello! Are you working?")
print(response.content)
Construyendo nuestra tubería de análisis de texto
Ahora importemos los paquetes necesarios para nuestra tubería de análisis de texto Langgraph:
import os
from typing import TypedDict, List, Annotated
from langgraph.graph import StateGraph, END
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain_core.runnables.graph import MermaidDrawMethod
from IPython.display import display, Image
Diseñando la memoria de nuestro agente
Así como la inteligencia humana requiere memoria, nuestro agente necesita una forma de realizar un seguimiento de la información. Creamos esto usando un Typeddict para definir nuestra estructura de estado: consulte el Códigos completos aquí
class State(TypedDict):
text: str
classification: str
entities: List[str]
summary: str
# Initialize our language model with temperature=0 for more deterministic outputs
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
Creando las capacidades centrales de nuestro agente
Ahora crearemos las habilidades reales que usará nuestro agente. Cada una de estas capacidades se implementa como una función que realiza un tipo específico de análisis. Mira el Códigos completos aquí
1. Nodo de clasificación
def classification_node(state: State):
'''Classify the text into one of the categories: News, Blog, Research, or Other'''
prompt = PromptTemplate(
input_variables=["text"],
template="Classify the following text into one of the categories: News, Blog, Research, or Other.\n\nText:{text}\n\nCategory:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
classification = llm.invoke([message]).content.strip()
return {"classification": classification}
2. Nodo de extracción de entidad
def entity_extraction_node(state: State):
'''Extract all the entities (Person, Organization, Location) from the text'''
prompt = PromptTemplate(
input_variables=["text"],
template="Extract all the entities (Person, Organization, Location) from the following text. Provide the result as a comma-separated list.\n\nText:{text}\n\nEntities:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
entities = llm.invoke([message]).content.strip().split(", ")
return {"entities": entities}
3. Nodo de resumen
def summarization_node(state: State):
'''Summarize the text in one short sentence'''
prompt = PromptTemplate(
input_variables=["text"],
template="Summarize the following text in one short sentence.\n\nText:{text}\n\nSummary:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
summary = llm.invoke([message]).content.strip()
return {"summary": summary}
Reuniendo todo
Ahora viene la parte más emocionante: conectar estas capacidades en un sistema coordinado que usa Langgraph:
Mira el Códigos completos aquí
# Create our StateGraph
workflow = StateGraph(State)
# Add nodes to the graph
workflow.add_node("classification_node", classification_node)
workflow.add_node("entity_extraction", entity_extraction_node)
workflow.add_node("summarization", summarization_node)
# Add edges to the graph
workflow.set_entry_point("classification_node") # Set the entry point of the graph
workflow.add_edge("classification_node", "entity_extraction")
workflow.add_edge("entity_extraction", "summarization")
workflow.add_edge("summarization", END)
# Compile the graph
app = workflow.compile()
Estructura del flujo de trabajo: Nuestra tubería sigue este camino:
clasificación_node → entity_extraction → resumen → final
Prueba de nuestro agente
Ahora que hemos construido nuestro agente, veamos cómo funciona con un ejemplo de texto del mundo real:
Mira el Códigos completos aquí
sample_text = """ OpenAI has announced the GPT-4 model, which is a large multimodal model that exhibits human-level performance on various professional benchmarks. It is developed to improve the alignment and safety of AI systems. Additionally, the model is designed to be more efficient and scalable than its predecessor, GPT-3. The GPT-4 model is expected to be released in the coming months and will be available to the public for research and development purposes. """
state_input = {"text": sample_text}
result = app.invoke(state_input)
print("Classification:", result["classification"])
print("\nEntities:", result["entities"])
print("\nSummary:", result["summary"])
Classification: News Entities: ['OpenAI', 'GPT-4', 'GPT-3'] Summary: OpenAI's upcoming GPT-4 model is a multimodal AI that aims for human-level performance and improved safety, efficiency, and scalability compared to GPT-3.
Comprender el poder del procesamiento coordinado
Lo que hace que este resultado sea particularmente impresionante no es solo las salidas individuales, así es como cada paso se basa en los demás para crear una comprensión completa del texto.
- El clasificación Proporciona un contexto que ayuda a enmarcar nuestra comprensión del tipo de texto
- El extracción de entidad identifica nombres y conceptos importantes
- El resumen destila la esencia del documento
Esto refleja la comprensión de la lectura humana, donde naturalmente formamos una comprensión de qué tipo de texto es, anote nombres y conceptos importantes, y forme un resumen mental, todo mientras mantenemos las relaciones entre estos diferentes aspectos de la comprensión.
Prueba con tu propio texto
Ahora probemos nuestra tubería con otra muestra de texto:
Mira el Códigos completos aquí
# Replace this with your own text to analyze your_text = """ The recent advancements in quantum computing have opened new possibilities for cryptography and data security. Researchers at MIT and Google have demonstrated quantum algorithms that could potentially break current encryption methods. However, they are also developing new quantum-resistant encryption techniques to protect data in the future. """
# Process the text through our pipeline your_result = app.invoke({"text": your_text}) print("Classification:", your_result["classification"])
print("\nEntities:", your_result["entities"])
print("\nSummary:", your_result["summary"])
Classification: Research Entities: ['MIT', 'Google'] Summary: Recent advancements in quantum computing may threaten current encryption methods while also prompting the development of new quantum-resistant techniques.
Agregar más capacidades (avanzado)
Uno de los poderosos aspectos de Langgraph es la facilidad con que podemos extender a nuestro agente con nuevas capacidades. Agreguemos un nodo de análisis de sentimientos a nuestra tubería:
Mira el Códigos completos aquí
# First, let's update our State to include sentiment
class EnhancedState(TypedDict):
text: str
classification: str
entities: List[str]
summary: str
sentiment: str
# Create our sentiment analysis node
def sentiment_node(state: EnhancedState):
'''Analyze the sentiment of the text: Positive, Negative, or Neutral'''
prompt = PromptTemplate(
input_variables=["text"],
template="Analyze the sentiment of the following text. Is it Positive, Negative, or Neutral?\n\nText:{text}\n\nSentiment:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
sentiment = llm.invoke([message]).content.strip()
return {"sentiment": sentiment}
# Create a new workflow with the enhanced state
enhanced_workflow = StateGraph(EnhancedState)
# Add the existing nodes
enhanced_workflow.add_node("classification_node", classification_node)
enhanced_workflow.add_node("entity_extraction", entity_extraction_node)
enhanced_workflow.add_node("summarization", summarization_node)
# Add our new sentiment node
enhanced_workflow.add_node("sentiment_analysis", sentiment_node)
# Create a more complex workflow with branches
enhanced_workflow.set_entry_point("classification_node")
enhanced_workflow.add_edge("classification_node", "entity_extraction")
enhanced_workflow.add_edge("entity_extraction", "summarization")
enhanced_workflow.add_edge("summarization", "sentiment_analysis")
enhanced_workflow.add_edge("sentiment_analysis", END)
# Compile the enhanced graph
enhanced_app = enhanced_workflow.compile()
Prueba del agente mejorado
# Try the enhanced pipeline with the same text
enhanced_result = enhanced_app.invoke({"text": sample_text})
print("Classification:", enhanced_result["classification"])
print("\nEntities:", enhanced_result["entities"])
print("\nSummary:", enhanced_result["summary"])
print("\nSentiment:", enhanced_result["sentiment"])
Classification: News Entities: ['OpenAI', 'GPT-4', 'GPT-3'] Summary: OpenAI's upcoming GPT-4 model is a multimodal AI that aims for human-level performance and improved safety, efficiency, and scalability compared to GPT-3. Sentiment: The sentiment of the text is Positive. It highlights the advancements and improvements of the GPT-4 model, emphasizing its human-level performance, efficiency, scalability, and the positive implications for AI alignment and safety. The anticipation of its release for public use further contributes to the positive tone.
Agregar bordes condicionales (lógica avanzada)
¿Por qué bordes condicionales?
Hasta ahora, nuestro gráfico ha seguido una ruta lineal fija: clasificación_node → entity_extraction → resumen → (sentimiento)
Pero en aplicaciones del mundo real, a menudo queremos ejecutar ciertos pasos solo si es necesario. Por ejemplo:
- Solo extraer entidades si el texto es un artículo de noticias o investigaciones
- Saltar resumen si el texto es muy corto
- Agregar procesamiento personalizado para publicaciones de blog
Langgraph lo facilita a través de bordes condicionales: compras lógicas que enrutan dinámicamente la ejecución en función de los datos en el estado actual.
Mira el Códigos completos aquí
Creación de una función de enrutamiento
# Route after classification
def route_after_classification(state: EnhancedState) -> str:
category = state["classification"].lower() # returns: "news", "blog", "research", "other"
return category in ["news", "research"]
Definir el gráfico condicional
from langgraph.graph import StateGraph, END
conditional_workflow = StateGraph(EnhancedState)
# Add nodes
conditional_workflow.add_node("classification_node", classification_node)
conditional_workflow.add_node("entity_extraction", entity_extraction_node)
conditional_workflow.add_node("summarization", summarization_node)
conditional_workflow.add_node("sentiment_analysis", sentiment_node)
# Set entry point
conditional_workflow.set_entry_point("classification_node")
# Add conditional edge
conditional_workflow.add_conditional_edges("classification_node", route_after_classification, path_map={
True: "entity_extraction",
False: "summarization"
})
# Add remaining static edges
conditional_workflow.add_edge("entity_extraction", "summarization")
conditional_workflow.add_edge("summarization", "sentiment_analysis")
conditional_workflow.add_edge("sentiment_analysis", END)
# Compile
conditional_app = conditional_workflow.compile()
Prueba de la tubería condicional
test_text = """
OpenAI released the GPT-4 model with enhanced performance on academic and professional tasks. It's seen as a major breakthrough in alignment and reasoning capabilities.
"""
result = conditional_app.invoke({"text": test_text})
print("Classification:", result["classification"])
print("Entities:", result.get("entities", "Skipped"))
print("Summary:", result["summary"])
print("Sentiment:", result["sentiment"])
Classification: News Entities: ['OpenAI', 'GPT-4'] Summary: OpenAI's GPT-4 model significantly improves performance in academic and professional tasks, marking a breakthrough in alignment and reasoning. Sentiment: The sentiment of the text is Positive. It highlights the release of the GPT-4 model as a significant advancement, emphasizing its enhanced performance and breakthrough capabilities.
Mira el Códigos completos aquí
Ahora pruébelo con un blog:
blog_text = """
Here's what I learned from a week of meditating in silence. No phones, no talking—just me, my breath, and some deep realizations.
"""
result = conditional_app.invoke({"text": blog_text})
print("Classification:", result["classification"])
print("Entities:", result.get("entities", "Skipped (not applicable)"))
print("Summary:", result["summary"])
print("Sentiment:", result["sentiment"])
Classification: Blog Entities: Skipped (not applicable) Summary: A week of silent meditation led to profound personal insights. Sentiment: The sentiment of the text is Positive. The mention of "deep realizations" and the overall reflective nature of the experience suggests a beneficial and enlightening outcome from the meditation practice.
Con bordes condicionales, nuestro agente ahora puede:
- Tomar decisiones basadas en el contexto
- Omitir pasos innecesarios
- Corre más rápido y más barato
- Comportarse con más inteligencia
Conclusión
En este tutorial, tenemos:
- Exploró los conceptos de langgraph y su enfoque basado en gráficos
- Construyó una tubería de procesamiento de texto con clasificación, extracción de entidad y resumen
- Mejoró nuestra tubería con capacidades adicionales
- Bordes condicionales introducidos para controlar dinámicamente el flujo en función de los resultados de clasificación
- Visualizó nuestro flujo de trabajo
- Probé a nuestro agente con ejemplos de texto del mundo real
Langgraph proporciona un marco poderoso para crear agentes de IA modelándolos como gráficos de capacidades. Este enfoque hace que sea fácil diseñar, modificar y extender sistemas de IA complejos.
Siguientes pasos
- Agregue más nodos para extender las capacidades de su agente
- Experimente con diferentes LLM y parámetros
- Explore las características de persistencia del estado de Langgraph para conversaciones en curso
Mira el Códigos completos aquí. Todo el crédito por esta investigación va a los investigadores de este proyecto. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín.
También te puede gustar Nvidia De origen abierto Cosmos difusión [Check it now]
Nir Diamant es un investigador de IA, desarrollador de algoritmos y especialista en Genai, con más de una década de experiencia en investigación y algoritmos de IA. Sus proyectos de código abierto han ganado millones de vistas, con más de 500k vistas mensuales y más de 50k estrellas en Github, lo que lo convierte en una voz principal en la comunidad de IA.
A través de su trabajo en Github y el boletín de Diamantai, NIR ha ayudado a millones a mejorar sus habilidades de IA con guías y tutoriales prácticos.