gpt4 book ai didi

javascript - 重复ChoicePrompt清除UserState

转载 作者:行者123 更新时间:2023-12-03 00:09:01 24 4
gpt4 key购买 nike

我使用 Microsoft BotFramework 实现了一个机器人。为了收集用户数据,我使用 ChoicePrompts。当用户未选择建议的选项之一时,ChoicePrompt 会重复,直到用户输入有效选项(这是提示方法的默认行为)。

不幸的是,在未选择有效选项之一后,用户状态将被刷新。这意味着我将丢失在此之前收集的所有用户数据。

这种行为是故意的还是有办法防止这种情况?

最佳答案

您提供的链接上的代码存在一些问题。由于我看不到您的完整代码,因此我对某些部分进行了猜测。

  1. 仔细检查 userState 和 userData 是否设置正确。我的构造函数如下所示:
const DIALOG_STATE_PROPERTY = 'dialogState';
const USER_PROFILE_PROPERTY = 'user';

const EDUCATION_PROMPT = 'education_prompt';
const MAJOR_PROMPT = 'major_prompt';

constructor(conversationState, userState) {
this.conversationState = conversationState;
this.userState = userState;

this.dialogState = this.conversationState.createProperty(DIALOG_STATE_PROPERTY);
this.userData = this.userState.createProperty(USER_PROFILE_PROPERTY);

this.dialogs = new DialogSet(this.dialogState);

// Add prompts that will be used by the main dialogs.
this.dialogs
.add(new TextPrompt(NAME_PROMPT))
.add(new TextPrompt(AGE_PROMPT))
.add(new TextPrompt(GENDER_PROMPT))
.add(new ChoicePrompt(EDUCATION_PROMPT))
.add(new ChoicePrompt(MAJOR_PROMPT));

// Create dialog for prompting user for profile data
this.dialogs.add(new WaterfallDialog(START_DIALOG, [
this.promptForName.bind(this),
this.promptForAge.bind(this),
this.promptForGender.bind(this),
this.promptForEducation.bind(this),
this.promptForMajor.bind(this),
this.returnUser.bind(this)
]));

this.majors = ['English', 'History', 'Computer Science'];
}
  • 请记住,TextPrompt 返回 step.result 中的值。 ChoicePrompt 返回值作为step.result.value

    我假设在“promptForEducation”步骤中,您将性别值分配给用户,该值来自选择提示。如果没有,你就会失去值(value)。仔细检查您是否指定了正确的来源。

  • .add(new TextPrompt(GENDER_PROMPT))
    .add(new ChoicePrompt(EDUCATION_PROMPT))

    ...

    if (!user.gender) {
    user.gender = step.result;
    // Give user object back to UserState storage
    await this.userData.set(step.context, user);
    console.log(user);
    }
  • 在“promptForMajor”步骤中,step.Prompt 中的第二个参数采用字符串并表示选择的对话框部分。您的代码应如下所示,并将产生以下输出。在本例中,我在构造函数中为“this.majors”赋值(如上所示)。
  • this.majors = ['English', 'History', 'Computer Science'];

    ...

    if (!user.major) {
    // Copy List of majors and add "Other" entry
    let majorsOther = this.majors.slice(0, this.majors.length);
    majorsOther.push('Einen anderen Studiengang');
    // return await step.prompt(MAJOR_PROMPT, this.userData.major, majorsOther);
    return await step.prompt(MAJOR_PROMPT, 'List of majors:', majorsOther);
    }

    enter image description here

  • 检查您是否在“onTurn”结束时保存状态。
  • // Save changes to the user state.
    await this.userState.saveChanges(turnContext);

    // End this turn by saving changes to the conversation state.
    await this.conversationState.saveChanges(turnContext);

    如果你实现了上述,你应该已经设置好了。我能够毫无问题地运行,也不会丢失状态。此外,在最终提供正确响应之前反复不回答 ChoicePrompt 并不会破坏状态。

    enter image description here

    希望得到帮助!

    关于javascript - 重复ChoicePrompt清除UserState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54825916/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com