Métriques d'évaluation : Similitude des réponses

Avancé

Ceci est unEngineering, AIworkflow d'automatisation du domainecontenant 21 nœuds.Utilise principalement des nœuds comme Set, Code, Merge, SplitOut, Aggregate, combinant la technologie d'intelligence artificielle pour une automatisation intelligente. Indicateur d'évaluation : Similarité des réponses

Prérequis
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "meta": {
    "instanceId": "408f9fb9940c3cb18ffdef0e0150fe342d6e655c3a9fac21f0f644e8bedabcd9"
  },
  "nodes": [
    {
      "id": "c5365531-2d66-4e67-9db2-37059e9e97a3",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -1512,
        420
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "8gccIjcuf3gvaoEr",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3881b831-b575-4b2f-8ebb-ac956a714f10",
      "name": "Lors de la récupération d'une ligne de jeu de données",
      "type": "n8n-nodes-base.evaluationTrigger",
      "position": [
        -2040,
        100
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1176192270,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y/edit#gid=1176192270",
          "cachedResultName": "Similarity"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y/edit?usp=drivesdk",
          "cachedResultName": "96. Evaluations Test"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "XHvC7jIRR8A2TlUl",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "dd5a14f7-7321-4dfd-9f08-1f35efba1a07",
      "name": "Remapper les entrées",
      "type": "n8n-nodes-base.set",
      "position": [
        -1820,
        100
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "00924b90-278f-49f5-80f2-c297df0fcc97",
              "name": "chatInput",
              "type": "string",
              "value": "={{ $json.input }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "78d87631-7d52-4fbb-9313-f47263bd101f",
      "name": "Évaluation",
      "type": "n8n-nodes-base.evaluation",
      "position": [
        -1180,
        200
      ],
      "parameters": {
        "operation": "checkIfEvaluating"
      },
      "typeVersion": 4.6
    },
    {
      "id": "1d8b12ba-ec63-4f92-a4dc-1885cbcd4d95",
      "name": "Définir les champs d'entrée",
      "type": "n8n-nodes-base.set",
      "position": [
        -960,
        100
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d58952c1-d346-4fbf-881e-d5c04b6781a5",
              "name": "question",
              "type": "string",
              "value": "={{ $('When fetching a dataset row').first().json.input }}"
            },
            {
              "id": "0f10a3d0-cf6e-4715-9ded-2cee54aa62ec",
              "name": "answer",
              "type": "string",
              "value": "={{ $json.output }}"
            },
            {
              "id": "edbe42ed-36a7-438a-989f-900673e61d0f",
              "name": "groundTruth",
              "type": "array",
              "value": "={{ $('When fetching a dataset row').first().json['ground truth'].split('\\n') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "518cecea-9bcc-47dd-83b1-73ef0880e808",
      "name": "Aucune opération, ne rien faire",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -960,
        300
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c1a9cf2f-8e5d-4db9-a29b-b426e1932ab3",
      "name": "Agent IA",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -1600,
        200
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "6c5602d1-59c0-479e-b9aa-fb8ce037d4b1",
      "name": "Lors de la réception d'un message de chat",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -1820,
        300
      ],
      "webhookId": "ba1fadeb-b566-469a-97b3-3159a99f1805",
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "6fb01095-7b93-41dd-8d7c-364cb685ddbb",
      "name": "Mettre à jour la sortie",
      "type": "n8n-nodes-base.evaluation",
      "position": [
        520,
        300
      ],
      "parameters": {
        "outputs": {
          "values": [
            {
              "outputName": "output",
              "outputValue": "={{ $('Set Input Fields').item.json.answer }}"
            },
            {
              "outputName": "score",
              "outputValue": "={{ $json.score }}"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1176192270,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y/edit#gid=1176192270",
          "cachedResultName": "Similarity"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y/edit?usp=drivesdk",
          "cachedResultName": "96. Evaluations Test"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "XHvC7jIRR8A2TlUl",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "18e8dbb6-df98-4d36-9686-9ec481a37754",
      "name": "Mettre à jour les métriques",
      "type": "n8n-nodes-base.evaluation",
      "position": [
        700,
        300
      ],
      "parameters": {
        "metrics": {
          "assignments": [
            {
              "id": "1fd7759c-f4ef-4eda-87ad-9d9563b63e99",
              "name": "score",
              "type": "number",
              "value": "={{ $json.score }}"
            }
          ]
        },
        "operation": "setMetrics"
      },
      "typeVersion": 4.6
    },
    {
      "id": "a685c9e7-0b21-4873-a502-5826a916e31f",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2120,
        -120
      ],
      "parameters": {
        "color": 7,
        "width": 840,
        "height": 720,
        "content": "## 1. Setup Your AI Workflow to Use Evaluations\n[Learn more about the Evaluations Trigger](https://docs.n8n.io/integrations/builtin/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.evaluationTrigger)\n\nThe Evaluations Trigger is a separate execution which does not affect your production workflow in any way. It is manually triggered and automatically pulled datasets from the assigned Google Sheet."
      },
      "typeVersion": 1
    },
    {
      "id": "2e57d911-8fef-456d-8e5c-3849350553e1",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1240,
        -120
      ],
      "parameters": {
        "color": 7,
        "width": 1700,
        "height": 720,
        "content": "## 2. Answer Similarity: How similar is the AI response to the Ground Truth?\n[Learn more about the Evaluations Trigger](https://docs.n8n.io/integrations/builtin/?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link&utm_campaign=n8n-nodes-base.evaluationTrigger)\n\nFor this evaluation, we want to do a simple check to see how similar the AI's response is to the ground truth.\nThis test is most effective for closed-ended questions where there can be little to no deviation in the answers. "
      },
      "typeVersion": 1
    },
    {
      "id": "9962bbf8-01bc-463c-ad3b-499618c5b1f9",
      "name": "Note adhésive3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2580,
        -120
      ],
      "parameters": {
        "width": 420,
        "height": 720,
        "content": "## Try It Out!\n### This n8n template demonstrates how to calculate the evaluation metric \"Similarity\" which in this scenario, measures the consistency of the agent.\n\nThe scoring approach is adapted from [https://github.com/explodinggradients/ragas/blob/main/ragas/src/ragas/metrics/_answer_similarity.py](https://github.com/explodinggradients/ragas/blob/main/ragas/src/ragas/metrics/_answer_similarity.py)\n\n### How it works\n* This evaluation works best where questions are close-ended or about facts where the answer can have little to no deviation.\n* For our scoring, we generate embeddings for both the AI's response and ground truth and calculate the cosine similarity between them.\n* A high score indicates LLM consistency with expected results whereas a low score could signal model hallucination.\n\n### Requirements\n* n8n version 1.94+\n* Check out this Google Sheet for a sample data [https://docs.google.com/spreadsheets/d/1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y/edit?usp=sharing](https://docs.google.com/spreadsheets/d/1YOnu2JJjlxd787AuYcg-wKbkjyjyZFgASYVV0jsij5Y/edit?usp=sharing)\n\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)!\n\nHappy Hacking!"
      },
      "typeVersion": 1
    },
    {
      "id": "47699677-545f-4eca-8b46-89c6862a56f1",
      "name": "Obtenir les embeddings",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -520,
        300
      ],
      "parameters": {
        "url": "https://api.openai.com/v1/embeddings",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "input",
              "value": "={{ $json.groundTruth }}"
            },
            {
              "name": "model",
              "value": "text-embedding-3-small"
            },
            {
              "name": "encoding_format",
              "value": "float"
            }
          ]
        },
        "nodeCredentialType": "openAiApi"
      },
      "credentials": {
        "openAiApi": {
          "id": "8gccIjcuf3gvaoEr",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "1a022046-80f2-4df3-b075-be8e9294b951",
      "name": "GroundTruth vers Items",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -720,
        300
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "groundTruth"
      },
      "typeVersion": 1
    },
    {
      "id": "0cea3a79-23ab-4d0f-9c6c-2522af6a506f",
      "name": "Obtenir les embeddings1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -520,
        100
      ],
      "parameters": {
        "url": "https://api.openai.com/v1/embeddings",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "input",
              "value": "={{ $json.answer }}"
            },
            {
              "name": "model",
              "value": "text-embedding-3-small"
            },
            {
              "name": "encoding_format",
              "value": "float"
            }
          ]
        },
        "nodeCredentialType": "openAiApi"
      },
      "credentials": {
        "openAiApi": {
          "id": "8gccIjcuf3gvaoEr",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "1b5740cc-4b79-4690-88ae-fa31c5a1c16c",
      "name": "Agréger",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        -120,
        300
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "groundTruth"
      },
      "typeVersion": 1
    },
    {
      "id": "d32f979b-7d96-4730-8324-de0d34ed659a",
      "name": "Remapper les embeddings",
      "type": "n8n-nodes-base.set",
      "position": [
        -320,
        100
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "3db07c98-f926-46e0-85f2-ed1eb137f842",
              "name": "answer",
              "type": "array",
              "value": "={{ $json.data[0].embedding }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "188864fb-3d6a-4c01-9d23-73c731de023d",
      "name": "Remapper les embeddings1",
      "type": "n8n-nodes-base.set",
      "position": [
        -320,
        300
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "3db07c98-f926-46e0-85f2-ed1eb137f842",
              "name": "data",
              "type": "array",
              "value": "={{ $json.data[0].embedding }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5cc6c1c7-240b-4129-b57a-e7d0ef2e72e6",
      "name": "Créer un résultat d'embeddings",
      "type": "n8n-nodes-base.merge",
      "position": [
        80,
        300
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.1
    },
    {
      "id": "7aa037d2-31a6-4efe-81b1-26a95c4c6d38",
      "name": "Calculer le score de similarité",
      "type": "n8n-nodes-base.code",
      "position": [
        280,
        300
      ],
      "parameters": {
        "jsCode": "const { answer, groundTruth = [] } = $input.item.json;\n\nconst scores = await Promise.all(groundTruth.map(truth =>\n  cosineSimilarity(answer, truth.data)\n));\n\nconst averageScore = scores.reduce((acc,i) => acc + i, 0) / scores.length;\n\nreturn { json: { score: averageScore } };\n\nfunction cosineSimilarity(a, b) {  \n  let dotProduct = normA = normB = 0;\n  for (let i = 0; i < a.length; i++) {\n    dotProduct += a[i] * b[i];\n    normA += a[i] ** 2;\n    normB += b[i] ** 2;\n  }\n  return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));\n}"
      },
      "typeVersion": 2
    }
  ],
  "pinData": {},
  "connections": {
    "c1a9cf2f-8e5d-4db9-a29b-b426e1932ab3": {
      "main": [
        [
          {
            "node": "78d87631-7d52-4fbb-9313-f47263bd101f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1b5740cc-4b79-4690-88ae-fa31c5a1c16c": {
      "main": [
        [
          {
            "node": "5cc6c1c7-240b-4129-b57a-e7d0ef2e72e6",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "78d87631-7d52-4fbb-9313-f47263bd101f": {
      "main": [
        [
          {
            "node": "1d8b12ba-ec63-4f92-a4dc-1885cbcd4d95",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "518cecea-9bcc-47dd-83b1-73ef0880e808",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "dd5a14f7-7321-4dfd-9f08-1f35efba1a07": {
      "main": [
        [
          {
            "node": "c1a9cf2f-8e5d-4db9-a29b-b426e1932ab3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6fb01095-7b93-41dd-8d7c-364cb685ddbb": {
      "main": [
        [
          {
            "node": "18e8dbb6-df98-4d36-9686-9ec481a37754",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "47699677-545f-4eca-8b46-89c6862a56f1": {
      "main": [
        [
          {
            "node": "188864fb-3d6a-4c01-9d23-73c731de023d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0cea3a79-23ab-4d0f-9c6c-2522af6a506f": {
      "main": [
        [
          {
            "node": "d32f979b-7d96-4730-8324-de0d34ed659a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d32f979b-7d96-4730-8324-de0d34ed659a": {
      "main": [
        [
          {
            "node": "5cc6c1c7-240b-4129-b57a-e7d0ef2e72e6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1d8b12ba-ec63-4f92-a4dc-1885cbcd4d95": {
      "main": [
        [
          {
            "node": "0cea3a79-23ab-4d0f-9c6c-2522af6a506f",
            "type": "main",
            "index": 0
          },
          {
            "node": "1a022046-80f2-4df3-b075-be8e9294b951",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "188864fb-3d6a-4c01-9d23-73c731de023d": {
      "main": [
        [
          {
            "node": "1b5740cc-4b79-4690-88ae-fa31c5a1c16c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c5365531-2d66-4e67-9db2-37059e9e97a3": {
      "ai_languageModel": [
        [
          {
            "node": "c1a9cf2f-8e5d-4db9-a29b-b426e1932ab3",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "1a022046-80f2-4df3-b075-be8e9294b951": {
      "main": [
        [
          {
            "node": "47699677-545f-4eca-8b46-89c6862a56f1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5cc6c1c7-240b-4129-b57a-e7d0ef2e72e6": {
      "main": [
        [
          {
            "node": "7aa037d2-31a6-4efe-81b1-26a95c4c6d38",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7aa037d2-31a6-4efe-81b1-26a95c4c6d38": {
      "main": [
        [
          {
            "node": "6fb01095-7b93-41dd-8d7c-364cb685ddbb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6c5602d1-59c0-479e-b9aa-fb8ce037d4b1": {
      "main": [
        [
          {
            "node": "c1a9cf2f-8e5d-4db9-a29b-b426e1932ab3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3881b831-b575-4b2f-8ebb-ac956a714f10": {
      "main": [
        [
          {
            "node": "dd5a14f7-7321-4dfd-9f08-1f35efba1a07",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Ingénierie, Intelligence Artificielle

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds21
Catégorie2
Types de nœuds13
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Jimleuk

Jimleuk

@jimleuk

Freelance consultant based in the UK specialising in AI-powered automations. I work with select clients tackling their most challenging projects. For business enquiries, send me an email at hello@jimle.uk LinkedIn: https://www.linkedin.com/in/jimleuk/ X/Twitter: https://x.com/jimle_uk

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34