์นด์นด์ค ์ฑ๋ด์ ๋ณธ์ธ์ ์๋ฒ(์คํฌ์๋ฒ)๋ก ํต์ ํ๊ณ ์ ํ๋๋ฐ
์นด์นด์ค ์ฑ๋ด์ ํ์์์์ 5์ด์ ๋๋ค..
์ฌ์ง์ด ์ด ํ์์์ ์๊ฐ์ ๋ณ๊ฒฝํ์ง ๋ชปํ๋ค๊ณ ์คํผ์ ์์๋ ๋ชป๋ฐ์๋๊ณ ์์ด์.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ฝ๋ฐฑ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๊ณ ์๋ค๊ณ ์จ์์ฃ ?
์ฝ๋ฐฑ ๊ธฐ๋ฅ์ด 5์ด์ ํ์์์์ ๋ณด์ํด์ค ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค !
์ฝ์ง์ ์ข ํ๋๋ฐ ์ ๊ฐ ์์๋ธ ์ด ์ฝ๋ฐฑ ๊ธฐ๋ฅ์ ๋ํด ์ ์ด๋ณด๋ ค๊ณ ํด์๐
๋จผ์ , ์นด์นด์ค ์ฑ๋ด์์ ์ ๊ณตํ๋ ์ฝ๋ฐฑ ๊ธฐ๋ฅ์
5์ด ์ด๋ด ๋ต๋ณ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ์ง์ฐ ๋ฉ์ธ์ง(์. ์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์)๋ฅผ ๋ณด๋ด๊ณ 1๋ถ ์ด๋ด๋ก 1๊ฑด์ ์๋ต์ ๋ณด๋ผ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ด ์ฝ๋ฐฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด AI ์ฑ๋ด ์ ํ์ ํด์ผํ๋๋ฐ, ์ด AI ์ฑ๋ด ์ ํ์ ์ ์ฒญํด์ฃผ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ ๊ฒ ๋น์ฆ๋์ค์ ์ผ๋ก ์์ธํ๊ฒ ์์ฑํ์ง ์์๋ ์ด์ํด๋ณด์ด์ง ์์ผ๋ฉด ์น์ธ๋๋ ๊ฒ ๊ฐ์์.
์ ๋ "์๋น์ค ์ฑ๋ด ๊ฐ๋ฐ์ค ์ฝ๋ฐฑ ๊ธฐ๋ฅ ์ฌ์ฉ์ ์ํจ" ๋ญ ์ด๋ฐ ์์ผ๋ก ์์ฑํ๋ ๊ฒ ๊ฐ์์.
1~2์ผ ๋ด๋ก ์น์ธ์ด ๋๋๋ฐ ์น์ธ์ด ๋๋ฉด
์ด๋ ๊ฒ ON ์ํ๋ก ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฝ๋ฐฑ ์๋ต์ ์ฌ์ฉํ๋๋ฐ ๊ณต์ ๊ฐ๋ฐ ๊ฐ์ด๋๊ฐ ์์ต๋๋ค.
์น์ ํ๊ฒ ์ด๋ฏธ์ง์ ํจ๊ป ์์ธํ ์ค๋ช ์ด ๋์ด ์๊ธฐ๋ ํด์ ๐๐ป
https://kakaobusiness.gitbook.io/main/tool/chatbot/skill_guide/ai_chatbot_callback_guide
๋จผ์ !
์ฑ๋ด ๊ด๋ฆฌ์์ผํฐ์์ ์ค์ ํด์ผ ํ๋ ๊ฒ์ ํด๋ฐฑ ๋ธ๋ก์ ๋ํด์ ๋ณด๊ฒ ์ต๋๋ค.
ํด๋ฐฑ ๋ธ๋ก์ ์ฌ์ฉ์์ ๋ฉ์ธ์ง์ ๋ํด ์๋ตํ ์ ์์ ๋ ์คํ๋๋ ๋ธ๋ก์ผ๋ก
ex)
"์ค๋ ๋ ์จ ์ด๋์" ๋ผ๋ ๋ ์จ ๋ธ๋ก๋ง ์ค์ ํ์ ๋, ์ฌ์ฉ์๊ฐ "์ค๋ lck ๊ฒฝ๊ธฐ ์ด๋ ํ์ด ์ด๊ฒผ๋์?" ๋ผ๊ณ ์ ๋ ฅํ๋ฉด ์คํ๋๊ฒ ๋๋ ๋ธ๋ก์ด ํด๋ฐฑ ๋ธ๋ก์ด์์.
์๋๋ฆฌ์ค -> ํด๋ฐฑ ๋ธ๋ก ์์ ์ค๋ฅธ์ชฝ ์๋จ ... ๋ฒํผ -> Callback ์ค์ ์ ํด๋ฆญํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ ์ฌ์ง๊ฐ์ ํ๋ฉด์ด ๋จ๋๋ฐ
์ค์ ์ค์์น๋ฅผ ON ํด์ฃผ๊ณ ๋ฉ์ธ์ง ์ ๋ ฅ๋์ ์๋์ ์๋ต์ด ๋์ค๊ธฐ ์ ์ ์ด๋ค ๋ฉ์ธ์ง๊ฐ ๋์ค๋ฉด ๋ ์ง ์ ๋ ฅํด์ค๋๋ค.
"์ ๋ ฅ์ค์ ๋๋ค." ๋ผ๋๊ฐ "์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์" ๋ผ๋๊ฐ์ ๋ฉ์ธ์ง๊ฐ ๋๊ฒ ์ฃ ?
์ฌ์ง์ฒ๋ผ {{#webhook.text}} ๋ฅผ ์ ๋ ฅํ๊ฒ ๋๋ฉด ์๋ฒ์์ ๋ณด๋ด๋ ์๋ต ๋ฉ์ธ์ง๋ก ํ๊ฒ ๋ค~ ์ ์๋ฏธ๊ฐ ๋๊ฒ ์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๋ชจ๋ ๋ฉ์ธ์ง์ ๋ํด ์คํฌ ์๋ฒ๋ฅผ ์ด์ฉํ๊ฒ ๋ค ํ๋ ๋ถ๋ค์ ์์คํ ์ํฐํฐ ์ค์ ์ด ํ์ํ๋ฐ์.
์ค๋ฅธ์ชฝ ์๋จ `์ํฐํฐ` ๋ผ๋ ๋ฒํผ์์ `์์คํ ์ํฐํฐ` ์์ `@sys.text` ์ ์ค์์น๋ฅผ Onํด์ ์ถ๊ฐํด์ฃผ์๊ณ
ํด๋ฐฑ ๋ธ๋ก์ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ค์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
ํ๋ผ๋ฏธํฐ๋ช ์ ์ํ๋ ๋๋ก ๊ตฌ๋ถ๊ฐ๋ฅํ ๋ณ์๋ช ํด์ฃผ์๋ฉด ๋๋๋ฐ (์ผ๋จ ์ ๊ฐ ์ฐพ์๋ณธ ๊ฑฐ์ ๋ฐ๋ฅด๋ฉด ) ์ํฐํฐ์ ํ์ํ๋ผ๋ฏธํฐ ์ค์ ์ด ํ์ํ ๊ฒ ๊ฐ์์.
ํด๋ฐฑ ๋ธ๋ก์์ ์ค์ ํ ์ด์ ๋
์ฌ์ฉ์์ ๋ฉ์ธ์ง๊ฐ ๋งค๋ฒ ๋ค๋ฅด๋ค๋ฉด ํด๋ฐฑ ๋ธ๋ก์ผ๋ก ๋น ์ง๊ธฐ ๋๋ฌธ์ด์์
์ ํด์ง ์ผ์ด์ค๊ฐ ์๋ค๋ฉด .. ํด๋นํ๋ ๋ธ๋ก์ ์์ฑํ์๋ฉด ๋๊ฒ ..์ฃ ..? ๐
๋ค ์ค์ ํ๋ฉด ์๋ ์ฌ์ง์ฒ๋ผ ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
ํ๋ผ๋ฏธํฐ ์ค์ ์๋ ๋ด ์๋ต์ `์คํฌ๋ฐ์ดํฐ ์ฌ์ฉ`์ผ๋ก ์ค์ ํด์ฃผ์ธ์
์ด์ ์คํฌ ์๋ฒ์์ ์ฒ๋ฆฌํ ์ฐจ๋ก์ ๋๋ค!
๋ณธ์ธ์ ์๋ฒ์ ๋ฐ๋ผ ๊ตฌํ ์ฝ๋๋ ๋ค๋ฅด๊ฒ ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ์นด์นด์ค ์ฑ๋ด ์ฝ๋ฐฑ ์๋ต ๊ธฐ๋ฅ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ์์!
1. ์ฌ์ฉ์ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์จ๋ค
2. ์ฌ์ฉ์ ๋ฉ์ธ์ง์ ๋ฐ๋ฅธ ์๋ต๊ฐ์ ๋ฐ์์จ๋ค.
a. 5์ด ์ด์ ์์์
โ “์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์”์ ๊ฐ์ ๋ฉ์ธ์ง๊ฐ ๋ด๊ธด callbackResponse๋ฅผ ๋ณด๋ธ๋ค
โก ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์์ค๋ฉด callbackUrl์ ๊ฒฐ๊ณผ๊ฐ์ ์ ์กํ๋ค
b. 5์ด ์ด๋ด ์์์
โ ๋ฐ์์จ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๋ก ๋ณด๋ธ๋ค
๊ทธ๋ฌ๋๊น
1. ์ฌ์ฉ์์ ๋ฉ์ธ์ง์๋ฅผ request.body๋ก ๋ฐ์์ค๋๋ฐ ๊ทธ ์์ callbackUrl์ด ํฌํจ๋์ด ์์ด์.
2. 5์ด ์ ์ ์๋ต๊ฐ์ด ๋ณด๋ด์ง ๊ฒ ๊ฐ์ง ์์ผ๋ฉด (= ์๋ต์ผ๋ก ๋ณด๋ผ ๋ฉ์ธ์ง๊ฐ 4์ด๊น์ง๋ ๋ฐ์์ค์ง ์์ผ๋ฉด) response์ "์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์" ์ ๊ฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ด์์ 200๋ฒ ์ฝ๋๋ก ๋ณด๋ด๊ณ
๊ทธ ์ดํ์ ์๋ต์ผ๋ก ๋ณด๋ผ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์ค๋ฉด callbackUrl์ ์ ์กํ๋ ๊ฑฐ์์.
3. 5์ด ์ด์ ์ ์๋ต๊ฐ์ ๋ณด๋ผ ์ ์์ผ๋ฉด (= ์๋ต์ผ๋ก ๋ณด๋ผ ๋ฉ์ธ์ง๊ฐ 4์ด ์ด์ ์ ๋ฐ์์ค๋ฉด) 200๋ฒ ์ฝ๋๋ก response์ ๋ณด๋ด์ค๋๋ค.
(4์ด๋ ์ ๊ฐ ์์๋ก ์ ํ ์๊ฐ์ ๋๋ค. 5์ด๊ฐ ํ์์์์ด๋๊น ๊ทธ ์ด์ ์ผ๋ก..)
์ ๋ Node.js๋ก ์๋ฒ๋ฅผ ๊ตฌํํ๊ณ ์๋๋ฐ ๋ชจ๋ฒ๋ต์์ ์๋๋ผ ์ฐธ๊ณ ์ฉ์ผ๋ก๋ง ๋ด์ฃผ์ธ์
const userMessage = req.body.userRequest.utterance;
const callbackUrl = req.body.userRequest.callbackUrl;
let result = "";
const setTimeout = setTimeout(async () => {
const callbackResponse = {
"version": "2.0",
"useCallback": true,
"data": {
"text": '๋ต๋ณ์ ์
๋ ฅ์ค์
๋๋ค . . .'
}
};
res.status(200).send(callbackResponse);
}, 4000);
try {
result = await getBotMessage(userMessage);
if (typeof result === 'string' && result.trim() !== '') {
const template = {
"version":"2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": result
}
}
]
}
}
res.status(200).send(template);
}
clearTimeout(setTimeout);
} catch (error) {
console.error("Error :", error)
}
if (result !== "") {
await kakaoCallback(callbackUrl, result);
}
์ฌ๊ธฐ์ ์ฐธ๊ณ ํ์ค ์ฝ๋๋
"์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์" ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ๋๋ useCallback:true ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ณด๋ด์ฃผ์ ์ผ ํ๋ค๋ ๊ฑฐ๊ณ
๊ทธ๋ฆฌ๊ณ ํ์์์ ์ดํ์ callbackUrl๋ก ๋ณด๋ด๋ ์ฝ๋๋ ์๋์ฒ๋ผ ์์ฑํ ์ ์์ด์.
async function kakaoCallback(callbackUrl, result) {
const responseBody = {
version: "2.0",
template: {
outputs: [
{
simpleText: {
text: result
}
}
]
}
};
axios.post(callbackUrl, responseBody)
.then(() => console.log('callbackurl send successfully'))
.catch((error) => console.error('callback url send error:', error));
}
๊ทธ๋ฅ ์ ๋ฐ template์ด๊ณ callbackUrl๋ก POST ๋ณด๋ธ๋ค ! ์ ๋๋ก๋ง ์ฐธ๊ณ ํด์ฃผ์ธ์ฉ
์์ธํ ๋ฉ์ธ์ง ์ ์ก ํ ํ๋ฆฟ์ ๊ณต์ ๊ฐ๋ฐ ๊ฐ์ด๋์์ ๋ณผ ์ ์์ด์ !
https://kakaobusiness.gitbook.io/main/tool/chatbot/skill_guide/answer_json_format
์ด๋ ๊ฒ ๊ฐ๋ฐ ์๋ฃํ๋ฉด ํ ์คํธ ํด๋ด์ผํ๋๋ฐ
์ฝ๋ฐฑ ๊ธฐ๋ฅ์ ์์ฝ๊ฒ๋ ๋ดํ ์คํธ์์ ์งํํ ์ ์๋์.
๊ทธ๋์ ํ ์คํธ ์ฑ๋์ ์ฐ๊ฒฐํด์ฃผ๊ฑฐ๋ ํด์ฃผ์ ์ผ ํฉ๋๋ค..
์์ ๊ฐ์ด ์๋ฒ ๊ตฌํํ๋ค๊ฐ ๊ฐํน ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ์,,
์ ๋ ๋ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
Invalid callback token. Check your callback token.
The skill server settings are incorrect. Use callback true setting required.
์ฒซ๋ฒ์งธ Invalid callback token. Check your callback token. ์๋ฌ๋ ๊ฐ์ด๋์ ์ด๋ ๊ฒ ๋์์๋๋ฐ์
callback token์ ์ค์ ์ด ์๋ชป๋์ด ์๋ ์ํ๋ก ์๋ ๋ด์ฉ์ ํ์ธํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
1. callback token์ ๊ธฐ์
์ด ์๋ชป๋ ๊ฒฝ์ฐ
2. callback token์ด ๋ง๋ฃ๋ ์ํ(1๋ถ์ด๋ด ์์ฒญ ํ์)
callback token์ ๊ฑด๋ค์ง ์์ผ๋ ๋์ ํ๋ฅ ๋ก 1. 1๋ถ ์ด๋ด์ ์์ฒญ์ด ์๋๊ฑฐ๋ 2. ๋ก์ง์ด ๋ญ๊ฐ ์๋ชป ๋ ๊ฒฝ์ฐ ์ ๋๋ค.
์ ๋ ์ง๊ธ๋ ๊ณ์ ๋ก์ง์ ์์ ์ค์ด๋ผ ์ ์๋ฌ๊ฐ ๋์ฌ ๋ ์๊ณ , ์ ๋์ฌ ๋ ์๋๋ฐ
1๋ฒ์ ๊ฒฝ์ฐ์๋ 58~9์ด์๋ ์๋ต ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์ค์ง ๋ชปํ๋ค๋ฉด "์ฃ์กํฉ๋๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค" ์ ๊ฐ์ ๋ฉ์ธ์ง๋ฅผ callbackUrl๋ก ๋ณด๋ด๊ณ ๋๋ด๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ฝ๋ฐฑ ์๋ต๋ `1๋ถ ์ด๋ด 1๊ฑด์ ๋ฉ์ธ์ง` ๋ผ๋ ์ ํ์ด ์์ด์ ์ด์ฉ ์ ์๋ค์ ๐ฅฒ
2๋ฒ์ ๊ฒฝ์ฐ์๋ ์ข ์ง์น๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌด์กฐ๊ฑด callback ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๊ณ ์๋ ์๋ต ๋ฉ์ธ์ง๋ฅผ callbackurl๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ฌด์กฐ๊ฑด callback ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋๊ฑฐ๋ผ
"์๋ ํ์ธ์" ๋ณด๋ด๋ "์ ์๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์" "์๋ ํ์ธ์ ! ๋ฌด์์ ๋์๋๋ฆด๊น์?" ๊ฐ ๋์์ ๋น์ถ์ฒํ๋ ๋ก์ง์ด๊ธดํฉ๋๋ค..๐
๋ชจ๋ฒ์ ์ผ๋ก ํ๋ ค๋ฉด ํ์์์ ์ด์ ์ ๋ฐ์์จ ๋ฉ์ธ์ง๋ฅผ ์ ๋ณด๋๋๊ฐ, ํ์์์์ด ์ง๋๋ฉด callback๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๊ณ callbackUrl๋ก ๋ฉ์ธ์ง๋ฅผ ์ ๋ณด๋๋๊ฐ, ์ค๋ณต์ผ๋ก ๊ฐ์ ๊ณณ์ผ๋ก ๋ณด๋ด์ง ์์๋๊ฐ ๋ฅผ ํ์ธํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ฒ์งธ The skill server settings are incorrect. Use callback true setting required. ์๋ฌ๋ ๊ฐ์ด๋์ ์ด๋ ๊ฒ ๋์์์ต๋๋ค.
์ฌ์ฉ์์ ์คํฌ์๋ฒ์ ์ ๋๋ก ํต์ ์ด ๋์ง ์์ ์ํ์
๋๋ค.
usecallback true ์ฒ๋ฆฌ๊ฐ ๋์ด ์๋์ง ํ์ธํ์ฌ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
useCallback:true ๋ณด๋๋๋ฐ?
ํ์๋ฉด.. ๊ทธ๋ฅ ๋ชจ๋ ๊ณณ์ ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํด ๋ณด๋ด๊ณ ์๋ฌ๊ฐ ์๋๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ๋นผ๋จน์๊ตฐ.. ํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ค ์ ๋ ์์ง ํท๊ฐ๋ฆฌ๋๋ฐ ์์ ์ผ๋ ์ฝ๋์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์์ด์..
async function kakaoCallback(callbackUrl, result) {
const responseBody = {
version: "2.0",
useCallback : true,
template: {
outputs: [
{
simpleText: {
text: result
}
}
]
}
};
axios.post(callbackUrl, responseBody)
.then(() => console.log('callbackurl send successfully'))
.catch((error) => console.error('callback url send error:', error));
}
๊ทธ๋ฐ๋ฐ ์ผ๋ฐ ์๋ต ๋ฉ์ธ์ง์๋ ์ถ๊ฐํ๋ฉด ์๋๋ ๊ฒ ๊ฐ๋๋ผ๊ตฌ์.
๋๋ฌด ๊ตฌ๊ตฌ์ ์ ์์ฑํด๋ดค๋๋ฐ..
๋ฏธ๋์ ๋๋ ์ด๋ ๋๊ตฐ๊ฐ๋ ์ด ๊ธ์ ๋ณด๊ณ ๋์์ ์กฐ๊ธ์ด๋ผ๋ ์ป์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค ๐ฅน