Spaces:
Build error
Build error
chore: update
Browse files
app.py
CHANGED
|
@@ -96,6 +96,10 @@ def run_fhe_fn(query_box):
|
|
| 96 |
anonymizer.run_server_and_decrypt_output(query_box)
|
| 97 |
|
| 98 |
anonymized_text = read_pickle(KEYS_DIR / "reconstructed_sentence")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
identified_words_with_prob = read_pickle(KEYS_DIR / "identified_words_with_prob")
|
| 100 |
|
| 101 |
# Convert the list of identified words and probabilities into a DataFrame
|
|
@@ -203,12 +207,8 @@ with demo:
|
|
| 203 |
|
| 204 |
with gr.Accordion("What is encrypted anonymization?", open=False):
|
| 205 |
gr.Markdown(
|
| 206 |
-
<<<<<<< HEAD
|
| 207 |
"""
|
| 208 |
Anonymization is the process of removing personally identifiable information (PII)
|
| 209 |
-
=======
|
| 210 |
-
"""Anonymization is the process of removing personally identifiable information (PII)
|
| 211 |
-
>>>>>>> 053bec9 (chore: update with marketing remarks)
|
| 212 |
from data to protect individual privacy.
|
| 213 |
|
| 214 |
To resolve trust issues when deploying anonymization as a cloud service, Fully Homomorphic
|
|
@@ -224,13 +224,15 @@ with demo:
|
|
| 224 |
########################## Key Gen Part ##########################
|
| 225 |
|
| 226 |
gr.Markdown(
|
| 227 |
-
"
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
|
|
|
|
|
|
| 231 |
)
|
| 232 |
|
| 233 |
-
gen_key_btn = gr.Button("Generate the
|
| 234 |
|
| 235 |
gen_key_btn.click(
|
| 236 |
key_gen_fn,
|
|
@@ -240,33 +242,38 @@ with demo:
|
|
| 240 |
|
| 241 |
########################## Main document Part ##########################
|
| 242 |
|
| 243 |
-
gr.Markdown("## Private document")
|
|
|
|
|
|
|
| 244 |
|
| 245 |
with gr.Row():
|
| 246 |
with gr.Column():
|
|
|
|
| 247 |
gr.Markdown(
|
| 248 |
"""This document was retrieved from the [Microsoft Presidio](https://huggingface.co/spaces/presidio/presidio_demo) demo.\n\n
|
| 249 |
You can select and deselect sentences to customize the document that will be used
|
| 250 |
-
as the initial prompt for ChatGPT in
|
| 251 |
"""
|
| 252 |
)
|
| 253 |
with gr.Column():
|
|
|
|
| 254 |
gr.Markdown(
|
| 255 |
-
"""You can see the anonymized
|
| 256 |
-
|
| 257 |
-
|
|
|
|
| 258 |
"""
|
| 259 |
)
|
| 260 |
|
| 261 |
with gr.Row():
|
| 262 |
with gr.Column():
|
| 263 |
original_sentences_box = gr.CheckboxGroup(
|
| 264 |
-
|
| 265 |
)
|
| 266 |
|
| 267 |
with gr.Column():
|
| 268 |
-
anonymized_doc_box = gr.Textbox(
|
| 269 |
-
|
| 270 |
)
|
| 271 |
|
| 272 |
original_sentences_box.change(
|
|
@@ -278,15 +285,14 @@ with demo:
|
|
| 278 |
########################## User Query Part ##########################
|
| 279 |
|
| 280 |
gr.Markdown("<hr />")
|
| 281 |
-
gr.Markdown("## Private query")
|
| 282 |
|
| 283 |
gr.Markdown(
|
| 284 |
-
"""Now, formulate a query
|
|
|
|
| 285 |
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
context. Any off-topic question will not be processed.
|
| 289 |
-
"""
|
| 290 |
)
|
| 291 |
|
| 292 |
with gr.Row():
|
|
@@ -294,11 +300,13 @@ with demo:
|
|
| 294 |
|
| 295 |
with gr.Column(scale=5):
|
| 296 |
default_query_box = gr.Dropdown(
|
| 297 |
-
list(DEFAULT_QUERIES.values()), label="
|
| 298 |
)
|
| 299 |
|
|
|
|
|
|
|
| 300 |
query_box = gr.Textbox(
|
| 301 |
-
value="Who lives in Maine?", label="
|
| 302 |
)
|
| 303 |
|
| 304 |
default_query_box.change(
|
|
@@ -313,40 +321,40 @@ with demo:
|
|
| 313 |
gr.Markdown(
|
| 314 |
"""
|
| 315 |
<p align="center">
|
| 316 |
-
Encrypt
|
| 317 |
</p>
|
| 318 |
"""
|
| 319 |
)
|
| 320 |
-
encrypt_btn = gr.Button("Encrypt
|
| 321 |
gr.HTML("<div style='height: 25px;'></div>")
|
| 322 |
|
| 323 |
with gr.Column(scale=5):
|
| 324 |
output_encrypted_box = gr.Textbox(
|
| 325 |
-
label="Encrypted anonymized query that
|
| 326 |
)
|
| 327 |
|
| 328 |
encrypt_btn.click(
|
| 329 |
fn=encrypt_query_fn, inputs=[query_box], outputs=[query_box, output_encrypted_box]
|
| 330 |
)
|
| 331 |
|
|
|
|
|
|
|
| 332 |
gr.Markdown("<hr />")
|
| 333 |
-
gr.Markdown("## Secure anonymization with FHE")
|
| 334 |
gr.Markdown(
|
| 335 |
-
"""
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
anonymization on encrypted data. When the computation is finished, the server returns
|
| 339 |
-
the result to the client for decryption.
|
| 340 |
"""
|
| 341 |
)
|
| 342 |
|
| 343 |
run_fhe_btn = gr.Button("Anonymize with FHE")
|
| 344 |
|
| 345 |
anonymized_text_output = gr.Textbox(
|
| 346 |
-
label="Decrypted anonymized query that will be sent to ChatGPT", lines=1, interactive=True
|
| 347 |
)
|
| 348 |
|
| 349 |
-
identified_words_output = gr.Dataframe(label="Identified words", visible=False)
|
| 350 |
|
| 351 |
run_fhe_btn.click(
|
| 352 |
run_fhe_fn,
|
|
@@ -354,20 +362,21 @@ with demo:
|
|
| 354 |
outputs=[anonymized_text_output, identified_words_output],
|
| 355 |
)
|
| 356 |
|
| 357 |
-
|
| 358 |
|
| 359 |
-
gr.Markdown("
|
|
|
|
| 360 |
gr.Markdown(
|
| 361 |
"""After securely anonymizing the query with FHE,
|
| 362 |
-
|
| 363 |
)
|
| 364 |
|
| 365 |
chatgpt_button = gr.Button("Query ChatGPT")
|
| 366 |
|
| 367 |
with gr.Row():
|
| 368 |
-
chatgpt_response_anonymized = gr.Textbox(label="ChatGPT anonymized response", lines=13)
|
| 369 |
chatgpt_response_deanonymized = gr.Textbox(
|
| 370 |
-
label="ChatGPT non-anonymized response", lines=13
|
| 371 |
)
|
| 372 |
|
| 373 |
chatgpt_button.click(
|
|
@@ -377,13 +386,9 @@ with demo:
|
|
| 377 |
)
|
| 378 |
|
| 379 |
gr.Markdown(
|
| 380 |
-
"""**Please
|
| 381 |
-
private information may be missed
|
| 382 |
following query before sending it to ChatGPT."""
|
| 383 |
)
|
| 384 |
-
<<<<<<< HEAD
|
| 385 |
-
=======
|
| 386 |
-
|
| 387 |
-
>>>>>>> 053bec9 (chore: update with marketing remarks)
|
| 388 |
# Launch the app
|
| 389 |
demo.launch(share=False)
|
|
|
|
| 96 |
anonymizer.run_server_and_decrypt_output(query_box)
|
| 97 |
|
| 98 |
anonymized_text = read_pickle(KEYS_DIR / "reconstructed_sentence")
|
| 99 |
+
|
| 100 |
+
# Removing Spaces Before Punctuation:
|
| 101 |
+
anonymized_text = re.sub(r"\s([,.!?;:])", r"\1", anonymized_text)
|
| 102 |
+
|
| 103 |
identified_words_with_prob = read_pickle(KEYS_DIR / "identified_words_with_prob")
|
| 104 |
|
| 105 |
# Convert the list of identified words and probabilities into a DataFrame
|
|
|
|
| 207 |
|
| 208 |
with gr.Accordion("What is encrypted anonymization?", open=False):
|
| 209 |
gr.Markdown(
|
|
|
|
| 210 |
"""
|
| 211 |
Anonymization is the process of removing personally identifiable information (PII)
|
|
|
|
|
|
|
|
|
|
| 212 |
from data to protect individual privacy.
|
| 213 |
|
| 214 |
To resolve trust issues when deploying anonymization as a cloud service, Fully Homomorphic
|
|
|
|
| 224 |
########################## Key Gen Part ##########################
|
| 225 |
|
| 226 |
gr.Markdown(
|
| 227 |
+
"## Step 1: Key generation\n\n"
|
| 228 |
+
|
| 229 |
+
"""In FHE schemes, two sets of keys are generated. First, the secret keys which are used for
|
| 230 |
+
encrypting and decrypting data owned by the client. Second, the evaluation keys that allow
|
| 231 |
+
a server to blindly process the encrypted data.
|
| 232 |
+
"""
|
| 233 |
)
|
| 234 |
|
| 235 |
+
gen_key_btn = gr.Button("Generate the secret and evaluation keys")
|
| 236 |
|
| 237 |
gen_key_btn.click(
|
| 238 |
key_gen_fn,
|
|
|
|
| 242 |
|
| 243 |
########################## Main document Part ##########################
|
| 244 |
|
| 245 |
+
gr.Markdown("## Step 2: Private document")
|
| 246 |
+
|
| 247 |
+
|
| 248 |
|
| 249 |
with gr.Row():
|
| 250 |
with gr.Column():
|
| 251 |
+
gr.Markdown("**Original document:**")
|
| 252 |
gr.Markdown(
|
| 253 |
"""This document was retrieved from the [Microsoft Presidio](https://huggingface.co/spaces/presidio/presidio_demo) demo.\n\n
|
| 254 |
You can select and deselect sentences to customize the document that will be used
|
| 255 |
+
as the initial prompt for ChatGPT in step 5.
|
| 256 |
"""
|
| 257 |
)
|
| 258 |
with gr.Column():
|
| 259 |
+
gr.Markdown("**Anonymized document:**")
|
| 260 |
gr.Markdown(
|
| 261 |
+
"""You can see below the anonymized text, replaced with hexademical strings, that
|
| 262 |
+
will be sent to ChatGPT.
|
| 263 |
+
|
| 264 |
+
ChatGPT will then be able to answer any queries about the document.
|
| 265 |
"""
|
| 266 |
)
|
| 267 |
|
| 268 |
with gr.Row():
|
| 269 |
with gr.Column():
|
| 270 |
original_sentences_box = gr.CheckboxGroup(
|
| 271 |
+
ORIGINAL_DOCUMENT, value=ORIGINAL_DOCUMENT, show_label=False,
|
| 272 |
)
|
| 273 |
|
| 274 |
with gr.Column():
|
| 275 |
+
anonymized_doc_box = gr.Textbox(show_label=False,
|
| 276 |
+
value=ANONYMIZED_DOCUMENT, interactive=False, lines=11
|
| 277 |
)
|
| 278 |
|
| 279 |
original_sentences_box.change(
|
|
|
|
| 285 |
########################## User Query Part ##########################
|
| 286 |
|
| 287 |
gr.Markdown("<hr />")
|
| 288 |
+
gr.Markdown("## Step 3: Private query")
|
| 289 |
|
| 290 |
gr.Markdown(
|
| 291 |
+
"""Now, you can formulate a query. Please choose from the predefined options in
|
| 292 |
+
“Queries examples” or craft a custom question in the “Customized query” text box.
|
| 293 |
|
| 294 |
+
Remain concise and relevant to the context. Any off-topic query will not be processed.
|
| 295 |
+
"""
|
|
|
|
|
|
|
| 296 |
)
|
| 297 |
|
| 298 |
with gr.Row():
|
|
|
|
| 300 |
|
| 301 |
with gr.Column(scale=5):
|
| 302 |
default_query_box = gr.Dropdown(
|
| 303 |
+
list(DEFAULT_QUERIES.values()), label="Queries examples:"
|
| 304 |
)
|
| 305 |
|
| 306 |
+
gr.Markdown("Or")
|
| 307 |
+
|
| 308 |
query_box = gr.Textbox(
|
| 309 |
+
value="Who lives in Maine?", label="Customized query:", interactive=True
|
| 310 |
)
|
| 311 |
|
| 312 |
default_query_box.change(
|
|
|
|
| 321 |
gr.Markdown(
|
| 322 |
"""
|
| 323 |
<p align="center">
|
| 324 |
+
Encrypt the query locally with FHE
|
| 325 |
</p>
|
| 326 |
"""
|
| 327 |
)
|
| 328 |
+
encrypt_btn = gr.Button("Encrypt query”")
|
| 329 |
gr.HTML("<div style='height: 25px;'></div>")
|
| 330 |
|
| 331 |
with gr.Column(scale=5):
|
| 332 |
output_encrypted_box = gr.Textbox(
|
| 333 |
+
label="Encrypted anonymized query that will be sent to the anonymization server:", lines=8
|
| 334 |
)
|
| 335 |
|
| 336 |
encrypt_btn.click(
|
| 337 |
fn=encrypt_query_fn, inputs=[query_box], outputs=[query_box, output_encrypted_box]
|
| 338 |
)
|
| 339 |
|
| 340 |
+
########################## FHE processing Part ##########################
|
| 341 |
+
|
| 342 |
gr.Markdown("<hr />")
|
| 343 |
+
gr.Markdown("## Step 4: Secure anonymization with FHE")
|
| 344 |
gr.Markdown(
|
| 345 |
+
""" Once the client encrypts the private query locally, it will be sent to a remote server
|
| 346 |
+
to perform the anonymization on encrypted data. When the computation is done, the server
|
| 347 |
+
will return the result to the client for decryption.
|
|
|
|
|
|
|
| 348 |
"""
|
| 349 |
)
|
| 350 |
|
| 351 |
run_fhe_btn = gr.Button("Anonymize with FHE")
|
| 352 |
|
| 353 |
anonymized_text_output = gr.Textbox(
|
| 354 |
+
label="Decrypted anonymized query that will be sent to ChatGPT:", lines=1, interactive=True
|
| 355 |
)
|
| 356 |
|
| 357 |
+
identified_words_output = gr.Dataframe(label="Identified words:", visible=False)
|
| 358 |
|
| 359 |
run_fhe_btn.click(
|
| 360 |
run_fhe_fn,
|
|
|
|
| 362 |
outputs=[anonymized_text_output, identified_words_output],
|
| 363 |
)
|
| 364 |
|
| 365 |
+
########################## ChatGpt Part ##########################
|
| 366 |
|
| 367 |
+
gr.Markdown("<hr />")
|
| 368 |
+
gr.Markdown("## Spet 5: Secure your communication on ChatGPT with anonymized queries")
|
| 369 |
gr.Markdown(
|
| 370 |
"""After securely anonymizing the query with FHE,
|
| 371 |
+
you can forward it to ChatGPT without having any concern about information leakage."""
|
| 372 |
)
|
| 373 |
|
| 374 |
chatgpt_button = gr.Button("Query ChatGPT")
|
| 375 |
|
| 376 |
with gr.Row():
|
| 377 |
+
chatgpt_response_anonymized = gr.Textbox(label="ChatGPT's anonymized response:", lines=13)
|
| 378 |
chatgpt_response_deanonymized = gr.Textbox(
|
| 379 |
+
label="ChatGPT's non-anonymized response:", lines=13
|
| 380 |
)
|
| 381 |
|
| 382 |
chatgpt_button.click(
|
|
|
|
| 386 |
)
|
| 387 |
|
| 388 |
gr.Markdown(
|
| 389 |
+
"""**Please note**: As this space is intended solely for demonstration purposes, some
|
| 390 |
+
private information may be missed during by the anonymization algorithm. Please validate the
|
| 391 |
following query before sending it to ChatGPT."""
|
| 392 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 393 |
# Launch the app
|
| 394 |
demo.launch(share=False)
|