在 C# 中从 FormFlow 调用 LUIS

2023-12-07

我正在使用 Microsoft 机器人框架创建一个机器人来询问用户然后理解答案。使用机器人框架中的 FormFlow API 询问用户并检索答案。这是表单流的代码:

public enum Genders { none, Male, Female, Other};

[Serializable]
public class RegisterPatientForm
{

    [Prompt("What is the patient`s name?")]
    public string person_name;

    [Prompt("What is the patients gender? {||}")]
    public Genders gender;

    [Prompt("What is the patients phone number?")]
    [Pattern(@"(<Undefined control sequence>\d)?\s*\d{3}(-|\s*)\d{4}")]
    public string phone_number;

    [Prompt("What is the patients Date of birth?")]
    public DateTime DOB;

    [Prompt("What is the patients CNIC number?")]
    public string cnic;


    public static IForm<RegisterPatientForm> BuildForm()
    {
        OnCompletionAsyncDelegate<RegisterPatientForm> processHotelsSearch = async (context, state) =>
        {
            await context.PostAsync($"Patient {state.person_name} registered");
        };

        return new FormBuilder<RegisterPatientForm>()
            .Field(nameof(person_name),
            validate: async (state, value) =>
            {
                //code here for calling luis
            })
            .Field(nameof(gender))
            .Field(nameof(phone_number))
            .Field(nameof(DOB))
            .Field(nameof(cnic))
            .OnCompletion(processHotelsSearch)
            .Build();
    }

}

当要求输入姓名时,用户可以输入:

我的名字是詹姆斯·邦德

名称也可以是可变长度的。我最好从这里打电话给 luis 并获取意图的实体(名称)。我目前不知道如何从表单流中调用 luis 对话框。


您可以使用 LUIS 的 API 方法,而不是对话框方法。

您的代码将是 - RegisterPatientForm Class :

public enum Genders { none, Male, Female, Other };

[Serializable]
public class RegisterPatientForm
{

    [Prompt("What is the patient`s name?")]
    public string person_name;

    [Prompt("What is the patients gender? {||}")]
    public Genders gender;

    [Prompt("What is the patients phone number?")]
    [Pattern(@"(<Undefined control sequence>\d)?\s*\d{3}(-|\s*)\d{4}")]
    public string phone_number;

    [Prompt("What is the patients Date of birth?")]
    public DateTime DOB;

    [Prompt("What is the patients CNIC number?")]
    public string cnic;


    public static IForm<RegisterPatientForm> BuildForm()
    {
        OnCompletionAsyncDelegate<RegisterPatientForm> processHotelsSearch = async (context, state) =>
        {
            await context.PostAsync($"Patient {state.person_name} registered");
        };

        return new FormBuilder<RegisterPatientForm>()
            .Field(nameof(person_name),
            validate: async (state, response) =>
            {
                var result = new ValidateResult { IsValid = true, Value = response };

                //Query LUIS and get the response
                LUISOutput LuisOutput = await GetIntentAndEntitiesFromLUIS((string)response);

                //Now you have the intents and entities in LuisOutput object
                //See if your entity is present in the intent and then retrieve the value
                if (Array.Find(LuisOutput.intents, intent => intent.Intent == "GetName") != null)
                {
                    LUISEntity LuisEntity = Array.Find(LuisOutput.entities, element => element.Type == "name");

                    if (LuisEntity != null)
                    {
                        //Store the found response in resut
                        result.Value = LuisEntity.Entity;
                    }
                    else
                    {
                        //Name not found in the response
                        result.IsValid = false;
                    }
                }
                else
                {
                    //Intent not found
                    result.IsValid = false;
                }
                return result;
            })
            .Field(nameof(gender))
            .Field(nameof(phone_number))
            .Field(nameof(DOB))
            .Field(nameof(cnic))
            .OnCompletion(processHotelsSearch)
            .Build();
    }

    public static async Task<LUISOutput> GetIntentAndEntitiesFromLUIS(string Query)
    {
        Query = Uri.EscapeDataString(Query);
        LUISOutput luisData = new LUISOutput();
        try
        {
            using (HttpClient client = new HttpClient())
            {
                string RequestURI = WebConfigurationManager.AppSettings["LuisModelEndpoint"] + Query;
                HttpResponseMessage msg = await client.GetAsync(RequestURI);
                if (msg.IsSuccessStatusCode)
                {
                    var JsonDataResponse = await msg.Content.ReadAsStringAsync();
                    luisData = JsonConvert.DeserializeObject<LUISOutput>(JsonDataResponse);
                }
            }
        }
        catch (Exception ex)
        {

        }
        return luisData;
    }
}

Here GetIntentAndEntitiesFromLUIS方法使用 Luis 应用程序公开的端点对 LUIS 进行查询。使用密钥将端点添加到您的 Web.configLuisModelEndpoint

通过访问找到您的 luis 端点Publish您的 luis 应用程序中的选项卡

你的 web.config 看起来像这样

<appSettings>
  <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->
  <add key="BotId" value="YourBotId" />
  <add key="MicrosoftAppId" value="" />
  <add key="MicrosoftAppPassword" value="" />
  <add key="LuisModelEndpoint" value="https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/YOUR_MODEL_ID?subscription-key=YOUR_SUBSCRIPTION_KEY&amp;verbose=true&amp;timezoneOffset=0&amp;q="/>
</appSettings>

我创建了一个 LUISOOutput 类来反序列化响应:

public class LUISOutput
{
    public string query { get; set; }
    public LUISIntent[] intents { get; set; }
    public LUISEntity[] entities { get; set; }
}
public class LUISEntity
{
    public string Entity { get; set; }
    public string Type { get; set; }
    public string StartIndex { get; set; }
    public string EndIndex { get; set; }
    public float Score { get; set; }
}
public class LUISIntent
{
    public string Intent { get; set; }
    public float Score { get; set; }
}

Emulator Response enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中从 FormFlow 调用 LUIS 的相关文章

随机推荐

  • 错误:运行 docker 容器时无法访问 jarfile

    尝试运行 docker 容器时出现以下错误 Error Unable to access jarfile 我的 Dockerfile 是这样的 FROM ubuntu 16 04 Install Updates RUN apt get up
  • 如何缓存 IQueryable 对象?

    我有这个方法 它返回 UserStatus 表中所有行的 Linq to SQL 查询 public IQueryable
  • 确定 ABAP 中的活动格式设置

    As the 格式化设置的ABAP文档解释 格式设置设置如下 在内部会议开始时 他们是由相关默认设置决定当前用户的用户主记录中的固定值 使用语句 SET COUNTRY 这是当前内部会话的默认设置可以使用特定于国家 地区的格式进行覆盖 但作
  • R - 当我绘制 xts 和 Zoo 对象时如何更改日期格式?

    我想知道如何更改日期格式 我正在处理的代码如下 library quantmod getSymbols AAPL price AAPL lt AAPL 6 plot price AAPL main The price of AAPL 这个结
  • 接收者未注册

    我有一个带有异步任务的程序和一个广播接收器来发送结果代码 以便 Asynctask 知道应用程序正在工作 但它崩溃了 说接收者在主要活动中未注册 我在主活动中注册了一个接收器 另一个接收器在 AsyncTask 活动中注册 所以这里是代码和
  • 从链接 Google Map API 中提取坐标

    有没有办法使用这种类型的谷歌地图链接检索纬度和经度 https goo gl maps 7jNqZtPa5Cjf333k7 在这个网址中7jNqZtPa5Cjf333k7不是指地点ID吗 我真的很难使用这种类型的链接来提取纬度和经度 如果有
  • 自 2022 年 10 月 VS-Code 更新(版本 1.73)起安装的新 isort 扩展出现问题

    我在 Windows 10 Pro Build 10 0 19045 上使用 VS Code 版本 1 73 1 带有 MS Python 扩展 v2022 18 2 安装 VS Code 2022 年 10 月更新后 在编写 Python
  • 将多行字符串中的指定列转换为单个逗号分隔行

    假设我有以下字符串 something1 12 0 some unnecessary trailing data this must go something2 15 5 some more unnecessary trailing dat
  • 导出带有资源的 jar

    我正在尝试通过构建许多小型模块化项目来构建大型 Java 项目 我希望每个小项目都是完全独立的 拥有其所有资源 例如图像 我正在使用 Eclipse 如果我配置构建路径来添加模块化项目之一 资源引用将不起作用 该系统找不到指定的文件 如果我
  • 如何让 Git 不列出修改过的更改?

    Git status 会给我已更改的文件列表 其中我有一些已更改但我不想提交 只需将其保留在工作目录中即可 令人烦恼的是 在提交之前 如果有新的更改 我必须扫描这些文件的差异 或者这些修改只是我知道的并且不想提交的修改 有没有办法告诉 Gi
  • JavaScript 读取文件内容

    如果您有新文档的 url 如何使用 javascript 从不是您所在页面的文档中检索数据 我想做的是创建一个页面 其中有一个用于提供本地文件名的文本字段和一个从所提供的文档中检索单词的按钮 thanks HTML5 有一个文件 API 可
  • 从资源中排除属性文件

    如何从 src main resources 中排除文件 例如 我在那里有一个名为 map 的文件夹 我想保留它 并且我想删除 war 中的所有内容 或者不首先将其打包到里面 或者替代但结果相同 从 src main resources 中
  • asp.net web 配置错误

    我的 ASP NET 项目仍然有问题 在 Visual Studio 中 当我开始调试时 一切正常并且页面正常工作 但是 当我在 iis7 上尝试时 会显示此错误 显示错误 配置错误描述 处理服务此请求所需的配置文件期间发生错误 请查看下面
  • C#:HttpListener 提供内容时出错

    我已经实现了类似的东西this唯一真正的区别是 string filename context Request RawUrl Replace Remove 0 1 string path Uri UnescapeDataString Pat
  • 从 javascript 调用 Objective-C 方法

    我制作任何 webView 并且我想从 javascript 调用任何返回任何参数的目标 c 方法 我尝试了很多方法但不允许 Objective C 方法在这里 BOOL webView UIWebView webView shouldSt
  • java 的 PriorityQueue 的内置迭代器不会以任何特定顺序遍历数据结构。为什么?

    这是直接来自Java文档 此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选方法 iterator 方法中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素 如果需要有序遍历 请考虑使用 Arrays sor
  • Base 64 图像到 ocr.space API Ionic 2

    我正在尝试将 Base 64 Jpeg 发送到 API 进行 OCR 分析 API 文档可以在这里找到https ocr space ocrapi 保存图像的代码在这里 takePicture Camera getPicture desti
  • (更新)基于两列向data.frame添加索引列

    示例数据框 df read table text colA colB 2 7 2 7 2 7 2 7 1 7 1 7 1 7 89 5 89 5 89 5 88 5 88 5 70 5 70 5 70 5
  • String.Replace 似乎没有用空字符串替换括号

    下面的 C 代码似乎没有执行任何操作 String str 3 str Replace String Empty str Replace String Empty Console WriteLine str 最终输出 3 我不知道这是为什么
  • 在 C# 中从 FormFlow 调用 LUIS

    我正在使用 Microsoft 机器人框架创建一个机器人来询问用户然后理解答案 使用机器人框架中的 FormFlow API 询问用户并检索答案 这是表单流的代码 public enum Genders none Male Female O