AWS Bedrock integration for LangChain4j enabling Java applications to interact with various LLM providers through a unified interface
Common scenarios for using guardrails.
Block harmful, toxic, or inappropriate content.
BedrockGuardrailConfiguration contentFilter = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("content-safety-guardrail")
.guardrailVersion("1")
.build();
BedrockChatModel model = BedrockChatModel.builder()
.modelId("anthropic.claude-3-5-sonnet-20241022-v2:0")
.defaultRequestParameters(
BedrockChatRequestParameters.builder()
.guardrailConfiguration(contentFilter)
.build()
)
.build();
ChatResponse response = model.chat(request);
// Check for content violations
if (response.metadata() instanceof BedrockChatResponseMetadata metadata) {
GuardrailAssessmentSummary summary = metadata.guardrailAssessmentSummary();
if (summary != null) {
for (GuardrailAssessment assessment : summary.inputAssessments()) {
if (assessment.policy() == GuardrailAssessment.Policy.CONTENT &&
assessment.action() == GuardrailAssessment.Action.BLOCKED) {
throw new ContentViolationException("Inappropriate content detected");
}
}
}
}Detect and anonymize personally identifiable information.
BedrockGuardrailConfiguration piiDetector = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("pii-protection")
.guardrailVersion("1")
.build();
ChatResponse response = model.chat(ChatRequest.builder()
.messages(UserMessage.from("My email is john@example.com"))
.parameters(
BedrockChatRequestParameters.builder()
.guardrailConfiguration(piiDetector)
.build()
)
.build());
// Check for PII anonymization
if (response.metadata() instanceof BedrockChatResponseMetadata metadata) {
GuardrailAssessmentSummary summary = metadata.guardrailAssessmentSummary();
if (summary != null) {
for (GuardrailAssessment assessment : summary.inputAssessments()) {
if (assessment.policy() == GuardrailAssessment.Policy.SENSITIVE &&
assessment.action() == GuardrailAssessment.Action.ANONYMIZED) {
System.out.println("PII detected: " + assessment.name());
// Response may contain: "My email is [EMAIL]"
}
}
}
}Block specific topics like financial advice, medical diagnosis, etc.
BedrockGuardrailConfiguration topicFilter = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("topic-blocker")
.guardrailVersion("1")
.build();
try {
ChatResponse response = model.chat(ChatRequest.builder()
.messages(UserMessage.from("Should I invest in Bitcoin?"))
.parameters(
BedrockChatRequestParameters.builder()
.guardrailConfiguration(topicFilter)
.build()
)
.build());
// Check if topic was blocked
if (response.metadata() instanceof BedrockChatResponseMetadata metadata) {
GuardrailAssessmentSummary summary = metadata.guardrailAssessmentSummary();
if (summary != null) {
for (GuardrailAssessment assessment : summary.inputAssessments()) {
if (assessment.policy() == GuardrailAssessment.Policy.TOPIC &&
assessment.action() == GuardrailAssessment.Action.BLOCKED) {
System.out.println("I'm not able to provide investment advice.");
}
}
}
}
} catch (Exception e) {
System.err.println("Topic blocked by guardrail");
}Ensure responses are grounded in provided context.
BedrockGuardrailConfiguration groundingChecker = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("grounding-validator")
.guardrailVersion("1")
.build();
String context = "The company was founded in 2020 and has 50 employees.";
ChatResponse response = model.chat(ChatRequest.builder()
.messages(
SystemMessage.from("Use only the provided context: " + context),
UserMessage.from("When was the company founded?")
)
.parameters(
BedrockChatRequestParameters.builder()
.guardrailConfiguration(groundingChecker)
.build()
)
.build());
// Check grounding violations
if (response.metadata() instanceof BedrockChatResponseMetadata metadata) {
GuardrailAssessmentSummary summary = metadata.guardrailAssessmentSummary();
if (summary != null) {
for (GuardrailAssessment assessment : summary.ouputAssessments()) {
if (assessment.policy() == GuardrailAssessment.Policy.CONTEXT &&
assessment.action() == GuardrailAssessment.Action.BLOCKED) {
System.out.println("Response not grounded in provided context");
// Model hallucinated information
}
}
}
}Apply different guardrails for different stages.
// Strict guardrail for user input
BedrockGuardrailConfiguration inputGuardrail = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("strict-input-filter")
.guardrailVersion("1")
.build();
// Moderate guardrail for output
BedrockGuardrailConfiguration outputGuardrail = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("moderate-output-filter")
.guardrailVersion("1")
.build();
// First pass: strict input filtering
ChatResponse response1 = model.chat(ChatRequest.builder()
.messages(userInput)
.parameters(
BedrockChatRequestParameters.builder()
.guardrailConfiguration(inputGuardrail)
.build()
)
.build());
// Second pass: moderate output filtering
ChatResponse response2 = model.chat(ChatRequest.builder()
.messages(response1.aiMessage())
.parameters(
BedrockChatRequestParameters.builder()
.guardrailConfiguration(outputGuardrail)
.build()
)
.build());Use different guardrails for development vs. production.
String environment = System.getenv("ENVIRONMENT"); // "dev" or "prod"
BedrockGuardrailConfiguration guardrail;
if ("prod".equals(environment)) {
guardrail = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("production-guardrail")
.guardrailVersion("1") // Stable version
.build();
} else {
guardrail = BedrockGuardrailConfiguration.builder()
.guardrailIdentifier("dev-guardrail")
.guardrailVersion("DRAFT") // Latest changes
.build();
}
BedrockChatModel model = BedrockChatModel.builder()
.modelId("anthropic.claude-3-5-sonnet-20241022-v2:0")
.defaultRequestParameters(
BedrockChatRequestParameters.builder()
.guardrailConfiguration(guardrail)
.build()
)
.build();Related: