Jesselg commited on
Commit
0152a3a
·
verified ·
1 Parent(s): 59f87c9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -58
app.py CHANGED
@@ -12,7 +12,6 @@ WEAVIATE_URL = "https://k6hr14w1r8gwkdctkxha.c0.europe-west3.gcp.weaviate.cloud/
12
  HEADERS = {"Authorization": f"Bearer {WEAVIATE_API_KEY}", "Content-Type": "application/json"}
13
 
14
  def fetch_relevant_docs(user_query):
15
- # Probeer eerst met nearText (semantische zoekopdracht)
16
  neartext_query = {
17
  "query": f"""
18
  {{
@@ -35,7 +34,6 @@ def fetch_relevant_docs(user_query):
35
  if documents:
36
  return "\n\n".join([f"{doc['content']}" for doc in documents])
37
 
38
- # Als nearText niets vindt, probeer met BM25 (keyword-zoekopdracht)
39
  bm25_query = {
40
  "query": f"""
41
  {{
@@ -69,17 +67,16 @@ def get_greeting():
69
  return "Goedenavond!"
70
 
71
  def generate_answer(vraag, history=[]):
72
- # Afhandelen van begroetingen en dankjewel
73
- begroetingen = ["hallo", "hi", "hey", "hoi", "dag", "goedemorgen", "goemiddag", "goedenavond"]
74
- dankjewel = ["bedankt", "dankjewel", "dank je wel", "thanks", "merci"]
75
-
76
  if any(greet in vraag.lower() for greet in begroetingen):
77
- if any(thanks in vraag.lower() for thanks in dankjewel):
78
  return f"{get_greeting()} Graag gedaan! Laat me weten als u nog meer hulp nodig heeft met EVA of DigiD."
79
  else:
80
  return f"{get_greeting()} Hoe kan ik u helpen met EVA of DigiD-aansluiting?"
81
 
82
- # Voeg gespreksgeschiedenis toe (laatste 2 berichten)
83
  history_text = ""
84
  if history:
85
  history_text = "\n".join(
@@ -91,74 +88,62 @@ def generate_answer(vraag, history=[]):
91
  if not context:
92
  return "Ik kan geen relevante documentatie vinden over EVA of DigiD-aansluiting. Misschien kan ik u helpen met een gerelateerd onderwerp? Bijvoorbeeld: 'Hoe werkt het aansluiten van DigiD via EVA?'"
93
 
94
- # Strenge instructies voor complete, beknopte antwoorden
95
  messages = [
96
  {"role": "system", "content": f"""
97
- ### ROL EN DOEL
98
  Je bent **De Aansluitassistent voor EVA en DigiD**, een **vriendelijke, deskundige en behulpzame** assistent voor organisaties.
99
- **JOUW TAAK:**
100
- 1. Geef **altijd complete, afgeronde antwoorden** binnen de token-limiet.
101
- 2. **Nooit** een antwoord afbreken - altijd afronden met een samenvatting of vervolgvraag.
102
- 3. Voor technische uitleg: gebruik **bulletpoints** en **voorbeelden**.
103
-
104
- ### STRENGE REGELS VOOR ANTWOORDEN
105
- - **Maximaal 1500 tokens** (≈1100 woorden). Als het antwoord langer dreigt te worden:
106
- 1. Beperk je tot **3 hoofdonderwerpen**.
107
- 2. Gebruik **bulletpoints** voor stappen/vereisten.
108
- 3. Voeg toe: "**Samenvattend:** [1-zin samenvatting]."
109
- 4. Sluit AF met: "**Vervolgvraag:** Wilt u meer details over [specifiek onderdeel]?"
110
- - **Als de vraag te breed is**, geef dan een **overzicht** en bied aan om dieper in te gaan op een onderdeel.
111
-
112
- ### GESPREKSCONTEXT
113
- {history_text}
114
 
115
- ### ANTWOORDSTIJL
116
- - **Vriendelijk en professioneel** (gebruik "u" en "uw").
117
- - **Technische uitleg:** Stapsgewijs met voorbeelden (bijv. code-fragmenten, URL's).
118
- - **Checklists:** Geef 3-5 hoofdpunten + verwijzing naar de volledige bron.
 
 
 
119
 
120
- ### VOORBEELD VAN EEN GOED ANTWOORD
121
- ```markdown
122
- [Korte inleiding]
123
 
124
- 1. **Hoofdpunt 1**: [uitleg]
125
- 2. **Hoofdpunt 2**: [uitleg]
126
 
127
- **Samenvattend:** [1 zin].
128
- **Vervolgvraag:** "Wilt u dieper ingaan op [onderdeel]?"
129
- ```
 
130
 
131
- ### CONTEXT (gebruik ALLEEN deze informatie)
132
  {context}
133
  """},
134
  {"role": "user", "content": vraag}
135
  ]
136
 
137
- # Eerste poging: complete antwoord genereren
138
  response = requests.post(
139
  "https://api.demo.vlam.ai/v2.1/projects/poc/openai-compatible/v1/chat/completions",
140
  headers={"Authorization": f"Bearer {VLAM_API_KEY}"},
141
  json={
142
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
143
  "messages": messages,
144
- "max_tokens": 1500, # Ruim genoeg voor 99% van de gevallen
145
- "temperature": 0.2 # Lager = minder afdwalen, meer focus
146
  }
147
  )
148
 
149
  full_answer = response.json()["choices"][0]["message"]["content"]
150
 
151
- # Controleer of het antwoord afgerond is (geen afbreking)
152
- if not any(punct in full_answer[-20:] for punct in ["?", "!", "."]):
153
- # Als het antwoord niet afgerond is, vraag om een samenvatting
 
154
  summary_prompt = [
155
  {"role": "system", "content": """
156
- Het vorige antwoord is afgebroken. Geef een **complete, afgeronde versie** met:
157
- 1. De 3 belangrijkste punten.
158
- 2. Een samenvatting in 1 zin.
159
- 3. Een vervolgvraag.
160
  """},
161
- {"role": "user", "content": f"Maak een complete, afgeronde versie van dit antwoord:\n\n{full_answer}"}
162
  ]
163
 
164
  summary_response = requests.post(
@@ -168,24 +153,24 @@ def generate_answer(vraag, history=[]):
168
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
169
  "messages": summary_prompt,
170
  "max_tokens": 1000,
171
- "temperature": 0.1
172
  }
173
  )
174
  return summary_response.json()["choices"][0]["message"]["content"]
175
 
176
  return full_answer
177
 
178
- # Gradio Interface met voorbeeldvragen
179
  demo = gr.ChatInterface(
180
  generate_answer,
181
  title="EVA/DigiD Aansluitassistent",
182
- description="Stel vragen over het aansluiten van DigiD via EVA. Ik geef complete, technische antwoorden met voorbeelden en vervolgvragen.",
183
  examples=[
184
- ["Hallo!"],
185
- ["Wat is de checklist voor pre-productie?"],
186
- ["Leg SAML-authenticatie uit voor DigiD Substantieel"],
187
- ["Hoe configureer ik certificaten in EVA?"],
188
- ["Dankjewel!"]
189
  ]
190
  )
191
- demo.launch()
 
12
  HEADERS = {"Authorization": f"Bearer {WEAVIATE_API_KEY}", "Content-Type": "application/json"}
13
 
14
  def fetch_relevant_docs(user_query):
 
15
  neartext_query = {
16
  "query": f"""
17
  {{
 
34
  if documents:
35
  return "\n\n".join([f"{doc['content']}" for doc in documents])
36
 
 
37
  bm25_query = {
38
  "query": f"""
39
  {{
 
67
  return "Goedenavond!"
68
 
69
  def generate_answer(vraag, history=[]):
70
+ # Vriendelijke begroetingen afhandelen
71
+ begroetingen = ["hallo", "hi", "goedemorgen", "goemiddag", "goedenavond",
72
+ "dag", "hey", "hoi", "bedankt", "dankjewel", "dank je wel"]
 
73
  if any(greet in vraag.lower() for greet in begroetingen):
74
+ if any(thanks in vraag.lower() for thanks in ["bedankt", "dankjewel", "dank je wel"]):
75
  return f"{get_greeting()} Graag gedaan! Laat me weten als u nog meer hulp nodig heeft met EVA of DigiD."
76
  else:
77
  return f"{get_greeting()} Hoe kan ik u helpen met EVA of DigiD-aansluiting?"
78
 
79
+ # Voeg gespreksgeschiedenis toe
80
  history_text = ""
81
  if history:
82
  history_text = "\n".join(
 
88
  if not context:
89
  return "Ik kan geen relevante documentatie vinden over EVA of DigiD-aansluiting. Misschien kan ik u helpen met een gerelateerd onderwerp? Bijvoorbeeld: 'Hoe werkt het aansluiten van DigiD via EVA?'"
90
 
 
91
  messages = [
92
  {"role": "system", "content": f"""
93
+ ### Rol en Doel
94
  Je bent **De Aansluitassistent voor EVA en DigiD**, een **vriendelijke, deskundige en behulpzame** assistent voor organisaties.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
+ ### Algemene Instructies
97
+ - **Wees altijd vriendelijk en professioneel** (bijv. begin met "Graag gedaan!" bij dankjewel).
98
+ - **Voor technische uitleg**: Geef **duidelijke, gestructureerde antwoorden** met maximaal 500 woorden.
99
+ - **Als het antwoord langer dan 400 woorden dreigt te worden**:
100
+ 1. Kort in tot **kernpunten** (maximaal 3 hoofdonderwerpen).
101
+ 2. Voeg een samenvatting toe: *"Samenvattend: [korte samenvatting in 1 zin]."*
102
+ 3. Sluit af met: *"Wilt u meer details over een specifiek onderdeel?"*
103
 
104
+ ### Antwoordstijl voor Checklists en Stappenplannen
105
+ - Bij checklists: Geef **3 hoofdpunten** + verwijzing naar volledige bron.
106
+ - Bij technische uitleg: Gebruik **bulletpoints** en **voorbeelden**.
107
 
108
+ ### Gesprekscontext:
109
+ {history_text}
110
 
111
+ ### Instructies:
112
+ - Gebruik **ALLEEN de onderstaande context** + gespreksgeschiedenis.
113
+ - **Verwijs naar eerdere antwoorden** als relevant.
114
+ - **Sluit AF met 1-2 vervolgvragen** die aansluiten op de context.
115
 
116
+ ### Context:
117
  {context}
118
  """},
119
  {"role": "user", "content": vraag}
120
  ]
121
 
 
122
  response = requests.post(
123
  "https://api.demo.vlam.ai/v2.1/projects/poc/openai-compatible/v1/chat/completions",
124
  headers={"Authorization": f"Bearer {VLAM_API_KEY}"},
125
  json={
126
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
127
  "messages": messages,
128
+ "max_tokens": 1500, # Ruimte voor technische uitleg
129
+ "temperature": 0.3
130
  }
131
  )
132
 
133
  full_answer = response.json()["choices"][0]["message"]["content"]
134
 
135
+ # Strenge verkorting van te lange antwoorden
136
+ words = full_answer.split()
137
+ if len(words) > 400: # ≈1200 tokens (veilig onder max_tokens)
138
+ # Probeer eerst te verkorten door samenvatten
139
  summary_prompt = [
140
  {"role": "system", "content": """
141
+ Kort het volgende antwoord in tot **maximaal 300 woorden**,
142
+ maar behoud alle **kernpunten** en **technische details**.
143
+ Voeg toe: "Samenvattend: [1-zin samenvatting]."
144
+ Sluit af met: "Wilt u meer details over een specifiek onderdeel?"
145
  """},
146
+ {"role": "user", "content": f"Kort dit antwoord in:\n\n{full_answer}"}
147
  ]
148
 
149
  summary_response = requests.post(
 
153
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
154
  "messages": summary_prompt,
155
  "max_tokens": 1000,
156
+ "temperature": 0.1 # Meer deterministisch
157
  }
158
  )
159
  return summary_response.json()["choices"][0]["message"]["content"]
160
 
161
  return full_answer
162
 
163
+ # Gradio Interface
164
  demo = gr.ChatInterface(
165
  generate_answer,
166
  title="EVA/DigiD Aansluitassistent",
167
+ description="Stel vragen over EVA en DigiD. Ik help u graag met technische uitleg, checklists en stappenplannen!",
168
  examples=[
169
+ "Wat is het verschil tussen de pre-productie en productieomgeving?",
170
+ "Wat is de checklist voor pre-productie?",
171
+ "Hoe configureer ik SAML voor DigiD Substantieel?",
172
+ "Hoe genereer ik metadata voor de DigiD aansluiting?"
173
+
174
  ]
175
  )
176
+ demo.launch()