当前位置:   article > 正文

RASA3获取用户输入,从数据库查询数据,返回给用户前台(踩坑记录)

rasa3

前阵子在捣鼓rasa人工智能 看上了他的可编程性。于是乎开始捣鼓

安装和初始化的教程我就跳过了,直接进入正题:

nlu.yml:

  1. nlu:
  2. - regex: user_input_name
  3. examples: |
  4. - (?<=查)[a-zA-Z0-9\u4e00-\u9fa5]{2,5}(?=的)
  5. - intent: info_input_name
  6. examples: |
  7. - 请帮我查[张三](user_input_name)的性别
  8. - 帮我查[张三](user_input_name)的性别
  9. - 查[张三](user_input_name)的性别
  10. - 我想查[张三](user_input_name)的性别
  11. #这里使用中文的话要去config中配置语种

regex是正则表达式 表达user_input这个字段(暂且叫做字段 本名是词槽)的范围 我这里就不多解释了。

config.yml:

  1. # The config recipe.
  2. # https://rasa.com/docs/rasa/model-configuration/
  3. recipe: default.v1
  4. # The assistant project unique identifier
  5. # This default value must be replaced with a unique assistant name within your deployment
  6. assistant_id: 20230529-100826-amicable-gain
  7. # Configuration for Rasa NLU.
  8. # https://rasa.com/docs/rasa/nlu/components/
  9. language: zh
  10. pipeline:
  11. # # No configuration for the NLU pipeline was provided. The following default pipeline was used to train your model.
  12. # # If you'd like to customize it, uncomment and adjust the pipeline.
  13. # # See https://rasa.com/docs/rasa/tuning-your-model for more information.
  14. # - name: WhitespaceTokenizer
  15. - name: JiebaTokenizer #支持中文
  16. - name: RegexFeaturizer
  17. - name: LexicalSyntacticFeaturizer
  18. - name: CountVectorsFeaturizer
  19. analyzer: char_wb
  20. min_ngram: 1
  21. max_ngram: 4
  22. - name: DIETClassifier
  23. epochs: 200
  24. constrain_similarities: true
  25. entity_recognition: false
  26. - name: EntitySynonymMapper
  27. - name: ResponseSelector
  28. epochs: 200
  29. constrain_similarities: true
  30. - name: FallbackClassifier
  31. threshold: 0.3
  32. ambiguity_threshold: 0.1
  33. - name: RegexFeaturizer
  34. - name: RegexEntityExtractor
  35. case_sensitive: False
  36. use_lookup_tables: False
  37. use_regexes: True
  38. use_word_boundaries: True
  39. # Configuration for Rasa Core.
  40. # https://rasa.com/docs/rasa/core/policies/
  41. policies:
  42. # # No configuration for policies was provided. The following default policies were used to train your model.
  43. # # If you'd like to customize them, uncomment and adjust the policies.
  44. # # See https://rasa.com/docs/rasa/policies for more information.
  45. - name: MemoizationPolicy
  46. - name: TEDPolicy
  47. max_history: 5
  48. epochs: 200
  49. constrain_similarities: true
  50. - name: RulePolicy

这是配置文件。不多解释了 官方文档上都有详解。

domain.yml: 这是比较重要的地方

  1. version: '3.1'
  2. intents:
  3. #添加前面的意图名和form表单名
  4. - info_input_name
  5. - name_form
  6. actions:
  7. #行为名
  8. - validate_name_form
  9. responses:
  10. #响应 utter_output_name是响应名 {}内的是插槽名
  11. utter_output_name:
  12. - text: '{user_input_name}的性别是{db_get_sex}'
  13. entities:
  14. #实体名
  15. - user_input_name、
  16. forms:
  17. #form表单名 name_form
  18. name_form:
  19. required_slots: #填写表单需要的插槽
  20. - user_input_name
  21. slots: #插槽
  22. #插槽名
  23. user_input_name:
  24. type: text #插槽类型
  25. influence_conversation: false #是否影响程序
  26. mappings: #插槽来源
  27. - type: from_entity #来源的类型
  28. entity: user_input_name #来源的实体名 这几个最好写成同一个
  29. db_get_sex:
  30. type: text
  31. mappings:
  32. - type: custom #来源于用户 待会会使用行为方法进行操作
  33. session_config:
  34. session_expiration_time: 60
  35. carry_over_slots_to_new_session: true

rule.yml:

  1. rules:
  2. #形式1
  3. - rule: avtivate get_uname form #名称 随便取 唯一
  4. steps:
  5. - intent: get_user_msg #你的意图
  6. - action: uname_form #触发的form表单
  7. - active_loop: uname_form #开始获取表单所需的值
  8. - rule: stop get_uname form #名称 随便取 唯一
  9. condition:
  10. # 条件是:表单处于活跃状态
  11. - active_loop: uname_form
  12. steps:
  13. # 表单停用
  14. - action: uname_form
  15. - active_loop: null
  16. - slot_was_set:
  17. - requested_slot: null
  18. # 一旦槽填满后,提交表单时要运行的动作
  19. - action: utter_output_user #这边直接触发回复字段 因为在form表单获取的过程中就自动触发了form验证的Action

Action.py:

  1. from typing import Text, Any, Dict
  2. from rasa_sdk import Action
  3. from rasa_sdk import Tracker, FormValidationAction
  4. from rasa_sdk.executor import CollectingDispatcher
  5. from rasa_sdk.types import DomainDict
  6. from rasa_sdk.events import SlotSet
  7. import pymysql #mysql 需要pip安装
  8. conn = pymysql.connect(host='localhost',
  9. port=3306,
  10. user='你的mysql用户名',
  11. passwd='mysql密码',
  12. db='rasa',
  13. charset = 'utf8'
  14. )
  15. #继承两个
  16. class SexMsgForm(FormValidationAction,Action):
  17. #必须写 return的是Action的名字
  18. def name(self) -> Text:
  19. return "validate_name_form" #前面action设置的值
  20. # 返回一下输入的字段就行了,方法名称是extract_+插槽名 他会自动检测
  21. async def extract_user_input_name(
  22. self,
  23. dispatcher: "CollectingDispatcher",
  24. tracker: "Tracker",
  25. domain: "DomainDict",
  26. ) -> Dict[Text, Any]:
  27. #从tracker获取到用户输入的slot的值
  28. return {"user_input_name":tracker.get_slot('user_input_name')}
  29. #使用了Action的run方法 因为extract不能返回slot
  30. def run(self, dispatcher, tracker, domain):
  31. print("你进入了自定义form")
  32. vall = tracker.get_slot("user_input_name")
  33. # print("slot:")
  34. # print(vall)
  35. sql = "select usex from tuser where uname = %s" #这里使用的%s是占位符 防止SQL
  36. cursor = conn.cursor()
  37. try:
  38. cursor.execute(sql,vall) #在这里将占位符填充
  39. resul = cursor.fetchall() #获取所有值使用fetchall()时结果是二维数组,获取第一条时使用fetchone()时是一维数组
  40. usex=resul[0][0] #
  41. except Exception as e:
  42. print("Exception:",e)
  43. conn.rollback
  44. cursor.close()
  45. return [SlotSet("db_get_sex",usex)]
  46. finally:
  47. cursor.close()
  48. return [SlotSet("db_get_sex",usex)] #将Slot设置值并返回给程序

这里不要在action.py中直接使用Action,也不要在slot的底下加Action名 我设置的所有Action无一例外全部都会自己触发 并且使用官方文档的使用方式导致我每次触发意图都会触发三次所有Action 2s的响应时间直接变成了10秒多 这个方法可以使你的每个form都分开触发 不会提前触发 让你的程序响应时间更快。

当然也许还会有更快更好的运行方式,我这只是自己尝试出来的方法 有这类需求而且找不到好方法的时候可以使用我这个方法 有好方法的同志也可以分享出来。大家互相学习一起努力

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/343543
推荐阅读
相关标签
  

闽ICP备14008679号