Dialogflow与Go服务交互:响应格式化及参数替换方案咨询
解决Dialogflow+Go服务多响应场景的参数替换问题
我来帮你梳理几个可行的方案,完美适配你在多响应场景下用Go服务数据替换Dialogflow响应参数的需求:
方案1:Webhook动态生成带参数的多响应
如果你的多响应内容需要灵活控制(比如根据不同业务逻辑返回不同话术模板),可以直接在Go服务里预定义响应模板,拿到数据后逐个替换占位符,再把处理后的响应返回给Dialogflow。
Go代码示例:
package main import ( "strings" "cloud.google.com/go/dialogflow/apiv2" dialogflowpb "google.golang.org/genproto/googleapis/cloud/dialogflow/v2" ) func handleWebhookRequest(req *dialogflowpb.WebhookRequest) (*dialogflowpb.WebhookResponse, error) { // 从你的业务服务获取经理姓名(示例数据) managerName := "Anton Smith" // 预定义多响应模板,用$占位符标记需要替换的参数 responseTemplates := []string{ "您好,负责该业务的经理是$managerName,您可以直接联系他。", "相关事宜请咨询$managerName经理,他会为您提供专业解答。", "$managerName是该业务的负责人,有任何问题都可以找他沟通。", } // 遍历模板替换参数,生成最终响应列表 var fulfillmentMessages []*dialogflowpb.WebhookResponse_FulfillmentMessage for _, template := range responseTemplates { replacedText := strings.ReplaceAll(template, "$managerName", managerName) fulfillmentMessages = append(fulfillmentMessages, &dialogflowpb.WebhookResponse_FulfillmentMessage{ Message: &dialogflowpb.WebhookResponse_FulfillmentMessage_Text{ Text: &dialogflowpb.WebhookResponse_FulfillmentMessage_Text_{ Text: []string{replacedText}, }, }, }) } // 构建并返回Webhook响应 return &dialogflowpb.WebhookResponse{ FulfillmentMessages: fulfillmentMessages, }, nil }
这种方式的好处是完全由Go服务控制响应内容,适配任何复杂的参数替换逻辑。
方案2:用Dialogflow上下文存储参数,配合控制台预定义响应
如果你的多响应是在Dialogflow控制台里预先配置好的(比如意图里的多个固定话术),可以通过Webhook将Go服务获取的数据存入输出上下文,让Dialogflow自动在响应中替换参数。
步骤1:Go服务设置输出上下文
func handleWebhookRequest(req *dialogflowpb.WebhookRequest) (*dialogflowpb.WebhookResponse, error) { managerName := "Anton Smith" // 创建输出上下文,存储经理姓名参数 outputContext := &dialogflowpb.Context{ // 注意替换成你的项目ID和会话ID(可从请求中获取) Name: "projects/your-project-id/agent/sessions/" + req.Session + "/contexts/manager_info", LifespanCount: 3, // 设置生命周期,确保后续响应能读取到参数 Parameters: map[string]interface{}{ "managerName": managerName, }, } // 返回包含上下文的响应,Dialogflow会自动使用控制台预定义的响应并替换参数 return &dialogflowpb.WebhookResponse{ OutputContexts: []*dialogflowpb.Context{outputContext}, }, nil }
步骤2:在Dialogflow控制台配置响应模板
在意图的“响应”部分,输入带参数引用的话术:
您好,负责的经理是#manager_info.managerName
#manager_info.managerName会为您处理所有相关问题
Dialogflow会自动识别#上下文名.参数名的格式,替换成Webhook传入的实际值。
方案3:结构化Payload传递参数(适合富文本场景)
如果需要更复杂的格式化(比如卡片、按钮、富文本),可以在Go服务返回结构化Payload,把参数值包含在内,然后在前端/客户端完成最终的渲染和替换。
Go代码示例:
func handleWebhookRequest(req *dialogflowpb.WebhookRequest) (*dialogflowpb.WebhookResponse, error) { managerName := "Anton Smith" // 构建包含参数的自定义Payload payload := map[string]interface{}{ "type": "manager_card", "data": map[string]string{ "name": managerName, "desc": "负责该业务的专属经理", }, } return &dialogflowpb.WebhookResponse{ FulfillmentMessages: []*dialogflowpb.WebhookResponse_FulfillmentMessage{ { Message: &dialogflowpb.WebhookResponse_FulfillmentMessage_Payload{ Payload: &structpb.Struct{Fields: structpb.NewStruct(payload)}, }, }, }, }, nil }
客户端拿到这个Payload后,可以根据data.name的值渲染出格式化的内容。
内容的提问来源于stack exchange,提问作者Anton Sachko
相关产品推荐
相关产品推荐

