全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

文本检测

最近更新时间:2026-03-02 21:48:45

检测示例

您可以基于大模型应用防火墙(KMAF)SDK 调用接口对文本内容进行合规检测。文本检测分为非流式流式两种方式,本文提供 Go 开发语言的文本内容检测示例代码,供您参考。

非流式文本检测

适用场景

非流式检测适用于需要完整上下文进行深度语义分析的场景,在一次调用中完成全部消息内容的检测。

接口说明

接口介绍、使用限制以及参数描述,请参见「检测输入或输出内容」。

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 释放资源

接口说明

接口介绍、使用限制以及参数描述,请参见「检测输入或输出内容」。

流式检测流程

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)

	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("✅ 流式检测完成,内容安全")
}

注意事项

  1. MsgId 唯一性:同一次流式检测的所有分块必须使用相同的 MsgId,用于关联上下文。

  2. UseStream 参数设置

    • 非末次调用:UseStream = 1,多次发送分块内容

    • 末次调用:UseStream = 2,标识流式结束,触发资源释放(必须设置,否则资源无法释放)

  3. 及时终止:检测到 block 时应立即终止流式传输,避免产生无效调用。

  4. 代答接口调用时机:使用流式检测时,需待检测完全结束(末次传入 UseStream = 2)并返回结果后,方可调用代答接口。

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈