You need to enable JavaScript to run this app.
导航
Java 使用示例
最近更新时间:2025.09.18 19:07:22首次发布时间:2025.09.12 10:44:38
复制全文
我的收藏
有用
有用
无用
无用

本文为您提供大模型应用防火墙接口调用的示例代码。实际使用时,您可以替换成 SDK 中已经支持的任意接口。

前提条件

关键参数说明

参考以下表格了解 SDK 中的关键参数说明及获取方法。

参数

示例值

说明

myUrl

  • 实例所在区域为北京:cn-beijing.sdk.access.llm-shield.omini-shield.com
  • 实例所在区域为上海:cn-shanghai.sdk.access.llm-shield.omini-shield.com
  • 参数说明:大模型应用防火墙对外提供的接口服务地址,形如{region}.sdk.access.llm-shield.omini-shield.com,其中 region 为您购买的实例所属地域。
    • 华北2(北京):cn-beijing
    • 华东2(上海):cn-shanghai
  • 获取方式:可前往大模型应用防火墙控制台实例管理模块,查看实例所在区域。
    Image

ak、sk

  • AK : AKLTYWRhNDMw****
  • SK: TWprNE5XVXlZbc****
  • 参数说明:火山引擎账号的 Access Key IDSecret Access Key
  • 获取方式:获取说明请参见 Access Key(密钥)管理

appid

app-d35p9du8pa51****

  • 参数说明:资产的唯一标识,完成控制台接入配置后,系统将自动生成 AppID。

    注意

    SDK 调用时支持传入通过 SDK 方式接入的资产 AppID,其他接入方式的资产不生效。

  • 获取方式:可前往大模型应用防火墙控制台资产管理模块,查看已通过 SDK 方式接入的资产 AppID。
    Image

region

  • 实例所在区域为北京:cn-beijing
  • 实例所在区域为上海:cn-shanghai
  • 参数说明:大模型应用防火墙实例所属地域,与 myUrl 中的 region 保持一致。
    • 华北2(北京):cn-beijing
    • 华东2(上海):cn-shanghai
  • 获取方式:可前往大模型应用防火墙控制台实例管理模块,查看实例所在区域。
    Image

检测输入或输出内容是否合规(非流式)

  • 适用场景:非流式检测适用于需要完整上下文的深度语义分析场景,在一次调用中完成全部消息内容检测。
  • 接口说明:详细接口说明请参见检测输入或输出内容是否合规
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();
        }
    }
}

检测输入或输出内容是否合规(流式)

  • 适用场景:流式检测适用于大模型流式响应处理场景,通过分段传输实现高效校验。无需等待完整响应内容生成即可开始检测,显著降低整体响应延迟。
  • 参数配置
    • 需要在一次流式审核中始终传入一个 session 实例,用于关联一个响应流的上下文。
    • 在调用时设置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());
                }
            }
        }
    }
}

上述代码中流式内容检测的实现逻辑如下流程图所示:
Image

生成安全代答内容

  • 适用场景:如果需要获取安全可靠的模型代答内容以响应用户,可调用此接口。接口将以流式方式返回响应内容,确保输出内容的安全性,避免恶意内容或敏感信息。
  • 调用方法
    1. 调用moderate接口,将内容传入 SDK 进行校验,获取 MsgID。
    2. 调用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()); 
        } 
    } 
}