Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save gusdelact/ffd2ffc9453ba032c75d7704db841f3f to your computer and use it in GitHub Desktop.
Save gusdelact/ffd2ffc9453ba032c75d7704db841f3f to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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