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:
- RAG vs Graph-RAG — Knowledge graphs para prevenir hallucinations
- Seleccion semantica de herramientas (este articulo) — Filtrado de tools basado en vectores
- Validacion multi-agente — Deteccion de hallucinations basada en equipos
- AI Agent Guardrails — Aplicacion de razonamiento simbolico
- 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
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:
- Errores de seleccion de funcion — Llamar a tools inexistentes
- Errores de parametros — Argumentos mal formados
- Errores de completitud — Parametros requeridos faltantes
- Comportamiento de bypass de tools — Generar respuestas en lugar de llamar herramientas
- 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)
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]]
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)
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)
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)
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.messagesse 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
- Problema dual: Errores en la seleccion de herramientas Y desperdicio de tokens
- Reduccion significativa de errores: Menos herramientas = menos selecciones incorrectas
- 89% de ahorro en tokens: Reduciendo de 29 a 3 herramientas por llamada
- Implementacion sencilla: ~20 lineas de codigo con FAISS
-
Integracion con Strands: El decorador
@tooly 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
Puedes cambiar a cualquier proveedor soportado por Strands — consulta Strands Model Providers para la configuracion.
Referencias
Investigacion
- Internal Representations as Indicators of Hallucinations
- Solving Context Window Overflow — Reduccion de tokens 7x
- Semantic Tool Selection in Practice — Reduccion del 89%
Strands Agents
Codigo
Gracias!
Top comments (0)