DEV Community

Cover image for Reduce errores y costos de tokens en agentes con seleccion semantica de herramientas
Elizabeth Fuentes L for AWS Español

Posted on

Reduce errores y costos de tokens en agentes con seleccion semantica de herramientas

Cuando los agentes de IA tienen muchas herramientas similares, a menudo seleccionan la incorrecta y consumen tokens excesivos al procesar todas las descripciones de herramientas.

Este articulo demuestra como la seleccion semantica de herramientas filtra tools antes del procesamiento del agente, mejorando la precision y reduciendo costos de tokens. La demostracion utiliza Strands Agents y FAISS para filtrar 29 herramientas y quedarse con las 3 mas relevantes.

Esta demo utiliza Strands Agents. Patrones similares se pueden aplicar en LangGraph, AutoGen u otros frameworks de agentes.


Vision general de la serie

Esta es la Parte 2 de una serie sobre como detener las hallucinations en agentes de IA:

  1. RAG vs Graph-RAG — Knowledge graphs para prevenir hallucinations
  2. Seleccion semantica de herramientas (este articulo) — Filtrado de tools basado en vectores
  3. Validacion multi-agente — Deteccion de hallucinations basada en equipos
  4. AI Agent Guardrails — Aplicacion de razonamiento simbolico
  5. Runtime Guardrails — Controles autocorrectivos

Configuracion

git clone https://github.com/aws-samples/sample-why-agents-fail
cd stop-ai-agent-hallucinations/02-semantic-tools-demo
uv venv && uv pip install -r requirements.txt
Enter fullscreen mode Exit fullscreen mode

El problema dual: errores + desperdicio de tokens

Escenario del problema

Un agente de viajes con 29 herramientas similares (search_hotels, search_flights, search_hotel_reviews, etc.) recibe la consulta: "How much does Hotel Marriott cost?"

El agente puede seleccionar get_hotel_details() en lugar de get_hotel_pricing() — una seleccion incorrecta de tool. Este error consume 4,500 tokens procesando las descripciones de las 29 herramientas.

Causas raiz

  • Nombres de herramientas similares causan confusion
  • Las herramientas genericas se usan en exceso
  • Mas herramientas aumentan la probabilidad de hallucination

Contexto de investigacion

"Las hallucinations en la seleccion de herramientas aumentan con la cantidad de tools. Sistemas en produccion reportan una reduccion del 89% en tokens con seleccion semantica de herramientas."


La solucion: seleccion semantica de herramientas con FAISS

Modos de falla de agentes a escala

La investigacion identifica cinco modos criticos de falla:

  1. Errores de seleccion de funcion — Llamar a tools inexistentes
  2. Errores de parametros — Argumentos mal formados
  3. Errores de completitud — Parametros requeridos faltantes
  4. Comportamiento de bypass de tools — Generar respuestas en lugar de llamar herramientas
  5. Desbordamiento de contexto — Desperdicio de tokens al procesar todas las descripciones

Analisis costo-beneficio

  • Cada llamada al LLM envia las descripciones de las 29 herramientas
  • En un flujo de 50 pasos: 29 tools x 50 llamadas
  • Genera un desperdicio significativo de tokens y retrasos en el procesamiento

La investigacion muestra hasta un 86.4% de precision previniendo hallucinations en la seleccion de herramientas en sistemas de produccion.


Demostracion: tres enfoques

Prueba 1: Enfoque tradicional (las 29 herramientas)

from strands import Agent
# Using OpenAI-compatible interface via Strands SDK (not direct OpenAI usage)
from strands.models.openai import OpenAIModel
from enhanced_tools import ALL_TOOLS

for query, expected in TESTS:
    agent = Agent(tools=ALL_TOOLS, system_prompt=PROMPT, model=MODEL)
    tools, tokens = run_and_capture_with_tokens(agent, query)
Enter fullscreen mode Exit fullscreen mode

Resultado: ~1,557 tokens promedio por consulta con precision variable.


Prueba 2: Enfoque semantico (top-3 herramientas filtradas)

El agente recibe unicamente las 3 herramientas mas relevantes por consulta.

Construccion del indice FAISS

import faiss
from sentence_transformers import SentenceTransformer

model = SentenceTransformer('all-MiniLM-L6-v2')

def build_index(tools):
    """Build FAISS index from tool docstrings"""
    texts = [f"{t.__name__}: {t.__doc__}" for t in tools]
    embeddings = model.encode(texts)

    index = faiss.IndexFlatL2(embeddings.shape[1])
    index.add(embeddings.astype('float32'))
    return index

def search_tools(query: str, top_k: int = 3):
    """Find most relevant tools using FAISS"""
    emb = model.encode([query])
    _, indices = index.search(emb.astype('float32'), top_k)
    return [tools[i] for i in indices[0]]
Enter fullscreen mode Exit fullscreen mode

El modelo all-MiniLM-L6-v2 es ligero (22M parametros, 384 dimensiones), optimizado para similitud semantica y funciona de manera eficiente en CPUs.

Filtrado en tiempo de ejecucion

from strands import Agent
# Using OpenAI-compatible interface via Strands SDK (not direct OpenAI usage)
from strands.models.openai import OpenAIModel

for query, expected in TESTS:
    selected = search_tools(query, top_k=3)
    selected_names = [t.__name__ for t in selected]

    agent = Agent(tools=selected, system_prompt=PROMPT, model=MODEL)
    tools, tokens = run_and_capture_with_tokens(agent, query)
Enter fullscreen mode Exit fullscreen mode

Resultado: ~275 tokens promedio por consulta — una reduccion desde 1,557 tokens.

Dato clave: el agente nunca procesa las otras 26 herramientas. Estas tools permanecen en el sistema pero nunca entran en la ventana de contexto del agente.


Prueba 3: Semantico + memoria (agente unico)

Para conversaciones multi-turno en produccion, manteniendo la memoria mientras se intercambian herramientas dinamicamente.

Intercambio dinamico de herramientas

def swap_tools(agent, new_tools):
    """Swap tools in a live agent without losing conversation memory."""
    reg = agent.tool_registry
    reg.registry.clear()
    reg.dynamic_tools.clear()
    for t in new_tools:
        reg.register_tool(t)
Enter fullscreen mode Exit fullscreen mode

Implementacion completa

from strands import Agent
# Using OpenAI-compatible interface via Strands SDK (not direct OpenAI usage)
from strands.models.openai import OpenAIModel
from enhanced_tools import ALL_TOOLS
from registry import build_index, search_tools, swap_tools

initial_tools = search_tools(TESTS[0][0], top_k=3)
memory_agent = Agent(tools=initial_tools, system_prompt=PROMPT, model=MODEL)

for query, expected in TESTS:
    selected = search_tools(query, top_k=3)
    swap_tools(memory_agent, selected)
    tools, tokens = run_and_capture_with_tokens(memory_agent, query)
Enter fullscreen mode Exit fullscreen mode

Resultado: Mas tokens que el enfoque solo semantico (debido al contexto acumulado), pero significativamente menos comparado con el metodo tradicional, manteniendo el historial completo de la conversacion.

Por que funciona

Strands llama a tool_registry.get_all_tools_config() en cada ciclo del event loop, detectando automaticamente los cambios en tiempo de ejecucion.

Ventajas:

  • Cero perdida de conversacion: agent.messages se preserva entre intercambios de tools
  • No requiere recrear el agente
  • Flexibilidad en tiempo de ejecucion para necesidades dinamicas de herramientas
  • Listo para produccion en conversaciones largas

Contexto de investigacion y rendimiento en el mundo real

La demo controlada logro precision perfecta en 13 consultas. Sin embargo, los sistemas de produccion reales con cientos de herramientas y consultas ambiguas muestran resultados diferentes.

"La investigacion muestra que en sistemas de produccion con cientos de herramientas, la seleccion semantica de tools alcanza hasta un 86.4% de precision en la deteccion y prevencion de hallucinations en la seleccion de herramientas."

Esto reduce significativamente los errores comparado con los enfoques tradicionales (que caen por debajo del 50% de precision con mas de 100 tools), pero sigue siendo un desafio en dominios con semantica de herramientas superpuesta.


Siguiente paso

La seleccion semantica de herramientas reduce los errores de seleccion de tools y los costos de tokens. Sin embargo, los agentes aun pueden generar hallucinations sobre el exito de operaciones (por ejemplo, confirmar reservaciones sin procesar pagos o ignorar reglas de negocio).

Parte 3: Validacion multi-agente demuestra como equipos especializados de agentes (Executor -> Validator -> Critic) detectan hallucinations antes de que lleguen a los usuarios.

Esta capacidad esta disponible de forma nativa a traves de Amazon Bedrock Agentcore Gateway.


Puntos clave

  1. Problema dual: Errores en la seleccion de herramientas Y desperdicio de tokens
  2. Reduccion significativa de errores: Menos herramientas = menos selecciones incorrectas
  3. 89% de ahorro en tokens: Reduciendo de 29 a 3 herramientas por llamada
  4. Implementacion sencilla: ~20 lineas de codigo con FAISS
  5. Integracion con Strands: El decorador @tool y la carga dinamica permiten el filtrado semantico con intercambio de herramientas en tiempo de ejecucion

Ejecutalo tu mismo

git clone https://github.com/aws-samples/sample-why-agents-fail
cd stop-ai-agent-hallucinations/02-semantic-tools-demo
uv venv && uv pip install -r requirements.txt
uv run test_semantic_tool_selection.py
Enter fullscreen mode Exit fullscreen mode

Puedes cambiar a cualquier proveedor soportado por Strands — consulta Strands Model Providers para la configuracion.


Referencias

Investigacion

Strands Agents

Codigo


Gracias!

🇻🇪🇨🇱 Dev.to Linkedin GitHub Twitter Instagram Youtube

Top comments (0)