Dynamisch data opslaan in een Google spreadsheet met de Image tag
Oktober 10, 2023
Ik ben al jaar en dag nieuwsgierig naar de mogelijkheden met Python. Ik gebruik Python letterlijk voor alles omtrent: automatisering, automatisering van repititieve taken, als virtual assistant, rapportage, SEO, SEA en sinds kort: LLM Automation.
Ik ben al jaar en dag nieuwsgierig naar de mogelijkheden met Python. Ik gebruik Python letterlijk voor alles omtrent: automatisering, automatisering van repititieve taken, als virtual assistant, rapportage, SEO, SEA en sinds kort: LLM Automation.
En LLM Automation werkt het best met behulp van RAG: Retrieval Augmented Generation. Het creëren van je eigen Large Language Model door diverse bronnen en koppelingen te gebruiken (bijvoorbeeld een API) als betrouwbare bronnen.
Als je bestaande bekende data gebruikt als onderdeel van je prompt, kun je veel nauwkeurigere en genuanceerdere informatie extraheren. Veel van mijn scripts doen dit via een koppeling met Google zoekresultaten via de ScraperAPI. Of een combinatie tussen een ScraperAPI en een Custom Search Engine.
Voordat ik verder ga met de manier hoe ik dit heb gemaakt, vertel ik eerst kort over RAG.
RAG gaat in op je prompt en haalt alle relevante input op uit een externe database, API, spreadsheet, JSON of ander input-bestand.
Vervolgens geeft het deze chunks door als context in een prompt om een LLM te helpen een verbeterd antwoord te genereren.
Je kunt dit zo ingewikkeld mogelijk maken, maar naarmate het complexer wordt, wordt het gebruik ervan bemoeilijkt. Dit komt doordat RAG bijvoorbeeld niet in staat is om adequaat te reageren op diverse prompts of om de meest geschikte prompt voor een bepaalde situatie te identificeren.
Bovendien, wanneer je RAG alleen instrueert om naar de verstrekte input te kijken, zal het geen gebruik maken van andere relevante informatiebronnen bij het genereren van een antwoord, wat potentieel verlies kan betekenen en niet volledige informatie.
Daarnaast vergt het aanzienlijke hoeveelheid testen, aangezien ik drie maanden heb besteed aan het finetunen van de juiste output. Bovendien wordt de Large Language Model voortdurend verbeterd, waardoor je meer prompts kunt genereren om bijvoorbeeld bepaalde factoren uit te sluiten bij het genereren van een antwoord.
Je moet dus eerst veel testen en de output finetunen. Ook hier geldt “garbage in, garbage out”. Neem dus goed de tijd. En kijk of je echt alle interessante input hebt die je wilt toevoegen aan een productomschrijving of aan een andere type beschrijving op een pagina.
In mijn project ben ik aan de slag gegaan met 100K producten. Niet ieder product heeft uitgebreide specificaties of een informatie overload aan verschillende API-koppelingen en databases. Ik moest producten dus een factor meegeven. Producten met veel rauwe input genereerde ik een productomschrijving van 500 karakters. Producten met weinig input, een productomschrijving van 250 woorden.
Voor mijn websites wil ik unieke content hebben. Echter, het gebruik van diverse content-syndicatie API's leidt automatisch tot het delen van dezelfde content met andere websites. Het nadeel van syndicated content is dat veel websites dezelfde productomschrijving delen. Hoewel Google dit niet direct als gedupliceerde content bestempeld, is het toch wenselijk dat de productomschrijvingen uniek zijn geschreven.
Ik ben daarom aan de slag gegaan met het ontwikkelen van een eigen LLM. Met de databasekoppeling tussen eigen JSON data, Icecat API en een aantal productfeeds ben ik begonnen met een LLM gemaakt met Python. Met behulp van het framework: LangChain.
De prompt:
Je bent een behulpzame assistent die voor een webshop werkt in de elektronica.
Je krijgt vragen over verschillende productspecificaties en je bent goed op de hoogte van de productspecificaities.
Blijf bij de vraag, geef een uitgebreid antwoord en verzin geen feiten.
Gebruik de volgende stukjes context om de vraag aan het einde te beantwoorden.
Als je het antwoord niet weet, zeg dan gewoon dat je het niet weet, probeer geen antwoord te verzinnen.
%PRODUCT%
{product}
%CONTEXT%
{context}
{json; {product_ID;spreadsheetname}
{factor}
Uiteraard zijn er nog veel meer prompts aan te pas. En gebruik ik een subfolder met een uitgebreide prompt.txt waar die de chronologische volgorde van moet afwerken. Zo zijn er nog prompts voor SEO, herstructureren van de tekst en aanvullingen van de database en API-koppelingen.
Uiteindelijk kan je dit automatiseren met behulp van een Apps script bijvoorbeeld:
Waar we naartoe gaan is een steeds geavanceerdere modellering van het iteratieve menselijke probleemoplossingsproces, dat verder kan worden verbeterd via verbindingen met eigen data (RAG).
Ik ga de komende maanden mij verder verdiepen in het scripten en automatiseren van handelingen met behulp van bijvoorbeeld LangChain, InstructGPT en HyDE. Om met eigen gegenereerde feedback de mogelijkheden van GPT naar een nog hoger niveau te tillen. Ik zal hier verder een vervolg aan geven en daar een nieuw artikel over schrijven.