Jesselg commited on
Commit
ff3675d
·
verified ·
1 Parent(s): 7223fc8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -51
app.py CHANGED
@@ -1,9 +1,11 @@
1
  import os
2
  import gradio as gr
3
  import requests
 
4
  # API Keys (via Hugging Face Secrets)
5
  WEAVIATE_API_KEY = os.getenv("WEAVIATE_APIKEY")
6
  VLAM_API_KEY = os.getenv("VLAM_APIKEY")
 
7
  # Weaviate Config
8
  WEAVIATE_URL = "https://k6hr14w1r8gwkdctkxha.c0.europe-west3.gcp.weaviate.cloud/v1/graphql"
9
  HEADERS = {"Authorization": f"Bearer {WEAVIATE_API_KEY}", "Content-Type": "application/json"}
@@ -31,6 +33,7 @@ def fetch_relevant_docs(user_query):
31
  documents = data.get("data", {}).get("Get", {}).get("DigiDDocument", [])
32
  if documents:
33
  return "\n\n".join([f"{doc['content']}" for doc in documents])
 
34
  # Als nearText niets vindt, probeer met BM25 (keyword-zoekopdracht)
35
  bm25_query = {
36
  "query": f"""
@@ -53,61 +56,79 @@ def fetch_relevant_docs(user_query):
53
  documents = data.get("data", {}).get("Get", {}).get("DigiDDocument", [])
54
  if documents:
55
  return "\n\n".join([f"{doc['content']}" for doc in documents])
 
56
  # Als beide queries niets vinden
57
  return None
58
 
59
- # Functie om antwoord te genereren met VLAM.AI
60
  def generate_answer(vraag, history=[]):
 
 
 
 
 
 
 
 
61
  context = fetch_relevant_docs(vraag)
62
  if not context:
63
  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?'"
64
 
65
  messages = [
66
- {"role": "system", "content": f"""
67
- ### Rol en Doel
68
- Je bent **De Aansluitassistent voor EVA en DigiD**, een **deskundige en behulpzame** assistent voor organisaties die DigiD aansluiten via EVA.
69
- - **Alleen antwoorden op basis van de onderstaande context.**
70
- - **Toon oprechte interesse** in de vraag van de gebruiker.
71
- - **Stel vervolgvragen die natuurlijk voortvloeien uit het gesprek**, gebaseerd op wat de gebruiker wil weten.
72
-
73
- ### Antwoordstijl
74
- - **Zakelijk, maar vriendelijk, betrokken en enthousiasmerend. Eenvoudig taalgebruik.**
75
- - Gebruik "u" en "uw".
76
- - Toon begrip voor de situatie van de gebruiker (bijv. *"Dat is een belangrijke stap, ik help u graag verder."*).
77
- - **Structuur:**
78
- 1. Beantwoord de **hoofdvraag** met **maximaal 3 kernpunten** (bulletpoints of alinea's).
79
- 2. **Sluit af met 1 of 2 vervolgvragen** die **direct aansluiten op het antwoord en de context**.
80
- - **Voorbeeld:**
81
- Als de gebruiker vraagt: *"Hoe configureer ik de ReturnUrl in SAML?"*
82
- **Antwoord dan met:**
83
- *"U configureert de ReturnUrl in de SAML AuthnRequest als volgt: [stappen].
84
- **Eindig altijd met 1 of 2 vervolgvragen binnen de context tenzij het gesprek expliciet wordt afgerond door de vragensteller, bijvoorbeeld:**
85
- - 'Moet de ReturnUrl exact overeenkomen met de URL in mijn applicatie?'
86
- - 'Waar vind ik de juiste waarde voor de ReturnUrl in EVA?'*
87
- - **Nooit generieke vervolgvragen** zoals *"Hoe werkt [onderdeel]?"* zonder context.
88
-
89
- ### Gedragsregels
90
- 1. **Als de vraag buiten de scope valt:**
91
- *"Ik help graag met technische en procedurele vragen over EVA en DigiD. Voor [onderwerp] kunt u terecht bij [bron]. Laat me weten als u hulp nodig heeft met iets anders binnen EVA/DigiD!"*
92
- 2. **Als er geen context is:**
93
- *"Ik kan helaas geen relevante informatie vinden over [onderwerp] in de EVA/DigiD-documentatie. Misschien kan ik u helpen met een gerelateerd onderwerp? Bijvoorbeeld: [noem een relevant onderwerp uit de context].*
94
- 3. **Als de context onduidelijk is:**
95
- *"Kunt u uw vraag wat specifieker maken? Dan kan ik u beter helpen. Bijvoorbeeld: [geef een voorbeeldvraag die aansluit op de context]."*
96
-
97
- ### Voorbeelden van Goede Vervolgvragen
98
- - Als de gebruiker vraagt over **Metadata**:
99
- *"Heeft u al een PKIOverheid Certificaat? Dan kan ik u helpen met de volgende stappen."*
100
- - Of:
101
- *"Wilt u weten hoe u certificaten kunt uploaden in EVA, of hoe u ze kunt genereren?"*
102
- - Als de gebruiker vraagt over **foutmeldingen**:
103
- *"Kunt u de specifieke foutmelding delen? Dan kan ik u gerichter helpen."*
104
-
105
- ### Context (gebruik ALLEEN deze informatie)
106
- {context}
107
- """},
108
- {"role": "user", "content": vraag}
109
- ]
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
  response = requests.post(
113
  "https://api.demo.vlam.ai/v2.1/projects/poc/openai-compatible/v1/chat/completions",
@@ -116,23 +137,26 @@ def generate_answer(vraag, history=[]):
116
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
117
  "messages": messages,
118
  "max_tokens": 1000,
119
- "temperature": 0.3 # Iets hoger voor natuurlijkere vervolgvragen
120
  }
121
  )
122
 
123
  full_answer = response.json()["choices"][0]["message"]["content"]
124
 
125
- # Alleen afkappen als het antwoord te lang is (zeldzaam met temperature: 0.3)
126
  words = full_answer.split()
127
  if len(words) > 300:
128
  truncated = ' '.join(words[:300])
129
- # Voeg alleen vervolgvragen toe als het antwoord niet al afsluit met een vraag
130
  if not any(punct in truncated[-10:] for punct in ["?", "!"]):
131
  truncated += "\n\nLaat me weten als u hier meer over wilt weten of hulp nodig heeft met een gerelateerd onderwerp!"
132
  return truncated
133
 
134
  return full_answer
135
-
136
- # Gradio Interface
137
- demo = gr.ChatInterface(generate_answer, title="EVA/DigiD Aansluitassistent")
 
 
 
 
138
  demo.launch()
 
1
  import os
2
  import gradio as gr
3
  import requests
4
+
5
  # API Keys (via Hugging Face Secrets)
6
  WEAVIATE_API_KEY = os.getenv("WEAVIATE_APIKEY")
7
  VLAM_API_KEY = os.getenv("VLAM_APIKEY")
8
+
9
  # Weaviate Config
10
  WEAVIATE_URL = "https://k6hr14w1r8gwkdctkxha.c0.europe-west3.gcp.weaviate.cloud/v1/graphql"
11
  HEADERS = {"Authorization": f"Bearer {WEAVIATE_API_KEY}", "Content-Type": "application/json"}
 
33
  documents = data.get("data", {}).get("Get", {}).get("DigiDDocument", [])
34
  if documents:
35
  return "\n\n".join([f"{doc['content']}" for doc in documents])
36
+
37
  # Als nearText niets vindt, probeer met BM25 (keyword-zoekopdracht)
38
  bm25_query = {
39
  "query": f"""
 
56
  documents = data.get("data", {}).get("Get", {}).get("DigiDDocument", [])
57
  if documents:
58
  return "\n\n".join([f"{doc['content']}" for doc in documents])
59
+
60
  # Als beide queries niets vinden
61
  return None
62
 
 
63
  def generate_answer(vraag, history=[]):
64
+ # Voeg de laatste 2 berichten uit de gespreksgeschiedenis toe aan de context
65
+ history_text = ""
66
+ if history:
67
+ history_text = "\n".join(
68
+ [f"Gebruiker: {user_msg}\nAssistent: {bot_msg}"
69
+ for user_msg, bot_msg in history[-2:]] # Laatste 2 berichten
70
+ )
71
+
72
  context = fetch_relevant_docs(vraag)
73
  if not context:
74
  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?'"
75
 
76
  messages = [
77
+ {"role": "system", "content": f"""
78
+ ### Rol en Doel
79
+ Je bent **De Aansluitassistent voor EVA en DigiD**, een **deskundige en behulpzame** assistent voor organisaties die DigiD aansluiten via EVA.
80
+
81
+ ### Antwoordstijl voor Checklists en Stappenplannen
82
+ - Als de gebruiker vraagt om een **checklist, stappenplan of eisenlijst**:
83
+ 1. **Bevestig kort** dat de checklist beschikbaar is.
84
+ 2. **Noem de 2-3 belangrijkste punten** (als voorproefje).
85
+ 3. **Verwijs naar de volledige checklist** met een link (indien beschikbaar) of bied aan om deze te delen.
86
+ 4. **Sluit af met een vervolgvraag** over een specifiek onderdeel.
87
+
88
+ **Voorbeeldantwoord voor een checklistvraag:**
89
+ *"Ja, er is een checklist voor [onderwerp]. De belangrijkste punten zijn:
90
+ - [Punt 1]
91
+ - [Punt 2]
92
+ - [Punt 3]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
+ **Volledige checklist:** [Link naar checklist] of [Toolkit DigiD](https://www.digid.nl/toolkit).
95
+ **Vervolgvraag:** Wilt u hulp bij een specifiek criterium, zoals [onderdeel]?"*
96
+
97
+ ### Gesprekscontext (gebruik deze om je antwoord te vormen):
98
+ {history_text}
99
+
100
+ ### Instructies:
101
+ - **Alleen antwoorden op basis van de onderstaande context EN de gesprekscontext.**
102
+ - **Verwijs naar eerdere antwoorden** als de gebruiker daarnaar verwijst.
103
+ - **Stel vervolgvragen die natuurlijk voortvloeien uit het gesprek en de context.**
104
+
105
+ ### Antwoordstijl
106
+ - **Zakelijk, maar vriendelijk, betrokken en enthousiasmerend. Eenvoudig taalgebruik.**
107
+ - Gebruik "u" en "uw".
108
+ - Toon begrip voor de situatie van de gebruiker (bijv. *"Dat is een belangrijke stap, ik help u graag verder."*).
109
+ - **Structuur:**
110
+ 1. Beantwoord de **hoofdvraag** met **maximaal 3 kernpunten** (bulletpoints of alinea's).
111
+ 2. **Sluit af met 1 of 2 vervolgvragen** die **direct aansluiten op het antwoord en de context**.
112
+
113
+ ### Gedragsregels
114
+ 1. **Als de vraag buiten de scope valt:**
115
+ *"Ik help graag met technische en procedurele vragen over EVA en DigiD. Voor [onderwerp] kunt u terecht bij [bron]. Laat me weten als u hulp nodig heeft met iets anders binnen EVA/DigiD!"*
116
+ 2. **Als er geen context is:**
117
+ *"Ik kan helaas geen relevante informatie vinden over [onderwerp] in de EVA/DigiD-documentatie. Misschien kan ik u helpen met een gerelateerd onderwerp? Bijvoorbeeld: [noem een relevant onderwerp uit de context].*
118
+ 3. **Als de context onduidelijk is:**
119
+ *"Kunt u uw vraag wat specifieker maken? Dan kan ik u beter helpen. Bijvoorbeeld: [geef een voorbeeldvraag die aansluit op de context]."*
120
+
121
+ ### Voorbeelden van Goede Vervolgvragen
122
+ - Als de gebruiker vraagt over **Metadata**:
123
+ *"Heeft u al een PKIOverheid Certificaat? Dan kan ik u helpen met de volgende stappen."*
124
+ - Als de gebruiker vraagt over **foutmeldingen**:
125
+ *"Kunt u de specifieke foutmelding delen? Dan kan ik u gerichter helpen."*
126
+
127
+ ### Context (gebruik ALLEEN deze informatie + de gesprekscontext):
128
+ {context}
129
+ """},
130
+ {"role": "user", "content": vraag}
131
+ ]
132
 
133
  response = requests.post(
134
  "https://api.demo.vlam.ai/v2.1/projects/poc/openai-compatible/v1/chat/completions",
 
137
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
138
  "messages": messages,
139
  "max_tokens": 1000,
140
+ "temperature": 0.3
141
  }
142
  )
143
 
144
  full_answer = response.json()["choices"][0]["message"]["content"]
145
 
146
+ # Alleen afkappen als het antwoord te lang is
147
  words = full_answer.split()
148
  if len(words) > 300:
149
  truncated = ' '.join(words[:300])
 
150
  if not any(punct in truncated[-10:] for punct in ["?", "!"]):
151
  truncated += "\n\nLaat me weten als u hier meer over wilt weten of hulp nodig heeft met een gerelateerd onderwerp!"
152
  return truncated
153
 
154
  return full_answer
155
+
156
+ # Gradio Interface met gespreksgeschiedenis
157
+ demo = gr.ChatInterface(
158
+ generate_answer,
159
+ title="EVA/DigiD Aansluitassistent",
160
+ description="Stel vragen over het aansluiten van DigiD via EVA. De chat onthoudt de context binnen deze sessie."
161
+ )
162
  demo.launch()