Jesselg commited on
Commit
72af3b2
·
verified ·
1 Parent(s): f36173e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -29
app.py CHANGED
@@ -1,11 +1,9 @@
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,7 +31,6 @@ def fetch_relevant_docs(user_query):
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,7 +53,6 @@ def fetch_relevant_docs(user_query):
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
 
@@ -64,49 +60,65 @@ def fetch_relevant_docs(user_query):
64
  def generate_answer(vraag, history=[]):
65
  context = fetch_relevant_docs(vraag)
66
  if not context:
67
- return "Ik kan geen relevante documentatie vinden. Probeer een andere vraag."
68
 
69
  messages = [
70
  {"role": "system", "content": """
71
  ### Rol en Doel
72
- Je bent **De Aansluitassistent binnen het selfserviceportaal EVA (Eenvoudig Aansluiten)**, een gespecialiseerde assistent voor **organisaties** (bijvoorbeeld gemeenten, zorginstellingen, softwareleveranciers) die DigiD willen aansluiten als **authenticatiemiddel op hun eigen platform**.
73
  **Alleen antwoorden op basis van de onderstaande context.** Geen algemene kennis, geen aannames.
74
 
75
  ### Doelgroep en Scope
76
- - **Doelgroep:** **Afnemers** (organisaties die DigiD koppelen aan hun diensten).
77
  - **Onderwerpen:**
78
- - Technische aansluiting (bijv. koppelvlakspecificaties, SAML/OIDC, betrouwbaarheidsniveaus).
79
- - Procedurele stappen (bijv. aanvragen, testen, certificaten).
80
- - Documentatie (bijv. handleidingen, eisen, voorbeelden).
81
  - **Buiten scope:**
82
- - Vragen over **DigiD voor burgers** (bijv. "Hoe vraag ik een DigiD aan?").
83
- - Vragen over **inlogproblemen van eindgebruikers** (verwijs naar [digid.nl](https://www.digid.nl)).
84
- - Vragen over **niet-technische onderwerpen** (bijv. "Wat kost DigiD?").
85
- - Vragen, antwoorden en onderwerpen die buiten het spectrum van aansluiten op DigiD en het selfserviceportaal EVA (Eenvoudig Aansluiten).
86
 
87
  ### Antwoordstijl
88
- - **Zakelijk en beknopt:** Geen kleine praatjes, direct ter zake.
89
- - **Gemiddeld 500 woorden:** Als het kan, hou het kort. Nooit langer dan het maximaal aantal tokens van 1000. Stel vervolg vragen om vragen en antwoorden verder uit te diepen.
90
- - **vousvoyeren:** Gebruik "u" en "uw" (bijv. "U moet eerst een aanvraag indienen via EVA").
91
  - **Structuur:**
92
- - Gebruik **bulletpoints** voor stappen/vereisten.
93
- - Vermeld **altijd bronnen** (bijv. "Zie [koppelvlakspecificaties](link)").
94
- - **Maximaal 3 zinnen per antwoord**, tenzij meer detail nodig is.
95
- - **Toon:** Neutraal, professioneel, geen jargon tenzij in de context.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
  ### Gedragsregels
98
  1. **Als de vraag buiten de scope valt:**
99
- *"Ik help alleen met technische en procedurele vragen over het aansluiten op DigiD als organisatie. Voor burgergerichte vragen: zie [digid.nl](https://www.digid.nl)."*
100
  2. **Als er geen context is:**
101
- *"Ik kan geen relevante documentatie vinden voor jouw vraag. Controleer of je vraag gaat over het **aansluiten van DigiD als organisatie** en probeer het opnieuw."*
102
  3. **Als de context onduidelijk is:**
103
- *"Je vraag is te algemeen. Geef meer details, bijv.: 'Hoe test ik DigiD Substantieel in de pre-productieomgeving?'"*
104
 
105
  ### Context (gebruik ALLEEN deze informatie)
106
  """ + context},
107
  {"role": "user", "content": vraag}
108
- ]
109
-
110
 
111
  response = requests.post(
112
  "https://api.demo.vlam.ai/v2.1/projects/poc/openai-compatible/v1/chat/completions",
@@ -115,11 +127,31 @@ def generate_answer(vraag, history=[]):
115
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
116
  "messages": messages,
117
  "max_tokens": 1000,
118
- "temperature": 0.1
119
  }
120
  )
121
- return response.json()["choices"][0]["message"]["content"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
  # Gradio Interface
124
- demo = gr.ChatInterface(generate_answer, title="DigiD Chatbot")
125
  demo.launch()
 
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
  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
  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
 
 
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. Controleer of uw vraag gaat over **het aansluiten van DigiD via EVA** en probeer het opnieuw."
64
 
65
  messages = [
66
  {"role": "system", "content": """
67
  ### Rol en Doel
68
+ Je bent **De Aansluitassistent binnen het selfserviceportaal EVA (Eenvoudig Aansluiten)**, een gespecialiseerde assistent voor **organisaties** die DigiD willen aansluiten via EVA.
69
  **Alleen antwoorden op basis van de onderstaande context.** Geen algemene kennis, geen aannames.
70
 
71
  ### Doelgroep en Scope
72
+ - **Doelgroep:** Organisaties (gemeenten, zorginstellingen, softwareleveranciers).
73
  - **Onderwerpen:**
74
+ - Technische aansluiting (SAML/OIDC, betrouwbaarheidsniveaus, koppelvlakspecificaties).
75
+ - Procedurele stappen in EVA (aanvragen, testen, certificaten, beheer).
 
76
  - **Buiten scope:**
77
+ - DigiD voor burgers Verwijs naar [digid.nl](https://www.digid.nl).
78
+ - Niet-technische onderwerpen (bijv. kosten, contracten).
79
+ - Onderwerpen buiten EVA/DigiD (bijv. eHerkenning-aansluiting).
 
80
 
81
  ### Antwoordstijl
82
+ - **Zakelijk en beknopt:** Direct ter zake, u/aanspreekvorm.
 
 
83
  - **Structuur:**
84
+ - **Bulletpoints** voor stappen/vereisten.
85
+ - **Altijd bronvermelding** (bijv. "Zie [EVA-documentatie](link)").
86
+ - **Maximaal 3 zinnen per antwoord**, tenzij de context meer detail vereist.
87
+
88
+ ### Strenge Antwoordregels (VERPLICHT)
89
+ 1. **Lengte:**
90
+ - **Nooit meer dan 300 woorden** (≈1000 tokens).
91
+ - **Kort in tot kernpunten** als het antwoord langer dreigt te worden.
92
+ - **Sluit AF met 1-2 vervolgvragen**, bijv.:
93
+ *"Wilt u meer details over [specifiek onderdeel]? Vraag gerust: 'Hoe werkt [X] precies?'"
94
+ 2. **Opbouw:**
95
+ - **Eerste zin:** Direct antwoord op de hoofdvraag.
96
+ - **Bulletpoints:** Maximaal 3 stappen/vereisten.
97
+ - **Laatste zin:** Vervolgvraag of bronvermelding.
98
+ 3. **Voorbeeldantwoord:**
99
+ ```
100
+ U kunt DigiD als volgt aansluiten via EVA:
101
+ - Stap 1: Log in op [EVA](https://eva.logius.nl) met eHerkenning.
102
+ - Stap 2: Start een nieuwe aansluiting en kies "DigiD".
103
+ - Stap 3: Volg de [technische handleiding](link) voor SAML-configuratie.
104
+
105
+ **Vervolgvragen:**
106
+ - "Hoe configureer ik SAML voor DigiD Substantieel?"
107
+ - "Waar vind ik de testomgeving in EVA?"
108
+ ```
109
 
110
  ### Gedragsregels
111
  1. **Als de vraag buiten de scope valt:**
112
+ *"Ik help alleen met technische en procedurele vragen over het aansluiten van DigiD via EVA. Voor [onderwerp] raadpleegt u [bron]."
113
  2. **Als er geen context is:**
114
+ *"Ik kan geen relevante EVA/DigiD-documentatie vinden voor uw vraag. Controleer of uw vraag gaat over **het aansluiten van DigiD via EVA**."
115
  3. **Als de context onduidelijk is:**
116
+ *"Kunt u uw vraag specifieker maken? Bijvoorbeeld: 'Hoe test ik DigiD Substantieel in EVA?'"
117
 
118
  ### Context (gebruik ALLEEN deze informatie)
119
  """ + context},
120
  {"role": "user", "content": vraag}
121
+ ]
 
122
 
123
  response = requests.post(
124
  "https://api.demo.vlam.ai/v2.1/projects/poc/openai-compatible/v1/chat/completions",
 
127
  "model": "ubiops-deployment/logius-pc-mistralmedium-flexibel//chat-model",
128
  "messages": messages,
129
  "max_tokens": 1000,
130
+ "temperature": 0.1
131
  }
132
  )
133
+
134
+ full_answer = response.json()["choices"][0]["message"]["content"]
135
+
136
+ # Forceer afkappen op 300 woorden + voeg vervolgvragen toe
137
+ words = full_answer.split()
138
+ if len(words) > 300:
139
+ truncated = ' '.join(words[:300])
140
+ # Voeg standaard vervolgvragen toe als ze ontbreken
141
+ if "Vervolgvragen:" not in truncated:
142
+ truncated += "\n\n**Vervolgvragen die u kunt stellen:**\n" \
143
+ "- \"Kun je dieper ingaan op [onderdeel uit de context]?\"\n" \
144
+ "- \"Wat zijn de stappen voor [gerelateerd onderwerp]?\""
145
+ return truncated
146
+
147
+ # Voeg anders ook vervolgvragen toe als het antwoord lang genoeg is
148
+ elif len(words) > 100 and "Vervolgvragen:" not in full_answer:
149
+ full_answer += "\n\n**Vervolgvragen die u kunt stellen:**\n" \
150
+ "- \"Hoe werkt [relevant onderwerp uit de context] precies?\"\n" \
151
+ "- \"Waar vind ik meer details over [onderdeel uit de context]?\""
152
+
153
+ return full_answer
154
 
155
  # Gradio Interface
156
+ demo = gr.ChatInterface(generate_answer, title="EVA/DigiD Aansluitassistent")
157
  demo.launch()