您可以通过大模型应用防火墙 SDK 调用伪造内容检测能力,对图片和视频中的 AI 生成、深度伪造、拼接篡改等异常痕迹进行识别。本文以检测本地图片文件为例,介绍如何通过 SDK 完成深度伪造内容检测。
适用场景
- 业务自动审核:在用户上传图片或视频后自动发起检测,减少人工初筛压力。
- 风险前置拦截:在理赔、风控、内容治理等环节,对高风险素材进行前置识别。
- 复核系统集成:将检测结果回传至业务系统,辅助审核人员二次判断。
前提条件
已参考SDK 安装和初始化完成 SDK 依赖安装和客户端初始化配置。
素材要求
调用 SDK 前,请先确认素材格式和大小满足要求。
- 图片
- 格式:支持
jpg、jpeg、png、webp。 - 大小:单张不超过 10 MB。
- Base64 前缀:图片通常可直接传 Base64 字符串,无需额外添加 MIME 前缀;如果您的业务侧统一使用 Data URI,也可分别使用以下前缀:
jpg、jpeg:data:image/jpeg;base64,png:data:image/png;base64,webp:data:image/webp;base64,
- 视频
- 格式:支持
mp4、avi。 - 大小:单条不超过 50 MB。
- Base64 前缀:
mp4:data:video/mp4;base64,avi:data:video/x-msvideo;base64,
步骤一 创建资产应用
- 登录大模型应用防火墙控制台。
- 在左侧导航栏,选择资产管理,然后单击添加资产。
- 配置以下参数并单击提交。
- 接入方式:SDK 接入。
- 应用名称:以 deepfake_demo 为例。
- 防护场景:伪造内容检测。

- 返回控制台,获取资产
AppID,作为 scene 参数值。

步骤二 准备配置参数
参考以下表格了解 SDK 中的关键参数说明及获取方法。
参数 | 示例值 | 说明 |
|---|
myUrl | https://cn-beijing.sdk.access.llm-shield.omini-shield.com | 大模型应用防火墙对外提供的接口服务地址,形如https://{region}.sdk.access.llm-shield.omini-shield.com,其中 region 为您购买的实例所属地域。 - 华北2(北京):cn-beijing
- 华东2(上海):cn-shanghai
|
ak、sk | - AK:AKLTYWRhNDMw****
- SK:TWprNE5XVXlZbc****
| 火山引擎账号的 Access Key ID 和 Secret Access Key。 获取说明请参见 Access Key(密钥)管理。 |
appid | app-d35p9du8pa51**** | 资产的唯一标识,完成控制台接入配置后,系统将自动生成 AppID。对应检测输入或输出内容是否合规中的scene。可前往大模型应用防火墙控制台资产管理模块,查看已通过 SDK 方式接入的资产 AppID。 注意 SDK 调用时支持传入通过 SDK 方式接入的资产 AppID,其他接入方式的资产不生效。 |
region | cn-beijing | 资产所属地域,与 myUrl 中的 region 保持一致。 - 华北2(北京):cn-beijing
- 华东2(上海):cn-shanghai
|
image_file | /Users/DeepFakeTest/image_001.png | 待检测对象的本地路径。 |
message.role | user | 内容来源。可选值包括 user、assistant。对于用户上传的图片或视频,建议传入 user。 |
message.contenttype | IMAGE | 内容类型。在 SDK 中通常对应枚举值 ContentTypeV2.IMAGE 和 ContentTypeV2.VIDEO。 |
步骤三 调用 SDK
请求示例
from volcenginesdkllmshield import *
import base64
# 加载图片内容并转换为Base64编码的函数
def load_image_content(image_file):
with open(image_file, 'rb') as f:
img_bytes = f.read()
# 将二进制图片数据编码为Base64格式,并转换为UTF-8字符串
base64_bytes = base64.b64encode(img_bytes).decode('utf-8')
return base64_bytes, len(base64_bytes)
def main():
# 配置信息(请替换为实际值)
myUrl = "https://cn-shanghai.sdk.access.llm-shield.omini-shield.com" #实例所在地域的服务接口地址
ak = "AKLT****" # Access Key,用于身份认证
sk = "TWpZ****" # Secret Key,用于身份认证
appid = "app-****" # 应用ID,标识要使用的审核应用
region = "cn-shanghai" # 实例所属地域
TIMEOUT = 50 # 超时时间(秒)
image_file = "/Users/DeepFakeTest/image_001.png" # 待检测的图片文件路径
image_content, size = load_image_content(image_file)
if size > 10*1024*1024:
print(f"请求失败: {size/1024}KB")
return
try:
# 发送请求并获取响应
client = ClientV2(myUrl, ak, sk, region, TIMEOUT)
# 构建请求(使用 pydantic 模型)
request = ModerateV2Request(
scene=appid,
message=MessageV2(
role="user", # 检测的内容来源,user-用户提示词;assistant-模型响应内容
content=image_content,
content_type=ContentTypeV2.IMAGE
),
)
response = client.Moderate(request)
# 使用 pydantic 的内置序列化方法
print("审核结果(JSON格式):")
print(response.model_dump_json(by_alias=True, indent=2)) # pydantic 模型直接转 JSON
except Exception as e:
print(f"请求失败: {e}")
if __name__ == "__main__":
main()
package main
import (
"encoding/base64"
"fmt"
"os"
"time"
"github.com/volcengine/volcengine-go-sdk/service/llmshield"
)
func EncodeImageToBase64(imagePath string) (string, error) {
// 读取图片文件内容
data, err := os.ReadFile(imagePath)
if err != nil {
return "", fmt.Errorf("读取图片失败: %v", err)
}
// 进行Base64编码
base64Str := base64.StdEncoding.EncodeToString(data)
return base64Str, nil
}
func main() {
var response *llmshield.ModerateV2Response
var err error
myUrl := "https://cn-shanghai.sdk.access.llm-shield.omini-shield.com" // 实例所在地域的服务接口地址
ak := "YOUR AK" // Access Key,用于身份认证
sk := "YOUR SK" // Secret Key,用于身份认证
appid := "app-****" // 应用ID,标识要使用的审核应用
region := "cn-shanghai" // 实例所在地域
timeout := time.Second * 60 // 超时时间
request := llmshield.ModerateV2Request{
Message: nil,
Scene: appid,
}
dtstr, err := EncodeImageToBase64("/Users/DeepFakeTest/image_001.png") // 待检测图片的本地存储路径
dsize := len(dtstr)
// 确保图片大小不超过 10 MB
if err != nil || dsize > 1010241024 {
fmt.Printf("%v,dsize:%v", err, dsize)
return
}
request.Message = &llmshield.MessageV2{
Content: dtstr,
ContentType: llmshield.ContentTypeV2_IMAGE,
Role: "user",
}
// 创建客户端实例
client := llmshield.New(myUrl, ak, sk, region, timeout)
if client == nil {
fmt.Printf("Failed to create client instance
")
return
}
response, err = client.Moderate(&request)
if err != nil {
fmt.Printf("Error occurred while checking LLM response stream: %v
", err)
}
if response == nil {
fmt.Println("Received empty result")
}
fmt.Printf("Received result: %s
", response.String())
}
import sys
from volcenginesdkllmshield import *
import base64
def load_file_content(file_type, file_path):
with open(file_path, 'rb') as f:
file_bytes = f.read()
baseStr = base64.b64encode(file_bytes).decode('utf-8')
if file_type == "mp4":
baseStr = "data:video/mp4;base64," + baseStr
elif file_type == "avi":
baseStr = "data:video/avi;base64," + baseStr
print(f"", baseStr)
return baseStr
def main():
# 配置信息(请替换为实际值)
myUrl = "https://cn-shanghai.sdk.access.llm-shield.omini-shield.com" # 根据大模型应用防火墙实例所在地域替换相应的地域信息
ak = "YOUR AK" # 火山账号的 AK
sk = "YOUR SK" # 火山账号的 SK
appid = "app-****" # 资产的 AppId,可在控制台资产管理页面获取
region = "cn-shanghai" # 大模型应用防火墙实例所在地域
TIMEOUT = 50 # 超时时间(秒)
try:
# 发送请求并获取响应
client = ClientV2(myUrl, ak, sk, region, TIMEOUT)
# 构建请求
request = ModerateV2Request(
scene = appid, # 资产的 AppId
message = MessageV2(
role = "user", # 检测的内容来源,user-用户提示词;assistant-模型响应内容
content = load_file_content("mp4", "/Users/DeepFakeTest/video_001.mp4"), # 需要检测的视频格式和本地路径
content_type = ContentTypeV2.VIDEO #内容类型,文本-TEXT,文件-FILE,图片-IMAGE,音频-AUDIO,视频-VIDEO
),
)
response = client.Moderate(request)
# 使用 pydantic 的内置序列化方法
print("审核结果(JSON格式):")
print(response.model_dump_json(by_alias=True, indent=2)) # pydantic 模型直接转 JSON
except Exception as e:
print(f"请求失败: {e}")
if __name__ == "__main__":
main()
package main
import (
"encoding/base64"
"fmt"
"os"
"strings"
"time"
"github.com/volcengine/volcengine-go-sdk/service/llmshield"
)
var (
role = "user" // 待检测内容来源,user-用户输入,assistant-模型输出
datainfo1 = "/Users/DeepFakeTest/video_001.mp4" // 待检测内容的路径
dataMap = map[string]*DcInfo{
datainfo1: {"mp4", llmshield.ContentTypeV2_VIDEO},
}
)
func main() {
var response *llmshield.ModerateV2Response
var err error
ak := "YOUR AK" // 火山账号的 AK
sk := "YOUR SK" // 火山账号的 SK
appid := "app-****" // 资产的 AppId,可在控制台资产管理页面获取
region := "cn-shanghai" // 大模型应用防火墙实例所在地域
myUrl := "https://cn-shanghai.sdk.access.llm-shield.omini-shield.com" // 大模型应用防火墙实例的访问地址,根据地域替换
timeout := time.Second * 20 // 超时时间
// 创建客户端实例
client := llmshield.New(myUrl, ak, sk, region, timeout)
if client == nil {
fmt.Printf("Failed to create client instance
")
return
}
request := llmshield.ModerateV2Request{Message: nil, Scene: appid}
request.Message = filledMsgContent(role)
response, err = client.Moderate(&request)
if err != nil {
fmt.Printf("Error occurred while checking LLM response stream: %v
", err)
}
if response == nil {
fmt.Println("Received empty result")
}
fmt.Printf("Received result: %s
", response.String())
}
func filledMsgContent(role string) *llmshield.MessageV2 {
var (
err error
content string
)
msg_multi := &llmshield.MessageV2{
Role: role,
}
for dataInfo, cGroup := range dataMap {
switch cGroup.Dtype {
case llmshield.ContentTypeV2_TEXT:
content = dataInfo
case llmshield.ContentTypeV2_IMAGE, llmshield.ContentTypeV2_FILE, llmshield.ContentTypeV2_AUDIO, llmshield.ContentTypeV2_VIDEO:
content, err = encodeFileToBase64(cGroup.ftype, dataInfo)
if err != nil {
fmt.Printf("Failed to encode file content:%v,err:%v
", content, err)
}
}
multPart := &llmshield.MultiPart{
Content: content,
ContentType: cGroup.Dtype,
}
msg_multi.MultiPart = append(msg_multi.MultiPart, multPart)
}
return msg_multi
}
func encodeFileToBase64(ftype string, filePath string) (string, error) {
data, err := os.ReadFile(filePath)
if err != nil {
return "", fmt.Errorf("读取文件失败: %v", err)
}
base64Str := base64.StdEncoding.EncodeToString(data)
// 根据文件类型添加 data URI 头
switch strings.ToLower(ftype) {
case "mp4":
base64Str = "data:video/mp4;base64," + base64Str
case "avi":
base64Str = "data:video/x-msvideo;base64," + base64Str
}
if len(base64Str) > 50 {
fmt.Printf("Headfile: %v
", strings.Split(base64Str[:50], "base64,")[0])
}
return base64Str, nil
}
type DcInfo struct {
ftype string
Dtype llmshield.ContentTypeV2
}
响应示例
以下响应结果以图片识别为例。
{
"ResponseMetadata": {
"RequestId": "02177937369911100000000000000000000ffff0a1614e5e1****",
"Service": "llmshield",
"Action": "Moderate",
"Version": "2025-08-31",
"Region": "cn-shanghai"
},
"Result": {
"MsgID": "b298424d3aea4e3db10169b6ebac****",
"RiskInfo": {
"Risks": [
{
"Category": "109",
"Label": "10900000",
"Prob": 1.0,
"Matches": []
}
]
},
"Decision": {
"DecisionType": 2,
"DecisionDetail": {
"BlockDetail": {},
"ReplaceDetail": {
"Replacement": null
}
},
"DecisionStrategyID": null,
"HitStrategyIDs": [
"rule-d87gnhdtmscn1mp2****",
"rule-d87gnhdtmscn1mp2****"
]
},
"PermitInfo": {
"Permits": []
},
"ContentInfo": "png",
"Degraded": false,
"DegradeReason": ""
}
}
{
"ResponseMetadata": {
"RequestId": "02177937606464100000000000000000000ffff0a1600e81****",
"Action": "Moderate",
"Version": "2025-08-31",
"Service": "llmshield",
"Region": "cn-shanghai",
"HTTPCode": 200,
"Error": null
},
"Result": {
"MsgID": "abe4e699287c4b699729c0f47a53****",
"RiskInfo": {
"Risks": null
},
"Decision": {
"DecisionType": 1,
"DecisionDetail": {
"BlockDetail": {},
"ReplaceDetail": {
"Replacement": null
}
}
},
"PermitInfo": {
"Permits": null
},
"ContentInfo": "jpg",
"Degraded": false,
"DegradeReason": ""
}
}
步骤四 结果分析
调用完成后,通过响应结果判断送检内容是否为伪造内容。关注响应结果中的以下字段即可:

参数 | 示例值 | 说明 |
|---|
RiskInfo.Risks.Category | 109 | 风险一级分类,109 表示命中了深度伪造风险。 |
RiskInfo.Risks.Label | 10900000 | 命中的二级检测分类标签信息,10900000 表示命中了深度伪造风险对应的标签。 |
RiskInfo.Risks.Prob | 1.0 | 风险概率,表示检测内容属于该风险的可能性,取值范围为 0 到 1 之间。 |
Decision.DecisionType | 2 | 命中的策略动作,表示对该命中内容的处理动作: - 1:通过,表示检测内容未命中深度伪造检测策略,直接放行
- 2:拦截,表示检测内容命中了深度伪造检测策略且被拦截
|
Decision.HitStrategyIDs | rule-d87gnhdtmscn1mp2**** | 命中策略 ID 列表,表示内容命中的所有策略。深度伪造检测场景内置检测策略(为固定 ID),其他自定义策略不会生效。 |
ContentInfo | png | 风险内容的格式。 - 图片:支持
jpg、jpeg、png、webp - 视频:支持
mp4、avi
|
步骤五 查看深度伪造日志
检测完成后,您还可以在控制台查看对应的深度伪造日志,便于后续审计和排查。
- 登录大模型应用防火墙控制台。
- 在左侧菜单栏选择攻击日志。
- 在深度伪造日志页签下,查看判别结果为伪造的日志。
