本文为您提供大模型应用防火墙接口调用的示例代码。实际使用时,您可以替换成 SDK 中已经支持的任意接口。
参考以下表格了解 SDK 中的关键参数说明及获取方法。
参数 | 示例值 | 说明 |
|---|---|---|
myUrl |
|
|
ak、sk |
|
|
appid | app-d35p9du8pa51**** |
|
region |
|
|
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()) }
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)) } }
上述代码中流式内容检测的实现逻辑如下流程图所示:
moderate接口,将内容传入 SDK 进行校验,获取 MsgID。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)) } } } }