Skip to content

Instantly share code, notes, and snippets.

@glaforge
Created November 25, 2024 08:52
Show Gist options
  • Save glaforge/c7d7188aa3ff01a0f691b1e474ec0260 to your computer and use it in GitHub Desktop.
Save glaforge/c7d7188aa3ff01a0f691b1e474ec0260 to your computer and use it in GitHub Desktop.
Redact sensitive information with Google Cloud Data Loss Prevention API before sending it to a Large Language Model
package experiments;
import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.*;
import dev.langchain4j.model.vertexai.VertexAiGeminiChatModel;
import java.io.IOException;
import java.util.stream.Stream;
public class RedactPii {
public static String redact(String userMessage) {
try (var dlp = DlpServiceClient.create()) {
var item = ContentItem.newBuilder().setValue(userMessage).build();
var inspectConfigbuilder = InspectConfig.newBuilder();
var redactConfig = DeidentifyConfig.newBuilder();
var infoTypeTransfBuilder = InfoTypeTransformations.newBuilder();
Stream.of("PERSON_NAME", "PHONE_NUMBER", "PASSPORT", "IBAN_CODE")
.forEach(toRedact -> {
var infoType = InfoType.newBuilder().setName(toRedact).build();
inspectConfigbuilder.addInfoTypes(infoType);
var replaceValueConfig =
ReplaceValueConfig.newBuilder()
.setNewValue(Value.newBuilder()
.setStringValue("[" + toRedact + "]").build())
.build();
var primitiveTransformation =
PrimitiveTransformation.newBuilder()
.setReplaceConfig(replaceValueConfig).build();
var infoTypeTransformation = InfoTypeTransformations.InfoTypeTransformation.newBuilder()
.addInfoTypes(infoType)
.setPrimitiveTransformation(primitiveTransformation)
.build();
infoTypeTransfBuilder.addTransformations(infoTypeTransformation);
});
redactConfig.setInfoTypeTransformations(
infoTypeTransfBuilder);
DeidentifyContentRequest request =
DeidentifyContentRequest.newBuilder()
.setParent(LocationName.of(System.getenv("GCP_PROJECT_ID"), "global").toString())
.setItem(item)
.setDeidentifyConfig(redactConfig)
.setInspectConfig(inspectConfigbuilder)
.build();
DeidentifyContentResponse response = dlp.deidentifyContent(request);
return response.getItem().getValue();
} catch (IOException e) {
throw new RuntimeException("Failed to redact message.", e);
}
}
public static void main(String[] args) {
var model = VertexAiGeminiChatModel.builder()
.project(System.getenv("GCP_PROJECT_ID"))
.location(System.getenv("GCP_LOCATION"))
.modelName("gemini-1.5-flash-002")
.build();
String userMessage = """
My name is Alicia Bob.
My number is +33612345678, can you call me please?
Please wire some $$$ on FR7630001007941234567890185
You can check my passport if needed, it's 78TH67845.
""";
String redactedMessage = redact(userMessage);
System.out.println(
redactedMessage
);
System.out.println(
model.generate(redactedMessage)
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment