{"id":132,"date":"2025-01-20T01:03:38","date_gmt":"2025-01-20T01:03:38","guid":{"rendered":"https:\/\/yininai.nl\/?page_id=132"},"modified":"2025-01-20T01:34:02","modified_gmt":"2025-01-20T01:34:02","slug":"main-py","status":"publish","type":"page","link":"https:\/\/yininai.nl\/index.php\/main-py\/","title":{"rendered":"main.py"},"content":{"rendered":"\n<p>from fastapi.middleware.cors import CORSMiddleware<\/p>\n\n\n\n<p>from dotenv import load_dotenv<\/p>\n\n\n\n<p>from fastapi import UploadFile, File<\/p>\n\n\n\n<p>from fastapi import FastAPI, HTTPException<\/p>\n\n\n\n<p>from pydantic import BaseModel<\/p>\n\n\n\n<p>from vectorstore.store import SimpleVectorStore<\/p>\n\n\n\n<p>from nlpgen.generation import generate_answer<\/p>\n\n\n\n<p>import os<\/p>\n\n\n\n<p># Laad het .env-bestand<\/p>\n\n\n\n<p>load_dotenv()<\/p>\n\n\n\n<p># Haal DATABASE_URL op<\/p>\n\n\n\n<p>DATABASE_URL = os.getenv(&#8220;DATABASE_URL&#8221;)<\/p>\n\n\n\n<p># Definieer de FastAPI-app<\/p>\n\n\n\n<p>app = FastAPI()<\/p>\n\n\n\n<p># Middleware<\/p>\n\n\n\n<p>app.add_middleware(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; CORSMiddleware,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; allow_origins=[&#8220;*&#8221;],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; allow_credentials=True,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; allow_methods=[&#8220;*&#8221;],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; allow_headers=[&#8220;*&#8221;],<\/p>\n\n\n\n<p>)<\/p>\n\n\n\n<p>@app.get(&#8220;\/&#8221;)<\/p>\n\n\n\n<p>async def root():<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return {&#8220;greeting&#8221;: &#8220;Hello, World!&#8221;, &#8220;message&#8221;: &#8220;Welcome to FastAPI!&#8221;}<\/p>\n\n\n\n<p>@app.get(&#8220;\/test-db&#8221;)<\/p>\n\n\n\n<p>def test_db():<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; # Controleer of DATABASE_URL correct is geladen<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; if not DATABASE_URL:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {&#8220;error&#8221;: &#8220;DATABASE_URL niet gevonden&#8221;}<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return {&#8220;database_url&#8221;: DATABASE_URL}<\/p>\n\n\n\n<p># Dummy dataset<\/p>\n\n\n\n<p>texts = [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;FastAPI is een modern webframework voor Python.&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;Retrieval-Augmented Generation combineert zoekfunctionaliteit met tekstgeneratie.&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;Vectorstores zoals FAISS worden vaak gebruikt om semantische zoekopdrachten te versnellen.&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;Het ontwikkelen van een CKBA-product vereist een combinatie van backend, frontend en machine learning.&#8221;<\/p>\n\n\n\n<p>]<\/p>\n\n\n\n<p># Initialiseer vectorstore en voeg teksten toe<\/p>\n\n\n\n<p>vectorstore = SimpleVectorStore()<\/p>\n\n\n\n<p>vectorstore.add_texts(texts)<\/p>\n\n\n\n<p># Requestmodel<\/p>\n\n\n\n<p>class QuestionRequest(BaseModel):<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; question: str<\/p>\n\n\n\n<p>@app.post(&#8220;\/answer&#8221;)<\/p>\n\n\n\n<p>async def answer_question(request: QuestionRequest):<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;&#8221;&#8221;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Beantwoord een vraag op basis van de opgeslagen teksten.<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;&#8221;&#8221;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; try:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Zoek relevante context<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; relevant_context = vectorstore.search(request.question, top_k=3)<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context = &#8220;\\n&#8221;.join(relevant_context[:3])&nbsp; # Beperk de context tot 3 resultaten<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Genereer antwoord<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; answer = generate_answer(request.question, context)<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {&#8220;question&#8221;: request.question, &#8220;context&#8221;: relevant_context, &#8220;answer&#8221;: answer}<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; except Exception as e:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise HTTPException(status_code=500, detail=f&#8221;Fout bij beantwoording: {str(e)}&#8221;)<\/p>\n\n\n\n<p>@app.post(&#8220;\/upload&#8221;)<\/p>\n\n\n\n<p>async def upload_document(file: UploadFile):<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; try:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Log details van het bestand<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(f&#8221;Ontvangen bestand: {file.filename}, content type: {file.content_type}&#8221;)<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content = (await file.read()).decode(&#8220;utf-8&#8221;)<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vectorstore.add_texts([content])<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {&#8220;filename&#8221;: file.filename, &#8220;message&#8221;: &#8220;Document succesvol geupload en toegevoegd aan de vectorstore.&#8221;}<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; except Exception as e:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(f&#8221;Fout bij uploaden: {e}&#8221;)<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise HTTPException(status_code=500, detail=f&#8221;Fout bij uploaden: {str(e)}&#8221;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>from fastapi.middleware.cors import CORSMiddleware from dotenv import load_dotenv from fastapi import UploadFile, File from fastapi import FastAPI, HTTPException from pydantic import BaseModel from vectorstore.store import SimpleVectorStore from nlpgen.generation import generate_answer import os # Laad het .env-bestand load_dotenv() # Haal DATABASE_URL op DATABASE_URL = os.getenv(&#8220;DATABASE_URL&#8221;) # Definieer de FastAPI-app app = FastAPI() # Middleware app.add_middleware( &nbsp;&nbsp;&nbsp; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-132","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/pages\/132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/comments?post=132"}],"version-history":[{"count":2,"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/pages\/132\/revisions"}],"predecessor-version":[{"id":167,"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/pages\/132\/revisions\/167"}],"wp:attachment":[{"href":"https:\/\/yininai.nl\/index.php\/wp-json\/wp\/v2\/media?parent=132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}