最近更新时间:2026-03-02 21:48:45
您可以基于大模型应用防火墙(KMAF)SDK 调用接口对文本内容进行合规检测。文本检测分为非流式和流式两种方式,本文提供 Go 开发语言的文本内容检测示例代码,供您参考。
非流式检测适用于需要完整上下文进行深度语义分析的场景,在一次调用中完成全部消息内容的检测。
接口介绍、使用限制以及参数描述,请参见「检测输入或输出内容」。
package main
import (
"fmt"
"os"
kmaf "github.com/kingsoftcloud/sdk-go/v2/ksyun/client/kmaf/v20260130"
"github.com/kingsoftcloud/sdk-go/v2/ksyun/common"
"github.com/kingsoftcloud/sdk-go/v2/ksyun/common/profile"
)
func main() {
// 1. 初始化凭证(建议从环境变量读取)
ak := os.Getenv("KSYUN_AK")
sk := os.Getenv("KSYUN_SK")
if ak == "" || sk == "" {
ak = "KSYUN_AK_HERE"
sk = "KSYUN_SK_HERE"
}
credential := common.NewCredential(ak, sk)
// 2. 客户端配置
cpf := profile.NewClientProfile()
cpf.HttpProfile.ReqMethod = "POST"
cpf.HttpProfile.ReqTimeout = 10
cpf.HttpProfile.Endpoint = "kmaf.api.ksyun.com"
// 3. 创建客户端
client, err := kmaf.NewClient(credential, "cn-beijing-6", cpf)
if err != nil {
fmt.Printf("NewClient error: %s\n", err)
return
}
// 4. 构造检测请求
req := kmaf.NewCheckModerateRequest()
req.AppId = common.StringPtr("your-app-id")
req.MsgId = common.StringPtr("msg-001")
req.UseStream = common.IntPtr(0) // 非流式检测
req.Message = &kmaf.CheckModerateMessage{
Role: common.StringPtr("user"),
Content: common.StringPtr("这是一条待检测的文本内容"),
ContentType: common.IntPtr(1), // 1-文本
}
// 可选:添加关联上下文
req.History = []*kmaf.CheckModerateHistory{
{
Role: common.StringPtr("assistant"),
Content: common.StringPtr("你好!有什么可以帮你的?"),
ContentType: common.IntPtr(1),
},
}
// 5. 发送请求并处理响应
resp, err := client.CheckModerateSend(req)
if err != nil {
fmt.Printf("CheckModerate error: %s\n", err)
return
}
// 6. 解析结果
action := ""
if resp.Data.Decision.Action != nil {
action = *resp.Data.Decision.Action
}
fmt.Printf("检测完成,MsgId: %s, 决策: %s\n", *resp.Data.MsgId, action)
switch action {
case "pass":
fmt.Println("✅ 内容安全,直接放行")
case "block":
fmt.Println("❌ 内容违规,已被拦截")
for _, risk := range resp.Data.RiskInfo.Risks {
if risk.Category != nil {
fmt.Printf(" - 风险分类: %s\n", *risk.Category)
}
}
case "answer":
fmt.Println("? 需调用安全代答接口")
}
}流式检测适用于大模型流式响应处理场景,通过分段传输实现高效校验。无需等待完整响应内容生成即可开始检测,显著降低整体响应延迟。
会话管理:需要在一次流式审核中始终传入同一个 MsgId,用于关联一个响应流的上下文。
流式标识:
非末次调用:设置 UseStream = 1,多次发送分块内容
末次调用:设置 UseStream = 2,标识流式结束,SDK 释放资源
接口介绍、使用限制以及参数描述,请参见「检测输入或输出内容」。
package main
import (
"fmt"
"os"
kmaf "github.com/kingsoftcloud/sdk-go/v2/ksyun/client/kmaf/v20260130"
"github.com/kingsoftcloud/sdk-go/v2/ksyun/common"
"github.com/kingsoftcloud/sdk-go/v2/ksyun/common/profile"
)
func main() {
// 1. 初始化客户端(同非流式)
ak := os.Getenv("KSYUN_AK")
sk := os.Getenv("KSYUN_SK")
if ak == "" || sk == "" {
ak = "KSYUN_AK_HERE"
sk = "KSYUN_SK_HERE"
}
credential := common.NewCredential(ak, sk)
cpf := profile.NewClientProfile()
cpf.HttpProfile.ReqMethod = "POST"
cpf.HttpProfile.ReqTimeout = 10
cpf.HttpProfile.Endpoint = "kmaf.api.ksyun.com"
client, err := kmaf.NewClient(credential, "cn-beijing-6", cpf)
if err != nil {
fmt.Printf("NewClient error: %s\n", err)
return
}
// 2. 准备长文本并分块
msgId := "stream-msg-001"
appId := "your-app-id"
longText := "这是一段很长的文本内容,用于演示流式检测功能。在实际场景中,这可能是大模型生成的流式响应内容,我们需要边生成边检测,以便及时发现违规内容并终止生成。流式检测可以显著降低整体响应延迟,提升用户体验。"
chunkSize := 50 // 每块字符数
// 将长文本按 chunkSize 分块
var textChunks []string
runes := []rune(longText)
for i := 0; i < len(runes); i += chunkSize {
end := i + chunkSize
if end > len(runes) {
end = len(runes)
}
textChunks = append(textChunks, string(runes[i:end]))
}
// 3. 构造检测请求(循环外复用)
req := kmaf.NewCheckModerateRequest()
req.AppId = common.StringPtr(appId)
req.MsgId = common.StringPtr(msgId)
req.Message = &kmaf.CheckModerateMessage{
Role: common.StringPtr("assistant"),
ContentType: common.IntPtr(1),
}
// 4. 流式检测
for i, chunk := range textChunks {
isLast := i == len(textChunks)-1
useStream := 1
if isLast {
useStream = 2 // 最后一次设置为 2
}
req.UseStream = common.IntPtr(useStream)
req.Message.Content = common.StringPtr(chunk)
resp, err := client.CheckModerateSend(req)
if err != nil {
fmt.Printf("CheckModerate error (chunk %d): %s\n", i+1, err)
return
}
action := ""
if resp.Data.Decision.Action != nil {
action = *resp.Data.Decision.Action
}
fmt.Printf("Chunk %d 检测结果: %s\n", i+1, action)
// 如果检测到违规,立即终止
if action == "block" {
fmt.Println("❌ 检测到违规内容,终止流式检测")
for _, risk := range resp.Data.RiskInfo.Risks {
if risk.Category != nil {
fmt.Printf(" - 风险分类: %s\n", *risk.Category)
}
}
return
}
}
fmt.Println("✅ 流式检测完成,内容安全")
}MsgId 唯一性:同一次流式检测的所有分块必须使用相同的 MsgId,用于关联上下文。
UseStream 参数设置:
非末次调用:UseStream = 1,多次发送分块内容
末次调用:UseStream = 2,标识流式结束,触发资源释放(必须设置,否则资源无法释放)
及时终止:检测到 block 时应立即终止流式传输,避免产生无效调用。
代答接口调用时机:使用流式检测时,需待检测完全结束(末次传入 UseStream = 2)并返回结果后,方可调用代答接口。
纯净模式