Probablemente hayas jugado con bots como ChatGPT y los hayas utilizado para brainstorming. Tal vez hayas notado que obtener respuestas en la estructura o formato correcto ha sido un desafío. Como personas, eso está bien, pero los programas son mucho más quisquillosos. Hemos estado experimentando con el uso de TypeScript en sí mismo como una forma de guiar y validar las respuestas de los modelos de lenguaje.
This talk has been presented at TypeScript Congress 2023, check out the latest edition of this JavaScript Conference.
FAQ
Daniel Rosenwasser es el gerente de programa en el equipo de TypeScript en Microsoft.
TypeChat es una biblioteca desarrollada por el equipo de TypeScript en Microsoft para facilitar la implementación de modelos de lenguaje en aplicaciones, permitiendo respuestas estructuradas en formato JSON que se alinean con tipos definidos.
TypeChat permite guiar a los modelos de lenguaje para que produzcan datos en un formato específico utilizando TypeScript, facilitando que las aplicaciones analicen y utilicen esta información de manera eficiente.
Utilizar JSON permite que las respuestas de los modelos de lenguaje sean fácilmente analizables y manejables por las aplicaciones, evitando la complejidad de analizar lenguaje natural.
Uno de los principales desafíos es obtener respuestas en un formato específico y consistente, dado que los modelos de lenguaje son no deterministas y pueden generar respuestas en formatos variables.
TypeChat utiliza los tipos definidos en TypeScript para validar las respuestas del modelo de lenguaje, asegurando que coincidan con el formato esperado y sean correctas.
Más información sobre TypeChat se puede encontrar en su repositorio de GitHub, donde los usuarios pueden acceder a ejemplos, discusiones y documentación adicional.
TypeChat es una biblioteca de código abierto que utiliza tipos de TypeScript para guiar y validar las respuestas de los modelos de lenguaje. Permite la creación de respuestas complejas y proporciona una forma de corregir errores en el modelo. Los programas de TypeChat permiten un mejor flujo de datos y la capacidad de referirse a pasos individuales. El ejemplo de matemáticas demuestra el uso de un traductor de programas y técnicas de metaprogramación para la seguridad de tipos. Los modelos de lenguaje entrenados tanto en código como en prosa funcionan bien en este contexto.
Hola a todos, mi nombre es Daniel Rosenwasser y soy el gerente de programa en el equipo de TypeScript en Microsoft. Hoy quiero hablarles sobre TypeChat, otra cosa en la que he estado trabajando recientemente con otros miembros de mi equipo. En los últimos meses, probablemente hayan visto mucho sobre inteligencia artificial y modelos de lenguaje grandes. Estos modelos de lenguaje son muy poderosos y es posible que hayan tenido la idea de intentar incorporar la inteligencia de uno de estos modelos de lenguaje en su aplicación, tal vez para agregar una interfaz de lenguaje natural de alguna manera.
Hola a todos, mi nombre es Daniel Rosenwasser y soy el gerente de programa en el equipo de TypeScript en Microsoft. Hoy quiero hablarles sobre TypeChat, otra cosa en la que he estado trabajando recientemente con otros miembros de mi equipo. Entonces, en los últimos meses, probablemente hayan visto mucho sobre inteligencia artificial y modelos de lenguaje grandes. Estos modelos de lenguaje son muy poderosos y probablemente hayan tenido la oportunidad de usarlos en forma de algo como ChatGBT o un programa de chat similar donde pueden hacerle preguntas al modelo, y este puede darles respuestas, pueden iterar a través de ideas y es una excelente manera de iterar creativamente a través de conceptos y demás. Eso funciona muy bien para las personas, pero estos modelos de lenguaje son muy poderosos y es posible que hayan tenido la idea de intentar incorporar la inteligencia de uno de estos modelos de lenguaje en su aplicación, tal vez para agregar una interfaz de lenguaje natural de alguna manera. Entonces, como ejemplo, supongamos que tenemos alguna aplicación que debe ayudarnos a planificar planes para un día, planes para el fin de semana, tal vez específicos de una ubicación. No parece impracticable dado el hecho de que estos modelos han sido entrenados con tanta data en el mundo, por lo que podrían saber mucho sobre Seattle u otra ciudad.
2. Uso de tipos de TypeScript para guiar modelos de lenguaje
Short description:
En esta aplicación, quieres obtener datos de modelos de lenguaje. Sin embargo, los modelos de lenguaje a menudo producen datos que no son fáciles de analizar. Puedes hacer que los modelos de lenguaje respondan en JSON, pero no siempre coincidirá con el formato esperado. Los tipos de TypeScript pueden guiar al modelo de lenguaje y proporcionar el formato deseado. Sin embargo, el modelo de lenguaje aún puede producir respuestas que no se ajusten exactamente. Se necesita validación para hacer que la IA intente nuevamente.
estás tratando de buscar ideas para. En esta aplicación, tal vez solo queremos poder hacerle una pregunta, esa es nuestra intención de usuario, y luego obtener un conjunto de resultados con un par de lugares y cada una de sus descripciones también. Entonces eso parece estar bien, pero ¿cómo harías para que uno de estos modelos de lenguaje produzca data que puedas usar en esta aplicación? Lo que puedes haber notado al intentar hacer algo así es que terminas tratando de mimar a la IA para que la dé en un formato específico, y incluso una vez que está en ese formato, genera un lenguaje natural que no siempre será fácil de analizar. Por ejemplo, aquí hay una solicitud y una respuesta que tomó un par de intentos para obtener algo razonable, ¿verdad? Una de las cosas que puedes notar es que termino tratando de darle un poco de orientación sobre cómo espero que sea la respuesta, ¿verdad? Esto no es tan malo, ¿verdad? Pero principalmente porque ha dado una respuesta regular en un formato específico. Y así me ha dado un formato de elementos de lista. Cada uno de ellos está numerado. Y luego entre el lugar y la descripción, tengo dos puntos. Ahora, ¿la IA siempre va a volver con ese esquema o formato? No necesariamente. Muchos de estos modelos de lenguaje son no deterministas. Entonces realmente no puedes contar con este formato. Pero incluso si pudieras contar con ese formato, no siempre puedes confiar en que el data se pueda analizar de manera uniforme, ¿verdad? Por ejemplo, en este caso, tengo una lista y todo está en este formato. ¿Qué tal si intentamos dividir por los dos puntos, ¿verdad? Podrías intentar decir, déjame intentar quitar cada uno de los números y luego dividir por los dos puntos. Pero ¿qué pasa si uno de los elementos de tu lista tiene dos puntos dentro del título o algo así, ¿verdad? Básicamente estás tratando de analizar lenguaje natural en este punto, ¿verdad? Y ahora tienes un error, y ahora tienes que averiguar cómo ser resistente a eso. Y así esto termina siendo un poco impráctico para la mayoría de las personas, ¿verdad? Es muy difícil analizar lenguaje natural. Pero muchos de ustedes probablemente también se dieron cuenta de que pueden hacer que los modelos de lenguaje respondan en forma de JSON. Y eso es genial, ¿verdad? Ahora realmente tienes algo que tu aplicación puede analizar fácilmente con JSON.parse o lo que sea, y obtener los datos que necesitas y trabajar a partir de eso. Pero eso realmente solo funciona para ejemplos simples, ¿verdad? Aquí pude decir, aquí hay un ejemplo del JSON que quiero obtener, ¿verdad? Tengo un lugar y una descripción, un lugar y una descripción. Y la IA es bastante buena para entender eso. Pero no nos dice acerca de propiedades opcionales, tal vez el caso en el que tienes tres tipos diferentes de objetos que esperas que estén en una posición específica, cosas así. Y así, solo dar ejemplos sería impráctico porque te meterías en estas explosiones combinatorias de todos los tipos de cosas que realmente querrías proporcionar. Los ejemplos no son suficientes. Lo que necesitas es algo un poco más. Y resulta que hay un formato que funciona bastante bien, en su mayor parte, en nuestra experiencia. Y es algo con lo que todos ustedes están familiarizados aquí en esta conferencia de TypeScript, que son los tipos. Los tipos de TypeScript son en realidad un gran formato para describir el formato exacto que queremos de un modelo de lenguaje y todas las formas en las que esperamos. Entonces, los tipos son realmente buenos para guiar al modelo de lenguaje hacia lo que queremos, ¿verdad? Y en realidad puedes tomar los tipos en una aplicación, como el texto real de los tipos en tu programa, tomar una intención de usuario y crear una solicitud que puedes enviar a un servicio de IA, a un modelo de lenguaje. Y eso te proporcionará JSON, Dirías, dame una respuesta en forma de JSON, aquí está el tipo al que debes cumplir cuando proporciones esa respuesta. Y así, ahora puedes guiar al modelo de lenguaje.
Pero como dije, el modelo de lenguaje no siempre va a regresar con una respuesta que sea exactamente como esperamos, ¿verdad? Tal vez regrese con JSON, pero no es del formato precisamente, ¿verdad? Siempre podemos decir, oye, no me diste el JSON correcto, inténtalo de nuevo. Pero necesitas algo más que empuje a una IA para que puedas decir
3. Uso de tipos de TypeScript para la validación de respuestas
Short description:
Una vez que tengas los tipos, puedes usarlos para validar la respuesta del modelo de lenguaje. Al construir un programa que verifique cada propiedad y valor, TypeScript puede asegurar que la respuesta sea correcta. Si hay un error, se puede enviar de vuelta al modelo para su reparación. Este enfoque permite la creación de respuestas complejas, como tomar pedidos de café. TypeChat, una biblioteca de código abierto, encapsula estas ideas y facilita comenzar. El ejemplo de sentimiento, que categoriza el sentimiento del usuario como positivo, negativo o neutral, demuestra las capacidades de TypeChat.
intentar de nuevo también. Y eso es la validación. Entonces, en realidad, una vez que tengas los tipos, puedes usar los tipos para validar la respuesta del modelo de lenguaje también. Y así, lo que realmente decidimos hacer es, dijimos, oye, si tenemos los tipos y tenemos el JSON, es muy trivial construir un pequeño programa donde puedes hacer que TypeScript verifique cada una de las propiedades y cada uno de los valores que han regresado, porque es muy simple en ese punto. Porque JSON es realmente solo aproximadamente un subconjunto de JavaScript. Y JavaScript es un subconjunto de TypeScript. Y así, en realidad puedes crear un programa, hacer que TypeScript lo verifique y si tiene un error, enviar ese error de vuelta al modelo de lenguaje y hacer que el modelo de lenguaje intente reparar lo que fue su respuesta desde la última vez. Eso funciona bastante bien. Y así, puedes usar esto para realmente construir respuestas aún más complejas, ¿verdad? Entonces, puedes decir, oye, tal vez soy un quiosco que toma pedidos de café o algo así, ¿verdad? Y así, los pedidos son efectivamente en forma de un carrito. Un carrito tiene muchos artículos. Esos artículos pueden ser uno de varios tipos diferentes de artículos. Y le damos ese esquema. Damos una intención del usuario, como quiero dos lattes, uno tall y uno grande. Y el modelo de lenguaje puede, o buenos modelos de lenguaje pueden típicamente responder con JSON bien formado que se ajusta al tipo. Y depende de la calidad de tu modelo, ¿verdad? Puedes hacer que se repare un par de veces. Pero en general, muchos de los que están disponibles para las personas hoy en día que están ampliamente disponibles regresan con una buena respuesta aquí. Y así, creo que este es un buen momento para dar una demostración rápida de TypeChat, que es esta biblioteca que hemos creado para encapsular todas estas ideas y facilitar su implementación. Así que voy a abrir el repositorio de TypeChat, ¿verdad? Es todo de código abierto. Puedes obtenerlo hoy. Lo anunciamos hace aproximadamente un mes más o menos. Y así, primero queremos ver el archivo readme para ver los ejemplos, ¿verdad? Este es el archivo readme en el nivel superior. Pero para tener una idea de TypeChat en sí, queremos echar un vistazo a los ejemplos. En la carpeta de ejemplos, tenemos un archivo readme con una tabla que describe cada uno de los ejemplos que tenemos. Y básicamente van desde los más fáciles de entender hasta los más difíciles. Así que el ejemplo de sentimiento que tenemos es como el hola mundo de TypeChat. Es un clasificador que toma una intención del usuario, ¿verdad? Toma una oración del usuario como una indicación, la envía a un modelo de lenguaje e intenta categorizar ese sentimiento como positivo, negativo o neutral. Así que vamos a eso. Tenemos un esquema de sentimiento. Y este archivo de esquema es lo que realmente se va a usar cuando lo enviemos al modelo de lenguaje. En realidad, vamos a tomar el texto completo de este archivo de esquema. Pero nota que es solo una respuesta muy simple, ¿verdad? Es solo un objeto con una propiedad que recibe una cadena que es negativo, neutral o positivo. También, algo a tener en cuenta es que mencioné que estamos yendo
4. Construyendo el Modelo de Lenguaje
Short description:
Los comentarios pueden ser útiles para persuadir al modelo de lenguaje a dar una respuesta que se ajuste a una forma deseada. En el ejemplo de sentimiento, el modelo de lenguaje categoriza diferentes oraciones. El código para construir el modelo de lenguaje involucra la función 'crear modelo de lenguaje', que toma variables de entorno y carga el archivo de esquema. El 'traductor JSON' se utiliza para asegurar que la respuesta cumpla con el tipo deseado.
enviar literalmente todo el texto del archivo al modelo de lenguaje. Por lo tanto, eso también significa que cosas como los comentarios también serán útiles para persuadir al modelo de lenguaje a dar una respuesta que se ajuste mejor a una forma que solo los tipos en bruto. Por lo tanto, también puedes comunicar más que solo los tipos.
Entonces, ya estamos en el ejemplo de sentimiento. Todo está construido aquí. Entonces, lo que voy a hacer es ejecutar el ejemplo. Así que esto crea una indicación y simplemente voy a escribir hola mundo. El modelo de lenguaje que estamos usando en este momento, que es GPT35 turbo, categoriza esta oración como neutral. Cada vez que hago esto, tantas veces como ponga un signo de exclamación, siempre es neutral por alguna razón. Pero si escribo algo como type chat es genial. Eso es positivo. Así que veamos cómo se ve el código para construir esto. Primero, tenemos esta función llamada crear modelo de lenguaje. La función crear modelo de lenguaje toma las variables de entorno que tenemos en nuestro proceso, y eso se llena con un archivo .n. No voy a mostrarte el contenido completo, pero puedes configurar cosas como el modelo que deseas y algunos otros data. Actualmente, la función crear modelo de lenguaje solo está ahí para facilitarte un modelo accesible que cargue modelos de Open AI o Azure Open AI. En realidad, un modelo es un concepto muy general. Puedes usar cualquier modelo que desees. Puedes usar algo que se haya entrenado localmente. Puedes usar algo que sea un servicio completamente diferente. Type chat es agnóstico a todo eso. Todo lo que nos importa es si puedes tomar una cadena y establecer una conexión a través de un modelo de lenguaje y, finalmente, devolver un éxito o un fallo en la cadena. Solo nos importa si puedes darnos una cadena a partir de una cadena. De todos modos. Así que creamos el modelo de lenguaje, lo inferimos a partir de nuestras variables de entorno y luego cargamos el archivo de esquema. Este es el archivo de esquema real que tenemos junto a main.ts. Ahora, hay cierta sutileza allí y hablaré de eso en un segundo, pero observa que este archivo aquí corresponde exactamente a este archivo aquí. Luego creamos lo que se llama un traductor JSON. Y esto tomará el modelo, tomará el esquema y el nombre del tipo al que queremos que se ajuste nuestra respuesta. Y esto es como el punto de entrada en nuestro archivo de tipos, ¿verdad? Podemos tener muchos tipos en este archivo. Podemos tener toda una red o gráfico de tipos y queremos asegurarnos de conocer el exacto con el que estamos comenzando. Y así estamos proporcionando el nombre del tipo, estamos proporcionando el tipo real que hemos cargado en el programa aquí,
5. Processing Requests and Examples
Short description:
Tenemos una función de procesamiento de solicitudes que simplifica la creación de un indicador de línea de comandos. Cada solicitud se ejecuta a través del traductor y, finalmente, del modelo de lenguaje. Los datos resultantes tienen un tipo seguro y bien definido gracias a TypeScript. El ejemplo de sentimiento es fácil de comenzar, y también tenemos un ejemplo más sofisticado de una cafetería. Dependiendo del modelo, puede funcionar de manera consistente o tener problemas ocasionales.
y luego tenemos un objeto traductor. Y también tenemos esta función de procesamiento de solicitudes, que realmente está ahí para facilitar la creación de un indicador de línea de comandos porque Node por alguna razón lo hace un poco difícil. Le das el indicador que quieres tener en cada línea, ya sabes, el texto que quieres imprimir en cada indicador, y luego un callback cada vez que obtienes una intención del usuario o una oración, ¿verdad? Entonces, esta es cada línea que se ingresa en el indicador. Ejecutamos cada una de las solicitudes a través del traductor, el traductor llama al modelo de lenguaje, el modelo de lenguaje responde, y luego el traductor toma eso, utiliza los tipos, construye el programa y utiliza internamente TypeScript para verificar el programa y asegurarse de que haya tenido éxito. Y si no lo ha tenido, posiblemente haga algunos intentos nuevamente y tal vez retroceda un poco también. Y si no tenemos éxito, simplemente mostramos un error y salimos. Pero si lo tenemos, lo que obtenemos es un data bien tipado. Así que obtenemos nuestro sentimiento, un éxito de respuesta de sentimiento, nuestro data es una respuesta de sentimiento, y luego tenemos ese sentimiento bien tipado . Y debido a que TypeScript está verificando el tipo de esta cosa, sabemos que esta cosa es fuertemente y estáticamente o estrictamente tipada. Y eso es muy fácil de comenzar. En total, alrededor de 22 líneas de código. Y hay un poco de sutileza allí porque en nuestra compilación, en realidad tenemos que hacer un poco de cosas adicionales. Entonces, si estás usando algo como ts-node, esto no es un problema, pero porque en realidad estamos buscando el archivo de entrada de TS, estamos utilizando los tipos de archivo de esquema, en realidad los copiamos todos en el directorio de la aplicación. Y es un poco rudimentario, pero funciona bastante bien. ¿Verdad? Y si no quieres hacer esto, siempre puedes usar algo como ts-node. Y probablemente haya formas fáciles de hacer que esto funcione con algo como deno o bon o lo que sea, ¿verdad?
El ejemplo de sentimiento es bastante fácil de comenzar. También tenemos otro ejemplo de una cafetería. Entonces, en nuestra cafetería, tenemos un esquema un poco más sofisticado. Cerraré los otros archivos aquí. Y así es similar a lo que tenía en la presentación hace un momento. Solo ten paciencia por un segundo. Tenemos un carrito, el carrito tiene artículos, los artículos son cada uno de estos elementos de línea, y luego, ya sabes, etcétera, etcétera, etcétera. Entonces, podemos pedir muffins de marca de manzana, muffins de arándanos, bagels, lo que sea. Y así que en realidad puedo salir de este indicador, ir a la carpeta del ejemplo de la cafetería y luego puedo ejecutar esto . Y puedo decir un café con leche pequeño y un bagel, por favor. Y así que miramos la salida aquí, en realidad obtenemos un JSON bien formado y para cada uno de los artículos, tenemos un café con leche, es un tamaño pequeño, y un bagel, ¿verdad? Y la cantidad es uno, la cantidad es uno. Y ya sabes, dependiendo de tu modelo, en realidad descubrirás que esto funciona de manera consistente o puede tener problemas ocasionales. Entonces, ya sabes, probemos esto. Dame un café con leche alto y un plátano. Y así que nota que falla aquí. En realidad, termina diciendo que no entendió lo siguiente, y luego
6. Schema and Unknown Text
Short description:
Al crear esquemas, es bueno darles un grado de incertidumbre. El texto desconocido se utiliza cuando el modelo de lenguaje no comprende un concepto. Esto permite aplicaciones más robustas y la capacidad de previsualizar las solicitudes del usuario.
enumeró eso. Y eso se debe a cómo formamos nuestro esquema, ¿verdad? Lo interesante es que al crear estos esquemas, en muchos casos es bueno darles un grado de incertidumbre, ¿verdad? En casos en los que un modelo de lenguaje no puede comprender completamente la intención del usuario, es bueno tener una salida. Y así, la salida aquí, el grado de libertad, como quieras llamarlo, que hemos agregado, es esta cosa llamada texto desconocido. Y así, cada vez que el modelo de lenguaje no comprende un concepto, tiende a poner las cosas en este cubo de texto desconocido, ¿verdad? Y lo que sucederá es que a medida que hacemos nuestros pedidos, esto funciona básicamente de la misma manera. Pero lo que decimos es que, cuando encontramos un tipo desconocido, decimos: No pude entender lo siguiente. Y luego simplemente recorremos todo el proceso y explicamos y detallamos, ¿verdad? Así que puedo decir que quiero un café alto y un plátano y un gorila sosteniendo el plátano. Y es capaz de traducir cada uno de esos elementos en un desconocido, que es un plátano y un gorila sosteniendo el plátano, ¿verdad? Así que eso funciona bastante bien. En general, si sientes que un usuario va a cometer un error, es bueno agregar estos grados de libertad. Decir algo como permito texto desconocido, o tal vez un booleano que indique que el pedido no fue claro o algo así puede ayudar con tu aplicación y puedes ser un poco más robusto, tal vez señalar cosas específicas. Y una de las cosas clave de algo como TypeChat es que, como todo está en JSON, siempre puedes previsualizar exactamente lo que un usuario iba a obtener cuando realizaba una de estas solicitudes. Así que eso es
7. Creating TypeChat Programs
Short description:
A menudo, las personas intentan planificar o escribir programas con IA, utilizando los conceptos básicos de TypeChat para crear comandos. Sin embargo, la secuencia lineal de comandos carece de la capacidad de hacer referencia a argumentos anteriores. Para solucionar esto, se crea un pseudo-lenguaje donde la IA responde en JSON. Esta representación falsa se convierte luego en un programa real utilizando TypeScript para la verificación de tipos, asegurando programas bien tipados entre cada paso. Este concepto de programas TypeChat permite un mejor flujo de datos y la capacidad de hacer referencia a pasos individuales.
Crear programas TypeChat es quizás la parte más fácil de entender de TypeChat. Una de las cosas que también nos dimos cuenta es que a menudo las personas intentan hacer algún tipo de planificación o escritura de programas con IA, ¿verdad? Tal vez tienes una aplicación, tienes muchas, muchas, muchas tareas diferentes y todas se pueden ejecutar posteriormente en un cierto orden. Y puedes usar los conceptos básicos de TypeChat, como el enfoque de TypeChat que acabo de mostrarte, para crear comandos, ¿verdad? Puedes crear objetos con un nombre de comando y tal vez algunos argumentos o propiedades que sigan y que se puedan usar como argumentos de alguna manera. Resulta que muchos programas, como VS Code y otros, utilizan una forma de realizar acciones similar a esta, ¿verdad? Hay un nombre de comando y luego algunas propiedades que siguen. Y también puedes secuenciarlos. Pero uno de los problemas con esto es que solo obtienes una secuencia lineal, ¿verdad? Y no tienes forma de hacer referencia a un argumento anterior en algunos casos. Y así, lo que quieres poder hacer es también validar que estás obteniendo el flujo correcto de datos, ¿verdad? Que cada uno de estos pasos realmente tiene el tipo correcto de datos que produce y que se puede usar en el siguiente paso. Pero también quieres poder hacer referencia a cada uno de los pasos individuales anteriores porque tal vez necesitas tener algunos resultados intermedios antes de ejecutar una acción o algo así. Y así, una pregunta que podrías hacer es, ¿qué pasa si simplemente generas código y tomas un enfoque muy similar al de TypeChat que tenías antes, ¿verdad? Todo lo que necesitas son tipos. Y así, tal vez digas, aquí está mi API, genera un programa como este. Eso funciona bien a veces, pero hay un par de problemas, ¿verdad? Primero, queremos que TypeChat sea multiplataforma con el tiempo, ¿verdad? Queremos poder llevar esto a otros lenguajes como Python o C Sharp u otros. Pero cuando dices que vas a crear código explícito, también necesitas poder decir que quieres aislar esto también. O tal vez quieres tener algo que interprete el código real de alguna manera. Pero luego terminas creando un intérprete muy completo que realmente tiene que interpretar mucho JavaScript o cualquier otro lenguaje que crees. Y luego terminas con muchos otros problemas, como, bueno, tengo APIs que son asíncronas frente a síncronas. Entonces, ahora la IA necesita generar código que también sepa sobre eso. Y resulta que cuando tienes el lenguaje real, intenta salirse de los límites con frecuencia. Entonces, si tienes JavaScript, intentará aprovechar al máximo el JavaScript que está disponible. Eso no siempre es ideal. Entonces, lo que realmente descubrimos fue que puedes confundir lo suficiente a la IA simplemente creando un pseudo-lenguaje en cierto sentido. Y dices, en realidad, solo responde en JSON. Y el JSON debería verse así. Y puede unir eso bastante bien y decir, sabes, hay estas propiedades meta que cada una de estas propiedades puede hacer referencia o especificar que tengo una función o lo que sea. Y así, esto es básicamente un lenguaje falso o una representación de lenguaje que se serializa a JSON. Y funciona lo suficientemente bien. Pero, ¿de dónde obtenemos la validación? ¿Cómo sabemos que las entradas de writeFile son realmente del tipo correcto? Que el texto recortado crea una cadena y esa cadena se puede usar como la salida, la entrada para la llamada a writeFile. Bueno, luego podemos tomar la representación falsa, el programa falso, tomar ese JSON, convertirlo en un programa real y luego usar TypeScript para crear un programa que realmente necesita ser verificado por tipos. Y así, cuando hacemos esa verificación de tipos, entonces podemos validar si cada una de las entradas y salidas corresponde correctamente. Y así, ahora tienes un programa bien tipado entre cada paso y sabes que los índices corresponden correctamente. Y así, esa es otra parte de TypeChat, que también tenemos este concepto de programas TypeChat.
8. Using a Program Translator for Math Example
Short description:
En esta sección, exploramos el ejemplo matemático y el uso de un traductor de programas en lugar de un traductor JSON. El programa siempre espera un tipo específico llamado API, que puede ser exportado. Las expresiones matemáticas se pueden escribir directamente, creando un programa JSON que se valida e interpreta. Se pueden utilizar técnicas de metaprogramación para garantizar la seguridad de tipos. El ejemplo matemático demuestra la capacidad de realizar operaciones complejas y crear pasos que se pueden referenciar más adelante. Los modelos de lenguaje entrenados tanto en código como en prosa funcionan bien en este contexto. Visítanos en GitHub para obtener más información y participa con nosotros en Twitter y otras plataformas.
corto de tiempo en este punto. Pero voy a entrar en el ejemplo matemático. Ahí no es donde está. Y luego voy a ejecutar el programa también. Y mi terminal no funciona muy bien con esto. Pero veamos el esquema matemático. El esquema matemático es realmente solo un conjunto de métodos para sumar, restar, multiplicar, dividir, negar. Y luego algunas cosas de identidad y luego como no sé cómo manejar esto correctamente. Ese grado de libertad del que mencioné antes.
Y en este programa en realidad no estamos usando un traductor JSON. Estamos usando un traductor de programas. Y la idea clave aquí es que siempre espera un tipo específico llamado API. Así que tengo que exportar un tipo llamado API aquí. Y lo que puedo hacer es simplemente escribir expresiones matemáticas y puedo decir algo como sumar uno y 41, ¿verdad? Y lo que hace eso es que realmente crea ese programa JSON antes. Esto es lo que construimos para validar el programa. En realidad, creamos esto. Y luego tenemos un intérprete que realmente lo ejecuta. Entonces, cuando implementas esto, efectivamente creas un intérprete en la forma de create o handle call. ¿Correcto? Y así tienes esta función evaluate JSON program y proporcionas un callback y luego simplemente toma un nombre de función y los argumentos que se le proporcionan. Y hay muchas cosas de metaprogramación que puedes hacer para asegurarte de que todo esté bien tipado. Entonces, al final, volviendo a nuestro ejemplo matemático, puedo hacer cosas sofisticadas de búsqueda. Como puedo decir, sumar uno y 41 y luego duplicarlo después, y tengo un error tipográfico ahí. Y en algunos casos lo vamos a incluir en línea, pero en otros casos, tal vez debido a cómo lo he dicho, creará un paso y el paso luego se puede referenciar en uno de los otros pasos. Así que dice sumar, y luego dice multiplicar. Y resulta que los modelos de lenguaje que han sido entrenados tanto en código como en prosa funcionan bastante bien aquí. Bueno, eso fue nuestra demostración. Desafortunadamente, estoy corto de tiempo, pero lo que realmente animamos a las personas a hacer es visitarnos en GitHub. Tenemos discusiones, tenemos problemas, realmente queremos saber de ustedes y también pueden seguirnos en otros lugares como Twitter o Blue Sky. Bueno, muchas gracias por su tiempo y eso es todo, cuídense. Transcrito por https://otter.ai
Today's Talk focuses on React's best types and JSX. It covers the types of JSX and React components, including React.fc and React.reactnode. The discussion also explores JSX intrinsic elements and react.component props, highlighting their differences and use cases. The Talk concludes with insights on using React.componentType and passing components, as well as utilizing the react.element ref type for external libraries like React-Select.
React and TypeScript have a strong relationship, with TypeScript offering benefits like better type checking and contract enforcement. Failing early and failing hard is important in software development to catch errors and debug effectively. TypeScript provides early detection of errors and ensures data accuracy in components and hooks. It offers superior type safety but can become complex as the codebase grows. Using union types in props can resolve errors and address dependencies. Dynamic communication and type contracts can be achieved through generics. Understanding React's built-in types and hooks like useState and useRef is crucial for leveraging their functionality.
Today's Talk discusses the importance of managing technical debt through refactoring practices, prioritization, and planning. Successful refactoring requires establishing guidelines, maintaining an inventory, and implementing a process. Celebrating success and ensuring resilience are key to building a strong refactoring culture. Visibility, support, and transparent communication are crucial for addressing technical debt effectively. The team's responsibilities, operating style, and availability should be transparent to product managers.
Debugging JavaScript is a crucial skill that is often overlooked in the industry. It is important to understand the problem, reproduce the issue, and identify the root cause. Having a variety of debugging tools and techniques, such as console methods and graphical debuggers, is beneficial. Replay is a time-traveling debugger for JavaScript that allows users to record and inspect bugs. It works with Redux, plain React, and even minified code with the help of source maps.
This Talk discusses building a voice-activated AI assistant using web APIs and JavaScript. It covers using the Web Speech API for speech recognition and the speech synthesis API for text to speech. The speaker demonstrates how to communicate with the Open AI API and handle the response. The Talk also explores enabling speech recognition and addressing the user. The speaker concludes by mentioning the possibility of creating a product out of the project and using Tauri for native desktop-like experiences.
React query version five is live and we'll be discussing the migration process to server components using Next.js and React Query. The process involves planning, preparing, and setting up server components, migrating pages, adding layouts, and moving components to the server. We'll also explore the benefits of server components such as reducing JavaScript shipping, enabling powerful caching, and leveraging the features of the app router. Additionally, we'll cover topics like handling authentication, rendering in server components, and the impact on server load and costs.
ReactJS es extremadamente popular y, por lo tanto, ampliamente soportado. TypeScript está ganando popularidad y, por lo tanto, cada vez más soportado.
¿Los dos juntos? No tanto. Dado que ambos cambian rápidamente, es difícil encontrar materiales de aprendizaje precisos.
¿React+TypeScript, con los IDEs de JetBrains? Esa combinación de tres partes es el tema de esta serie. Mostraremos un poco sobre mucho. Es decir, los pasos clave para ser productivo, en el IDE, para proyectos de React utilizando TypeScript. En el camino, mostraremos el desarrollo guiado por pruebas y enfatizaremos consejos y trucos en el IDE.
TypeScript no es solo tipos e interfaces. Únete a esta masterclass para dominar características más avanzadas de TypeScript que harán tu código a prueba de balas. Cubriremos tipos condicionales y notación de inferencia, cadenas de plantillas y cómo mapear sobre tipos de unión y propiedades de objetos/arrays. Cada tema se demostrará en una aplicación de muestra que se escribió con tipos básicos o sin tipos en absoluto y juntos mejoraremos el código para que te familiarices más con cada característica y puedas llevar este nuevo conocimiento directamente a tus proyectos. Aprenderás:- - ¿Qué son los tipos condicionales y la notación de inferencia?- ¿Qué son las cadenas de plantillas?- Cómo mapear sobre tipos de unión y propiedades de objetos/arrays.
TypeScript tiene un sistema de tipos poderoso con todo tipo de características sofisticadas para representar estados de JavaScript salvajes y extravagantes. Pero la sintaxis para hacerlo no siempre es sencilla, y los mensajes de error no siempre son precisos al decirte qué está mal. Vamos a profundizar en cómo funcionan muchas de las características más poderosas de TypeScript, qué tipos de problemas del mundo real resuelven, y cómo dominar el sistema de tipos para que puedas escribir código TypeScript verdaderamente excelente.
En esta masterclass, discutimos los méritos de la arquitectura sin servidor y cómo se puede aplicar al espacio de la IA. Exploraremos opciones para construir aplicaciones RAG sin servidor para un enfoque más lambda-esque a la IA. A continuación, nos pondremos manos a la obra y construiremos una aplicación CRUD de muestra que te permite almacenar información y consultarla utilizando un LLM con Workers AI, Vectorize, D1 y Cloudflare Workers.
¿Eres un desarrollador de React tratando de obtener los máximos beneficios de TypeScript? Entonces esta es la masterclass para ti.En esta masterclass interactiva, comenzaremos desde lo básico y examinaremos los pros y contras de las diferentes formas en que puedes declarar componentes de React usando TypeScript. Después de eso, pasaremos a conceptos más avanzados donde iremos más allá de la configuración estricta de TypeScript. Aprenderás cuándo usar tipos como any, unknown y never. Exploraremos el uso de predicados de tipo, guardias y comprobación exhaustiva. Aprenderás sobre los tipos mapeados incorporados, así como cómo crear tus propias utilidades de mapa de tipo nuevo. Y comenzaremos a programar en el sistema de tipos de TypeScript usando tipos condicionales e inferencia de tipos.
El conocimiento de las herramientas de AI es fundamental para preparar el futuro de las carreras de los desarrolladores de React, y la suite de herramientas de AI de Vercel es una vía de acceso accesible. En este curso, examinaremos más de cerca el Vercel AI SDK y cómo esto puede ayudar a los desarrolladores de React a construir interfaces de transmisión con JavaScript y Next.js. También incorporaremos APIs de terceros adicionales para construir y desplegar una aplicación de visualización de música. Temas:- Creación de un Proyecto de React con Next.js- Elección de un LLM- Personalización de Interfaces de Transmisión- Construcción de Rutas- Creación y Generación de Componentes - Uso de Hooks (useChat, useCompletion, useActions, etc)
Comments