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