[{"content":"","externalUrl":null,"permalink":"/Portfolio/projektstart/","section":"","summary":"","title":"","type":"projektstart"},{"content":"","externalUrl":null,"permalink":"/Portfolio/sparring/","section":"","summary":"","title":"","type":"sparring"},{"content":" Refleksion over specifikationer i AI-drevet udvikling # AI-drevet udvikling ændrer måden, vi arbejder med software på. Hvor udviklere tidligere brugte størstedelen af tiden på at skrive kode manuelt, kan AI i dag generere store dele af implementeringen ud fra beskrivelser og instruktioner. Derfor bliver specifikationer vigtigere end nogensinde før. Når AI skal hjælpe med udvikling, er kvaliteten af resultatet nemlig tæt knyttet til kvaliteten af de krav og beskrivelser, der gives. At arbejde med specifikationer i AI-drevet udvikling handler ikke kun om at definere funktionelle krav. Det handler også om at formulere kontekst, forventninger, begrænsninger og ønsket adfærd på en præcis måde. Hvis specifikationen er uklar, vil AI ofte producere løsninger, der virker teknisk korrekte, men som ikke passer til brugerens behov eller projektets mål. På den måde bliver specifikationer et centralt kommunikationsværktøj mellem menneske og AI. Samtidig kræver AI-drevet udvikling en mere iterativ tilgang til specifikationer. I stedet for at skrive en fuldstændig kravspecifikation fra starten kan man arbejde i mindre trin, hvor specifikationer løbende forbedres gennem test, feedback og nye prompts. AI gør det muligt hurtigt at afprøve ideer, men det stiller også krav til kritisk vurdering af de løsninger, der genereres. Derfor bliver refleksion og kvalitetssikring en vigtig del af processen. Fremover vil jeg inddrage specifikationer mere aktivt i projekter ved at bruge dem som et dynamisk arbejdsredskab gennem hele udviklingsforløbet. Jeg vil fokusere på at beskrive både funktionelle krav, brugeroplevelse og tekniske rammer tydeligt, så AI-værktøjer får et bedre grundlag for at generere relevante løsninger. Derudover vil jeg arbejde mere iterativt med specs, hvor krav løbende justeres på baggrund af feedback og test af AI-genererede løsninger. Jeg ser også et potentiale i at bruge specifikationer som dokumentation og fælles referencepunkt i samarbejde mellem mennesker og AI. Jo mere præcise og gennemtænkte specifikationerne er, desto større er sandsynligheden for at udviklingsprocessen bliver effektiv, gennemsigtig og giver et bedre slutresultat.\n","externalUrl":null,"permalink":"/Portfolio/spec-driven-dev/","section":"","summary":"","title":"","type":"spec-driven-dev"},{"content":"Kodeagenter er AI-systemer, der ikke bare besvarer spørgsmål, men aktivt kan skrive, køre, debugge og refaktorere kode. I stedet for at fungere som et avanceret autocomplete arbejder de som en samarbejdspartner, der forstår et helt projekts kontekst og kan tage beslutninger på tværs af filer.\nHvad er en kodeagent? # En kodeagent kombinerer en stor sprogmodel med evnen til at:\nLæse og skrive filer direkte i projektet Køre kommandoer i terminalen og reagere på output Søge i kodebasen for at forstå arkitektur og afhængigheder Iterere selvstændigt – fejler noget, prøver agenten igen Det adskiller sig fra et simpelt chatvindue, fordi agenten opererer i dit faktiske udviklingsmiljø.\nDe agenter vi arbejdede med # Claude Code (Anthropic) # Claude Code kører direkte i terminalen og har adgang til hele arbejdsbiblioteket. Den er stærk til at forstå store kodebaser og forklare sine valg undervejs. Den er særligt god til refactoring og arkitekturspørgsmål, fordi den holder et overblik over sammenhænge på tværs af filer.\nOpenAI Codex # Codex er OpenAI\u0026rsquo;s kodespecialiserede model og grundlaget for GitHub Copilot. Den er hurtig til at generere kodeblokke og fungerer godt til velafgrænsede opgaver. Vi brugte den via CLI-interfacet til at sammenligne dens output direkte med Claude\u0026rsquo;s.\nHvad vi lavede i undervisningen # Trin 1: Introduktion og sammenligning # Vi startede med en gennemgang af, hvad kodeagenter overhovedet er, og hvordan Claude og Codex adskiller sig i tilgang og arkitektur. Hvornår er den ene bedre end den anden? Hvad koster det at køre dem? Og hvad betyder det egentlig, at en model er \u0026ldquo;agent\u0026rdquo; frem for blot \u0026ldquo;assistent\u0026rdquo;?\nTrin 2: Cupcake-projektet # Som skolen har et eksisterende cupcake-projekt – en webapplikation vi kender fra tidligere undervisning – brugte vi det som benchmark. Vi bad først Claude Code om at implementere projektet fra bunden og observerede, hvordan den navigerede opgaven: hvilke filer den oprettede, hvilke valg den traf om struktur, og hvor den bad om afklaring.\nDerefter gentog vi øvelsen med Codex og løste den samme opgave.\nSammenligning af resultaterne:\nKriterium Claude Code Codex Kodestruktur Organiseret i lag, fulgte MVC Mere direkte, færre lag Forklaringer undervejs Detaljerede kommentarer Kortere, mere kodecentreret Fejlhåndtering Proaktiv – tilføjede validering selv Tilføjede det vi bad om Samlet indtryk God til komplekse arkitekturbeslutninger Hurtig til afgrænsede opgaver Det var tydeligt, at de to agenter har forskellig \u0026ldquo;stil\u0026rdquo; – Claude tenderer mod at tænke i helheden, mens Codex er mere direkte og effektiv til velspecificerede delproblemer.\nTrin 3: Meditationsopgaven # Vores lærer stillede os en selvstændig opgave: vi skulle vælge en kodeagent og bruge den til at bygge en quiz inspireret af en eksisterende meditationshjemmeside – i hvert vores helt nye projekt. Formålet var at undersøge, hvordan det egentlig er at arbejde med en agent på en opgave man ikke selv har specificeret til mindste detalje.\nJeg valgte Claude Code og brugte den til at bygge quizzen fra bunden i et nyt projekt. Erfaringerne:\nHvad gik godt: Agenten hjalp med at strukturere applikationen og foreslog fornuftige løsninger, jeg ikke selv havde tænkt på. Den var god til at holde styr på sammenhængen, efterhånden som projektet voksede. Hvad var udfordrende: Det krævede præcise prompts. Var opgaven for åben, tog agenten beslutninger, der ikke altid passede til mine intentioner – og så skulle jeg bruge tid på at korrigere kursen. Konklusion: Kodeagenter er stærke redskaber, men de kræver, at man som udvikler stadig tager ansvar for arkitekturen og retningen. Agenten er en produktiv samarbejdspartner – ikke en erstatning for at tænke selv. Samarbejde mellem udvikler og agent # Den vigtigste lektie fra undervisningen var, at den bedste brug af kodeagenter ikke er at \u0026ldquo;bare lade den køre\u0026rdquo;. Det effektive mønster er:\nUdvikler definerer mål og afgrænsning – hvad skal løses, og hvad er out of scope? Agent genererer et forslag – kode, arkitektur, tests Udvikler reviewer og godkender – forstår du koden, inden du accepterer den? Iteration – stil opfølgende spørgsmål, bed om alternativer, juster Kodeagenter fremskynder det tekniske arbejde markant, men den faglige vurdering forbliver udviklerens ansvar.\n","externalUrl":null,"permalink":"/Portfolio/kodeagenter/","section":"AI-baserede Kodeagenter","summary":"","title":"AI-baserede Kodeagenter","type":"kodeagenter"},{"content":"","externalUrl":null,"permalink":"/Portfolio/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/Portfolio/","section":"Blowfish","summary":"","title":"Blowfish","type":"page"},{"content":"","externalUrl":null,"permalink":"/Portfolio/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":" Velkommen til min portfolio! # Jeg er datamatikerstuderende på 4. semester og synes det er fedt at kode. Her på siden kan du se et udvalg af mine projekter.\nMine Kompentencer # Sprog: Java, JavaScript, C#(Unity) Værktøjer: Git, Docker Projekter # Meditation Quiz # Et quiz-projekt bygget med hjælp fra en AI-kodeagent som del af undervisningen i kodeagenter.\nSe projektet på GitHub\n","externalUrl":null,"permalink":"/Portfolio/portfolio/","section":"Datamatiker Portfolio","summary":"","title":"Datamatiker Portfolio","type":"portfolio"},{"content":" Valget: lokal LLM frem for eksternt API # Til dette projekt valgte jeg at køre min sprogmodel lokalt via Ollama frem for at kalde et eksternt API som OpenAI eller Anthropic. Grunden er simpel: et eksternt API koster penge per token, og da jeg primært bruger dette til udvikling og læring, ville omkostningerne hurtigt løbe op.\nJeg er godt klar over, at en lokal model som llama3.2 ikke er på niveau med f.eks. GPT-4 eller Claude – svarene er generelt mindre nuancerede, og modellen klarer komplekse ræsonnementer dårligere. Det er en bevidst afvejning jeg ofrer noget svarkvalitet for til gengæld at kunne eksperimentere frit uden at tænke på udgifter.\nArkitekturen # Jeg har bygget et lille FastAPI-lag, der sidder imellem min applikation og den lokale Ollama-server. Det giver mig ét samlet sted at styre hvilken model der bruges, hvilken systemprompt der sendes med, og hvordan fejl håndteres.\nKlient → FastAPI (/ask) → Ollama (localhost:11434) → llama3.2 ↑ systemprompt fra .md-fil Implementeringen # Endpointet /ask modtager en prompt og et valgfrit modelnavn, læser systemprompt fra en ekstern markdown-fil og videresender det hele til Ollamas /api/generate:\n@app.post(\u0026#34;/ask\u0026#34;) def ask_local_llm(request: PromptRequest): url = \u0026#34;http://localhost:11434/api/generate\u0026#34; system_prompt = \u0026#34;\u0026#34; try: with open(\u0026#34;prompts/praktik_system_prompt.md\u0026#34;, \u0026#34;r\u0026#34;, encoding=\u0026#34;utf-8\u0026#34;) as f: system_prompt = f.read() except FileNotFoundError: print(\u0026#34;Advarsel: Kunne ikke finde system prompt filen.\u0026#34;) payload = { \u0026#34;model\u0026#34;: request.model, # standard: \u0026#34;llama3.2\u0026#34; \u0026#34;prompt\u0026#34;: request.prompt, \u0026#34;system\u0026#34;: system_prompt, \u0026#34;stream\u0026#34;: False } response = requests.post(url, json=payload) response.raise_for_status() data = response.json() return {\u0026#34;response\u0026#34;: data.get(\u0026#34;response\u0026#34;, \u0026#34;Intet svar fundet i JSON\u0026#34;)} Ollama returnerer et JSON-objekt, og jeg trækker svaret ud via data.get(\u0026quot;response\u0026quot;). Hvis Ollama ikke er tilgængelig, kastes en HTTPException med en beskrivende fejlbesked.\nSystemprompt fra fil # I stedet for at hardcode systempromptens indhold direkte i koden læser jeg den fra en separat .md-fil. Det gør det nemt at justere modellens rolle og adfærd uden at ændre i Python-koden – man redigerer blot filen og genstarter endpointet.\nHvad jeg ville have gjort anderledes med et eksternt API # Havde jeg valgt et eksternt API, ville flowet have været næsten identisk – forskellen er primært:\nAutentifikation: en API-nøgle i en miljøvariabel i stedet for ingen autentifikation til localhost. Svarformat: OpenAI og Anthropic bruger choices[0].message.content frem for response. Svarqualitet: markant bedre, særligt på komplekse eller flersprogede opgaver. Arkitekturen med et FastAPI-lag imellem gør det let at skifte fra lokal til ekstern model på et senere tidspunkt – man ændrer blot URL og payload-format et sted.\n","externalUrl":null,"permalink":"/Portfolio/llm-api-implementering/","section":"LLM API-implementering","summary":"","title":"LLM API-implementering","type":"llm-api-implementering"},{"content":"En stor sprogmodel (LLM) behøver ikke bo lokalt i din applikation. De fleste udbydere – Anthropic, OpenAI, Google m.fl. – stiller deres modeller til rådighed via et HTTP API, som du kan kalde fra næsten ethvert programmeringssprog. Det betyder, at du kan tilføje AI-funktioner til en eksisterende applikation uden at håndtere modelhosting selv.\nHvad er et LLM-API? # Et LLM-API er en REST-tjeneste, der modtager en besked (en prompt) og returnerer modellens svar som JSON. Konceptuelt ligner det et hvilket som helst andet web-API:\nDu sender en HTTP POST-request med din prompt og eventuelle parametre. Serveren sender prompten videre til modellen. Du modtager svaret og bruger det i din applikation. Det kræver som regel en API-nøgle til autentifikation, og du betaler per token (omtrent per ord) du sender og modtager.\nSystemprompt: sæt konteksten # Med en system-parameter kan du fortælle modellen, hvilken rolle den skal spille:\nSystemprompten styrer tone, sprog og begrænsninger uden at det er synligt for brugeren.\nHvad kan du bruge det til? # API-adgang åbner op for at bygge AI-funktioner direkte ind i dine egne applikationer:\nTekstgenerering og -opsummering # Send et langt dokument og bed modellen om et kort resume. Nyttigt til nyheder, rapporter eller mødereferater.\nStruktureret output # Ofte vil du have modellens svar i et bestemt format, f.eks. JSON, så du kan behandle det programmatisk. Det gøres ved at bede om det direkte i prompten:\nPraktiske hensyn # Omkostninger: Du betaler per token. Brug max_tokens til at begrænse udgifterne, og hold systemprompts korte.\nLatency: Et API-kald tager typisk 0,5–3 sekunder. Til realtidsapplikationer kan du bruge streaming, så svar vises løbende mens modellen genererer dem.\nSikkerhed: Gem aldrig API-nøglen direkte i koden – brug miljøvariabler (os.environ[\u0026quot;ANTHROPIC_API_KEY\u0026quot;]) eller en secrets manager.\nFejlhåndtering: API\u0026rsquo;er kan returnere fejl (rate limits, netværksfejl). Implementér retry-logik og fald-back-beskeder til brugeren.\nOpsummering # At kalde et LLM-API er ikke mere kompliceret end at kalde et hvhert andet web-API. De tre kerneelementer er:\nEn systemprompt der definerer modellens rolle og begrænsninger En brugerbesked med det konkrete input Parsing af svaret til brug i din applikation Derfra er mulighederne brede: opsummering, klassifikation, oversættelse, kodegenering, chatbots – alt hvad der kan beskrives som et sprogligt input/output-problem kan løses med et LLM-API.\n","externalUrl":null,"permalink":"/Portfolio/llm-api-integration/","section":"LLM API-integration","summary":"","title":"LLM API-integration","type":"llm-api-integration"},{"content":" Udforskning af RAG til vores egen chatbot # Vi har arbejdet på at skabe vores egen chatbot ved hjælp af Retrieval-Augmented Generation (RAG) baseret på vores egen vidensbase. For at finde den bedste løsning har vi afprøvet tre forskellige værktøjer og platforme:\n1. ChatGPT\u0026rsquo;s Indbyggede RAG (Custom GPT) # Vi startede med at bygge en Custom GPT direkte gennem OpenAI\u0026rsquo;s interface.\nBeskrivelse: Gør det muligt at uploade egne dokumenter og filer direkte, hvorefter ChatGPT automatisk søger i dataen for at understøtte sine svar. Styrker: Det er utroligt hurtigt at sætte op og kræver ingen kodning. Det er en fantastisk måde at prototype og teste på. Oplevelse: Perfekt til intern brug og for hurtigt at mærke \u0026ldquo;magien\u0026rdquo; ved RAG, men begrænset i forhold til integrationer på egne hjemmesider. 2. CustomGPT.ai # For at få en mere dedikeret og skræddersyet løsning testede vi CustomGPT.ai.\nBeskrivelse: En platform skræddersyet udelukkende til at bygge RAG-løsninger. Den indekserer ens hjemmeside, dokumenter og data, og genererer en chatbot. Styrker: Leverer meget præcise svar baseret kun på den data man fodrer den med, og den er god til at fremhæve kildehenvisninger. Oplevelse: Ideel som en \u0026ldquo;plug-and-play\u0026rdquo; erhvervsløsning, der nemt kan indlejres (embeddes) på en hjemmeside, uden at hallucinationer bliver et problem. 3. Dify.ai # Til sidst kiggede vi på Dify.ai, som giver meget mere frihed og kontrol.\nBeskrivelse: En open-source platform til at udvikle LLM-applikationer. Her kan man designe hele sit eget workflow grafisk. Styrker: Vi får fuld kontrol over hele RAG-pipelinen (hvordan tekster deles op - chunking, hvilke embeddings der bruges, og avancerede prompts). Oplevelse: Det bedste værktøj når man vil have dyb kontrol over arkitekturen og lave komplekse flows eller interagere dybt med eksterne API\u0026rsquo;er. Min Chat bot # Min chat bot har instruktioner, som \u0026ldquo;Superliga ekspert\u0026rdquo; og kan besvare på superliga spørgsmål.\nKnowledge er hentet fra \u0026ldquo;https://superliga.dk/\".\nDen virker faktisk meget fint, men den har svært ved at forstå klubbernes rangering.\n","externalUrl":null,"permalink":"/Portfolio/rag/","section":"RAG \u0026 Chatbots","summary":"","title":"RAG \u0026 Chatbots","type":"rag"},{"content":"Dette projekt dokumenterer, hvordan jeg har bygget et automatiseret workflow i Java, der sørger for at min RAG-bot på Dify altid afspejler det nyeste indhold på min portfolio.\nProblemet # Når man bygger en RAG-bot med en videnbase, opstår der hurtigt et vedligeholdelsesproblem: indholdet bliver forældet. Hver gang jeg tilføjer en ny side til min portfolio, skal jeg manuelt opdatere Dify\u0026rsquo;s knowledge base – det er upraktisk og fejlbehæftet.\nLøsningen er at automatisere processen, så botten selv holder sig opdateret.\nArkitektur # Workflowet fungerer i tre trin:\nSitemap-parsing – Java-programmet henter og parser portfolioens sitemap.xml for at finde alle aktive URL\u0026rsquo;er. Sammenligning – De fundne URL\u0026rsquo;er sammenlignes med den liste, der sidst blev indekseret i Dify. Opdatering via API – Nye URL\u0026rsquo;er sendes til Dify\u0026rsquo;s knowledge base API, så indholdet crawles og indekseres. Java-implementering # Projektet er skrevet i IntelliJ IDEA og bruger en dedikeret Sitemap-klasse til at håndtere al XML-parsing.\nSitemap-klassen # import org.w3c.dom.*; import javax.xml.parsers.*; import java.net.URL; import java.util.ArrayList; import java.util.List; public class Sitemap { private final String sitemapUrl; public Sitemap(String sitemapUrl) { this.sitemapUrl = sitemapUrl; } public List\u0026lt;String\u0026gt; fetchUrls() throws Exception { List\u0026lt;String\u0026gt; urls = new ArrayList\u0026lt;\u0026gt;(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new URL(sitemapUrl).openStream()); NodeList locNodes = doc.getElementsByTagName(\u0026#34;loc\u0026#34;); for (int i = 0; i \u0026lt; locNodes.getLength(); i++) { urls.add(locNodes.item(i).getTextContent().trim()); } return urls; } } Sitemap-klassen åbner en forbindelse direkte til sitemappets URL og parser XML-dokumentet med Java\u0026rsquo;s indbyggede DocumentBuilder. Alle \u0026lt;loc\u0026gt;-tags udtrækkes og returneres som en liste af strings.\nHoved-workflowet # import java.util.List; public class RagUpdater { public static void main(String[] args) throws Exception { String sitemapUrl = \u0026#34;https://sofusk7cdk.github.io/Portfolio/sitemap.xml\u0026#34;; String difyApiKey = System.getenv(\u0026#34;DIFY_API_KEY\u0026#34;); String datasetId = System.getenv(\u0026#34;DIFY_DATASET_ID\u0026#34;); Sitemap sitemap = new Sitemap(sitemapUrl); List\u0026lt;String\u0026gt; currentUrls = sitemap.fetchUrls(); KnownUrlStore store = new KnownUrlStore(\u0026#34;known_urls.txt\u0026#34;); List\u0026lt;String\u0026gt; knownUrls = store.load(); List\u0026lt;String\u0026gt; newUrls = currentUrls.stream() .filter(url -\u0026gt; !knownUrls.contains(url)) .toList(); if (newUrls.isEmpty()) { System.out.println(\u0026#34;Ingen nye sider fundet – Dify er allerede opdateret.\u0026#34;); return; } DifyClient dify = new DifyClient(difyApiKey, datasetId); for (String url : newUrls) { dify.addWebDocument(url); System.out.println(\u0026#34;Tilføjet til Dify: \u0026#34; + url); } store.save(currentUrls); System.out.println(\u0026#34;Færdig – \u0026#34; + newUrls.size() + \u0026#34; ny(e) side(r) indekseret.\u0026#34;); } } Programmet holder styr på kendte URL\u0026rsquo;er i en lokal tekstfil (known_urls.txt). Kun URL\u0026rsquo;er der er nye siden sidst, sendes til Dify – det minimerer unødvendige API-kald.\nDify API-kaldet # import java.net.URI; import java.net.http.*; import java.nio.charset.StandardCharsets; public class DifyClient { private final String apiKey; private final String datasetId; private static final String BASE_URL = \u0026#34;https://api.dify.ai/v1\u0026#34;; public DifyClient(String apiKey, String datasetId) { this.apiKey = apiKey; this.datasetId = datasetId; } public void addWebDocument(String url) throws Exception { String body = \u0026#34;\u0026#34;\u0026#34; { \u0026#34;indexing_technique\u0026#34;: \u0026#34;high_quality\u0026#34;, \u0026#34;data_source\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;web_page\u0026#34;, \u0026#34;info_list\u0026#34;: { \u0026#34;data_source_type\u0026#34;: \u0026#34;web_page\u0026#34;, \u0026#34;web_page_list\u0026#34;: [\u0026#34;%s\u0026#34;] } }, \u0026#34;process_rule\u0026#34;: { \u0026#34;mode\u0026#34;: \u0026#34;automatic\u0026#34; } } \u0026#34;\u0026#34;\u0026#34;.formatted(url); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(BASE_URL + \u0026#34;/datasets/\u0026#34; + datasetId + \u0026#34;/document/create-by-url\u0026#34;)) .header(\u0026#34;Authorization\u0026#34;, \u0026#34;Bearer \u0026#34; + apiKey) .header(\u0026#34;Content-Type\u0026#34;, \u0026#34;application/json\u0026#34;) .POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8)) .build(); HttpResponse\u0026lt;String\u0026gt; response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() != 200) { throw new RuntimeException(\u0026#34;Dify API fejl: \u0026#34; + response.statusCode() + \u0026#34; – \u0026#34; + response.body()); } } } API-nøgler og dataset-ID hentes fra miljøvariable (DIFY_API_KEY, DIFY_DATASET_ID) for at undgå at hardcode følsomme oplysninger i koden.\nAutomatisering # Programmet er sat op til at køre som et GitHub Actions workflow, der udløses automatisk, hver gang der pushes til main-branchen på portfoliorepoet. Det betyder, at Dify-botten opdateres inden for minutter efter at en ny side er gået live.\nname: Sync RAG bot on: push: branches: [main] jobs: sync: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: \u0026#39;17\u0026#39; distribution: \u0026#39;temurin\u0026#39; - name: Kør RAG-opdatering env: DIFY_API_KEY: ${{ secrets.DIFY_API_KEY }} DIFY_DATASET_ID: ${{ secrets.DIFY_DATASET_ID }} run: mvn -q compile exec:java -Dexec.mainClass=\u0026#34;RagUpdater\u0026#34; Resultat # Botten har nu altid et opdateret billede af portfolioens indhold. Når en besøgende stiller spørgsmål om mine projekter, kan Dify hente præcis og aktuel information frem – uden at jeg behøver at løfte en finger efter et nyt deploy.\nMin Chat Bot # Eksempel på et svar: ","externalUrl":null,"permalink":"/Portfolio/rag-demo/","section":"RAG-demo: Automatiseret opdatering af Dify-bot","summary":"","title":"RAG-demo: Automatiseret opdatering af Dify-bot","type":"rag-demo"},{"content":"","externalUrl":null,"permalink":"/Portfolio/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/Portfolio/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":" AI-drevne løsninger til event- og bryllupsbranchen # Introduktion # Vi havde vi besøg af virksomheden E.G, som fortalte om deres arbejde inden for events, bryllupper og administration af et årligt julemarked.\nVirksomheden arbejder blandt andet med:\nPlanlægning af bryllupper og større events Logistik og lagerstyring Kundekontakt og administration Håndtering af julemarked med 80–90 standholdere Formålet med besøget var at undersøge, hvordan AI-løsninger potentielt kunne understøtte virksomheden og optimere deres arbejdsgange.\nAI-løsninger til julemarked og administration # AI til håndtering af standholdere # Virksomheden afholder hvert år et julemarked, hvor omkring 80–90 standholdere skal kontaktes for at høre, om de ønsker at deltage igen.\nDette indebærer:\nudsendelse af invitationer opfølgning på svar administration af pladser koordinering af praktiske oplysninger Mulig AI-løsning # Et AI-understøttet administrationssystem kunne hjælpe med at:\nsende automatiske invitationer registrere svar automatisk sende påmindelser organisere standholdere efter kategori foreslå placeringer af boder baseret på tidligere data Fordele # Mindre manuelt arbejde Hurtigere administration Bedre overblik over deltagere Mere effektiv planlægning AI til logistik og lagerstyring # Ved større events og bryllupper håndteres store mængder udstyr såsom:\nborde og stole dekorationer lys og lydudstyr service og materialer Det kan være svært at holde overblik over lagerstatus og planlægning.\nMulig AI-løsning # Et intelligent lager- og logistiksystem kunne:\nregistrere lagerstatus automatisk forudsige behov for udstyr optimere pakkelister planlægge transport advare om manglende udstyr Fordele # Færre fejl Bedre ressourceudnyttelse Tidsbesparelse Mere effektiv planlægning AI og kundekontakt # Under besøget blev det tydeligt, at personlig kundekontakt er en meget vigtig del af virksomheden især ved bryllupper og større events.\nKunderne ønsker ofte:\ntryghed personlig rådgivning tæt dialog gennem hele planlægningsprocessen Derfor ville en fuldautomatisk AI-chatbot sandsynligvis ikke være den optimale løsning.\nI stedet giver det mere mening at bruge AI som et internt støtteværktøj for medarbejderne.\nAI som støtteværktøj # AI-genererede svarforslag # AI kunne hjælpe medarbejderne ved at:\ngenerere forslag til mails opsummere kundesamtaler lave udkast til tilbud foreslå svar på ofte stillede spørgsmål Medarbejderen kan derefter selv tilpasse svaret og bevare den personlige kontakt med kunden.\nFordele # Hurtigere svartider Mindre administrativt arbejde Stadig personlig og menneskelig kontakt Intelligent CRM-system # Et AI-baseret CRM-system kunne hjælpe virksomheden med at holde styr på:\nkundernes ønsker budgetter deadlines tidligere samtaler særlige behov AI kunne samtidig foreslå:\nnæste handling opfølgninger relevante services Automatisk mødeopsummering # Ved møder med kunder kunne AI:\ntransskribere samtaler lave automatiske referater fremhæve vigtige aftaler og ønsker Dette ville give medarbejderen mulighed for at fokusere mere på kunden fremfor noter og administration.\nRefleksion # Besøget gav et godt indblik i, hvordan AI kan anvendes i virkelige virksomheder.\nEn vigtig læring var, at AI ikke nødvendigvis skal erstatte mennesker. I brancher som bryllupper og events er personlig kontakt, relationer og tryghed en central del af kundeoplevelsen.\nHer giver AI størst værdi som et værktøj, der:\nunderstøtter medarbejderne reducerer administrative opgaver effektiviserer arbejdsgange hjælper med planlægning og dataanalyse Samtidig er det vigtigt at være opmærksom på:\ndatasikkerhed GDPR kvaliteten af AI-genereret indhold menneskelig kontrol og ansvar Besøget gjorde det tydeligt, at AI kan skabe stor værdi, når teknologien bruges som støtte til mennesker fremfor som en direkte erstatning.\nNoter ","externalUrl":null,"permalink":"/Portfolio/virksomhedsopl%C3%A6g/","section":"Virksomhedsoplæg","summary":"","title":"Virksomhedsoplæg","type":"virksomhedsoplæg"},{"content":"Welcome to my website! I\u0026rsquo;m really happy you stopped by.\n","externalUrl":null,"permalink":"/Portfolio/project/","section":"Blowfish","summary":"","title":"Welcome to Blowfish!","type":"page"}]