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

IBM Watson Assistant客户端开发:上下文处理与实体判断问询

关于IBM Watson Assistant .NET客户端的两个问题解答

1. 如何保存上下文并回传给IBM Watson Assistant

首先得明白,Watson Assistant的**上下文(Context)**是维持对话状态的核心——它能记住用户之前提过的信息、对话流程的进度。在.NET客户端里,咱们可以通过官方SDK轻松处理这个需求:

  • 先在NuGet里安装IBM.Watson.Assistant.v2包,这是Watson Assistant的官方.NET SDK。
  • 初始化客户端时,要填入你的API密钥和服务URL(这些都能在Watson控制台里找到)。
  • 每次调用Watson的Message接口时,请求里要带上当前的上下文;Watson返回的响应会包含更新后的上下文,你得把这个上下文保存下来(比如存在内存、数据库或者会话存储里),下次发起请求时再传回去。

给你一段示例代码参考:

using IBM.Watson.Assistant.v2;
using IBM.Watson.Assistant.v2.Model;

// 初始化Watson客户端
var assistant = new AssistantService("2021-06-14") // 替换成你对应的API版本号
{
    Authenticator = new IamAuthenticator(apiKey: "你的API密钥"),
    ServiceUrl = "你的Watson服务URL"
};

// 第一步:创建会话(每个对话需要独立的session ID)
var sessionResponse = await assistant.CreateSessionAsync(assistantId: "你的助手ID");
var sessionId = sessionResponse.SessionId;

// 第一次请求:不带上下文(或初始上下文)
var firstMessageRequest = new MessageInput() { Text = "你好,我想咨询订单问题" };
var firstMessageResponse = await assistant.MessageAsync(
    assistantId: "你的助手ID",
    sessionId: sessionId,
    input: firstMessageRequest
);

// 保存返回的上下文,用于下一次请求
var currentContext = firstMessageResponse.Context;

// 第二次请求:带上之前保存的上下文,让Watson记住对话状态
var secondMessageRequest = new MessageInput() { Text = "我的订单号是12345" };
var secondMessageResponse = await assistant.MessageAsync(
    assistantId: "你的助手ID",
    sessionId: sessionId,
    input: secondMessageRequest,
    context: currentContext
);

// 对话结束后记得销毁会话
await assistant.DeleteSessionAsync(assistantId: "你的助手ID", sessionId: sessionId);

关键点就是每次请求都要传递上一次响应里的Context,这样Watson才能连贯处理对话。

2. 在.NET客户端中实现对话逻辑:判断输入是否属于实体列表

如果不想依赖Watson的对话管理,自己在.NET里处理实体判断,思路其实很清晰:把你在Watson里定义的实体导出,然后在客户端做匹配逻辑就行。

步骤拆解:

  1. 导出Watson实体:在Watson Assistant控制台里找到你的实体,导出成JSON格式(或者手动整理成实体列表)。比如实体结构大概是这样:
[
    { "entity": "order_status", "values": ["已发货", "待支付", "已取消"] },
    { "entity": "product_type", "values": ["手机", "电脑", "耳机"] }
]
  1. 在.NET中加载实体数据:先定义一个对应实体的C#类,比如:
public class WatsonEntity
{
    public string Entity { get; set; }
    public List<string> Values { get; set; }
}

然后用System.Text.Json或者Newtonsoft.Json把导出的JSON文件加载成List<WatsonEntity>对象。
3. 实现实体匹配逻辑:针对用户输入,遍历实体列表,检查输入里是否包含实体值。可以做精确匹配,也可以做模糊匹配(比如忽略大小写),复杂场景还能用上正则表达式。

示例代码:

// 加载实体数据(假设已经从JSON文件读取到entities列表)
List<WatsonEntity> entities = LoadEntitiesFromJson("entities.json");

// 判断用户输入是否包含实体的方法
public List<string> MatchUserInputEntities(string userInput)
{
    var matchedEntities = new List<string>();
    foreach (var entity in entities)
    {
        foreach (var value in entity.Values)
        {
            // 模糊匹配,忽略大小写
            if (userInput.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0)
            {
                matchedEntities.Add($"{entity.Entity}: {value}");
                break; // 每个实体只匹配一次即可
            }
        }
    }
    return matchedEntities;
}

// 调用示例
var userInput = "我的手机订单已经发货了吗?";
var matches = MatchUserInputEntities(userInput);
foreach (var match in matches)
{
    Console.WriteLine($"匹配到实体:{match}");
}

如果需要更智能的识别(比如同义词、变体),可以扩展匹配逻辑,把实体的同义词也加入匹配列表,或者用.NET的ML.NET库训练一个简单的实体识别模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:21