feat(ai): synchronize analysis quality, optimize batch performance and implement context-aware weighting

This commit is contained in:
Michael committed 2026-02-21 23:14:12 +01:00
1 parent e8cc89cb2f
commit c89e046dee
2 files changed
+32 -18

No files matched your search

+13 -8
View File
@@ -14,17 +14,22 @@ const AnalyzeSchema = z.object({
}); });
const OPENROUTER_URL = "https://openrouter.ai/api/v1/chat/completions"; const OPENROUTER_URL = "https://openrouter.ai/api/v1/chat/completions";
const SYSTEM_PROMPT = `Tu es un expert en analyse de gammes de produits B2B pour un acheteur retail professionnel. const SYSTEM_PROMPT = `Tu es un expert en stratégie d'achat retail. Ton rôle est de catégoriser ce produit (A=Permanent, C=Saisonnier, Z=Sortie) via une analyse de VALEUR CONTEXTUELLE.
En analysant les données de ventes et le SCORE de performance relative (0-100), génère une recommandation de gamme (A=Permanent, C=Saisonnier, Z=Sortie). L'IMPORTANCE ÉCONOMIQUE PRIME SUR LE SCORE DE PERFORMANCE RELATIVE.
RÈGLES CRITIQUES : HIÉRARCHIE DES CRITÈRES :
- SCORE < 20 : Signal fort de "Sortie" (Z). Même si le volume semble correct dans l'absolu, un score faible signifie que le produit sous-performe par rapport à ses pairs. 1. APPORT ÉCONOMIQUE : Analyse le CA et la Marge. S'ils sont élevés pour ce type de produit/fournisseur, le produit est stratégique (Gamme A), même si le Score est faible.
- A (Permanent) : Uniquement si la rotation est régulière ET le score est satisfaisant. 2. RÉGULARITÉ : Une rotation constante sur l'année (sales12m) est un signe fort de Gamme A.
- C (Saisonnier) : Uniquement si des pics clairs apparaissent dans l'historique. 3. PERFORMANCE RELATIVE : Le Score (0-100) est un indicateur de santé. Un score faible sur un produit qui génère du volume ne justifie PAS une sortie (Z).
Ta réponse doit être en 1-2 phrases maximum, en français, directe et actionnable. DÉFINITION :
Format: "[Recommandation]: [Justification courte basée sur les données et le score]"`; - A (Permanent) : Produit stratégique (CA/Marge significatif) OR rotation régulière.
- C (Saisonnier) : Ventes concentrées sur des pics temporels.
- Z (Sortie) : Cumul de : contribution économique insignifiante + marge faible + score médiocre + ventes sporadiques.
Réponse courte, mentionnant la contribution économique et le score. Ne mentionne aucun seuil en euros.
Format: "[Recommandation]: [Justification basée sur la valeur et le score]"`;
export async function POST(req: NextRequest) { export async function POST(req: NextRequest) {
console.log("[AI] Analysis request received."); console.log("[AI] Analysis request received.");
+19 -10
View File
@@ -39,18 +39,27 @@ export async function POST(req: NextRequest) {
const { rayon, products } = parsed.data; const { rayon, products } = parsed.data;
// Optimized System Prompt: Perfectly aligned with analyze/route.ts // Context-Aware System Prompt: Relative weighting within the batch
const systemPrompt = `Tu es un expert en analyse de gammes de produits B2B pour un acheteur retail professionnel. const systemPrompt = `Tu es un expert en stratégie d'achat retail. Ton rôle est de catégoriser les produits d'un fournisseur (A=Permanent, C=Saisonnier, Z=Sortie) en analysant leur POIDS RELATIF dans le lot fourni.
En analysant les données de ventes fournies (CA, Marge, Volume, Historique mensuel) et surtout le SCORE de performance relative (0-100), génère pour chaque produit une recommandation de gamme (A=Permanent, C=Saisonnier, Z=Sortie). L'IMPORTANCE RELATIVE AU SEIN DU LOT PRIME SUR LE SCORE DE PERFORMANCE.
CRITÈRES PRIORITAIRES : MÉTHODOLOGIE D'ANALYSE :
- SCORE < 20 : Recommandation "Z" (Sortie) quasi-obligatoire. Un score faible signifie que le produit est un fardeau par rapport aux autres produits du fournisseur. 1. ANALYSE DU LOT : Identifie les produits qui portent le business du fournisseur (Top contributeurs en CA et Marge au sein de ce groupe).
- A (Permanent) : Produit avec une rotation régulière ET un score satisfaisant (> 35). 2. RÈGLE D'OR (PROTECTION DES PILIERS) : Un produit avec une contribution significative (ex: dans les 20% supérieurs du lot en CA ou Marge) est stratégique (Gamme A). Son Score faible indique un besoin d'optimisation, PAS une sortie (Z).
- C (Saisonnier) : Pics de ventes concentrés sur l'historique (sales12m). Aide-toi de la nomenclature. 3. HIÉRARCHIE DÉCISIONNELLE :
- Z (Sortie) : Ventes nulles, rotation insuffisante ou score médiocre. a. Poids relatif dans le lot (CA/Marge %) -> Priorité 1
b. Régularité des ventes (sales12m) -> Priorité 2
c. Performance relative (Score 0-100) -> Priorité 3 (Simple indicateur de santé).
DÉFINITION DES GAMMES :
- A (Permanent) : Produit "pilier" par son poids relatif OU sa rotation régulière.
- C (Saisonnier) : Pics de ventes saisonniers clairs.
- Z (Sortie) : Cumul de : poids insignifiant dans le lot + marge faible + score médiocre + ventes sporadiques.
IMPORTANT : RÉPONDS UNIQUEMENT EN JSON VALIDE. IMPORTANT : RÉPONDS UNIQUEMENT EN JSON VALIDE.
La justification doit obligatoirement situer le produit par rapport au reste du lot (ex: "Top 10% du CA du lot"). Ne donne aucun seuil en euros.
Format: Format:
{ {
"results": [ "results": [
@@ -58,12 +67,12 @@ Format:
"codein": "ID", "codein": "ID",
"recommandationGamme": "A|C|Z", "recommandationGamme": "A|C|Z",
"isDuplicate": boolean, "isDuplicate": boolean,
"justificationCourte": "..." "justificationCourte": "Justification incluant le poids relatif (ex: 'Top contributeur CA du lot, à protéger')."
} }
] ]
} }
Données fournies : codein, nom, ca (€), ventes (unités), marge (%), score (0-100), codeGamme (actuel), sales12m (historique par mois), nomenclature.`; Données : codein, nom, ca (€), ventes (unités), marge (%), score (0-100), codeGamme (actuel), sales12m (historique), nomenclature.`;
const userPrompt = `Analyse cette liste de produits: \n${JSON.stringify(products, null, 2)} `; const userPrompt = `Analyse cette liste de produits: \n${JSON.stringify(products, null, 2)} `;