dav74 commited on
Commit
fcf3905
·
verified ·
1 Parent(s): 3d24ef7

Upload main.py

Browse files
Files changed (1) hide show
  1. main.py +6 -44
main.py CHANGED
@@ -4,14 +4,10 @@ from langchain_core.output_parsers import StrOutputParser
4
  from langchain_groq import ChatGroq
5
  from langchain_core.prompts import ChatPromptTemplate
6
  from typing import List
7
- from langchain_huggingface import HuggingFaceEmbeddings
8
- from langchain_chroma import Chroma
9
  from typing_extensions import TypedDict
10
  from typing import Annotated
11
  from langgraph.graph.message import AnyMessage, add_messages
12
  from langchain_core.messages import HumanMessage, AIMessage
13
- from langchain_community.document_loaders import DirectoryLoader
14
- from langchain_text_splitters import CharacterTextSplitter
15
  from langgraph.graph import END, StateGraph, START
16
  from langgraph.checkpoint.memory import MemorySaver
17
  from fastapi import FastAPI
@@ -35,54 +31,26 @@ class Request(BaseModel):
35
  load_dotenv()
36
  os.environ["GROQ_API_KEY"] = os.getenv('GROQ_API_KEY')
37
  os.environ["TOKENIZERS_PARALLELISM"] = "false"
38
- persist_directory = 'db'
39
- embedding = HuggingFaceEmbeddings(model_name="OrdalieTech/Solon-embeddings-large-0.1")
40
  llm = ChatGroq(model="llama-3.3-70b-versatile", temperature=0.5)
41
  memory = MemorySaver()
42
 
43
- if os.path.exists(persist_directory) :
44
- vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding)
45
- else :
46
- glob_pattern="./*.md"
47
- directory_path = "./documents"
48
- loader = DirectoryLoader(directory_path, glob=glob_pattern)
49
- documents = loader.load()
50
- text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
51
- texts = text_splitter.split_documents(documents)
52
- vectordb = Chroma.from_documents(documents=texts, embedding=embedding, persist_directory=persist_directory)
53
-
54
- retriever = vectordb.as_retriever()
55
 
56
  system = """
57
- Tu es un assistant spécialisé dans l'enseignement de la spécialité Numérique et sciences informatiques en classe de première et de terminal
58
- Tu as un bon niveau en langage Python
59
- Ton interlocuteur est un élève qui suit la spécialité nsi en première et en terminale
60
- Tu dois uniquement répondre aux questions qui concernent la spécialité numérique et sciences informatiques
61
- Tu ne dois pas faire d'erreur, répond à la question uniquement si tu es sûr de ta réponse
62
- si tu ne trouves pas la réponse à une question, tu réponds que tu ne connais pas la réponse et que l'élève doit s'adresser à son professeur pour obtenir cette réponse
63
- Tu dois uniquement aborder des notions qui sont aux programmes de la spécialité numérique et sciences informatiques (première et terminale), tu ne dois jamais aborder une notion qui n'est pas au programme
64
- si l'élève n'arrive pas à trouver la réponse à un exercice, tu ne dois pas lui donner tout de suite la réponse, mais seulement lui donner des indications pour lui permettre de trouver la réponse par lui même
65
- Quand tu donnes un exercice Python, dans les indications que tu donnes aux élèves, tu ne dois pas dire aux élèves d'utiliser les fonctions Python : min, max, sum... pour résoudre l'exercice
66
- Pour des exercices sur les requêtes SQL, tu ne doir pas utiliser LIKE, GROUP BY, INNER LEFT et INNER RIGHT car ces notions ne sont pas au programme de NSI
67
- Tu peux lui donner la réponse à un exercice uniquement si l'élève te demande explicitement cette réponse
68
- Tu dois uniquement répondre en langue française
69
- Tu trouveras ci-dessous les programmes de la spécialité NSI en première et terminale, tu devras veiller à ce que tes réponses ne sortent pas du cadre de ces programmes
70
- Si la question posée ne rentre pas dans le cadre du programme de NSI tu peux tout de même répondre en précisant bien que cette notion est hors programme
71
- si tu proposes un exercice, tu dois bien vérifier que toutes les notions nécessaires à la résolution de l'exercice sont explicitement au programme de NSI
72
  """
73
 
74
  prompt = ChatPromptTemplate.from_messages(
75
  [
76
  ("system", system),
77
- ("human", "Extraits des programmes de NSI : \n {document} \n\n Historique conversation entre l'assistant et l'élève : \n {historical} \n\n Intervention de l'élève : {question}"),
78
  ]
79
  )
80
 
81
  chain = prompt | llm | StrOutputParser()
82
 
83
- def format_docs(docs):
84
- return "\n".join(doc.page_content for doc in docs)
85
-
86
  def format_historical(hist):
87
  historical = []
88
  for i in range(0,len(hist)-2,2):
@@ -93,22 +61,16 @@ def format_historical(hist):
93
 
94
  class GraphState(TypedDict):
95
  messages: Annotated[list[AnyMessage], add_messages]
96
- documents : str
97
 
98
- def retrieve(state : GraphState):
99
- documents = format_docs(retriever.invoke(state['messages'][-1].content))
100
- return {'documents' : documents}
101
 
102
  def chatbot(state : GraphState):
103
  response = chain.invoke({'document': state['documents'], 'historical': format_historical(state['messages']), 'question' : state['messages'][-1].content})
104
  return {"messages": [AIMessage(content=response)]}
105
 
106
  workflow = StateGraph(GraphState)
107
- workflow.add_node('retrieve', retrieve)
108
  workflow.add_node('chatbot', chatbot)
109
 
110
- workflow.add_edge(START, 'retrieve')
111
- workflow.add_edge('retrieve','chatbot')
112
  workflow.add_edge('chatbot', END)
113
 
114
  app_chatbot = workflow.compile(checkpointer=memory)
 
4
  from langchain_groq import ChatGroq
5
  from langchain_core.prompts import ChatPromptTemplate
6
  from typing import List
 
 
7
  from typing_extensions import TypedDict
8
  from typing import Annotated
9
  from langgraph.graph.message import AnyMessage, add_messages
10
  from langchain_core.messages import HumanMessage, AIMessage
 
 
11
  from langgraph.graph import END, StateGraph, START
12
  from langgraph.checkpoint.memory import MemorySaver
13
  from fastapi import FastAPI
 
31
  load_dotenv()
32
  os.environ["GROQ_API_KEY"] = os.getenv('GROQ_API_KEY')
33
  os.environ["TOKENIZERS_PARALLELISM"] = "false"
 
 
34
  llm = ChatGroq(model="llama-3.3-70b-versatile", temperature=0.5)
35
  memory = MemorySaver()
36
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
  system = """
39
+ You are an assistant who must help French students improve their level in English by discussing different topics with them.
40
+ You must only answer in English, even if the student speaks to you in French.
41
+ If the student makes mistakes when speaking in English, you must point out his mistakes.
42
+ When the student succeeds in making sentences without mistakes, you can congratulate him on the quality of his expression.
 
 
 
 
 
 
 
 
 
 
 
43
  """
44
 
45
  prompt = ChatPromptTemplate.from_messages(
46
  [
47
  ("system", system),
48
+ ("human", "history of the conversation between you and the student : \n {historical} \n\n student intervention : {question}"),
49
  ]
50
  )
51
 
52
  chain = prompt | llm | StrOutputParser()
53
 
 
 
 
54
  def format_historical(hist):
55
  historical = []
56
  for i in range(0,len(hist)-2,2):
 
61
 
62
  class GraphState(TypedDict):
63
  messages: Annotated[list[AnyMessage], add_messages]
 
64
 
 
 
 
65
 
66
  def chatbot(state : GraphState):
67
  response = chain.invoke({'document': state['documents'], 'historical': format_historical(state['messages']), 'question' : state['messages'][-1].content})
68
  return {"messages": [AIMessage(content=response)]}
69
 
70
  workflow = StateGraph(GraphState)
 
71
  workflow.add_node('chatbot', chatbot)
72
 
73
+ workflow.add_edge(START, 'chatbot')
 
74
  workflow.add_edge('chatbot', END)
75
 
76
  app_chatbot = workflow.compile(checkpointer=memory)