使用Dialogflow API V2添加训练短语避免覆盖内容的问题
解决Dialogflow V2 API添加训练短语时的覆盖问题
你猜的完全没错!直接调用patch接口只传新增的训练短语,确实会把现有的短语全删掉——因为Dialogflow的patch默认是替换式更新,而不是追加。正确的操作流程得分成三步来走:
1. 先拉取目标意图的完整数据
首先得调用projects.agent.intents.get接口,传入你要修改的意图名称(格式是projects/{你的项目ID}/agent/intents/{意图ID})。这个接口会返回意图的全部信息,包括现有的trainingPhrases数组,这一步是为了确保你能拿到所有已有的训练短语,不会弄丢。
注意调用的时候要做好身份认证,比如用服务账号的密钥生成访问令牌,不然接口会拒绝你的请求。
2. 给训练短语数组添加新内容
从返回的意图数据里取出trainingPhrases,把你要新增的训练短语对象加进去就行。每个训练短语的格式大概是这样的:
{ "type": "EXAMPLE", "parts": [ { "text": "你要添加的新训练短语内容" } ] }
这里建议加个去重逻辑,先检查一下新增的短语是不是已经存在了,避免重复添加导致冗余。
3. 用patch接口更新意图(重点!)
这一步最关键的是要设置updateMask参数为trainingPhrases,然后在请求体里带上更新后的完整trainingPhrases数组。
updateMask的作用是告诉Dialogflow:“我只更新trainingPhrases这个字段,其他字段保持原样”。如果不设置这个参数,Dialogflow会默认用你传的请求体替换整个意图,那还是会覆盖掉其他内容。
举个curl的简单示例:
# 第一步:获取意图完整数据 curl -X GET \ 'https://dialogflow.googleapis.com/v2/projects/你的项目ID/agent/intents/你的意图ID' \ -H 'Authorization: Bearer 你的访问令牌' # 第二步修改数组后,第三步执行更新 curl -X PATCH \ 'https://dialogflow.googleapis.com/v2/projects/你的项目ID/agent/intents/你的意图ID?updateMask=trainingPhrases' \ -H 'Authorization: Bearer 你的访问令牌' \ -H 'Content-Type: application/json' \ -d '{ "trainingPhrases": [ // 这里放原有的所有训练短语 + 新增的短语 ] }'
如果需要批量处理多个意图或者频繁添加短语,最好把这个流程封装成脚本,比如用Python或者Node.js来实现,这样操作起来更高效。
内容的提问来源于stack exchange,提问作者mattipet
相关产品推荐
相关产品推荐

