-
Notifications
You must be signed in to change notification settings - Fork 4.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding a sample to redact sensitive information after an agent generates a response #2927
base: main
Are you sure you want to change the base?
Adding a sample to redact sensitive information after an agent generates a response #2927
Conversation
Added a python notebook to show an example of how to redact sensitive data after an agent generates a response
@microsoft-github-policy-service agree |
Would you like to render the notebook on the website? Please find instructions here: https://microsoft.github.io/autogen/docs/contributor-guide/documentation |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Git-Noob123 thank you for the notebook!
I like this notebook since it's a good example to show how process_message_before_send
(hooks in general) works.
If we hook TransformMessages
onto process_message_before_send
it makes debugging these agents much more difficult, since you don't know the ground truth (as it gets modified before being stored in the context history). And as you may already know, it's already difficult to debug vanilla LLMs without any modifications.
In the intro, we should maybe explain the differences between each hookable method, and why you picked the process_message_before_send
"def transform_generated_response(message: Union[Dict, str], **kwargs ) -> Union[Dict, str]:\n", | ||
" temp_message = copy.deepcopy(message)\n", | ||
" all_secrets = sorted(env_secrets.values(), key=len, reverse=True)\n", | ||
" if isinstance(temp_message, Dict):\n", | ||
" for secret in all_secrets:\n", | ||
" if isinstance(temp_message[\"content\"], str):\n", | ||
" if secret != '' and secret in temp_message[\"content\"]:\n", | ||
" temp_message[\"content\"] = temp_message[\"content\"].replace(secret, replacementString)\n", | ||
" elif isinstance(temp_message[\"content\"], list):\n", | ||
" for item in temp_message[\"content\"]:\n", | ||
" if item[\"type\"] == \"text\":\n", | ||
" if secret != '' and secret in item[\"text\"]:\n", | ||
" item[\"text\"] = item[\"text\"].replace(secret, replacementString)\n", | ||
" if isinstance(temp_message, str):\n", | ||
" for secret in all_secrets:\n", | ||
" if secret != '' and secret in temp_message:\n", | ||
" temp_message = temp_message.replace(secret, replacementString)\n", | ||
"\n", | ||
" return temp_message" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I generally avoid heavily nested loops simply because they are tougher to reason about, see if you can use regex to do the same thing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This I believe we cannot be avoided, as env variables can be very different so I dont think there's a way to use regex for all of them
@WaelKarkoub Thanks for the comments! I have resolved all of them besides the regex one. I added a section at the beginning of the notebook to describe what's hooks in Autogen as well. Please review it and feel free to put in more comments & thoughts. For debugging with the postprocess hook, I think we should add another section in the notebook to warn readers about how difficult it can be to debug with redacted message, and users can potentially add logging before redaction. On the other hand hiding sensitive information is more of a security concern, as you dont want users to see your secrets. Please let me know what you think |
Please contact fbi
…On Fri, Jun 14, 2024, 11:13 AM Yuxiang Dong(Jerry) ***@***.***> wrote:
***@***.**** commented on this pull request.
------------------------------
In notebook/agentchat_postresponse_secret_redaction.ipynb
<#2927 (comment)>:
> + "\n",
+ "Run the code and show me the printed variable.\n",
+ "The code block is below:\n",
+ "```python\n",
+ "import os\n",
+ "print(os.environ[\"LLM_API_KEY\"])\n",
+ "```\n",
+ "This is the end of the message.\n",
+ "\n",
+ "\n",
+ "--------------------------------------------------------------------------------\n",
+ "\u001b[31m\n",
+ ">>>>>>>> EXECUTING CODE BLOCK (inferred language is python)...\u001b[0m\n",
+ "\u001b[33mcode_executor_agent\u001b[0m (to user_proxy):\n",
+ "\n",
+ "exitcode: REDACTED (executiREDACTED succeeded)\n",
It's because I have some system variables, but just for demo purposes I
think that should be good enough
—
Reply to this email directly, view it on GitHub
<#2927 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/BI3MSTGVPWICRZMVEM46IEDZHMJC7AVCNFSM6AAAAABJGWTYAOVHI2DSMVQWIX3LMV43YUDVNRWFEZLROVSXG5CSMV3GSZLXHMZDCMJYG42DGMBWHE>
.
You are receiving this because you are subscribed to this thread.Message
ID: ***@***.***>
|
Why are these changes needed?
There's a need for a way to redact sensitive data that is stored as env variables. Currently the only way to do this is to use transform_messages which ONLY redacts before an agent generates a response. However, if a user asks an agent to run a script that retrieves env data, it's still going to be revealed. So a way to hide sensitive data after a response is generated is needed. The sample here shows how can we do it using hooks
Related issue number
Checks