Hier tonen we hoe je kan interageren met ChatGPT om een financiële analyse op te vragen op basis van jaarrekeningen in NBB - wettelijk formaat. Dit vereist de installatie van de plugin MercatorAI.OpenAI en werkt alleen met een Core-versie van Mercator. (De code is echter ook compileerbaar in een klassieke versie).
Deze code voegt het volgende item toe aan het contextmenu:

Hiermee kan de analyseaanvraag worden gestart. Er wordt een chatvenster geopend. Het is mogelijk om het gesprek voort te zetten door een bericht in te geven onderaan het scherm en op "Ondervragen" te klikken.
De code is als volgt:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Windows.Forms;
// <CompileWithRoslyn />
namespace Main
{
public class Customizer : MercatorUi.ICustomizers.IExec
{
public void Main(MercatorUi.ICustomizers.ExecAction action)
{
if (action == MercatorUi.ICustomizers.ExecAction.DossierOpen)
{
Globals.Main.BaseFormCreating += Main_BaseFormCreating;
}
else if (action == MercatorUi.ICustomizers.ExecAction.DossierClose)
{
Globals.Main.BaseFormCreating -= Main_BaseFormCreating;
}
}
void Main_BaseFormCreating(object sender, MercatorUi.Main.BaseFormCreatingEventArgs e)
{
if (e.Form is MercatorUi.Forms.Accounting.AccountingBilanForm accountingBilanForm)
{
ToolStripMenuItem mi_analysis = new ToolStripMenuItem(_Divers.Iif_langue(Globals.Langue, "Financiële Analyse", "Financial Analysis", "Financiële Analyse", "Analyse Financière"), GraphicKit.CurrentGraphicKit.Images.AI16,
(s, e2) =>
{
string title = ((ToolStripMenuItem)s).Text + " " + accountingBilanForm.Tree.Columns[2].Text + (accountingBilanForm.WithYear2 ? "-" + accountingBilanForm.Tree.Columns[3].Text : "");
string legislat;
if (Globals.Params["LEGISLAT"] == "LU")
legislat = _Divers.Iif_langue(accountingBilanForm.Langue, "luxemburgischem", "Luxembourg", "Luxemburgse", "luxembourgeoise");
else
legislat = _Divers.Iif_langue(accountingBilanForm.Langue, "belgischem", "Belgian", "Belgische", "belge");
string systemMessage = _Divers.Iif_langue(accountingBilanForm.Langue,
$"Du bist ein Experte für Finanzanalyse und analysierst die Bilanz gemäß {legislat} Recht, wie unten dargestellt.\n",
$"You are an expert in financial analysis and you are analyzing the balance sheet under {legislat} legislation as shown below.\n",
$"Je bent een expert in financiële analyse en je analyseert de balans volgens de {legislat} wetgeving zoals hieronder weergegeven.\n",
$"Tu es un expert en analyse financière et tu analyses le bilan en législation {legislat} repris ci-dessous.\n")
+ accountingBilanForm.Text + "\n";
if (accountingBilanForm.WithYear2)
systemMessage += _Divers.Iif_langue(accountingBilanForm.Langue,
"Tot1 enthält den Saldo des Bilanzjahres. Tot2 enthält den Saldo des Vorjahres.\n",
"Tot1 contains the balance for the year of the balance sheet. Tot2 contains the balance for the previous year.\n",
"Tot1 bevat het saldo van het boekjaar van de balans. Tot2 bevat het saldo van het voorgaande jaar.\n",
"Tot1 contient le solde de l'année du bilan. Tot2 contient le solde de l'année précédente.\n");
else
systemMessage += _Divers.Iif_langue(accountingBilanForm.Langue,
"Tot1 enthält den Saldo des Bilanzjahres.\n",
"Tot1 contains the balance for the year of the balance sheet.\n",
"Tot1 bevat het saldo van het boekjaar van de balans.\n",
"Tot1 contient le solde de l'année du bilan.\n");
systemMessage += _Divers.Iif_langue(accountingBilanForm.Langue,
"Sie antworten AUSSCHLIESSLICH in Markdown.",
"You answer EXCLUSIVELY in Markdown.",
"Je antwoordt UITSLUITEND in Markdown.",
"Tu réponds EXCLUSIVEMENT en Markdown.");
systemMessage += "\n\n" + accountingBilanForm.JsonData;
string question = _Divers.Iif_langue(accountingBilanForm.Langue,
"Kannst du die Analyse dieser Bilanz mit den üblichen Kennzahlen durchführen und mich über eventuelle Auffälligkeiten informieren, die du feststellen würdest?",
"Can you perform the analysis of this balance sheet using the usual ratios and inform me of any anomalies you might detect?",
"Kan je de analyse van deze balans uitvoeren met de gebruikelijke ratio’s en me informeren over eventuele anomalieën die je zou detecteren?",
"Peux-tu effectuer l'analyse de ce bilan avec les ratios habituels et m'informer des anomalies que tu détecterais.");
MercatorAI.FactoryOpenAI.ChatOptions chatOptions = new MercatorAI.FactoryOpenAI.ChatOptions
{
Temperature = 0.2f, // lichte variatie toestaan
TopP = 1.0f
};
MercatorUi.Forms.Other.ChatForm.SimpleOpenAiChat("gpt-4o", title, systemMessage, question, autoAskFirstQuestion: false, chatOptions: chatOptions, userControl: null, responseUpdater: null, standardStreamingAction: MercatorUi.Forms.Other.ChatForm.StandardStreamingActionEnum.RawStreamShow);
});
EventHandler fullInitializedHandler = null;
fullInitializedHandler = (s, e2) =>
{
accountingBilanForm.FullInitialized -= fullInitializedHandler;
if (accountingBilanForm.Type == MercatorUi.Forms.Accounting.AccountingBilanForm.BilanType.Legal)
accountingBilanForm.Tree.ContextMenuStrip.Items.AddRange(new ToolStripItem[] { new ToolStripSeparator(), mi_analysis });
};
accountingBilanForm.FullInitialized += fullInitializedHandler;
}
}
}
}
De informatie wordt verzonden naar een derde partij (OpenAI). Er mogen dus geen vertrouwelijke gegevens worden doorgestuurd.
De analyse en/of suggesties die door deze code worden gegenereerd, zijn automatisch gegenereerd met behulp van een model voor kunstmatige intelligentie (AI). Hoewel ze ontworpen zijn om nuttige en relevante antwoorden te geven, kunnen deze onvolledig, onnauwkeurig, gedeeltelijk of volledig zijn.