Coder Social home page Coder Social logo

garbo's Introduction

Klimatkollen Garbo AI

This is the main repo for the AI bot we call Garbo. Garbo is a Discord bot that is powered by LLM:s to effectively fetch and extract GHG self reported data from companies.

Garbo is invoked through a set of commands in Discord and has a pipeline of tasks that will be started in order for her to both extract, evaluate and format the data autonomously.

We utilise an open source queue manager called BullMQ which relies on Redis. The data is then stored into OpenSearch and Wikidata.

image

Current Status

Test the app in Discord channel #rapporter-att-granska by using the command /pdf and Garbo will be answering with a parsed JSON

Data Flow

Some of the following steps will be performed in parallel and most will be asynchronous. If a process is failed it's important to be able to restart it after a new code release so we can iterate on the prompts etc without having to restart the whole process again.

flowchart TB

    A[PDF]
    B{Is in cache?}
    C[Download PDF]
    D[Index Database]
    E[Search Database]
    F[Extract Emissions]
    G[JSON]

    Industry[Extract Industry]
    Goals[Extract Climate Goals]
    Review[Reasonability Assessment]


    DB[OpenSearch/Kibana]

    A --> B --> C --> D --> E ---> F ---> G ---> H
    B --(Cached)--> E

    F --> CompanyName --(.company)--> G
    F --> Industry --(.industry)--> G
    F --> Scope1+2 --(.scope1)--> G
    F --> Scope3 --(.scope3)--> G
    F --> Goals --(.goals)--> G
    F --> Initiatives --(.initiatives)--> G
    F --> Contacts --(.contacts)--> G
    F --> Turnover --(.turnover)--> G
    F --> Factors --(.factors)--> G

    G --> Format --(json)--> H

    H --> Review --> DB
    H --> Review --> DB
Loading

Get Started

Get an OPENAI_API_KEY from OpenAI and add it to a .env file in the root directory. Run redis locally or add REDIS_HOST and REDIS_PORT into the .env file.

npm i
docker run -d -p 6379:6379 redis
docker run -d -p 8000:8000 chromadb/chroma
docker run -d -p 9200:9200 opensearch # TODO: add instructions for running opensearch locally
npm start & npm run workers

How to run the code

The code consists of two different starting points. The first one will serve the BullMQ queue UI and will also be responsible for listening to new events from Discord.

npm start

Now you can go to http://localhost:3000 and see the dashboard.

The second one is the workers responsible for doing the actual work. This part can be scaled horisontally and divide the work automatically through the queue.

npm run workers

Environment/Secrets

Create a .env file in the root lib and add these tokens/secrets before running the application:

OPENAI_API_KEY=
OPENAI_ORG_ID=
DISCORD_APPLICATION_ID=
DISCORD_TOKEN=
DISCORD_SERVER_ID=

# these are optional, the code works fine without Llama cloud and OpenSearch:
LLAMA_CLOUD_API_KEY=
OPENSEARCH_NODE_URL=
OPENSEARCH_INDEX_NAME=

How to run with nodemon

Either you run both workers and board in the same terminal with same command through concurrently

npm run dev

or you start them separately

npm run dev-workers
# new terminal:
npm run dev-board

How to run with Docker

docker run -d -p 3000:3000 ghcr.io/klimatbyran/garbo npm start

# start how many workers you want:
docker run -d ghcr.io/klimatbyran/garbo npm run workers
docker run -d ghcr.io/klimatbyran/garbo npm run workers
docker run -d ghcr.io/klimatbyran/garbo npm run workers

Next steps / Tasks

Operations

This application is run in Kubernetes and uses FluxCD as CD pipeline. To create secret in the k8s cluster - use this command to transfer your .env file as secret to the application

kubectl create secret generic env --from-env-file=.env

License

MIT

garbo's People

Contributors

irony avatar fluxcdbot avatar github-actions[bot] avatar schweinryder avatar elvbom avatar greenheart avatar almendra-ab avatar

Stargazers

Clarissa Liljander avatar

Watchers

 avatar

garbo's Issues

llamaparse stuck!

Many of the reports get stuck somewhere after I send them to llamparse, and I never get any data back. Maybe this is because it takes too long for llama to process it.

Suggestion/idea: To only send the pages identified as relevant to llamaparse, maybe using keywords to look for. Risk is that we don't send all the relevant info.

Error handling

Handle errors in the entire workflow, and output errors to discord to give the user an indication what wen wrong.

Identifiera biogena utsläpp

Prompt
Företag har huvudsakligen fossila utsläpp. I de fall de har biogena utsläpp rapporteras dessa (oftast) separat, i enlighet med GHG-protokollet. Om vi ber Garbo att rapportera dem separat kommer hon antagligen inte att inkludera dem i totalen. För vissa företag är detta betydande utsläpp och vi kommer på sikt att behöva visa dem, även om vi exkluderar det i MVP.

Approve (definitive) & Override

Det vore bra eftersom samma rapporter körs mycket, om det finns ett sätt att säga "Approve" som innebär att det är det resultatet som sparas. Och om rapporten körs igen, så krävs det en Approve och "are you sure you want to override the saved result?" innan nästa sparas ovanpå. På så sätt säkerställer vi att vi har en godkänd version som inte kan ändras hur som helst.

Forbidden PDF - Garbo kan inte hämta

Vissa företag förbjuder Garbo att ladda ner deras rapport, så vi behöver ett sätt att komma runt detta. I nuläget har vi identifierat Swedbank och Astra Zeneca som detta gäller (dvs 2/150)

Utsläpp i en annan pdf än års/HB-rapport

Vissa företag har utsläppen någon annan stans än i hållbarhetsrapporten. Tex H&M har en separat pdf som heter typ sustainability discosure. I de fallen vill vi att Garbo identifierar att det finns en referen eller länk till utsläppsdata, och i bästa fall kan gå vidare dit själv. Arion Bank är en annan dubbel-weirdo som har en separat pdf för sina finansierade utsläpp (kat 15), så där vill vi att Garbo plockar upp på det.

Handle errors

Add error handling to the entire flow, and output to discord if something goes wrong. Currently the last started job just looks stuck if it crashes.

Köra rapporten genom Garbo flera gånger (automatiserat)

Garbo är lite slarvig, och kan ibland behöva flera chanser på sig att göra rätt. Kan vi automatisera multipla genomkörningar (typ 5 st), och se till att hon ger sig själv godkänt när det är konsekvent samma resultat, eller de som är mest sannolik?

I så fall, vad visar hon i Discord? Kanske den "bästa" versionen av 5, och om hon har fått inkonsekventa resultat i sina genomkörningar (mer än 1 annorlunda) så flaggar hon för det, så kan man välja att titta på de andra också och manuellt godkänna den som är rätt.

Köra rapporten genom Garbo flera gånger - genom knapp i Discord

Garbo är lite slarvig och kan behöva flera försök för att hitta rätt. En del av lösningen tänker vi kan vara att ha en till knapp i Discord, så att det kan vara Approve-Feedback-Retry-Reject. Så blir det enklare för människan att bara starta om de som är fel, och godkänna när det är rätt.

Send updates to Discord for every step on the process

When a new pdf is sent to the bot- we should try to keep the interaction object somehow so we can send updates to it during the process. Probably we should start with the flow jobs and keep the interaction object at the main job and then update for each substep that is started or finished.

image

  • Downloaded the PDF, looks good.
  • Found 15 pages
  • Added to our knowledge database
  • Started analyzing...
  • Finished analyzing
  • Reflecting on the answer...
  • Producing result...
  • Here is the result, please review

Something like that.

Identifiera finansierade utsläpp

Jag tror att det är bra om Garbo kan göra en self-check om det är så att hon identifierar företaget som en finansiell insitiution, och i sin kommentar säga huruvida de rapporterar finansierade utsläpp eller inte. I så fall borde hon identifiera antingen om de står i en separat tabell som ofta är fallet, eller om det finns en till pdf och så kan vi lösa det.

Jag tror att det kommer vara vanligt att det finns ett lagg här, så att finansierade utsläpp visas för 2022 i 2023 års rapport osv. Då vill vi att det omnämns i kommentaren.

save to db

Choose a relevant db to save results in - Elasticsearch + Kibana?

Ensure json consistency

The AI generated JSON is sometimes inconsistent between runs, example:

"scope3": {
  "emissions": "3595000",
  "unit": "ton CO2e",
  "baseYear": "2019",
  "categories": "Error 404"
},

"scope3": {
  "emissions": "3595000",
  "unit": "ton CO2e",
  "baseYear": "2019",
  "categories": {
    "Error 404": "Missing specific categories data"
  }
},

Elasticsearch will complain if 'categories' is sometimes an array and sometimes a single value. The defined type is 'nested', which lets ES decide for itself what structure it has. Unfortunately it only helps the first run. Depending on what is passed, ES will continue to expect this structure (we want an array).

Solutions:
Explicitly define the data structure and make sure we always get that.
PRO: Explicit data structure
CON: Needs error handling, some reports might get lost simply due to this inconsistency.

OR
Change the data type to text, and parse the JSON and save as a string
PRO: Everything will be saved
CON: Blob of text, visualization in kibana more difficult?

PDF parsing: Only process the interesting pages to save resources and get results faster

From Discord:

Lista ut vilka sidor som innehåller de viktiga datat som vi är ute efter och skapa ett jobb som skapar en ny pdf med just de viktigaste sidorna och sedan skickar vi dessa till /parse - då spar vi både pengar och beräkningskraft = energi - och även får det att gå snabbare. Inget vi prioriterar just nu men definitivt till att vi ska tolka tusentals sidor.

Välja mellan flera totaler (utsläpp)

ABB har två olika totaler, ett som är "representativt" och ett som är "strikt". Ett prompt skulle kanske vara att säga att Garbo ska välja den total som är mest heltäckande, och om detta är fallet så måste hon klargöra i kommentaren att det finns två scenarion och vad det andra är.

Feedback can only take one iteration

Garbo can receive feedback from the user and try again to look for the correct data. This only works once, after the first interaction the user is stuck with the final result and it would be very helpful to have more dialouge to continue tweaking.

There seems to have been work done to solve this but it's not working for me yet :)

Andra kategorier/utsläppskällor än GHG-protokollets 15

Ett inte obetydande antal företag rapporterar utsläpp i andra kategorier än de som GHG-protokollet anger. FÖRSLAG: Därför skulle vi behöva att Garbo 1. mappar mot GHG-protokollets kategorier och 2. identifierar andra utsläppskällor som hon kan lista. Antingen kan en människa därifrån hjälpa henne med mappningen, eller så kan vi med kod summera så att totalerna stämmer.

Gäller även sammanslagna kategorier, där om det tex står "logistik" så är det bättre att Garbo redovisar det separat än gissar kategori, tills vi tränat henne på vad som passar var.

En specifik kategori av företag med den här utmaningen är fastighetsbranschen, där vi kanske kan specialträna Garbo på deras lite egna tweak av GHG-protokollet. Fastighetsägarna har tagit fram en bransch-guide för Scope 3
https://www.fastighetsagarna.se/fakta/broschyrer-och-faktablad/riktlinjer/vagledning-rapportering-av-utslapp-i-scope-3-for-fastighetsagare/ och det finns även en rapporteringsstandard från European Public Real Estate Association https://www.epra.com/media/EPRA_Sus-BPR_2014_1424420907752.pdf

Men det gäller även andra företag som freestylear, tex SBAB. Detta kommer säkert bli mindre vanligt med tiden.

Add Elasticsearch client

Add and setup elasticsearch client (define index and data structure), and integrate with the instance running in the cluster.
Progressively save more data as the workflow proceeds.
TODO: figure out how to act or error, should data be deleted or kept for later?

PDF-läsning som mellansteg innan Garbo

Garbo har ibland svårt att läsa pdf'er, och då kanske ett bra mellansteg är att hon får hjälp av en annan tjänst som är bättre på att tolka pdfs, vi pratade om någon som heter llama.

Förslag är att om Garbo inte hittar några siffror, så kan hon be llama om hjälp, och sedan prova igen därifrån, så att vi inte behöver köra allt genom llama.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.