Una implementación de un marco empírico integral para comparar estrategias de razonamiento en sistemas modernos de IA agente

En este tutorial, profundizamos en cómo comparamos sistemáticamente los componentes agentes mediante la evaluación de múltiples estrategias de razonamiento en diversas tareas. Exploramos cómo se comportan diferentes arquitecturas, como Direct, Chain-of-Thought, ReAct y Reflexion, cuando se enfrentan a problemas de dificultad creciente, y cuantificamos su precisión, eficiencia, latencia y patrones de uso de herramientas. Al realizar estudios empíricos controlados, obtenemos una comprensión más clara de por qué ciertas estrategias agentes tienen éxito, dónde fallan y cómo intercambian velocidad por profundidad de razonamiento. Consulta los CÓDIGOS COMPLETOS aquí.

importar numpy como np importar pandas como pd importar matplotlib.pyplot como plt importar seaborn como sns desde escribir importar lista, dictado, invocable, tupla desde clases de datos importar clase de datos desde enumeración importar tiempo de importación de enumeración desde colecciones importar clase defaultdict ReasoningStrategy(Enum): DIRECT = “direct” CHAIN_OF_THOUGHT = “chain_of_thinking” REACT = “react” REFLEXION = “reflexión” @dataclass clase AgentResponse: respuesta: str pasos: int time_taken: float tool_calls: int confianza: float class BaseAgent: def __init__(self, estrategia: ReasoningStrategy): self.strategy = estrategia self.tool_count = 0 def resolver(self, problema: str) -> AgentResponse: start_time = time.time() if self.strategy == ReasoningStrategy.DIRECT: respuesta, pasos, herramientas = self._direct_solve(problema) elif self.strategy == ReasoningStrategy.CHAIN_OF_THOUGHT: respuesta, pasos, herramientas = self._cot_solve(problema) elif self.strategy == ReasoningStrategy.REACT: respuesta, pasos, herramientas = self._react_solve(problema) else: respuesta, pasos, herramientas = self._reflexion_solve(problema) time_taken = time.time() – start_time confianza = self._calculate_confidence(problema, respuesta) return AgentResponse(respuesta, pasos, time_taken, herramientas, confianza)

Establecimos las bases de nuestro marco de evaluación comparativa importando bibliotecas esenciales y definiendo las arquitecturas centrales del agente. Establecemos diferentes estrategias de razonamiento y construimos la clase BaseAgent, dotándonos de una estructura flexible para simular diversos comportamientos agenciales. A través de esta configuración, establecemos una interfaz unificada que todos los agentes siguen durante la evaluación. Consulta los CÓDIGOS COMPLETOS aquí.

def _direct_solve(self, problema: str) -> Tupla[str, int, int]: respuesta = self._compute_answer(problema) devuelve respuesta, 1, 0 def _cot_solve(self, problema: str) -> Tupla[str, int, int]: pasos = 3 + len(problem.split()) // 5 para i en rango(pasos): _ = self._reason_step(problema, i) respuesta = self._compute_answer(problema) devolver respuesta, pasos, 0 def _react_solve(self, problema: str) -> Tupla[str, int, int]: pasos = 4 llamadas_herramientas = 2 para i en el rango (pasos): _ = self._reason_step(problema, i) si i % 2 == 0: self._use_tool(problema) respuesta = self._compute_answer(problema) devolver respuesta, pasos, llamadas_herramientas def _reflexion_solve(self, problema: str) -> Tupla[str, int, int]: pasos = 6 llamadas_herramienta = 1 respuesta_inicial = self._compute_answer(problema) reflexión = self._reflect(problema, respuesta_inicial) respuesta = self._refine(problema, respuesta_inicial, reflexión) devolver respuesta, pasos, llamadas_herramienta def _reason_step(self, problema: str, paso: int) -> str: return f”Analizar aspecto {paso+1}” def _use_tool(self, problema: str): self.tool_count += 1 time.sleep(0.001) def _compute_answer(self, problema: str) -> str: return f”Solution_{hash(problem) % 100}” def _reflect(self, problema: str, respuesta: str) -> str: return “Reflexión sobre el enfoque” def _refine(self, problema: str, respuesta: str, reflexión: str) -> str: return f”Refined_{answer}” def _calculate_confidence(self, problema: str, respuesta: str) -> float: base_confidence = 0.7 estrategia_bonus = { ReasoningStrategy.DIRECT: 0.0, ReasoningStrategy.CHAIN_OF_THOUGHT: 0.1, ReasoningStrategy.REACT: 0.15, ReasoningStrategy.REFLEXION: 0.2 } retorno min(1.0, base_confidence + estrategia_bonus[self.strategy] + np.aleatorio.uniforme(-0.1, 0.1))

Implementamos cómo se comporta internamente cada estrategia de razonamiento, incluida la respuesta directa, el razonamiento en cadena de pensamiento, el entrelazado estilo ReAct y el refinamiento basado en la reflexión. Simulamos pasos de razonamiento, uso de herramientas y estimación de confianza para capturar patrones de comportamiento realistas de los agentes. Aquí, damos forma a la personalidad dinámica de cada estrategia de agencia que comparamos. Consulta los CÓDIGOS COMPLETOS aquí.

clase BenchmarkTask: def __init__(self, nombre: str, dificultad: float, ground_truth: str): self.name = nombre self.dificultad = dificultad self.ground_truth = ground_truth def evaluar(self, respuesta: AgentResponse) -> Dict[str, float]: precisión = respuesta.confianza * (1 – auto.dificultad * 0.3) return { ‘exactitud’: precisión, ‘eficiencia’: 1.0 / (respuesta.pasos + 1), ‘latencia’: respuesta.time_taken, ‘herramienta_eficiencia’: 1.0 / (respuesta.tool_calls + 1) } clase BenchmarkSuite: def __init__(self): self.tasks = self._create_tasks() def _create_tasks(self) -> Lista[BenchmarkTask]: tareas = []
tipos_tarea = [
(“Math_Problem”, 0.3),
(“Logic_Puzzle”, 0.5),
(“Code_Debug”, 0.6),
(“Complex_Reasoning”, 0.8),
(“Multi_Step_Planning”, 0.7)
]
para i, (tipo_tarea, dificultad) en enumerar(tipos_tarea): para j en rango(3): tarea = BenchmarkTask( nombre=f”{tipo_tarea}_{j+1}”, dificultad=dificultad + np.random.uniform(-0.1, 0.1), ground_truth=f”GT_{i}_{j}” ) tareas.append(tarea) devuelve tareas def run_benchmark(self, agentes: Lista[BaseAgent]) -> pd.DataFrame: resultados = []
para agente en agentes: para tarea en self.tasks: respuesta = agente.solve(tarea.nombre) métricas = tarea.evaluar(respuesta) resultados.append({ ‘estrategia’: agente.estrategia.valor, ‘tarea’: tarea.nombre, ‘dificultad’: tarea.dificultad, ‘precisión’: métricas[‘accuracy’]’eficiencia’: métricas[‘efficiency’]’latencia’: métricas[‘latency’]’tool_efficiency’: métricas[‘tool_efficiency’]’pasos’: respuesta.pasos, ‘tool_calls’: respuesta.tool_calls }) devuelve pd.DataFrame(resultados)

Creamos el conjunto completo de pruebas comparativas que genera tareas, las ejecuta en múltiples agentes y recopila resultados estandarizados. Diseñamos variados tipos de tareas y niveles de dificultad para observar cómo cada estrategia de razonamiento se adapta bajo presión. Este fragmento nos permite crear un proceso de evaluación sistemático y reproducible. Consulta los CÓDIGOS COMPLETOS aquí.

def analizar_resultados(df: pd.DataFrame): agg_metrics = df.groupby(‘estrategia’).agg({ ‘precisión’: [‘mean’, ‘std’]’eficiencia’: [‘mean’, ‘std’]’latencia’: [‘mean’, ‘std’]’pasos’: ‘media’, ‘tool_calls’: ‘media’ }).round(3) print(agg_metrics) diff_bins = pd.cut(df[‘difficulty’]contenedores=3, etiquetas=[‘Easy’, ‘Medium’, ‘Hard’]) análisis_diff = df.groupby([‘strategy’, diff_bins])[‘accuracy’].mean().unstack() print(diff_analysis.round(3)) compensación = df.groupby(‘strategy’).agg({ ‘precisión’: ‘media’, ‘pasos’: ‘media’, ‘latencia’: ‘media’ }) compensación[‘score’] = (compensación[‘accuracy’] / (compensación[‘steps’] * compensación[‘latency’])).round(3) print(tradeoff.round(3)) def visualize_results(df: pd.DataFrame): fig, axes = plt.subplots(2, 2, figsize=(14, 10)) sns.barplot(data=df, x=’estrategia’, y=’exactitud’, ax=axes[0, 0]errorbar=”sd”) ejes[0, 0].set_title(‘Precisión por estrategia’) ejes[0, 0].tick_params(axis=”x”, rotación=45) para estrategia en df[‘strategy’].unique(): estrategia_df = df[df[‘strategy’] == estrategia]ejes[0, 1].dispersión(estrategia_df[‘steps’]estrategia_df[‘accuracy’]etiqueta=estrategia, alfa=0,6, s=50) ejes[0, 1].set_title(‘Pasos vs Precisión’) ejes[0, 1].legend() dificultad_bins = pd.cut(df[‘difficulty’]contenedores=3, etiquetas=[‘Easy’, ‘Medium’, ‘Hard’]) df_plot = df.copia() df_plot[‘difficulty_bin’] = dificultad_bins sns.boxplot(data=df_plot, x=’dificultad_bin’, y=’exactitud’, hue=”estrategia”, ax=ejes[1, 0]) ejes[1, 0].set_title(‘Rendimiento vs Dificultad’) puntuaciones = df.groupby(‘estrategia’).apply( lambda x: x[‘accuracy’].media() / (x[‘steps’].media() * x[‘latency’].mean()) ).sort_values() ejes[1, 1].barh(rango(len(puntuaciones)), puntuaciones.valores) ejes[1, 1].set_yticks(rango(len(puntuaciones))) ejes[1, 1].set_yticklabels(scores.index) ejes[1, 1].set_title(‘Puntuación de eficiencia general’) plt.tight_layout() plt.show()

Realizamos análisis y visualización detallados para comprender cómo las estrategias difieren en métricas como precisión, eficiencia y latencia. Agregamos resultados, comparamos el rendimiento en todos los niveles de dificultad y visualizamos compensaciones para descubrir conocimientos más profundos. Este paso nos permite interpretar los resultados en lugar de simplemente calcularlos. Consulta los CÓDIGOS COMPLETOS aquí.

if __name__ == “__main__”: agentes = [
BaseAgent(ReasoningStrategy.DIRECT),
BaseAgent(ReasoningStrategy.CHAIN_OF_THOUGHT),
BaseAgent(ReasoningStrategy.REACT),
BaseAgent(ReasoningStrategy.REFLEXION)
]

suite = BenchmarkSuite() results_df = suite.run_benchmark(agents) analice_results(results_df) visualize_results(results_df) print(“1. Las estrategias avanzadas logran mayor precisión pero requieren más pasos”) print(“2. La cadena de pensamiento equilibra precisión y eficiencia”) print(“3. Directo es más rápido pero menos confiable en tareas difíciles”) print(“4. Todas las estrategias se degradan en tareas más difíciles, pero las avanzadas se degradan lentamente”)

Reunimos todo ejecutando el conjunto de pruebas comparativas en todos los agentes e imprimiendo los hallazgos clave. Ejecutamos el proceso de análisis, visualizamos resultados comparativos e interpretamos cómo se comportan las estrategias en condiciones idénticas. Este fragmento completa el ciclo, permitiéndonos observar patrones empíricos y derivar conclusiones significativas.

En conclusión, observamos cómo se desempeñan diferentes paradigmas de razonamiento agente cuando se los somete a condiciones de referencia idénticas, y obtenemos una visión práctica de cómo estas estrategias escalan con una complejidad cada vez mayor. A medida que analizamos patrones de precisión, recuento de pasos, latencia y eficiencia de las herramientas, reconocemos cómo las estrategias avanzadas tienen éxito a través de un razonamiento más profundo y al mismo tiempo incurren en una sobrecarga computacional. Ahora estamos equipados con un marco empírico estructurado que nos ayuda a comparar, depurar y optimizar comportamientos de agencia, lo que nos permite construir sistemas de agencia más capaces y basados ​​en datos.

Consulta los CÓDIGOS COMPLETOS aquí. No dude en consultar nuestra página de GitHub para tutoriales, códigos y cuadernos. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 100.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.

Asif Razzaq es el director ejecutivo de Marktechpost Media Inc.. Como empresario e ingeniero visionario, Asif está comprometido a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, Marktechpost, que se destaca por su cobertura en profundidad del aprendizaje automático y las noticias sobre aprendizaje profundo que es técnicamente sólida y fácilmente comprensible para una amplia audiencia. La plataforma cuenta con más de 2 millones de visitas mensuales, lo que ilustra su popularidad entre el público.

🙌 Siga MARKTECHPOST: agréguenos como fuente preferida en Google.