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

Watson Conversation动态获取指定实体值列表的实现问询

解决方案:动态返回Watson Assistant实体的所有值

我之前也碰到过一模一样的需求,不用静态上下文数组的话,咱们可以通过Webhook调用Watson Assistant API的方式实现动态获取实体全量值,具体步骤如下:

1. 先定义对应的查询意图

首先得让Watson准确识别用户“查询所有水果”的请求,所以创建一个意图(比如命名为list_fruits),添加这些训练样本:

  • 你们有什么水果?
  • 能提供哪些水果?
  • 所有可选的水果是啥?
  • 水果种类有哪些?

多添加几个相似表述,确保Watson能稳定触发这个意图。

2. 搭建Webhook后端服务

Watson对话流本身没法直接读取实体的完整值列表,所以需要通过Webhook调用Watson的官方API来获取。这里以Python为例写个极简后端:

import requests
from flask import Flask, request, jsonify

app = Flask(__name__)

# 替换成你自己的Watson认证信息和技能ID
WATSON_API_KEY = "你的API密钥"
WATSON_ASSISTANT_URL = "你的Assistant服务URL"
SKILL_ID = "你的技能ID"
ENTITY_ID = "Fruit"

@app.route('/get-fruit-values', methods=['POST'])
def get_fruit_values():
    # 调用Watson Assistant的实体值列表API
    api_url = f"{WATSON_ASSISTANT_URL}/v2/skills/{SKILL_ID}/entities/{ENTITY_ID}/values?version=2021-06-14"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {WATSON_API_KEY}"
    }
    response = requests.get(api_url, headers=headers)
    
    if response.status_code == 200:
        # 提取所有实体值并整理成自然语言格式
        value_list = [item['value'] for item in response.json()['values']]
        if len(value_list) > 1:
            fruit_text = ", ".join(value_list[:-1]) + " 和 " + value_list[-1]
        else:
            fruit_text = value_list[0]
        return jsonify({"fruits": fruit_text})
    else:
        return jsonify({"fruits": "抱歉,暂时无法获取水果列表"})

if __name__ == '__main__':
    app.run(port=5000)

你也可以用Node.js、Java等自己熟悉的语言实现,核心逻辑就是调用Watson的List entity values接口拿到所有值,再整理成友好的文本格式返回。

3. 在Watson Assistant中配置Webhook和对话节点

  • 启用Webhook:进入你的技能,点击左侧菜单栏「设置」→「Webhook」,填入刚才搭建的服务地址(比如http://你的服务器地址:5000/get-fruit-values),保存配置。
  • 配置对话节点:
    1. 新建一个对话节点,触发条件设为#list_fruits(匹配我们定义的意图)。
    2. 在节点的「然后」部分,选择「调用Webhook」,选中刚才配置的Webhook。
    3. 添加响应内容,引用Webhook返回的结果:我们目前提供的水果有:<? $webhook_result.fruits ?>

这样当用户问“你们有什么水果?”时,Watson会触发意图、调用Webhook获取最新的Fruit实体值列表,然后动态返回给用户。

补充:简易替代方案(适合值少变动的场景)

如果你的实体值不会频繁更新,也可以用个小技巧:创建Fruit实体时,把所有值的列表写在实体的「描述」字段里(比如“Apple、Orange、Banana、Kiwi”),然后在对话节点的响应中直接引用<? entities['Fruit'].description ?>。这种方法不用写后端,但需要手动维护描述字段,适合值很少变动的场景。

内容的提问来源于stack exchange,提问作者Guido Dizioli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:19:48