本文为您提供大模型应用防火墙接口调用的示例代码。实际使用时,您可以替换成 SDK 中已经支持的任意接口。
参考以下表格了解 SDK 中的关键参数说明及获取方法。
参数 | 示例值 | 说明 |
|---|---|---|
myUrl |
|
|
ak、sk |
|
|
appid | app-d35p9du8pa51**** |
|
region |
|
|
package com.TestLLMshieldV2; import com.volcengine.llmshield.*; public class Moderate { public static void main(String[] args) { String myUrl = "https://cn-beijing.sdk.access.llm-shield.omini-shield.com"; // 根据大模型应用防火墙实例所在地域替换相应的地域信息 String ak = "YOUR AK"; // 火山账号的 AK String sk = "YOUR SK"; // 火山账号的 SK String region = "cn-beijing"; // 大模型应用防火墙实例所在地域 String myAppID = "app-d2pgblcjslsilv******"; // 资产的 AppId,可在控制台获取 long timeout = 5000; // 超时时间,单位毫秒 ApiClient client = ApiClient.New(myUrl, ak,sk,region, timeout); ModerateV2Request request = new ModerateV2Request(); request.setScene(myAppID); // 设置检测内容 MessageV2 message = new MessageV2(); message.setContent("云南人友好吗?云南人都吸毒"); message.setRole("user"); // 检测的内容来源,user-用户提示词;assistant-模型响应内容 message.setContentType(ContentTypeV2.TEXT); request.setMessage(message); // 设置上下文 MessageV2 message1 = new MessageV2(); message1.setContent("请给我一份云南十一出行计划"); message1.setRole("user"); // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词 message1.setContentType(ContentTypeV2.TEXT); request.appendHistory(message1); // 设置上下文 MessageV2 message2 = new MessageV2(); message2.setContent("你是一个智能助手"); message2.setRole("system"); // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词 message2.setContentType(ContentTypeV2.TEXT); request.appendHistory(message2); try { // 调用 Moderate 接口进行检查 ModerateV2Response response = client.Moderate(request ); if (response != null) { System.out.println("response: " + response); } } catch (Exception e) { e.printStackTrace(); } } }
UseStream = 1,多次发送分块内容。UseStream = 2,帮助 SDK 释放资源。package com.TestLLMshieldV2; import com.volcengine.llmshield.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class ModerateStream { private static final int BUFFER_SIZE = 10; // 每次读取的字符数 private static final String TEST_FILE = "moderate_stream_example.txt"; // 类路径下的文件,本demo通过从文件中读取内容来模拟一个输入流,实际应用中可根据需求替换为真实的输入流。 public static void main(String[] args) { String myUrl = "https://cn-beijing.sdk.access.llm-shield.omini-shield.com"; // 根据大模型应用防火墙实例所在地域替换相应的地域信息 String ak = "YOUR AK"; // 火山账号的 AK String sk = "YOUR SK"; // 火山账号的 SK String region = "cn-beijing"; // 大模型应用防火墙实例所在地域 String myAppID = "app-d2pgblcjslsilv******"; // 资产的 AppId,可在控制台获取 long timeout = 5000; // 超时时间,单位毫秒 ApiClient client = ApiClient.New(myUrl, ak,sk,region, timeout); ModerateV2Request request = new ModerateV2Request(); ModerateV2StreamSession session = new ModerateV2StreamSession(); request.setScene(myAppID); request.setUseStream(1); // 非流结束为1,结束为2 // 设置检测内容 MessageV2 message = new MessageV2(); message.setContent(""); message.setRole("assistant"); // 检测的内容来源,user-用户提示词;assistant-模型响应内容 message.setContentType(ContentTypeV2.TEXT); request.setMessage(message); // 设置上下文 MessageV2 message1 = new MessageV2(); message1.setContent("你是一个智能助手"); message1.setRole("system"); // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词 message1.setContentType(ContentTypeV2.TEXT); request.appendHistory(message1); // 设置上下文 MessageV2 message2 = new MessageV2(); message2.setContent("给我一份计划"); message2.setRole("user"); // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词 message2.setContentType(ContentTypeV2.TEXT); request.appendHistory(message2); // 从类路径加载文件内容并流式处理,模拟大模型的流式输出 InputStream is = ModerateStream.class.getClassLoader().getResourceAsStream(TEST_FILE); if (is == null) { System.err.println("文件不存在于类路径:" + TEST_FILE); return; } try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { char[] buffer = new char[BUFFER_SIZE]; int bytesRead; boolean isLastChunk; // 循环读取并调用接口 while ((bytesRead = reader.read(buffer)) != -1) { String chunk = new String(buffer, 0, bytesRead); isLastChunk = bytesRead < BUFFER_SIZE; // 更新请求内容 message.setContent(chunk); if (isLastChunk) { request.setUseStream(2); // 最后一块设置为流结束 } // 调用审核接口 ModerateV2Response response = client.ModerateStream(request, session); if (response != null) { System.out.println("响应:" + response); } } System.out.println("输入流处理完毕"); } catch (IOException e) { System.err.println("处理失败:" + e.getMessage()); e.printStackTrace(); } catch (Exception e) { // 捕获所有其他未明确声明的异常(兜底处理) System.err.println("发生未知错误:" + e.getMessage()); e.printStackTrace(); } finally { // 手动关闭可能未关闭的资源(如输入流) if (is != null) { try { is.close(); } catch (IOException e) { System.err.println("资源关闭失败:" + e.getMessage()); } } } } }
上述代码中流式内容检测的实现逻辑如下流程图所示:
moderate接口,将内容传入 SDK 进行校验,获取 MsgID。generate 接口,传入 MsgID 和内容相关参数,即可得到优化的代答结果,结果将以流式方式返回。package com.TestLLMshieldV2; import com.fasterxml.jackson.databind.ObjectMapper; import com.volcengine.llmshield.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class GenerateV2Stream { public static void main(String[] args) throws IOException { String myUrl = "https://cn-beijing.sdk.access.llm-shield.omini-shield.com"; // 根据大模型应用防火墙实例所在地域替换相应的地域信息 String ak = "YOUR AK"; // 火山账号的 AK String sk = "YOUR SK"; // 火山账号的 SK String region = "cn-beijing"; // 大模型应用防火墙实例所在地域 String myAppID = "app-d2pgblcjslsilvcv****"; // 资产的 AppId,可在控制台获取 long timeout = 5000; // 超时时间,单位毫秒 ModerateV2Response moderateV2Responseode = null; ApiClient client = ApiClient.New(myUrl, ak,sk,region, timeout); ModerateV2Request moderateV2Request = new ModerateV2Request(); moderateV2Request.setScene(myAppID); // 设置检测内容 MessageV2 message = new MessageV2(); message.setContent("A地的人都吸毒?"); message.setRole("user"); // 检测的内容来源,user-用户提示词 message.setContentType(ContentTypeV2.TEXT); moderateV2Request.setMessage(message); // 设置上下文 MessageV2 message1 = new MessageV2(); message1.setContent("请给我一份A地十一出行计划"); message1.setRole("user"); // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词 message1.setContentType(ContentTypeV2.TEXT); moderateV2Request.appendHistory(message1); // 设置上下文 MessageV2 message2 = new MessageV2(); message2.setContent("你是一个智能助手"); message2.setRole("system"); // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词 message2.setContentType(ContentTypeV2.TEXT); moderateV2Request.appendHistory(message2); try { // 调用可能抛出异常的方法 moderateV2Responseode = client.Moderate(moderateV2Request ); // 正常逻辑:处理返回结果 if (moderateV2Responseode != null) { // 例如:打印响应或解析结果 System.out.println("审核结果:" + moderateV2Responseode); } } catch (Exception e) { // 异常处理逻辑 System.err.println("调用 Moderate 方法失败:" + e.getMessage()); // 可选:打印异常堆栈,方便调试 e.printStackTrace(); // 可选:根据业务需求进行重试、返回默认值或抛出自定义异常 // throw new BusinessException("内容审核服务调用失败", e); } ModerateV2Result result = moderateV2Responseode.getResult(); if (result != null) { if(result.getDecision()!=null) { if(result.getDecision().getDecisionType() != DecisionTypeV2.OPTIMIZE) { // 您可以选择在命中代答动作后再进行代答,也可以根据具体业务需求来决定后续的处理逻辑。 SDK支持对任何动作进行代答 System.out.println("您的请求无需代答,action is:" + result.getDecision().getDecisionType()); // return ; } } } else { System.out.println("您的审核结果为空" ); return ; } GenerateStreamV2Request request = new GenerateStreamV2Request(); request.setMsgID(moderateV2Responseode.getResult().getMsgID()); request.setUseStream(Boolean.TRUE); try { GenerateStreamV2Response response = client.GenerateV2Stream(request); InputStream inputStream = response.getReader(); BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream)); while (true) { String line; try { line = bufReader.readLine(); } catch (IOException e) { System.err.println("读取失败: " + e.getMessage()); break; } if (line == null) { break; } // 去除换行符 line = line.trim(); // 忽略空行 if (line.isEmpty()) { continue; } // 假设 SSE 数据以 "data: " 开头 if (line.startsWith("data:")) { String data = line.substring(5).trim(); if (data.equals("[DONE]")) { System.out.println("收到 data: [DONE],关闭连接"); break; } try { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); GenerateStreamV2ResponseData responseData = objectMapper.readValue(data, GenerateStreamV2ResponseData.class); String tempString = objectMapper.writeValueAsString(responseData); System.out.println("Received result: " + tempString); } catch (IOException e) { System.err.println("反序列化失败: " + e.getMessage()); } } } bufReader.close(); inputStream.close(); } catch (Exception e) { System.err.println("Failed to start SSE stream: " + e.getMessage()); } } }