You need to enable JavaScript to run this app.
导航
Go 使用示例
最近更新时间: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 main

import (
        "fmt"
        "github.com/volcengine/volcengine-go-sdk/service/llmshield"
        "time"
)

func main() {
    var response *llmshield.ModerateV2Response
    var err error

        myUrl := "https://cn-beijing.sdk.access.llm-shield.omini-shield.com" // 根据大模型应用防火墙实例所在地域替换相应的地域信息
        ak := "YOUR AK"              // 火山账号的 AK
        sk := "YOUR SK"              // 火山账号的 SK
        appid := "app-d2vektrahgp6********"      // 资产的 AppId,可在控制台获取
        region := "cn-beijing"          // 大模型应用防火墙实例所在地域

        timeout := time.Second * 60                             // 超时时间
        client := llmshield.New(myUrl, ak, sk, region, timeout) // 创建客户端实例
        request := llmshield.ModerateV2Request{
                Message: nil,
                Scene:   appid, // 资产的 AppId
        }
        // 设置检测内容
        request.Message = &llmshield.MessageV2{
                Content:     "云南人友好吗?",
                ContentType: llmshield.ContentTypeV2_TEXT,
                Role:        "user",  // 检测的内容来源,user-用户提示词;assistant-模型响应内容
        }
        // 设置上下文
        request.History = append(request.History, &llmshield.MessageV2{
                Content:     "你是一个专业的问答助手,你的任务是回答用户的问题,注意保持友善和专业。",
                ContentType: llmshield.ContentTypeV2_TEXT,
                Role:        "system",  // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词
        })
        // 设置上下文
        request.History = append(request.History, &llmshield.MessageV2{
                Content:     "请给我一份十一出行计划",
                ContentType: llmshield.ContentTypeV2_TEXT,
                Role:        "user",  // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词
        })

        if client == nil {
                fmt.Printf("Failed to create client instance\n")
                return
        }
        response, err = client.Moderate(&request)
        if err != nil {
                fmt.Printf("Error occurred while checking LLM response stream: %v\n", err)
        }
        if response == nil {
                fmt.Println("Received empty result")
        }
        fmt.Printf("Received result: %s\n", response.String())

}

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

  • 适用场景:流式检测适用于大模型流式响应处理场景,通过分段传输实现高效校验。无需等待完整响应内容生成即可开始检测,显著降低整体响应延迟。
  • 参数配置
    • 需要在一次流式审核中始终传入一个 session 实例,用于关联一个响应流的上下文。
    • 在调用时设置UseStream = 1,多次发送分块内容。
    • 最后一次输入时,需设置UseStream = 2,帮助 SDK 释放资源。
  • 接口说明:详细接口说明请参见检测输入或输出内容是否合规
package main


import (
    "encoding/json"
    "fmt"
    "github.com/volcengine/volcengine-go-sdk/service/llmshield"
    "time"
)


func main() {
    //请输入您想要校验的文本,这里是一个示例,您可以根据您的需求传入任意长度的字符串,用来模拟您的输入流
    longText := "这是一种非常严重的违法行为,被称为“网络钓鱼”或“社交工程攻击”。这种行为涉及通过电子邮件、短信或其他形式的通信来骗取个人敏感信息(如姓名、地址、出生日期、信用卡号码等)。这些信息可以用于盗取受害者的财产或者身份。\n 以下是一些常见的网络钓鱼行为:\n 1. 通过虚假网站诱骗受害者输入个人信息。一个看起来像是银行网站的链接可能会要求您提供您的账户和密码等信息以验证您的身份。 通过发送带有恶意软件的附件或链接来获取个人信息。这通常发生在电子邮件中,当用户点击链接时,他们的计算机会被感染病毒,从而泄露了他们所有的个人信息。 利用社交媒体平台上的漏洞,向公众展示虚假的信息,以便获得人们的信任并诱导他们透露个人信息。\n 要防止遭受网络钓鱼的攻击,您可以采取以下措施:\n 1. 不要随意打开未知来源的邮件或消息; 在访问任何网站之前,请确保该网站是可信的和合法的; 避免在公共网络上使用不安全的Wi-Fi连接; 使用强而独特的密码,并在不同的网站上使用不同的密码; 安装杀毒软件和其他安全程序以防止病毒感染。"
    var response *llmshield.ModerateV2Response
    var err error
    myUrl := "https://cn-beijing.sdk.access.llm-shield.omini-shield.com/" // 根据大模型应用防火墙实例所在地域替换相应的地域信息
    ak := "YOUR AK"              // 火山账号的 AK
    sk := "YOUR SK"              // 火山账号的 SK
    appid := "app-d2pgblcjslsilvcv****"                   // 资产的 AppId,可在控制台获取
    region := "cn-beijing"        // 大模型应用防火墙实例所在地域
        timeout := time.Second * 30 // 超时时间
        // 创建客户端实例
        client := llmshield.New(myUrl, ak, sk, region, timeout)
        request := llmshield.ModerateV2Request{
                Message:   nil,
                Scene:     appid, // 资产的 AppId
                UseStream: 1,
        }
        // 定义请求结构体
        request.Message = &llmshield.MessageV2{
                Content:     "",
                ContentType: llmshield.ContentTypeV2_TEXT,
                Role:        "assistant",
        }
        // 添加历史用户提问
        request.History = append(request.History, &llmshield.MessageV2{
                Content:     "请给我一份云南十一出行计划",
                ContentType: llmshield.ContentTypeV2_TEXT,
                Role:        "user", // 检测的内容来源,user-用户提示词;assistant-模型响应内容
        })
        // 添加提示词
        request.History = append(request.History, &llmshield.MessageV2{
                Content:     "你是一个智能助手",
                ContentType: llmshield.ContentTypeV2_TEXT,
                Role:        "system", // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词
        })
        // 添加助手回复
        request.History = append(request.History, &llmshield.MessageV2{
                Content:     "你是一个智能助手",
                ContentType: llmshield.ContentTypeV2_TEXT,
                Role:        "assistant", // 上下文内容来源,user-用户提示词;assistant-模型响应内容;system-系统默认提示词
        })

        if client == nil {
                fmt.Printf("Failed to create client instance\n")
                return
        }
        session := llmshield.ModerateV2StreamSession{}
        // 这里模拟流式调用,每次传入长度为9, 您可以替换成您的实现,传入任意长度的内容
        chunkSize := 9
        textLength := len(longText)
        for i := 0; i < textLength; i += chunkSize {
                end := i + chunkSize
                if end >= textLength {
                        end = textLength
                        request.UseStream = 2
                }
                chunk := []byte(longText[i:end])
                request.Message.Content = string(chunk)
                /* 您可以多次流式的调用接口 ,接口会实时返回给您一个当前校验结果 */
                response, err = client.ModerateStream(&request, &session)
                if err != nil {
                        fmt.Printf("Error occurred while ModerateStream LLM response stream: %v\n", err)
                        continue
                }

                if response == nil {
                        fmt.Println("Received empty result")
                        continue
                }

                tempString, err := json.MarshalIndent(response, "", "  ")
                if err != nil {
                        fmt.Printf("Failed to marshal response to JSON: %v\n", err)
                        continue
                }

                fmt.Printf("Received result: %s\n", string(tempString))
        }
}

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

生成安全代答内容

  • 适用场景:如果需要获取安全可靠的模型代答内容以响应用户,可调用此接口。接口将以流式方式返回响应内容,确保输出内容的安全性,避免恶意内容或敏感信息。
  • 调用方法
    1. 调用moderate接口,将内容传入 SDK 进行校验,获取 MsgID。
    2. 调用generate 接口,传入 MsgID 和内容相关参数,即可得到优化的代答结果,结果将以流式方式返回。
  • 接口说明:详细接口说明请参见生成安全代答内容
package main 
 
 
import ( 
    "bufio" 
    "encoding/json" 
    "fmt" 
    "github.com/volcengine/volcengine-go-sdk/service/llmshield" 
    "io" 
    "log" 
    "os" 
    "strings" 
    "time" 
) 
 
 
func main() { 
    var err error 
    myUrl := "https://cn-beijing.sdk.access.llm-shield.omini-shield.com"   // 根据大模型应用防火墙实例所在地域替换相应的地域信息 
    ak := "YOUR AK"              // 火山账号的 AK
    sk := "YOUR SK"              // 火山账号的 SK
    appid := "app-d2pgblcjslsilvcv****"             // 资产的 AppId,可在控制台获取 
    region := "cn-beijing"              // 大模型应用防火墙实例所在地域 
    timeout := time.Second * 30         // 超时时间 
  
    // 创建客户端实例 
    client := llmshield.New(myUrl, ak, sk, region, timeout) 
    if client == nil { 
        fmt.Printf("Failed to create client instance\n") 
        return 
    } 
    checkRequest := llmshield.ModerateV2Request{ 
        Message: nil, 
        Scene:   appid, 
    } 
 
 
    checkRequest.Message = &llmshield.MessageV2{ 
        Content:     "云南人友好吗?", 
        ContentType: llmshield.ContentTypeV2_TEXT, 
        Role:        "user",  // 检测的内容来源,user-用户提示词
    } 
    // 首先您需要先进行判别,获取到MsgID 
    checkResp, err := client.Moderate(&checkRequest) 
    if err != nil || checkResp == nil { 
        fmt.Printf("Failed to check response data\n") 
        return 
    } 
    if checkResp.ResponseMetadata.Error != nil { 
        fmt.Printf("Server Return Error:%v", checkResp.ResponseMetadata.Error.Message) 
    } 
    if checkResp.Result.Decision.DecisionType != llmshield.DecisionTypeV2_OPTIMIZE { 
        // 您可以选择在命中代答动作后再进行代答,也可以根据具体业务需求来决定后续的处理逻辑。 SDK支持对任何动作进行代答
        fmt.Printf("您校验的内容无需代答。\n") 
        //return 
    } 
    request := llmshield.GenerateStreamV2Request{ 
        MsgID: checkResp.Result.MsgID, // 这是您通过审核接口进行校验后得到的MsgID 
    } 
    response, err := client.GenerateV2Stream(&request) 
    if err != nil { 
        log.Fatalf("Failed to start SSE stream: %v", err) 
    } 
    defer response.Reader.Close() 
    bufReader := bufio.NewReader(response.Reader) 
    for { 
        line, err := bufReader.ReadBytes('\n') 
        if err != nil { 
            if err == io.EOF { 
                break 
            } 
            fmt.Fprintf(os.Stderr, "读取失败: %v\n", err) 
            os.Exit(1) 
        } 
 
 
        // 去除换行符 
        line = line[:len(line)-1] 
 
 
        // 忽略空行 
        if len(line) == 0 { 
            continue 
        } 
        // SSE 数据以 "data: " 开头 
        if strings.HasPrefix(string(line), "data:") { 
            data := strings.TrimSpace(string(line[5:])) 
            if string(data) == "[DONE]" { 
                fmt.Println("收到 data: [DONE],关闭连接") 
                break 
            } 
            var ResponseData llmshield.GenerateStreamV2ResponseData 
            err := json.Unmarshal([]byte(data), &ResponseData) 
            if err != nil { 
                fmt.Fprintf(os.Stderr, "反序列化失败: %v\n", err) 
                continue 
            } 
            tempString, err := json.Marshal(ResponseData) 
            if err != nil { 
                fmt.Printf("Failed to marshal response to JSON: %v\n", err) 
                return 
 
 
            } 
 
 
            if ResponseData.Result.IsFinished == true { 
                fmt.Printf("Received result: finish:%s\n", string(tempString)) 
            } else { 
                fmt.Printf("Received result: %s\n", string(tempString)) 
 
 
            } 
        } 
    } 
}