gpt4 book ai didi

node.js - api.ai 使用不同的输入循环相同的意图

转载 作者:搜寻专家 更新时间:2023-10-31 23:45:30 26 4
gpt4 key购买 nike

我是用API.AI来实现小助手的,但是现在发现很难循环同一个intent来收集不同的用户输入(表达不对请指正,会详细解释) 问题是,我有一个元素列表,每次我想为一个人分配一个元素(通过使用输入 Assistant.getArgument() 收集),但是,我希望它每次都像“你是谁”一样对用户说话想将元素 X 分配给? (X 指的是列表中元素的名称)。我当前的实现是,创建一个单独的函数,让它提出问题,然后使用 while 循环在另一个函数中执行收集输入/赋值,在 while 主体调用 ask 函数的末尾,但它不起作用API.AI 在响应中给出 Not Available。关于如何做到这一点的任何想法?如果有什么不清楚的地方,请告诉我。

这只是一个简短的代码片段,用于显示问题所在以及我想要实现的目标。我想让它在 API.AI 中询问 4 次,获取用户输入,并将它们全部存储到输出字符串中。

var output = '';

function do_sth(assistant){
let get_name_input = assistant.getArgument('name');
output = output + get_name_input + '.';
}

function test_repeat(assistant){
for(let i = 0; i < 4; i++){
assistant.ask('What is the name?');
do_sth(assistant);
}
}

最佳答案

问题是助手的编程是一个事件驱动的系统(每个Intent都是一个事件),你在服务器端用assistant.ask()结束事件的处理或者assistant.tell()。这会将您的回复发送回用户。 ask() 将等待另一个事件,而 tell() 表示对话结束。

这意味着您不能将 ask() 放入循环中,也不能将结果存储在局部变量中,因为每个答案都会作为一个新事件返回给您(即 -每次对您的 webhook 进行新的调用)。

这里有一个方法可以做到这一点。它由三部分组成:

  1. 一个意图(在我的屏幕截图中为 name.init),用于首先使用 name.entry 操作调用 webhook 并触发循环。
  2. 一个意图(我的屏幕截图中的 name.loop)在 name_loop 上下文处于事件状态时响应以获取名称并使用相同的操作将其发送到 webhook name.entry
  3. 用于处理 name.entry 意图的代码片段。

name.init

name.loop

代码

var loopAction = function( assistant ){
const CONTEXT = 'name_loop';
const PARAM = 'name';
const VALUE = 'index';
const NUM_NAMES = 4;

// Get the context, which contains the loop counter index, so we know
// which name we're getting and how many times we've been through the loop.
var index;
var context = assistant.getContext( CONTEXT );

if( !context ){
// If no context was set, then we are just starting the loop, so we
// need to initialize it.
index = 0;

} else {
// The context is set, so get the invex value from it
index = context.parameters[VALUE];

// Since we are going through the loop, it means we were prompted for
// the name, so get the name.
var name = assistant.getArgument( PARAM );

// Save this all, somehow.
// We may want to put it back in a context, or save it in a database,
// or something else, but there are things to be aware of:
// - We can't save it in a local variable - they will go out of scope
// after we send the next reply.
// - We can't directly save it in a global variable - other users who
// call the Action will end up writing to the same place.
loopSave( index, name );

// Increment the counter to ask for the next name.
index++;
}


if( index < NUM_NAMES ){
// We don't have all the names yet, ask for the next one

// Build the outgoing context and store the new index value
var contextValues = {};
contextValues[VALUE] = index;

// Save the context as part of what we send back to API.AI
assistant.setContext( CONTEXT, 5, contextValues );

// Ask for the name
assistant.ask( `Please give me name ${index}` );

} else {
// We have reached the end of the loop counter.

// Clear the context, making sure we don't continue through the loop
// (Not really needed in this case, since we're about to end the
// conversation, but useful in other cases, and a good practice.)
assistant.setContext( CONTEXT, 0 );

// End the conversation
assistant.tell( `I got all ${index}, thanks!` );
}
};

关于node.js - api.ai 使用不同的输入循环相同的意图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45680747/

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