Métriques d'évaluation : Similitude des réponses
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
- •Peut nécessiter les informations d'identification d'authentification de l'API cible
- •Clé API OpenAI
Nœuds utilisés (21)
Catégorie
{
"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
}
]
]
}
}
}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.
Workflows recommandés
Jimleuk
@jimleukFreelance 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
Partager ce workflow