Puntos clave
- La nueva API de reacciones para canales de Slack facilita la creación de estados de carga y recibos para Managed Deep Agents utilizando tanto heurísticas simples como modelos de decisión, como Jev.
- Este nuevo SDK ayuda a crear interfaces amigables para el usuario y estados de carga para los usuarios que interactúan con los agentes.
- Veamos cómo utilizamos este pensamiento de diseño con nuestros propios agentes internos y usuarios que no son desarrolladores.
Los estados de carga son uno de los aspectos del diseño más subestimados (y olvidados) al crear experiencias de usuario efectivas para agentes.
En nuestra experiencia, los usuarios confían en los agentes cuando tienen visibilidad sobre lo que estos agentes realmente están haciendo. Este comportamiento se manifiesta más en forma de UI skeuomórfica, un concepto de diseño en el que los objetos digitales imitan las contrapartes del mundo real. El visionario Domino’s Pizza Tracker es uno de los ejemplos más destacados de diseño skeuomórfico que se puede aplicar a los agentes. Hoy en día, los estados de carga digital (incluso aquellos que pueden engañarte) son cruciales para hacer cualquier experiencia de usuario comprensible y efectiva. El nuevo SDK de reacciones de agente para Managed Deep Agents es una herramienta excelente para crear interfaces agradables y estados de carga para los usuarios que interactúan con tus agentes.
Atributo de reacciones nuevas en los Agentes Profundos Gestionados
En v0.9, Managed Deep Agents incluye una nueva API para gestionar reacciones de los agentes distribuidos, y un sistema para asignar dinámicamente respuestas de emoji con su instrumento preferido, como modelos de decisión, modelos fronterizos o las antiguas sentencias if.
El atributo new reactions para canales de Slack acepta ya sea una cadena que representa un emoji o un llamador que devuelve uno.
from managed_deepagents import channels
async def choose_emoji(context: dict) -> str:
return "bug" if "broken" in context["text"].lower() else "eyes"
channel = channels.slack(name="Support Bot", reactions=choose_emoji)En este ejemplo, usamos 👀 por defecto, pero el análisis estático asignará un 🐛 si el mensaje contiene la palabra “broken”.
Que los desarrolladores de LangChain puedan adoptar patrones comunes de satisfacción del usuario en los estados de carga y en los patrones de espera, ya que muchas tareas de agente pueden ejecutarse durante largos períodos de tiempo. Los usuarios finales que interactúan con agentes necesitan que se les reconozca que la tarea ha sido recibida.
Por ejemplo, recientemente lanzamos un agente de marketing interno para crear contenido en video. Mientras esperamos que el agente responda, es útil que los usuarios entiendan el progreso del agente.
Aquí hay un ejemplo del tipo de contenido de video y gráficos de movimiento que nuestro agente puede crear:
https://x.com/ndrezn/status/2104962135730061688?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E2104962135730061688%7Ctwgr%5E3fb82affc6e194f89989fadec1e2161b853b60b3%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fapp.notion.com%2Fp%2FBuild-great-out-of-the-box-user-experiences-with-Managed-Deepagents-3ed808527b178002bda9fc42f4db7213A menudo no es suficiente simplemente responder a un mensaje con un único emoji. También necesitamos que los agentes le expliquen al usuario cómo interpretó la tarea, y la respuesta contextual puede ser una parte clave del diseño de su agente.
Vamos a seguir con el ejemplo de la reacción básica. Podemos tener un modelo de decisión, como Jev, que selecciona entre un conjunto de vocabulario de emojis basado en el contexto de entrada. Jev admite hasta 255 opciones, pero se podría construir una matriz de decisión con múltiples preguntas (por ejemplo, agrupando los emojis en categorías y pidiendo a Jev que elija una categoría, luego un emoji) para consultar más emojis:
from functools import lru_cache
from langchain_typesafe import Choice, TypeSafeClassifier
from managed_deepagents import channels
# The description is what the model matches on, so describe the situation
# rather than the picture. Keep an option for anything unremarkable.
VOCABULARY = Choice(
instructions="Which emoji best acknowledges this message?",
criteria={
"bug": "A defect or incorrect behaviour.",
"rotating_light": "A declared incident or outage.",
"mag": "A code review, pull request, or diff to look at.",
"hourglass": "Waiting on someone or something else; blocked.",
"speech_balloon": "A question, or a request to explain something.",
"wave": "A greeting or hello.",
"eyes": "Anything that does not clearly fit another option.",
},
)
@lru_cache(maxsize=1)
def classifier() -> TypeSafeClassifier:
return TypeSafeClassifier(model="typesafe/jev-latest")
async def choose_emoji(context: dict) -> str:
answer = await classifier().ainvoke(
{"state": context["text"][:2000], "questions": {"emoji": VOCABULARY}}
)
emoji = answer.choices["emoji"]
# Below this the model has no real view, so prefer a generic reaction.
return emoji.choice if emoji.confidence >= 0.25 else "eyes"
channel = channels.slack(name="Support Bot", reactions=choose_emoji)En este ejemplo, estamos utilizando la nueva TypeSafe Classifier que forma parte del toolkit de LangChain. Es una gran manera de interactuar con modelos de decisión compatibles con TypeSafe, como Jev, pero también es posible usar otros modelos de decisión con los mismos endpoints, como SemIf, alojado en LangSmith LLM Gateway. O bien, se puede cambiar entre modelos para experimentar con la mejor opción.
El mismo emoji puede significar cosas opuestas dependiendo de lo que haga el agente. Por ejemplo, 🔥 para un agente en turno podría significar que la producción está en marcha y hay que despertarse. 🔥 para un agente de crecimiento podría significar que la campaña está funcionando y se puede volver a dormir. Por esta razón, las descripciones criteria realizan más trabajo que los nombres de los emojis. El modelo coincide con la descripción que usted da de la situación, por lo que el mismo glifo puede tener cualquier significado que su espacio de trabajo le haya asignado.
El ejemplo anterior también muestra cómo aprovechar los umbrales de confianza. Si el modelo de decisión tiene menos del 25% de confianza en su elección principal, recurriremos a 👀. También podrías optar por no reaccionar si ninguno de los emojis que has proporcionado en el vocabulario es adecuado.
Podría argumentarse que hay deshonestidad en este diseño: ya que un modelo diferente evalúa las respuestas de reacción en comparación con el modelo que responde, podrían existir diferencias sutiles en la interpretación. Por esta razón, es importante escribir descripciones efectivas sobre cómo se espera que cada reacción sea utilizada. Un modelo de puntuación puede tener un índice excesivo en ciertas respuestas de reacción si su descripción es demasiado genérica, incluso si una reacción diferente no se sobreajustaría a un ojo no entrenado.
Puede agregar emojis personalizados a su vocabulario mediante el código corto de Slack. Para nuestro agente de contenido interno, el equipo de IA aplicado creó un conjunto de emojis personalizados que el agente puede utilizar en las respuestas. Me gusta el lc-no-em-dash, que el agente elige cuando se le indica que debe escribir contenido:

Prueba diferentes enfoques. Diferentes descripciones para los emojis (o diferentes maneras de estructurar completamente tu vocabulario) llevarán a resultados distintos. De manera similar, expande o contrae el conjunto de emojis que un agente tiene a su disposición.
Los Agentes Profundos Gestionados están diseñados para aprovechar todas las sutiles interfaces de diseño que consideramos cruciales para la adopción de los agentes, a través de APIs simples y expresivas. Comience a agregar reacciones para sus Agentes Profundos Gestionados existentes utilizando nuestra documentación. O, si aún no ha creado un agente profundo gestionado, el mejor lugar para comenzar es nuestro quickstart.
