Ejemplo de métrica de evaluación: Similitud de cadenas
Este es unEngineering, AIflujo de automatización del dominio deautomatización que contiene 12 nodos.Utiliza principalmente nodos como Set, Code, Webhook, Evaluation, HttpRequest, combinando tecnología de inteligencia artificial para lograr automatización inteligente. Ejemplo de métrica de evaluación: Similitud de cadenas de texto
- •Punto final de HTTP Webhook (n8n generará automáticamente)
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Clave de API de OpenAI
Nodos utilizados (12)
Categoría
{
"meta": {
"instanceId": "bf40384a063e00f3b983f4f9bada22b57a8231a04c0fb48d363e26d7b0f2b7e7",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "b2a1a367-119f-4e2d-a982-ff675debf658",
"name": "Nota adhesiva 1",
"type": "n8n-nodes-base.stickyNote",
"position": [
220,
-40
],
"parameters": {
"color": 7,
"width": 180,
"height": 260,
"content": "Check how far apart the actual code is from the expected code (a score of 1 is a perfect match)"
},
"typeVersion": 1
},
{
"id": "f5413855-20de-4b77-ba90-18610a9d9b4d",
"name": "Nota adhesiva 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1300,
40
],
"parameters": {
"width": 300,
"height": 500,
"content": "## How it works\nThis template shows how to calculate a workflow evaluation metric: **text similarity, measured character-by-character**.\n\nThe workflow takes images of hand-written codes, extracts the code and compares it with the expected answer from the dataset.\n\nThe images look like this:\n\n\nYou can find more information on workflow evaluation [here](https://docs.n8n.io/advanced-ai/evaluations/overview), and other metric examples [here](https://docs.n8n.io/advanced-ai/evaluations/metric-based-evaluations/#2-calculate-metrics)."
},
"typeVersion": 1
},
{
"id": "8921a4c4-cee1-44e7-8dce-55219db519d7",
"name": "Nota adhesiva 4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-960,
280
],
"parameters": {
"color": 7,
"width": 220,
"height": 220,
"content": "Read in [this test dataset](https://docs.google.com/spreadsheets/d/1uuPS5cHtSNZ6HNLOi75A2m8nVWZrdBZ_Ivf58osDAS8/edit?gid=1786963566#gid=1786963566) of images"
},
"typeVersion": 1
},
{
"id": "fbf8337b-eb46-443a-8507-58a14b817be0",
"name": "Verificar formato webhook",
"type": "n8n-nodes-base.set",
"position": [
-680,
340
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "= {\n \"headers\": {\n },\n \"params\": {},\n \"query\": {\n \"url\": {{ $json.file_url.toJsonString() }}\n },\n \"body\": {},\n \"executionMode\": \"test\"\n }"
},
"typeVersion": 3.4
},
{
"id": "a03c9b79-d45d-4842-9325-df1af37697eb",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-900,
40
],
"webhookId": "7ceb775c-b961-44f0-acfe-682a67612332",
"parameters": {
"path": "7ceb775c-b961-44f0-acfe-682a67612332",
"options": {}
},
"typeVersion": 2
},
{
"id": "85bd63e2-3039-4f0e-8721-bc2b843461c9",
"name": "Al obtener una fila del conjunto de datos",
"type": "n8n-nodes-base.evaluationTrigger",
"position": [
-900,
340
],
"parameters": {
"sheetName": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/1uuPS5cHtSNZ6HNLOi75A2m8nVWZrdBZ_Ivf58osDAS8/edit?gid=1786963566#gid=1786963566"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/1uuPS5cHtSNZ6HNLOi75A2m8nVWZrdBZ_Ivf58osDAS8/edit?gid=1786963566#gid=1786963566"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "bpr2LoSELMlxpwnN",
"name": "Google Sheets account David"
}
},
"typeVersion": 4.6
},
{
"id": "4ed0b460-70af-4f1d-a7f3-97293f9b4ce0",
"name": "Responder a Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
260,
320
],
"parameters": {
"options": {}
},
"typeVersion": 1.3
},
{
"id": "f1642aa1-94c5-4002-a7aa-533566dd20eb",
"name": "¿Evaluando?",
"type": "n8n-nodes-base.evaluation",
"position": [
-20,
200
],
"parameters": {
"operation": "checkIfEvaluating"
},
"typeVersion": 4.6
},
{
"id": "15115588-b9ca-4e24-b7d8-f0aa0974b5dd",
"name": "Establecer métricas",
"type": "n8n-nodes-base.evaluation",
"position": [
480,
80
],
"parameters": {
"metrics": {
"assignments": [
{
"id": "0e507b06-e6d5-4ace-aa22-f06c6db5b883",
"name": "score",
"type": "number",
"value": "={{ $json.score }}"
}
]
},
"operation": "setMetrics"
},
"typeVersion": 4.6
},
{
"id": "af028132-c866-487d-be85-e3af049bc793",
"name": "Extraer código de imagen",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-240,
200
],
"parameters": {
"text": "=Extract ONLY the handwritten code in the top-right corner of this image.\n\nThe code MUST follow this EXACT format:\nBT/ED/[1-3 capital letters]/[1-3 capital letters]/[1-3 capital letters]/[1-3 capital letters or empty]/[single letter + number (2-4 chars total)]\n\nExamples of correct format:\nBT/ED/ABC/DE/F/G/H1\nBT/ED/A/BC/DEF/GH/I23\nBT/ED/AB/CD/EF/GH/I234\n\nDO NOT include any explanations, notes, or other text.\nDO NOT return anything if the code doesn't match the required format.\nVERIFY the extracted code matches the format before returning it.\nReturn ONLY the extracted code - nothing else.",
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "GPT-4O"
},
"options": {},
"resource": "image",
"inputType": "base64",
"operation": "analyze"
},
"credentials": {
"openAiApi": {
"id": "Ag9qPAsY7lpIGkvC",
"name": "JPs n8n openAI key"
}
},
"typeVersion": 1.8
},
{
"id": "50a26635-078f-40a7-8944-2e43ed8cd482",
"name": "Calcular distancia de cadenas",
"type": "n8n-nodes-base.code",
"position": [
260,
80
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const expected_code = $('When fetching a dataset row').item.json.expected_output\nconst actual_code = $json.content\n\nfunction levenshteinDistance(str1, str2) {\n const m = str1.length;\n const n = str2.length;\n const dp = Array(m + 1).fill().map(() => Array(n + 1).fill(0));\n\n for (let i = 0; i <= m; i++) {\n dp[i][0] = i;\n }\n \n for (let j = 0; j <= n; j++) {\n dp[0][j] = j;\n }\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (str1[i - 1] === str2[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1];\n } else {\n dp[i][j] = 1 + Math.min(\n dp[i - 1][j], // deletion\n dp[i][j - 1], // insertion\n dp[i - 1][j - 1] // substitution\n );\n }\n }\n }\n\n return dp[m][n];\n}\n\nconst dist = levenshteinDistance(\n expected_code, \n actual_code\n)\n\nconst max_dist = Math.max(\n expected_code.length,\n actual_code.length\n)\n\nconsole.log('truth', expected_code)\nconsole.log('effort', actual_code)\nconsole.log('dist', dist)\nconsole.log('max_dist', max_dist)\n\n$input.item.json.score = 1 - (dist / max_dist)\n\nreturn $input.item;"
},
"typeVersion": 2
},
{
"id": "383db4b0-9665-4608-bbf9-3dca88508bff",
"name": "Descargar imagen",
"type": "n8n-nodes-base.httpRequest",
"position": [
-460,
200
],
"parameters": {
"url": "={{ $json.query.url }}",
"options": {}
},
"typeVersion": 4.2
}
],
"pinData": {},
"connections": {
"a03c9b79-d45d-4842-9325-df1af37697eb": {
"main": [
[
{
"node": "383db4b0-9665-4608-bbf9-3dca88508bff",
"type": "main",
"index": 0
}
]
]
},
"f1642aa1-94c5-4002-a7aa-533566dd20eb": {
"main": [
[
{
"node": "50a26635-078f-40a7-8944-2e43ed8cd482",
"type": "main",
"index": 0
}
],
[
{
"node": "4ed0b460-70af-4f1d-a7f3-97293f9b4ce0",
"type": "main",
"index": 0
}
]
]
},
"383db4b0-9665-4608-bbf9-3dca88508bff": {
"main": [
[
{
"node": "af028132-c866-487d-be85-e3af049bc793",
"type": "main",
"index": 0
}
]
]
},
"50a26635-078f-40a7-8944-2e43ed8cd482": {
"main": [
[
{
"node": "15115588-b9ca-4e24-b7d8-f0aa0974b5dd",
"type": "main",
"index": 0
}
]
]
},
"fbf8337b-eb46-443a-8507-58a14b817be0": {
"main": [
[
{
"node": "383db4b0-9665-4608-bbf9-3dca88508bff",
"type": "main",
"index": 0
}
]
]
},
"af028132-c866-487d-be85-e3af049bc793": {
"main": [
[
{
"node": "f1642aa1-94c5-4002-a7aa-533566dd20eb",
"type": "main",
"index": 0
}
]
]
},
"85bd63e2-3039-4f0e-8721-bc2b843461c9": {
"main": [
[
{
"node": "fbf8337b-eb46-443a-8507-58a14b817be0",
"type": "main",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio - Ingeniería, Inteligencia Artificial
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
David Roberts
@davidn8nCompartir este flujo de trabajo