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 0079941..b0470e3 100644 Binary files a/server/src/app/__pycache__/database.cpython-311.pyc and b/server/src/app/__pycache__/database.cpython-311.pyc differ diff --git a/server/src/app/__pycache__/main.cpython-311.pyc b/server/src/app/__pycache__/main.cpython-311.pyc index 89ef8a4..36b6f6d 100644 Binary files a/server/src/app/__pycache__/main.cpython-311.pyc and b/server/src/app/__pycache__/main.cpython-311.pyc differ diff --git a/server/src/app/api/v1/__pycache__/knowledges.cpython-311.pyc b/server/src/app/api/v1/__pycache__/knowledges.cpython-311.pyc index ed01046..3d06783 100644 Binary files a/server/src/app/api/v1/__pycache__/knowledges.cpython-311.pyc and b/server/src/app/api/v1/__pycache__/knowledges.cpython-311.pyc differ 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 0000000..4f306c8 Binary files /dev/null and b/server/src/app/services/__pycache__/language_generation.cpython-311.pyc differ 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} +