Inhoud

Projecten

ā‡ Terug naar start

RAG Chatapplicatie

šŸ”ø Een app gebouwd die data in een Pincone vector database plaatst en vervolgens een chatbot gebouwd die de content uit de database haalt en doorgeeft een een llm (RAG).

Database vullen

Gegevens opsplitsen: Online zijn vele voorbeelden te vinden waarbij documenten allemaal dezelfde aantal leestekens hebben doordat een splitten wordt gebruikt die grote documenten splits op het aantal leestekens. Ik heb voor een andere (intensievere) methode gekozen door documenten te schrijven die niet allemaal het zelfde aantal tekens hebben maar waarvan de content per document een afgerond verhaald is (van tussen de 1000 en 1500 leestekens)! Alle documenten die bij mij uiteindelijk in de database zijn terecht gekomen staan in het voorbeeld (hieronder) in de map ā€œ./a3d/files/txt/ā€. De splitter is een dubbele soft enter ā€œ\n\nā€ (zie de load_embeddings_from_dir methode). Het resultaat is dat er geen data/gegevens verloren gaat zoals dat bij andere splits methoden wel gebeurd. Ieder document is een afgerond verhaal.

šŸ”ø Deze methode is wel een stuk arbeidsintensiever en kan alleen toegepast worden als degene die de documenten samenstelt van alle ins en outs m.b.t. tot de gewenste resultaten op de hoogte is.
āœØ Groot voordeel is dan wel dat de resultaten een stuk beter zullen zijn āœØ

import os
import pinecone 
from langchain.vectorstores import Pinecone
from langchain.embeddings.openai import OpenAIEmbeddings

class Document:
    def __init__(self, text, metadata=None):
        self.page_content = text
        self.metadata = metadata if metadata is not None else {}

class A3DEmbedding:
    def __init__(self, a3dcon, a3dmod):
        self.a3dcon = a3dcon
        self.a3dmod = a3dmod       

    # START 
    def start_embeddings(self):
        doc_db = self.embedding_db()
        print(doc_db)
        self.a3dcon.embeddings_done("> Embeddings loaded in Pinecone index")

    def embedding_db(self):
        embeddings = OpenAIEmbeddings()
        pinecone.init(
            api_key = self.a3dmod.pinecone_api_key,
            environment = self.a3dmod.pinecone_environment
        )
        docs_split = self.load_embeddings_from_dir()
        doc_db = Pinecone.from_documents(
            docs_split, 
            embeddings, 
            index_name=self.a3dmod.pinecone_index_name
        )
        return doc_db
    
    def load_embeddings_from_dir(self):
        directory = './a3d/files/txt/'
        documents = [] 
        for filename in os.listdir(directory):
            if filename.endswith('.txt'):
                file_path = os.path.join(directory, filename)
                with open(file_path, 'r', encoding='utf-8') as file:
                    content = file.read()
                    parts = content.split('\n\n')
                    for part in parts:
                        documents.append(Document(part))
        print(f"Aantal gesplitste documenten: {len(documents)}")
        return documents

Onderzoek

A3Dbot

Stappen:

ā†’ Embedding App
ā†’ Web Chat App bouwen
ā†’ Web Chat App bouwen 2

ā†’ Testomgeving opzetten en diverse tools en oplossingen uitproberen