You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:33:14