首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >采用对话框流意图和查询修复

采用对话框流意图和查询修复
EN

Stack Overflow用户
提问于 2018-07-31 20:26:20
回答 1查看 478关注 0票数 3

我的聊天机器人是在对话框中创建的,现在我正在尝试从Python中访问它,以便在GUI中获取用户输入和显示输出(假设是一个基本的chatbot gui)。

我已经将我的Python环境连接到了对话框流和火药库,

下面是检测意图的代码;

代码语言:javascript
复制
#Detection of Dialogflow intents, project and input.
def detect_intent_texts(project_id, session_id, texts, language_code):
   #Returns the result of detect intent with texts as inputs, later can implement same `session_id` between requests allows continuation of the conversaion.
    import dialogflow_v2 as dialogflow
    session_client = dialogflow.SessionsClient()

    session = session_client.session_path(project_id, session_id)
#To ensure session path is correct - print('Session path: {}\n'.format(session))

    for text in texts:
        text_input = dialogflow.types.TextInput(text=text, language_code=language_code)
        query_input = dialogflow.types.QueryInput(text=text_input)
        response = session_client.detect_intent(session=session, query_input=query_input)

        print ('Chatbot:{}\n'.format(response.query_result.fulfillment_text))
detect_intent_texts("chat-8","abc",["Hey"],"en-us")

我需要在某种程度上说,如果这个意图被触发,从db中获取一些内容并显示给用户。

更新

我现在的代码已经全部完成了,这一切在我看来都是正确的,但它却抛出了一个我不明白的错误,这要感谢Sid8491到目前为止的帮助。

简而言之,我的问题是,我以前的代码允许我输入某些内容,聊天机器人响应,所有这些都在控制台中,但它有效.新代码应该允许我说“当这个意图被触发时,就这样做”。

代码语言:javascript
复制
import os, json
import sys
import dialogflow
from dialogflow_v2beta1 import *
import firebase_admin
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()
from firebase_admin import firestore
from firebase_admin import credentials
import requests.packages.urllib3
from Tkinter import *
from dialogflow_v2beta1 import agents_client
import Tkinter as tk
result = None
window = Tk()

def Response():
    #no need to use global here
    result = myText.get()
    displayText.configure(state='normal')
    displayText.insert(END, "User:"+ result + '\n')
    displayText.configure(state='disabled')

#Creating the GUI
myText = tk.StringVar()
window.resizable(False, False)
window.title("Chatbot")
window.geometry('400x400')
User_Input = tk.Entry(window, textvariable=myText, width=50).place(x=20, y=350)
subButton = tk.Button(window, text="Send", command=Response).place(x =350, y=350)
displayText = Text(window, height=20, width=40)
displayText.pack()
scroll = Scrollbar(window, command=displayText).pack(side=RIGHT)
window.mainloop()

#Initialize the firebase admin SDK
cred = credentials.Certificate('./file.json')
default_app = firebase_admin.initialize_app(cred)
db = firestore.client()

def getCourse():
    doc_ref = db.collection(u"Course_Information").document(u"CourseTypes")
    try:
        doc = doc_ref.get()
        return 'Document data: {}'.format(doc.to_dict())
    except google.cloud.exceptions.NotFound:
        return 'Not found'

def detect_intent_text(project_id, session_id, text, language_code):
    GOOGLE_APPLICATION_CREDENTIALS=".chat-8.json"
    session_client = dialogflow.SessionsClient(GOOGLE_APPLICATION_CREDENTIALS)

    session = session_client.session_path(project_id, session_id)

    text_input = dialogflow.types.TextInput(
        text=text, language_code=language_code)

    query_input = dialogflow.types.QueryInput(text=text_input)

    response = session_client.detect_intent(
        session=session, query_input=query_input)

queryText = [myText.get()]

res = detect_intent_text('chat-8', 'session-test', queryText, 'en')
intentName = res['query_result']['intent']['display_name']

if intentName == 'CourseEnquiry':
    reponse = getCourse()
    print json.dumps({
        'fulfillmentText': reponse,
    })
elif intentName == 'Greetings':
    print "Yo"

detect_intent_texts("chat-8","abc", queryText,"en-us")

但我知道这个错误:

代码语言:javascript
复制
C:\Users\chat\PycharmProjects\Chatbot\venv\Scripts\python.exe C:/Users/chat/PycharmProjects/Chatbot/venv/Chatbot.py
Traceback (most recent call last):
  File "C:/Users/chat/PycharmProjects/Chatbot/venv/Chatbot.py", line 65, in <module>
    res = detect_intent_text('chat-8', 'session-test', queryText, 'en')
  File "C:/Users/chat/PycharmProjects/Chatbot/venv/Chatbot.py", line 51, in detect_intent_text
    session_client = dialogflow.SessionsClient(GOOGLE_APPLICATION_CREDENTIALS)
  File "C:\Users\chat\PycharmProjects\Chatbot\venv\lib\site-packages\dialogflow_v2\gapic\sessions_client.py", line 109, in __init__
    self.sessions_stub = (session_pb2.SessionsStub(channel))
  File "C:\Users\chat\PycharmProjects\Chatbot\venv\lib\site-packages\dialogflow_v2\proto\session_pb2.py", line 1248, in __init__
    self.DetectIntent = channel.unary_unary(
AttributeError: 'str' object has no attribute 'unary_unary'

Process finished with exit code 1
EN

回答 1

Stack Overflow用户

发布于 2018-08-01 07:03:09

是的,我认为你走在正确的轨道上。

您需要从从intentName获得的响应中提取dialogFlowactionaName,并调用相应的函数,然后将响应发送回用户。

代码语言:javascript
复制
res = detect_intent_texts("chat-8","abc",["Hey"],"en-us")
action = res['queryResult']['action']

if action == 'getSomethingFromDb':
    reponse = someFunction(req)
    return json.dumps({
        'fulfillmentText': reponse,
    })
elif action == 'somethingElse':
    ....

如果您希望使用intentName而不是actionName来实现,那么您可以像下面这样提取intentName

代码语言:javascript
复制
intentName = res['query_result']['intent']['display_name']

编辑1:

例子-

代码语言:javascript
复制
import dialogflow
import os, json

def getCourse():
    doc_ref = db.collection(u"Course_Information").document(u"CourseTypes")
    try:
        doc = doc_ref.get()
        return 'Document data: {}'.format(doc.to_dict())
    except google.cloud.exceptions.NotFound:
        return 'Not found'

def detect_intent_text(project_id, session_id, text, language_code):
    GOOGLE_APPLICATION_CREDENTIALS="C:\\pyth_to_...\\cred.json"
    session_client = dialogflow.SessionsClient(GOOGLE_APPLICATION_CREDENTIALS)

    session = session_client.session_path(project_id, session_id)

    text_input = dialogflow.types.TextInput(
        text=text, language_code=language_code)

    query_input = dialogflow.types.QueryInput(text=text_input)

    response = session_client.detect_intent(
        session=session, query_input=query_input)

queryText = 'get courses of Python' # you will call some function to get text from your app

res = detect_intent_text('project_1234', 'session-test', queryText, 'en')
intentName = res['query_result']['intent']['display_name']

if intentName == 'getCourse':
    reponse = getCourse()
    return json.dumps({
        'fulfillmentText': reponse,
    })

试着上面的例子,并根据你对应用程序的需求进行修改。我的建议是,首先让DialogFlow在没有应用程序的情况下工作,然后将其与应用程序集成。否则,您将无法理解问题是发生在DialogFlow还是您的应用程序。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51621553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档