Created
May 9, 2025 09:09
-
-
Save gusdelact/ffd2ffc9453ba032c75d7704db841f3f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "2efb6694", | |
"metadata": {}, | |
"source": [ | |
"# Ruteo de Prompts con LangChain usando RunnableBranch" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "9362d44d", | |
"metadata": {}, | |
"source": [ | |
"Este notebook ejemplifica cómo usar **RunnableBranch** en lugar de `RunnableMap` para realizar ruteo dinámico dentro de una cadena en LangChain." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "90f423d5", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"!pip install \"langchain[aws]\"" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "6a57ed31", | |
"metadata": {}, | |
"source": [ | |
"## 1. Configuración de credenciales de AWS" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "93a96df0", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"from google.colab import userdata\n", | |
"\n", | |
"# Configuración de credenciales AWS\n", | |
"os.environ['AWS_ACCESS_KEY_ID'] = userdata.get('AWS_ACCESS_KEY_ID')\n", | |
"os.environ['AWS_SECRET_ACCESS_KEY'] = userdata.get('AWS_SECRET_ACCESS_KEY')\n", | |
"os.environ['AWS_SESSION_TOKEN'] = userdata.get('AWS_SESSION_TOKEN')\n", | |
"os.environ['AWS_DEFAULT_REGION'] = userdata.get('AWS_DEFAULT_REGION')\n", | |
"\n", | |
"# Verificación\n", | |
"for k in ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'AWS_DEFAULT_REGION']:\n", | |
" print(f\"{k}: {'Configurada' if os.environ.get(k) else 'No configurada'}\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "47dc9b28", | |
"metadata": {}, | |
"source": [ | |
"## 2. Inicialización del modelo Bedrock" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "e1d7df83", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from langchain_aws import ChatBedrock\n", | |
"\n", | |
"bedrock_llm = ChatBedrock(\n", | |
" model_id='anthropic.claude-3-haiku-20240307-v1:0',\n", | |
" model_kwargs={'temperature': 0.0}\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "7f27c9f3", | |
"metadata": {}, | |
"source": [ | |
"## 3. Prompt Templates" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "15444d53", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from langchain.prompts import PromptTemplate\n", | |
"\n", | |
"template_cliente = PromptTemplate.from_template(\n", | |
" 'Eres un asistente que resuelve dudas básicas de clientes de autos. Pregunta: {input}'\n", | |
")\n", | |
"\n", | |
"template_mecanico = PromptTemplate.from_template(\n", | |
" 'Eres un experto en mecánica automotriz. Pregunta técnica: {input}'\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "a231ccfd", | |
"metadata": {}, | |
"source": [ | |
"## 4. Router Prompt para clasificación" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "cf8cbbcc", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"router_prompt = PromptTemplate.from_template(\n", | |
" '''Determina si la consulta es para 'cliente' o 'mecanico'.\n", | |
"Solo responde con una de estas palabras: cliente o mecanico.\n", | |
"Consulta: {input}'''\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "79352202", | |
"metadata": {}, | |
"source": [ | |
"## 5. Construcción de la Chain usando RunnableBranch" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "f2ed0b5d", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from langchain_core.runnables import RunnableLambda, RunnableBranch\n", | |
"\n", | |
"# Crear subchains para cada ruta\n", | |
"chain_cliente = template_cliente | bedrock_llm\n", | |
"chain_mecanico = template_mecanico | bedrock_llm\n", | |
"\n", | |
"# Router que clasifica la consulta\n", | |
"router_chain = router_prompt | bedrock_llm | RunnableLambda(lambda x: x.strip().lower())\n", | |
"\n", | |
"# Condiciones para RunnableBranch\n", | |
"def is_mecanico(input):\n", | |
" return router_chain.invoke({'input': input}) == 'mecanico'\n", | |
"\n", | |
"# Composición con RunnableBranch\n", | |
"ruteo_branch_chain = RunnableBranch(\n", | |
" (lambda x: is_mecanico(x['input']), chain_mecanico),\n", | |
" chain_cliente # default\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "cf30b094", | |
"metadata": {}, | |
"source": [ | |
"## 6. Prueba del sistema de ruteo" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "a5309718", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"pregunta_1 = {'input': '¿Cómo puedo revisar la presión de mis llantas?'}\n", | |
"pregunta_2 = {'input': '¿Cuál es la secuencia de encendido en un motor V8?'}\n", | |
"\n", | |
"print('--- Respuesta Pregunta 1 ---')\n", | |
"print(ruteo_branch_chain.invoke(pregunta_1))\n", | |
"\n", | |
"print('\\n--- Respuesta Pregunta 2 ---')\n", | |
"print(ruteo_branch_chain.invoke(pregunta_2))" | |
] | |
} | |
], | |
"metadata": {}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment