L'intelligence artificielle se développe chaque jour désormais et les grands modèles de langage deviennent de plus en plus puissants. En utilisant des outils d'IA, l'efficacité du travail a été considérablement améliorée. Il vous suffit de saisir quelques caractères et d'appuyer sur la touche Tab, et le code sera automatiquement complété.
En plus de la complétion du code, nous pouvons également laisser l'IA nous aider à automatiser les fonctions et à renvoyer les données JSON requises.
Regardons d'abord un exemple :
// index.tsinterface Height {meters: number;feet: number;}interface Mountain {name: string;height: Height;}// @ts-ignore// @magicasync function getHighestMountain(): Promise<mountain> {// Return the highest mountain}(async () => {console.log(await getHighestMountain());})();</mountain>
Dans le code ci-dessus, nous définissons une fonction asynchrone getHighestMountain pour obtenir les informations du plus haut sommet du monde, et sa valeur de retour est la structure de données définie par l'interface Montagne. Il n'y a pas d'implémentation spécifique à l'intérieur de la fonction, nous décrivons simplement ce que la fonction doit faire à travers des commentaires.
Après avoir compilé et exécuté le code ci-dessus, la console affichera les résultats suivants :
{ name: 'Mount Everest', height: { meters: 8848, feet: 29029 } }
La plus haute montagne du monde est le mont Everest, qui est le principal sommet de l'Himalaya et le plus haut sommet du monde. , avec une altitude de 8848,86 mètres, n'est-ce pas très haut ?
Ensuite, je vais vous révéler le secret de la fonction getHighestMountain.
Afin de comprendre ce qui se fait dans la fonction asynchrone getHighestMountain, jetons un coup d'œil au code JS compilé :
const { fetchCompletion } = require("@jumploops/magic");// @ts-ignore// @magicfunction 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#\"}"});});}
Comme le montre le code ci-dessus, la fonction fetchCompletion dans le @jumploops/magic La bibliothèque est utilisée dans l’appel de la fonction getHighestMountain.
À partir des paramètres de cette fonction, nous voyons l'annotation de fonction de la fonction TS précédente. De plus, nous voyons également un objet contenant l'attribut de schéma. La valeur de cet attribut est l'objet JSON Schema correspondant à l'interface Mountain.
Ensuite, nous nous concentrons sur l'analyse de la fonction fetchCompletion dans la bibliothèque @jumploops/magic. Une fonction est définie dans le fichier fetchCompletion.ts et son flux de traitement interne est divisé en trois étapes
// fetchCompletion.tsexport 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);}
Dans Prompt, nous avons défini le rôle de l'IA et préparé quelques exemples pour la guider afin de renvoyer un format JSON valide.
Appelez l'API Chat Completions pour obtenir les résultats de la réponse et utilisez directement l'API createChatCompletion fournie par la bibliothèque openai.
Après avoir obtenu le résultat de la réponse, la fonction validateAPIResponse sera appelée pour vérifier l'objet de réponse. La mise en œuvre de cette fonction est également relativement simple. La bibliothèque ajv est utilisée en interne pour implémenter la vérification d'objet basée sur le schéma 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;}
La prochaine chose que nous voulons analyser est de savoir comment compiler le code TS en code JS qui appelle la fonction fetchCompletion.
bibliothèque ttypescript utilisée en interne par @jumploops/magic qui nous permet de configurer des convertisseurs personnalisés dans le fichier tsconfig.json.
À l'intérieur du transformateur, c'est l'API fournie par Typescript, qui sert à analyser et faire fonctionner AST et à générer le code souhaité. Cette phrase peut être réécrite comme suit : Il y a trois étapes qui constituent le flux de traitement principal à l'intérieur du transformateur
L'objectif de cet article n'est pas la manipulation des objets AST générés par le compilateur TypeScript. Lisez le fichier transformer.ts dans le projet @jumploops/magic si vous êtes intéressé. Si vous souhaitez découvrir la fonction AI par vous-même, vous pouvez vous référer à la configuration de package.json et tsconfig.json dans les exemples de cet article.
package.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"}}
tsconfig.json file
{"compilerOptions": {"target": "es2016","module": "commonjs","esModuleInterop": true,"allowSyntheticDefaultImports": true,"strict": true,"skipLibCheck": true,"plugins": [{ "transform": "@jumploops/magic" }]},"include": ["src/**/*.ts"],"exclude": [ "node_modules"],}
Veuillez noter que l'API de complétion de chat ne renvoie pas toujours un objet JSON valide dans le format attendu, vous En pratique, une logique de gestion des exceptions appropriée doit être ajoutée.
Actuellement, la bibliothèque @jumploops/magic ne prend pas en charge la définition des paramètres de fonction et ne fournit que des exemples simples. La documentation sur les capacités d'intelligence artificielle de la bibliothèque Marvin est à votre disposition pour lire cette partie.
Si le grand modèle de langage peut produire de manière contrôlable des données structurées selon nos exigences. Eh bien, nous pouvons faire beaucoup de choses.
Actuellement, de nombreuses plateformes low-code ou RPA (Robotic Process Automation) peuvent obtenir les objets JSON Schema correspondants.
Avec les solutions de @jumploops/magic, nous pouvons rendre les plateformes low-code ou RPA plus intelligentes. Par exemple, créez rapidement des pages de formulaire ou publiez diverses tâches en langage naturel.
Enfin, résumons le travail derrière la bibliothèque @jumploops/magic, qui utilise un convertisseur TypeScript pour obtenir le type de retour d'une fonction, convertir le type en un objet Schema JSON, puis remplacer le code source de la fonction contenant le // Corps d'annotation @magic, appelle ensuite l'API de complétion de chat et valide la réponse par rapport au schéma JSON.
C'est la fin de l'article d'aujourd'hui, j'espère qu'il vous sera utile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!