¿Qué sucede cuando TS se encuentra con la IA?

Siga la cuenta oficial de WeChat de "Big Front-end Private Kitchen" e ingrese la contraseña [Guía de entrevista] para recibir 107 páginas de preguntas de la entrevista front-end de forma gratuita.

La inteligencia artificial se desarrolla todos los días y los grandes modelos de lenguaje son cada vez más poderosos. El uso de herramientas de inteligencia artificial para ayudarlo en el trabajo mejorará en gran medida la eficiencia del trabajo. Simplemente escriba algunos caracteres y presione la tecla Tab, y el código se completará de manera inteligente.

Además de completar el código, también podemos dejar que la IA nos ayude a automatizar funciones y devolver los datos JSON necesarios.

Veamos primero un ejemplo:

// index.ts
interface Height {
  meters: number;
  feet: number;
}

interface Mountain {
  name: string;
  height: Height;
}

// @ts-ignore
// @magic
async function getHighestMountain(): Promise<Mountain> {
  // Return the highest mountain
}

(async () => {
  console.log(await getHighestMountain());
})();

En el código anterior, definimos una función asincrónica getHighestMountain para obtener la información del pico más alto del mundo, y su valor de retorno es la estructura de datos definida por la interfaz Mountain. No hay una implementación específica dentro de la función, simplemente describimos lo que la función debe hacer mediante comentarios.

Después de compilar y ejecutar el código anterior, la consola generará los siguientes resultados:

{ name: 'Mount Everest', height: { meters: 8848, feet: 29029 } }

La montaña más alta del mundo es el Monte Everest, es el pico principal del Himalaya y el pico más alto del mundo, con una altitud de 8848,86 metros ¿No es asombroso?

A continuación, revelaré el secreto de la función getHighestMountain.

Para comprender qué se hace dentro de la función asincrónica getHighestMountain, echemos un vistazo al código JS compilado:

const { fetchCompletion } = require("@jumploops/magic");

// @ts-ignore
// @magic
function getHighestMountain() {
    return __awaiter(this, void 0, void 0, function* () {
        return yield fetchCompletion("{\n  // Return the highest mountain\n}", {
            schema: "{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"height\":{\"$ref\":\"#/definitions/Height\"}},\"required\":[\"height\",\"name\"],\"definitions\":{\"Height\":{\"type\":\"object\",\"properties\":{\"meters\":{\"type\":\"number\"},\"feet\":{\"type\":\"number\"}},\"required\":[\"feet\",\"meters\"]}},\"$schema\":\"http://json-schema.org/draft-07/schema#\"}"
        });
    });
}

Como se puede ver en el código anterior, la función fetchCompletion en la biblioteca @jumploops/magic se llama dentro de la función getHighestMountain.

De los parámetros de esta función, vemos la anotación de la función TS anterior, además, también vemos un objeto que contiene el atributo de esquema. El valor de este atributo es el objeto de esquema JSON correspondiente a la interfaz Mountain.

A continuación, nos centramos en analizar la función fetchCompletion en la biblioteca @jumploops/magic. Esta función está definida en el archivo fetchCompletion.ts y su flujo de procesamiento interno se divide en tres pasos:

  • Consejos para ensamblar la API de finalización de chat;

  • Llame a la API de finalización de chat para obtener los resultados de la respuesta;

  • Analice los resultados de la respuesta y valide el objeto de respuesta utilizando el esquema JSON.

// fetchCompletion.ts
export async function fetchCompletion(
  existingFunction: string, 
  { schema }: { schema: any }) {
  let completion;

  // (1)
  const prompt = `
    You are a robotic assistant. Your only language is code. You only respond with valid JSON. Nothing but JSON. 
 For example, if you're planning to return:
      { "list": [ { "name": "Alice" }, { "name": "Bob" }, { "name": "Carol"}] } 
    Instead just return:
      [ { "name": "Alice" }, { "name": "Bob" }, { "name": "Carol"}]
    ...

    Prompt: ${existingFunction.replace('{', '')
     .replace('}', '').replace('//', '').replace('\n', '')}

    JSON Schema: 
    \`\`\`
      ${JSON.stringify(JSON.parse(schema), null, 2)}
    \`\`\`
  `;


  // (2)
  try {
    completion = await openai.createChatCompletion({
      model: process.env.OPENAI_MODEL ?
       process.env.OPENAI_MODEL : 'gpt-3.5-turbo',
      messages: [{ role: 'user', content: prompt }],
    });
  } catch (err) {
    console.error(err);
    return;
  }

  const response = JSON.parse(completion.data.choices[0].message.content);

  // (3)
  if (!validateAPIResponse(response, JSON.parse(schema))) {
    throw new Error("Invalid JSON response from LLM");
  }

  return JSON.parse(completion.data.choices[0].message.content);
}

En Prompt, configuramos una función para la IA y preparamos algunos ejemplos para guiarla en la devolución de un formato JSON válido.

Llame a la API Chat Completions para obtener los resultados de la respuesta y utilice directamente la API createChatCompletion proporcionada por la biblioteca openai.

Después de analizar el resultado de la respuesta, se llamará a la función validarAPIResponse para verificar el objeto de respuesta. La implementación de esta función también es relativamente sencilla. La biblioteca ajv se utiliza internamente para implementar la verificación de objetos basada en el esquema JSON.

export function validateAPIResponse(
  apiResponse: any, schema: object): boolean {
  const ajvInstance = new Ajv();
  ajvFormats(ajvInstance);
  const validate = ajvInstance.compile(schema);
  const isValid = validate(apiResponse);

  if (!isValid) {
    console.log("Validation errors:", validate.errors);
  }

  return isValid;
}

A continuación queremos analizar cómo compilar código TS en código JS que llama a la función fetchCompletion.

La biblioteca ttypescript es utilizada internamente por @jumploops/magic y nos permite configurar convertidores personalizados en el archivo tsconfig.json.

Dentro del transformador, hay una API proporcionada por mecanografiado, que se utiliza para analizar y operar AST y generar el código deseado. El flujo de procesamiento principal dentro del transformador también se puede dividir en 3 pasos:

  • Escanee el código fuente de las funciones de IA que contienen // @magicannotation;

  • Genere el objeto de esquema JSON correspondiente de acuerdo con el tipo de valor de retorno de la función AI;

  • Extraiga anotaciones de funciones del cuerpo de la función AI y genere código que llame a la función fetchCompletion.

El objetivo de este artículo no es cómo analizar y manipular objetos AST generados por el compilador TypeScript. Si está interesado, puede leer el archivo transformador.ts en el proyecto @jumploops/magic. Si desea experimentar la función AI usted mismo, puede consultar la configuración de package.json y tsconfig.json en los ejemplos de este artículo.

paquete.json

{
  "name": "magic",
  "scripts": {
    "start": "ttsc && cross-env OPENAI_API_KEY=sk-*** node src/index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@jumploops/magic": "^0.0.6",
    "cross-env": "^7.0.3",
    "ts-patch": "^3.0.0",
    "ttypescript": "^1.5.15",
    "typescript": "4.8.2"
  }
}

archivo tsconfig.json

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "skipLibCheck": true,
    "plugins": [{ "transform": "@jumploops/magic" }]
  },
  "include": ["src/**/*.ts"],
  "exclude": [ "node_modules"],
}

Tenga en cuenta que la API de finalización de chat no siempre devuelve objetos JSON válidos en el formato que esperamos, por lo que en la práctica deberá agregar una lógica de manejo de excepciones adecuada.

Actualmente, la biblioteca @jumploops/magic solo proporciona ejemplos simples y aún no admite la configuración de parámetros de funciones. Para esta parte, puede leer la documentación sobre Funciones de IA en la biblioteca de Marvin.

Si el modelo de lenguaje grande puede generar datos estructurados de manera controlable de acuerdo con nuestros requisitos. Entonces podremos hacer muchas cosas.

Actualmente, muchas plataformas de código bajo o plataformas RPA (Robotic Process Automation) pueden obtener los objetos de esquema JSON correspondientes.

Con las soluciones de @jumploops/magic, podemos hacer que las plataformas RPA o de bajo código sean más inteligentes. Por ejemplo, cree rápidamente páginas de formulario o publique varias tareas en lenguaje natural.

Finalmente, resumamos el trabajo detrás de la biblioteca @jumploops/magic, que utiliza un conversor TypeScript para obtener el tipo de retorno de una función, convertir el tipo en un objeto de esquema JSON y luego reemplazar el cuerpo de la función con el código fuente que contiene la // función anotada @magic. Luego llame a la API de finalización del chat y valide la respuesta con el esquema JSON.

Este es el final del artículo de hoy, espero que te sea útil.

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_41692221/article/details/131434994
Recomendado
Clasificación