


{"id":3931,"date":"2024-12-18T17:07:43","date_gmt":"2024-12-18T17:07:43","guid":{"rendered":"https:\/\/yininit.nl\/?p=3931"},"modified":"2024-12-19T18:28:50","modified_gmt":"2024-12-19T18:28:50","slug":"kba-implementatie-alles","status":"publish","type":"post","link":"https:\/\/yininit.nl\/index.php\/2024\/12\/18\/kba-implementatie-alles\/","title":{"rendered":"KBA Implementatie (alles)"},"content":{"rendered":"\n<p>Hier is een complete <strong>samenvatting<\/strong> van alles wat we gedaan hebben om je <strong>KBA (Knowledge Base Agent)<\/strong> te laten draaien met <strong>Python<\/strong>, <strong>Flask<\/strong>, <strong>FAISS<\/strong>, en <strong>Render<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Complete Samenvatting: KBA-project Setup<\/strong><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Benodigde bestanden<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">a. <strong>Bestandstructuur<\/strong><\/h3>\n\n\n\n<p>Je projectstructuur moet er als volgt uitzien:<\/p>\n\n\n\n<p>plaintext<\/p>\n\n\n\n<p>Code kopi\u00ebren<\/p>\n\n\n\n<p><code>kba-project\/ \u2502-- app.py # Hoofdbestand met Flask-code \u2502-- requirements.txt # Lijst met afhankelijkheden \u2502-- Procfile # Start de app op Render \u2502-- .gitignore # Vermijd node_modules, virtualenv \u2502-- static\/ # Optioneel, voor statische bestanden (HTML\/CSS) \u2502-- uploads\/ # Optioneel, map om bestanden te uploaden<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. De Python Code (app.py)<\/strong><\/h2>\n\n\n\n<p>Maak een bestand <strong><code>app.py<\/code><\/strong> en kopieer de volgende code erin:<\/p>\n\n\n\n<p>python<\/p>\n\n\n\n<p>Code kopi\u00ebren<\/p>\n\n\n\n<p><code>from flask import Flask, request, jsonify from flask_cors import CORS from sentence_transformers import SentenceTransformer from langchain_community.vectorstores import FAISS from langchain.embeddings.base import Embeddings from langchain.docstore.document import Document from transformers import pipeline import os # Flask-app configuratie app = Flask(__name__) CORS(app) # 1. Wrapper voor SentenceTransformer class SentenceTransformerWrapper(Embeddings): def __init__(self, model_name=\"sentence-transformers\/all-MiniLM-L6-v2\"): self.model = SentenceTransformer(model_name) def embed_documents(self, texts): return self.model.encode(texts, show_progress_bar=False) def embed_query(self, query): return self.model.encode([query], show_progress_bar=False)[0] embeddings_model = SentenceTransformerWrapper() # 2. Initialiseer BLOOMZ pipeline nlp_pipeline = pipeline(\"text-generation\", model=\"google\/flan-t5-small\") # 3. Vooraf ingestelde documenten documents = [ Document(page_content=\"Er wordt een lunchpauze van 30 minuten opgenomen tussen 12:00 en 13:30 uur.\"), Document(page_content=\"Overuren worden geregistreerd in het HR-portaal.\"), Document(page_content=\"Overuren worden gecompenseerd met 1,5 keer het normale uurtarief.\"), ] # 4. Maak FAISS vectorstore document_texts = [doc.page_content for doc in documents] vectorstore = FAISS.from_texts(document_texts, embeddings_model) def retrieve_documents(vraag, k=3): results = vectorstore.similarity_search(vraag, k=k) return [doc.page_content for doc in results] def generate_answer(vraag, context): prompt = f\"Gebruik de onderstaande informatie om de vraag te beantwoorden:\\n{context}\\n\\nVraag: {vraag}\\nAntwoord:\" result = nlp_pipeline(prompt, max_length=200, truncation=True, num_return_sequences=1) return result[0]['generated_text'] @app.route(\"\/kba\", methods=[\"POST\"]) def answer_question(): if not request.is_json: return jsonify({\"error\": \"Verwacht JSON-data\"}), 400 data = request.get_json() vraag = data.get(\"vraag\", \"\") if not vraag: return jsonify({\"error\": \"Geen vraag ontvangen.\"}), 400 relevante_documenten = retrieve_documents(vraag) context = \"\\n\".join(relevante_documenten) antwoord = generate_answer(vraag, context) return jsonify({\"vraag\": vraag, \"antwoord\": antwoord}) if __name__ == \"__main__\": from waitress import serve port = int(os.environ.get(\"PORT\", 5000)) print(f\"Running production server on port {port}...\") serve(app, host=\"0.0.0.0\", port=port)<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Dependencies: requirements.txt<\/strong><\/h2>\n\n\n\n<p>Maak een bestand genaamd <strong><code>requirements.txt<\/code><\/strong> en voeg de volgende afhankelijkheden toe:<\/p>\n\n\n\n<p>plaintext<\/p>\n\n\n\n<p>Code kopi\u00ebren<\/p>\n\n\n\n<p><code>flask flask-cors waitress sentence-transformers langchain langchain-community transformers faiss-cpu torch --index-url https:\/\/download.pytorch.org\/whl\/cpu<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Render Startinstellingen: Procfile<\/strong><\/h2>\n\n\n\n<p>Maak een bestand <strong><code>Procfile<\/code><\/strong> (zonder extensie) en voeg dit toe:<\/p>\n\n\n\n<p>plaintext<\/p>\n\n\n\n<p>Code kopi\u00ebren<\/p>\n\n\n\n<p><code>web: python app.py<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5. Git Setup en Commit<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Initialiseer Git<\/strong> in je projectmap:bashCode kopi\u00ebren<code>git init<\/code><\/li>\n\n\n\n<li><strong>Voeg alle bestanden toe<\/strong>:bashCode kopi\u00ebren<code>git add .<\/code><\/li>\n\n\n\n<li><strong>Commit je wijzigingen<\/strong>:bashCode kopi\u00ebren<code>git commit -m \"Initial KBA project setup\"<\/code><\/li>\n\n\n\n<li><strong>Push naar GitHub<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Maak een nieuwe repository aan op <a href=\"https:\/\/github.com\/\">GitHub<\/a>.<\/li>\n\n\n\n<li>Koppel je repository lokaal:bashCode kopi\u00ebren<code>git remote add origin https:\/\/github.com\/&lt;gebruikersnaam&gt;\/&lt;repository-naam&gt;.git<\/code><\/li>\n\n\n\n<li>Push de code:bashCode kopi\u00ebren<code>git push -u origin main<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6. Deploy op Render<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Log in op <a href=\"https:\/\/render.com\">Render<\/a>.<\/li>\n\n\n\n<li>Maak een nieuwe <strong>Web Service<\/strong> aan.<\/li>\n\n\n\n<li>Koppel je GitHub repository aan Render.<\/li>\n\n\n\n<li>Zorg ervoor dat je app:\n<ul class=\"wp-block-list\">\n<li><strong>Build command<\/strong>: <code>pip install -r requirements.txt<\/code><\/li>\n\n\n\n<li><strong>Start command<\/strong>: <code>python app.py<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Klik op <strong>Manual Deploy<\/strong>.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7. Testen van de KBA API<\/strong><\/h2>\n\n\n\n<p>Gebruik <strong>cURL<\/strong> of Postman om de API te testen:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Met cURL:<\/h3>\n\n\n\n<p>bash<\/p>\n\n\n\n<p>Code kopi\u00ebren<\/p>\n\n\n\n<p><code>curl -X POST -H \"Content-Type: application\/json\" -d \"{\\\"vraag\\\":\\\"Hoe laat is het lunchpauze?\\\"}\" https:\/\/jouw-app-url.onrender.com\/kba<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8. Probleemoplossing<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>&#8220;No open ports detected&#8221;<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Zorg dat je dynamisch <strong><code>os.environ[\"PORT\"]<\/code><\/strong> gebruikt in je code.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Out of Memory<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Gebruik kleinere modellen zoals <strong><code>flan-t5-small<\/code><\/strong> in plaats van grote modellen.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Logs controleren<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Ga naar Render Dashboard &gt; <strong>Logs<\/strong> en controleer eventuele foutmeldingen.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Samenvatting van Bestanden<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>app.py<\/code><\/strong>: De Flask-server en je KBA-functionaliteit.<\/li>\n\n\n\n<li><strong><code>requirements.txt<\/code><\/strong>: Alle Python dependencies.<\/li>\n\n\n\n<li><strong><code>Procfile<\/code><\/strong>: Startscript voor Render.<\/li>\n\n\n\n<li><strong><code>.gitignore<\/code><\/strong>: Om <strong>node_modules<\/strong> of andere ongewenste bestanden uit te sluiten.<\/li>\n\n\n\n<li><strong>GitHub Repository<\/strong>: Voor versiebeheer en integratie met Render.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Als je opnieuw wilt beginnen:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Maak een nieuwe projectmap.<\/li>\n\n\n\n<li>Kopieer alle bestanden zoals hierboven beschreven.<\/li>\n\n\n\n<li>Push je project naar GitHub en redeploy op Render.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Hier is een complete samenvatting van alles wat we gedaan hebben om je KBA (Knowledge Base Agent) te laten draaien met Python, Flask, FAISS, en Render. Complete Samenvatting: KBA-project Setup 1. Benodigde bestanden a. Bestandstructuur Je projectstructuur moet er als volgt uitzien: plaintext Code kopi\u00ebren kba-project\/ \u2502&#8211; app.py # Hoofdbestand met Flask-code \u2502&#8211; requirements.txt # [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16,1],"tags":[],"class_list":["post-3931","post","type-post","status-publish","format-standard","hentry","category-algemeen","category-robot"],"_links":{"self":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/posts\/3931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/comments?post=3931"}],"version-history":[{"count":2,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/posts\/3931\/revisions"}],"predecessor-version":[{"id":3933,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/posts\/3931\/revisions\/3933"}],"wp:attachment":[{"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/media?parent=3931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/categories?post=3931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yininit.nl\/index.php\/wp-json\/wp\/v2\/tags?post=3931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}