From 1b00ab25f706b7722cd178fbbfc4233e175ae64a Mon Sep 17 00:00:00 2001 From: Robin COuret Date: Thu, 19 Feb 2026 18:00:42 +0100 Subject: [PATCH] add question generation --- server/.env.example | 4 +- server/README.md | 1 + server/requirements.txt | 6 ++- .../app/__pycache__/database.cpython-311.pyc | Bin 1242 -> 1242 bytes .../src/app/__pycache__/main.cpython-311.pyc | Bin 1068 -> 1068 bytes .../v1/__pycache__/knowledges.cpython-311.pyc | Bin 2717 -> 2898 bytes server/src/app/api/v1/knowledges.py | 6 ++- server/src/app/database.py | 4 +- .../language_generation.cpython-311.pyc | Bin 0 -> 2100 bytes .../src/app/services/language_generation.py | 47 ++++++++++++++++++ 10 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 server/src/app/services/__pycache__/language_generation.cpython-311.pyc create mode 100644 server/src/app/services/language_generation.py diff --git a/server/.env.example b/server/.env.example index c850c8a..5f69035 100644 --- a/server/.env.example +++ b/server/.env.example @@ -1 +1,3 @@ -DATABASE_URI="sqlite:///database.db" \ No newline at end of file +DATABASE_URI="sqlite:///database.db" +LANGUAGE_MODEL_API="http://localhost:8080/v1" +MODEL_NAME="SmolLM3-Q4_K_M.gguf" \ No newline at end of file diff --git a/server/README.md b/server/README.md index 7df3b44..776a87c 100644 --- a/server/README.md +++ b/server/README.md @@ -3,6 +3,7 @@ FastAPI server to run Manolia # Run ``` +cd src/app fastapi dev main.py ``` diff --git a/server/requirements.txt b/server/requirements.txt index 13f4297..b151ac7 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -1,3 +1,7 @@ fastapi==0.128.6 sqlmodel==0.0.32 -python-dotenv==1.2.1 \ No newline at end of file +python-dotenv==1.2.1 +openai==2.21.0 +spacy==3.8.11 +# python -m spacy download en_core_web_sm +# python -m spacy download fr_core_news_sm \ No newline at end of file diff --git a/server/src/app/__pycache__/database.cpython-311.pyc b/server/src/app/__pycache__/database.cpython-311.pyc index 0079941ce46a37288e8777ce76db593c99a8831e..b0470e3603301d69c5fcd76d72fd5025478177d3 100644 GIT binary patch delta 151 zcmcb`d5e>GIWI340}z;hoR+zKBCjf66hjI_3R4baE>jc}Bf~@oabc!qK>5`mMPR_l zkjgMID_M#$m_d{KB}m9mlkpaJPJUuad`f;vYF^pK=ckwinDUEnu|fDn%s@qx4>Ffa ZaW;VA4FGIWI340}$~1>B`(Tkyn*3mobWwks*a4g(-(AifN*QxG>`~p!{l(A~0ZN zNM)Lsl`O>+%%I8r5+tO_c#AtHKQSdfCBGy!ugq`b^HWR$Y!FTnGf=@Tru^c`2bs&I aM*CqbNNSr>1QD#I2#R{pLn~+z+L)P!K$@hp8}Xnd zhoa!E%%NTiJ++p4^C0*S^wdf~*;6liu6PhU`OYRLO_MG=?|ke$&ol4y&Td7&#`N7l zz=z=ZXl~}G)D3+A&um<}RV9dc3V~I9QO8I^6caUv-)lPcJTk~WKX=E zJ4qjvS0v(FS9W0AerxMu2pGbxX?svbT@?OxbP60f1B^)jDfs|3L0<2Y7YscUsP>{D z291&+jjpI9)I}8os(3qr_NW&V946ew5I=F43vE1%NTfR-J|{)*4xH&g4+MxtyF~pY zHjh$q{zQ7Cr?BJ8mR8FJYUfKu{!@C6b-pB1PXx};&p*pgZws?hn5m7fA3951hfyYq z=qQY42#di`AS@AT=tpSuFqEu^lC^u^{m}y@%1pkdJW4mIG}yE!F<~9k1xkW2+8}hP z+%UlZD8ty~G0(z{CeRD}Qc44u5a@FvxD<*@(Ij!yN||JA%7$QdnD2U$!1Kj(bG*sZ zCt!mRPAWSppsr8X11qPaR9s+o33~r_0g%1-G^~A)XFALCDn$jd|8VdqCiai>28?fue3?cgz5d%ApfMju8zUj8M9b6 zohg^o7G=-!S!$&VnPRSz$dM|HDsR932hKaNr^SvC`;cH|tj-D){%Od*2)OOZYY@esG*Tfn~Ta z+sDRUu|ik&=C9W@A}BXn^rN{?2|0wFtqn&w?~3X@^_zrS|9|7QU|Sl`?dtnLJ{(HO zhASNPmCl?Q<>zQAa&y!YIQu^XePB*Kpz1 zpwi5a0vr*(PF;F{i7v$^mjPTo)zPceS1qbtVgp@s@hnPBK$vW|ec(r5Z*Uw+W#y=}27mmr2F oqn}h=%e9U^<<8Snr8j<`Fk1Qx-x<*sj_J9+24Ph!Tulf28|n6_2mk;8 diff --git a/server/src/app/api/v1/knowledges.py b/server/src/app/api/v1/knowledges.py index a0170a6..7ff306e 100644 --- a/server/src/app/api/v1/knowledges.py +++ b/server/src/app/api/v1/knowledges.py @@ -4,6 +4,8 @@ from src.app.models.knowledge import Knowledge from src.app.crud.crud_knowledges import create_knowledge, read_knowledges, read_knowledge, update_knowledge, delete_knowledge from src.app.crud.crud_questions import read_questions as read_questions_crud +from src.app.services.language_generation import completion + #Added in __ini__ router = APIRouter(tags=["knowledges"]) @@ -38,9 +40,9 @@ def delete(id: int): #TODO: find pattern @router.post("/knowledges/{id}/questions") def create_questions(id: int): - #SLM Generation + question = completion(read_knowledge(id)) #create_question() - return True + return question @router.get("/knowledges/{id}/questions") def read_questions(id: int): diff --git a/server/src/app/database.py b/server/src/app/database.py index c63b1ee..086df93 100644 --- a/server/src/app/database.py +++ b/server/src/app/database.py @@ -1,9 +1,9 @@ -from dotenv import load_dotenv import os -#import secrets +from dotenv import load_dotenv from sqlmodel import Session, SQLModel, create_engine load_dotenv() + database_uri=os.environ.get("DATABASE_URI") connect_args = {"check_same_thread": False} diff --git a/server/src/app/services/__pycache__/language_generation.cpython-311.pyc b/server/src/app/services/__pycache__/language_generation.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f306c80d6a1038f47f09582f6cf4350ce76dae7 GIT binary patch literal 2100 zcma)6&2JM&6rcUHy70p@n=_Z>K;}(8D${EN=eD% zMN`iDl0FV$l<{w&ph}?0y*=yFDu>V`7@IAr{Et2Iwmm@}VF4?;@3DWC2Q(O4Xez95 znNU;K1KW0nbp`t_^Lp@xn2hM$cW6j`!HlPeI4YmZV{2>@xWJd1ji+)tHkok7%3U+D zK7(o3*|F(~@5d&_Q&ZJoR4! z*i?a-)TiZ*6s*$7Ws*wg2u@k}nw_$;9s^<{AERpgrCtu_$Jw zCWx-|HrcnlYtzb2gOcP#nml;Attv{g)A?p~71&2DvE(btnO1F`L>Kx>{-Uq4S=TMA zO{VD2v`%cV1PdLHlhe)g#c!xiVu7I7& zvhx%FCR*)S;9H^y9_XP5JXC0SdLeioUw3e9GrRWR2k1q1apj+m4a5?AYiAr%>6Rw;h~a=>B#~ADh4yCK@w=(iBO~#MGD0Sq`=w zDi&-^KrLn2C7_aFDd2j;T zpdwgvFjYLvl%-`cm2(9Lkg3Srr-EhXsc0IuLnQ_Xd$c^eNQ9%o`-j>NBgUv9IvV;pu5rCYjRbMLvKiYBt(>pCU-^1%?&q_Wk$V4untHIV9;~Vd|6cDM zSSwV6hgla7zk)!ap$^LDY^aR9mY#>ofx^%X!X7c|&(G_c(PWCXFW$Ym$!;JqF$cFzI z>?oKxK|TkOT?+d*APs@zI2Q%V-sd8@mg?yJ-ENDtOp{CJKWG-H$2dg1ciTzfV^g;EH@P7 h>n!6NnQG@iO&+YvgJq#1_Hjp6h8hT_cM|Vs{{d}I3+?~_ literal 0 HcmV?d00001 diff --git a/server/src/app/services/language_generation.py b/server/src/app/services/language_generation.py new file mode 100644 index 0000000..46a5649 --- /dev/null +++ b/server/src/app/services/language_generation.py @@ -0,0 +1,47 @@ +import os +import spacy + +from openai import OpenAI +from pydantic import BaseModel +from src.app.models.knowledge import Knowledge + +language_model_api=os.environ.get("LANGUAGE_MODEL_API") +model_name=os.environ.get("LANGUAGE_MODEL_NAME") + +client = OpenAI( + base_url=language_model_api, + api_key = "sk-no-key-required" +) + +nlp = spacy.load("fr_core_news_sm") + +def completion(knowledge: Knowledge): + + context = "Texte : ```" + knowledge.content + "```" + instruction = "A partir du texte génère 3 questions :" + prompt = context + "\n" + instruction + + #SLM processing + response = client.responses.create( + model=model_name, + input=[ + {"role": "system", "content": "Question Generation"}, + {"role": "user", "content": prompt}], + ) + text_response = response.output[0].content[0].text + + #Sentence segmentation + doc = nlp(text_response) + sents = list() + for sentence in doc.sents: + sents.append(sentence.text) + + #Interrogation sentence detection + questions = list() + for sent in sents: + index_mark = sent.rfind("?") + if(index_mark > 0): + questions.append(sent[0:index_mark+1]) + + return {"questions": questions, "sentence":sents} +