|
1 | 1 | # Demos de Python con OpenAI |
2 | 2 |
|
3 | | -Este repositorio contiene una colección de scripts en Python que demuestran cómo usar la API de OpenAI para generar completados de chat. |
| 3 | +Este repositorio contiene una colección de scripts en Python que demuestran cómo usar la API de OpenAI (y modelos compatibles) para generar completados de chat. |
4 | 4 |
|
5 | | -## Librería OpenAI |
| 5 | +* [Ejemplos](#ejemplos) |
| 6 | + * [Completados de chat de OpenAI](#completados-de-chat-de-openai) |
| 7 | + * [Llamadas a funciones (Function calling)](#llamadas-a-funciones-function-calling) |
| 8 | + * [Generación aumentada con recuperación (RAG)](#generación-aumentada-con-recuperación-rag) |
| 9 | + * [Salidas estructuradas](#salidas-estructuradas) |
| 10 | +* [Configuración del entorno de Python](#configuración-del-entorno-de-python) |
| 11 | +* [Configurando las variables de entorno de OpenAI](#configurando-las-variables-de-entorno-de-openai) |
| 12 | + * [Usando modelos de GitHub](#usando-modelos-de-github) |
| 13 | + * [Usando Azure OpenAI](#usando-azure-openai) |
| 14 | + * [Usando OpenAI.com](#usando-openaicom) |
| 15 | + * [Usando modelos de Ollama](#usando-modelos-de-ollama) |
| 16 | +* [Recursos](#recursos) |
6 | 17 |
|
7 | | -Estos scripts demuestran como usar la libreria de OpenAI. En orden creciente de complejidad, los scripts son: |
| 18 | +## Ejemplos |
8 | 19 |
|
9 | | -1. [`chat.py`](./chat.py): Un script simple que demuestra cómo usar la API de OpenAI para generar completados de chat. |
10 | | -2. [`chat_stream.py`](./chat_stream.py): Añade `stream=True` a la llamada de API para devolver un generador que transmite el completado mientras se está generando. |
11 | | -3. [`chat_history.py`](./chat_history.py): Añade una interfaz de chat bidireccional usando `input()` que mantiene un registro de los mensajes anteriores y los envía con cada llamada de completado de chat. |
12 | | -4. [`chat_history_stream.py`](./chat_history_stream.py): La misma idea, pero con `stream=True` habilitado. |
| 20 | +### Completados de chat de OpenAI |
13 | 21 |
|
14 | | -Además de estos scripts para demostrar características adicionales: |
| 22 | +Estos scripts usan el paquete `openai` de Python para demostrar cómo utilizar la API de Chat Completions. En orden creciente de complejidad: |
15 | 23 |
|
16 | | -* [`chat_safety.py`](./chat_safety.py): El script simple con manejo de excepciones para errores de filtro de Seguridad de Contenido de Azure AI. |
17 | | -* [`chat_async.py`](./chat_async.py): Utiliza los clientes asíncronos para hacer llamadas asincrónicas, incluyendo un ejemplo de envío de múltiples solicitudes a la vez usando `asyncio.gather`. |
| 24 | +1. [`chat.py`](../chat.py): Script simple que muestra cómo generar un completado de chat. |
| 25 | +2. [`chat_stream.py`](../chat_stream.py): Añade `stream=True` para recibir el completado progresivamente. |
| 26 | +3. [`chat_history.py`](../chat_history.py): Añade un chat bidireccional que conserva el historial y lo reenvía en cada llamada. |
| 27 | +4. [`chat_history_stream.py`](../chat_history_stream.py): Igual que el anterior pero además con `stream=True`. |
18 | 28 |
|
19 | | -## Generación Aumentada con Recuperación (RAG) |
| 29 | +Scripts adicionales de características: |
20 | 30 |
|
21 | | -Estos scripts demuestran cómo usar la API de OpenAI para tareas de Generación Aumentada con Recuperación (RAG), donde el modelo recupera información relevante de una fuente y la utiliza para generar una respuesta. |
| 31 | +* [`chat_safety.py`](../chat_safety.py): Manejo de excepciones para filtros de seguridad de contenido (Azure AI Content Safety). |
| 32 | +* [`chat_async.py`](../chat_async.py): Uso de clientes asíncronos y envío concurrente de múltiples solicitudes con `asyncio.gather`. |
22 | 33 |
|
23 | | -Primero instala las dependencias de RAG: |
| 34 | +### Llamadas a funciones (Function calling) |
| 35 | + |
| 36 | +Estos scripts muestran cómo usar la característica "tools" (function calling) de la API de Chat Completions. Permite que el modelo decida si invoca funciones definidas por el desarrollador y devolver argumentos estructurados en lugar (o antes) de una respuesta en lenguaje natural. |
| 37 | + |
| 38 | +En todos los ejemplos se declara una lista de funciones en el parámetro `tools`. El modelo puede responder con `message.tool_calls` que contiene una o más llamadas. Cada llamada incluye el `name` de la función y una cadena JSON con `arguments` que respetan el esquema declarado. Tu aplicación debe: (1) detectar las llamadas, (2) ejecutar la lógica local/externa correspondiente y (3) (opcionalmente) enviar el resultado de la herramienta de vuelta al modelo para una respuesta final. |
| 39 | + |
| 40 | +Scripts (en orden de capacidad): |
| 41 | + |
| 42 | +1. [`function_calling_basic.py`](../function_calling_basic.py): Declara una sola función `lookup_weather` y muestra la llamada (si existe) o el contenido normal. |
| 43 | +2. [`function_calling_call.py`](../function_calling_call.py): Ejecuta `lookup_weather` si el modelo la solicita, parseando los argumentos JSON. |
| 44 | +3. [`function_calling_extended.py`](../function_calling_extended.py): Hace el ciclo completo: tras ejecutar la función, añade un mensaje de rol `tool` con el resultado y vuelve a consultar al modelo para incorporar los datos reales. |
| 45 | +4. [`function_calling_multiple.py`](../function_calling_multiple.py): Expone múltiples funciones (`lookup_weather`, `lookup_movies`) para observar cómo el modelo elige y cómo podrían devolverse múltiples llamadas. |
| 46 | + |
| 47 | +Debe usarse un modelo que soporte function calling (por ejemplo, `gpt-4o`, `gpt-4o-mini`, etc.). Algunos modelos locales o antiguos no soportan `tools`. |
| 48 | + |
| 49 | +### Generación aumentada con recuperación (RAG) |
| 50 | + |
| 51 | +Scripts que muestran cómo realizar tareas de RAG, donde el modelo recupera información relevante y la utiliza para generar la respuesta. |
| 52 | + |
| 53 | +Primero instala las dependencias específicas: |
24 | 54 |
|
25 | 55 | ```bash |
26 | 56 | python -m pip install -r requirements-rag.txt |
27 | 57 | ``` |
28 | 58 |
|
29 | | -Luego ejecuta los scripts (en orden de complejidad creciente): |
| 59 | +Luego ejecuta (en orden de complejidad): |
| 60 | + |
| 61 | +* [`rag_csv.py`](../rag_csv.py): Recupera filas coincidentes de un CSV y las usa para responder. |
| 62 | +* [`rag_multiturn.py`](../rag_multiturn.py): Igual, pero con chat multi‑turno y preservación de historial. |
| 63 | +* [`rag_queryrewrite.py`](../rag_queryrewrite.py): Añade reescritura de la consulta del usuario para mejorar la recuperación. |
| 64 | +* [`rag_documents_ingestion.py`](../rag_documents_ingestion.py): Ingeste de PDFs: convierte a Markdown (pymupdf), divide en fragmentos (LangChain), genera embeddings (OpenAI) y guarda en un JSON local. |
| 65 | +* [`rag_documents_flow.py`](../rag_documents_flow.py): Flujo RAG que consulta el JSON creado anteriormente. |
| 66 | +* [`rag_documents_hybrid.py`](../rag_documents_hybrid.py): Recuperación híbrida (vector + keywords), fusión con RRF y re‑ranking semántico con un modelo cross‑encoder. |
30 | 67 |
|
31 | | -* [`rag_csv.py`](./rag.py): Recupera resultados coincidentes de un archivo CSV y los utiliza para responder a la pregunta del usuario. |
32 | | -* [`rag_multiturn.py`](./rag_multiturn.py): La misma idea, pero con una interfaz de chat bidireccional usando `input()` que mantiene un registro de mensajes anteriores y los envía con cada llamada de completado de chat.them with each chat completion call. |
33 | | -* [`rag_queryrewrite.py`](./rag_queryrewrite.py): Añade un paso de reescritura de consulta al proceso RAG, donde la pregunta del usuario se reescribe para mejorar los resultados de recuperación. |
34 | | -* [`rag_documents_ingestion.py`](./rag_ingestion.py): Ingesta PDFs usando pymupdf para convertirlos a markdown, luego usa Langchain para dividirlos en fragmentos, después usa OpenAI para incrustar los fragmentos, y finalmente los almacena en un archivo JSON local. |
35 | | -* [`rag_documents_flow.py`](./rag_pdfs.py): Un flujo RAG que recupera resultados coincidentes del archivo JSON local creado por `rag_documents_ingestion.py`. |
36 | | -* [`rag_documents_hybrid.py`](./rag_documents_hybrid.py): Un flujo RAG que implementa una recuperación híbrida con búsqueda vectorial y por palabras clave, fusionando con Reciprocal Rank Fusion (RRF), y reclasificación semántica con un modelo cross-encoder. |
| 68 | +### Salidas estructuradas |
37 | 69 |
|
38 | | -## Salidas estructuradas con OpenAI |
| 70 | +Estos scripts muestran cómo generar respuestas estructuradas usando modelos Pydantic: |
39 | 71 |
|
40 | | -Estos scripts muestran cómo usar la API de OpenAI para generar respuestas estructuradas usando modelos de datos con Pydantic: |
| 72 | +* [`structured_outputs_basic.py`](../structured_outputs_basic.py): Extrae información simple de un evento. |
| 73 | +* [`structured_outputs_description.py`](../structured_outputs_description.py): Añade descripciones en campos para guiar el formato. |
| 74 | +* [`structured_outputs_enum.py`](../structured_outputs_enum.py): Usa enumeraciones para restringir valores. |
| 75 | +* [`structured_outputs_function_calling.py`](../structured_outputs_function_calling.py): Usa funciones definidas con Pydantic para llamadas automáticas. |
| 76 | +* [`structured_outputs_nested.py`](../structured_outputs_nested.py): Modelos anidados para estructuras más complejas (por ejemplo, eventos con participantes detallados). |
41 | 77 |
|
42 | | -* [`structured_outputs_basic.py`](./structured_outputs_basic.py): Ejemplo básico que extrae información sencilla de un evento usando un modelo Pydantic. |
43 | | -* [`structured_outputs_description.py`](./structured_outputs_description.py): Usa descripciones adicionales en los campos del modelo Pydantic para aclararle al modelo cómo formatear la respuesta. |
44 | | -* [`structured_outputs_enum.py`](./structured_outputs_enum.py): Usa enumeraciones (Enums) para restringir los valores posibles en la respuesta estructurada. |
45 | | -* [`structured_outputs_function_calling.py`](./structured_outputs_function_calling.py): Muestra cómo usar funciones definidas con Pydantic para que el modelo las llame automáticamente según la consulta del usuario. |
46 | | -* [`structured_outputs_nested.py`](./structured_outputs_nested.py): Usa modelos anidados con Pydantic para manejar respuestas estructuradas más complejas, como eventos con participantes que tienen múltiples atributos. |
| 78 | +## Configuración del entorno de Python |
47 | 79 |
|
| 80 | +Si abres el repositorio en un Dev Container o GitHub Codespaces, todo estará ya listo. Si no, sigue: |
48 | 81 |
|
| 82 | +1. Crea y activa un entorno virtual de Python. |
| 83 | +2. Instala dependencias base: |
49 | 84 |
|
50 | | -## Configuración del entorno |
| 85 | +```bash |
| 86 | +python -m pip install -r requirements.txt |
| 87 | +``` |
51 | 88 |
|
52 | | -Si abres esto en un Dev Container o GitHub Codespaces, todo estará configurado para ti. |
53 | | -Si no, sigue estos pasos: |
| 89 | +## Configurando las variables de entorno de OpenAI |
54 | 90 |
|
55 | | -1. Configura un entorno virtual de Python y actívalo. |
| 91 | +Los scripts pueden ejecutarse con Azure OpenAI, OpenAI.com, Ollama (local) o GitHub Models, según lo que configures en el archivo `.env`. Existe un `.env.sample` como plantilla. |
56 | 92 |
|
57 | | -2. Instala las librerías requeridas: |
| 93 | +1. Copia la plantilla: |
58 | 94 |
|
59 | 95 | ```bash |
60 | | -python -m pip install -r requirements.txt |
| 96 | +cp .env.sample .env |
61 | 97 | ``` |
62 | 98 |
|
63 | | -## Configurando las variables de entorno de OpenAI |
| 99 | +Luego ajusta según el proveedor elegido. |
| 100 | + |
| 101 | +### Usando modelos de GitHub |
| 102 | + |
| 103 | +En GitHub Codespaces el `GITHUB_TOKEN` ya está disponible y puedes usar gratis GitHub Models. |
| 104 | + |
| 105 | +Para uso local crea un [PAT de GitHub](https://github.com/settings/tokens) (sin scopes especiales) y expórtalo: |
64 | 106 |
|
65 | | -Estos scripts pueden ejecutarse con una cuenta de Azure OpenAI, OpenAI.com, servidor local de Ollama o modelos de GitHub, dependiendo de las variables de entorno que configures. |
| 107 | +```bash |
| 108 | +export GITHUB_TOKEN=TU_TOKEN |
| 109 | +``` |
| 110 | + |
| 111 | +Opcional: cambia de modelo (por defecto `gpt-4o`) definiendo `GITHUB_MODEL` (por ejemplo `gpt-4o-mini`): |
66 | 112 |
|
67 | | -1. Copia el archivo `.env.sample` a un nuevo archivo llamado `.env`: |
| 113 | +```bash |
| 114 | +API_HOST=github |
| 115 | +GITHUB_MODEL=gpt-4o |
| 116 | +``` |
| 117 | + |
| 118 | +### Usando Azure OpenAI |
| 119 | + |
| 120 | +Provisiona los recursos y despliegues (por ejemplo con Azure Developer CLI) de modelos como `gpt-4o` y un modelo de embeddings. |
| 121 | + |
| 122 | +```bash |
| 123 | +API_HOST=azure |
| 124 | +AZURE_OPENAI_ENDPOINT=https://TU-SERVICIO.openai.azure.com/openai/v1 |
| 125 | +AZURE_OPENAI_CHAT_DEPLOYMENT=TU-DEPLOYMENT-CHAT |
| 126 | +AZURE_OPENAI_VERSION=2024-03-01-preview |
| 127 | +``` |
68 | 128 |
|
69 | | - ```bash |
70 | | - cp .env.sample .env |
71 | | - ``` |
| 129 | +Inicia sesión si no lo has hecho: |
72 | 130 |
|
73 | | -2. Para Azure OpenAI, crea un deployment de Azure OpenAI gpt-3.5 o gpt-4 (quizás usando [este template](https://github.com/Azure-Samples/azure-openai-keyless)), and actualiza el `.env` con tu Azure OpenAI endpoint y deployment id. |
| 131 | +```bash |
| 132 | +az login |
| 133 | +``` |
74 | 134 |
|
75 | | - ```bash |
76 | | - API_HOST=azure |
77 | | - AZURE_OPENAI_ENDPOINT=https://YOUR-AZURE-OPENAI-SERVICE-NAME.openai.azure.com/openai/v1 |
78 | | - AZURE_OPENAI_CHAT_DEPLOYMENT=YOUR-AZURE-DEPLOYMENT-NAME |
79 | | - AZURE_OPENAI_VERSION=2024-03-01-preview |
80 | | - ``` |
| 135 | +### Usando OpenAI.com |
81 | 136 |
|
82 | | - Si aún no has iniciado sesión en la cuenta de Azure asociada con ese deployment, ejecuta este comando para iniciar sesión: |
| 137 | +Configura tu clave y modelo: |
83 | 138 |
|
84 | | - ```shell |
85 | | - az login |
86 | | - ``` |
87 | | -3. Para OpenAI.com, actualiza el archivo `.env` con tu clave API de OpenAI y el nombre del modelo deseado. |
| 139 | +```bash |
| 140 | +API_HOST=openai |
| 141 | +OPENAI_API_KEY=TU-CLAVE-OPENAI |
| 142 | +OPENAI_MODEL=gpt-4o-mini |
| 143 | +``` |
88 | 144 |
|
89 | | - ```bash |
90 | | - API_HOST=openai |
91 | | - OPENAI_KEY=TU-CLAVE-API-OPENAI |
92 | | - OPENAI_MODEL=gpt-3.5-turbo |
93 | | - ``` |
| 145 | +### Usando modelos de Ollama |
94 | 146 |
|
95 | | -4. Para Ollama, actualiza el archivo [.env](http://_vscodecontentref_/0) con tu endpoint de Ollama y nombre del modelo (cualquier modelo que hayas descargado). |
| 147 | +Instala [Ollama](https://ollama.com/) y descarga un modelo: |
96 | 148 |
|
97 | | - ```bash |
98 | | - API_HOST=ollama |
99 | | - OLLAMA_ENDPOINT=http://localhost:11434/v1 |
100 | | - OLLAMA_MODEL=llama2 |
101 | | - ``` |
| 149 | +```bash |
| 150 | +ollama pull llama3.1 |
| 151 | +``` |
102 | 152 |
|
103 | | - Si estás ejecutando dentro del Dev Container, reemplaza `localhost` con `host.docker.internal`. |
| 153 | +Configura tu `.env`: |
104 | 154 |
|
105 | | -5. Para GitHub Models, actualiza el archivo [.env](http://_vscodecontentref_/1) con el nombre de tu GitHub Model. |
| 155 | +```bash |
| 156 | +API_HOST=ollama |
| 157 | +OLLAMA_ENDPOINT=http://localhost:11434/v1 |
| 158 | +OLLAMA_MODEL=llama3.1 |
| 159 | +``` |
106 | 160 |
|
107 | | - ```bash |
108 | | - API_HOST=github |
109 | | - GITHUB_MODEL=gpt-4o |
110 | | - ``` |
| 161 | +Si ejecutas dentro de un Dev Container, reemplaza `localhost` por `host.docker.internal`. |
111 | 162 |
|
112 | | - Necesitarás una variable de entorno `GITHUB_TOKEN` que almacene un token de acceso personal de GitHub. |
113 | | - Si estás ejecutando esto dentro de un GitHub Codespace, el token estará disponible automáticamente. |
114 | | - Si no, genera un nuevo [token de acceso personal](https://github.com/settings/tokens) y ejecuta este comando para establecer la variable de entorno `GITHUB_TOKEN`: |
| 163 | +## Recursos |
115 | 164 |
|
116 | | - ```shell |
117 | | - export GITHUB_TOKEN="<aquí-va-tu-token-de-github>" |
| 165 | +* [Próxima serie octubre 2025: Python + IA](https://aka.ms/PythonIA/serie) |
| 166 | +* [Serie de videos: Aprende Python + IA](https://techcommunity.microsoft.com/blog/EducatorDeveloperBlog/learn-python--ai-from-our-video-series/4400393) |
0 commit comments