更新本地nlp
1、在test/rasa目录下提供本地nlp(rasa+chatglm)的替换方法。
This commit is contained in:
parent
d405442e27
commit
2f9a95e12f
@ -66,6 +66,14 @@ Fay是一个完整的开源项目,包含Fay控制器及数字人模型,可
|
|||||||
|
|
||||||
2、以上每个模块可轻易替换成自家核心产品。
|
2、以上每个模块可轻易替换成自家核心产品。
|
||||||
|
|
||||||
|
3、本地nlp(rasa+chatglm)的替换方法:
|
||||||
|
1、安装启动chatglm(github)
|
||||||
|
2、安装rasa 包:rasa、rasa-sdk
|
||||||
|
3、进入test/rasa目录启动actions:rasa run actions
|
||||||
|
4、启动rasa api server:rasa run --enable-api -p 5006
|
||||||
|
5、fay_core.py 引入nlp_rasa.py
|
||||||
|
|
||||||
|
|
||||||
### **目录结构**
|
### **目录结构**
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -107,6 +115,7 @@ Fay是一个完整的开源项目,包含Fay控制器及数字人模型,可
|
|||||||
**2023.04:**
|
**2023.04:**
|
||||||
|
|
||||||
+ 抖音直播互动数据对接更换成系统代理抓包pd解码的方式(运行直播伴侣即可);
|
+ 抖音直播互动数据对接更换成系统代理抓包pd解码的方式(运行直播伴侣即可);
|
||||||
|
+ 提供本地nlp的对接代码(rasa+chatglm)。
|
||||||
+ 修复若干逻辑及说明错误。
|
+ 修复若干逻辑及说明错误。
|
||||||
|
|
||||||
|
|
||||||
|
0
test/rasa/actions/__init__.py
Normal file
0
test/rasa/actions/__init__.py
Normal file
111
test/rasa/actions/actions.py
Normal file
111
test/rasa/actions/actions.py
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
from rasa_sdk import Action,Tracker
|
||||||
|
from rasa_sdk.executor import CollectingDispatcher
|
||||||
|
from datetime import datetime
|
||||||
|
from dateutil.parser import parse
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
|
from rasa_sdk.forms import FormValidationAction
|
||||||
|
|
||||||
|
class ValidateScheduleReminderForm(FormValidationAction):
|
||||||
|
def name(self) :
|
||||||
|
return "validate_schedule_reminder_form"
|
||||||
|
|
||||||
|
async def validate_date(self, value, dispatcher: CollectingDispatcher, tracker: Tracker, domain) :
|
||||||
|
# 在这里添加您的日期验证逻辑
|
||||||
|
return {"date": value}
|
||||||
|
|
||||||
|
async def validate_time(self, value, dispatcher: CollectingDispatcher, tracker: Tracker, domain):
|
||||||
|
# 在这里添加您的时间验证逻辑
|
||||||
|
return {"time": value}
|
||||||
|
|
||||||
|
async def validate_event(self, value, dispatcher: CollectingDispatcher, tracker: Tracker, domain):
|
||||||
|
# 在这里添加您的事件验证逻辑
|
||||||
|
return {"event": value}
|
||||||
|
|
||||||
|
|
||||||
|
class ActionGPTResponse(Action):
|
||||||
|
def name(self) -> str:
|
||||||
|
return "action_gpt_response"
|
||||||
|
|
||||||
|
async def run(self, dispatcher: CollectingDispatcher, tracker, domain):
|
||||||
|
history = []
|
||||||
|
user_messages = []
|
||||||
|
bot_messages = []
|
||||||
|
|
||||||
|
# Separate user messages and bot messages
|
||||||
|
for event in tracker.events:
|
||||||
|
if event.get("event") == "user":
|
||||||
|
user_messages.append(event.get("text"))
|
||||||
|
elif event.get("event") == "bot":
|
||||||
|
bot_messages.append(event.get("text"))
|
||||||
|
|
||||||
|
# Combine user and bot messages
|
||||||
|
for user, bot in zip(user_messages, bot_messages):
|
||||||
|
history.append([user, bot])
|
||||||
|
|
||||||
|
print("*******************************")
|
||||||
|
print(history)
|
||||||
|
print("*******************************")
|
||||||
|
|
||||||
|
url = "http://127.0.0.1:8000"
|
||||||
|
req = json.dumps({
|
||||||
|
"prompt": "请用20字内回复我。" + tracker.latest_message.get("text"),
|
||||||
|
"history": history})
|
||||||
|
headers = {'content-type': 'application/json'}
|
||||||
|
r = requests.post(url, headers=headers, data=req)
|
||||||
|
a = json.loads(r.text).get('response')
|
||||||
|
history = json.loads(r.text).get('history')
|
||||||
|
|
||||||
|
dispatcher.utter_message(a)
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
class ActionAskDate(Action):
|
||||||
|
def name(self):
|
||||||
|
return "action_ask_date"
|
||||||
|
|
||||||
|
async def run(self, dispatcher, tracker, domain):
|
||||||
|
# 获取当前日期
|
||||||
|
today = datetime.now().date()
|
||||||
|
# 获取星期几的信息
|
||||||
|
week_day = today.strftime("%A")
|
||||||
|
# 将星期几的英文名称转换为中文
|
||||||
|
week_day_zh = {
|
||||||
|
"Monday": "星期一",
|
||||||
|
"Tuesday": "星期二",
|
||||||
|
"Wednesday": "星期三",
|
||||||
|
"Thursday": "星期四",
|
||||||
|
"Friday": "星期五",
|
||||||
|
"Saturday": "星期六",
|
||||||
|
"Sunday": "星期日",
|
||||||
|
}.get(week_day, "未知")
|
||||||
|
# 将日期格式化为字符串
|
||||||
|
date_str = today.strftime("%Y年%m月%d日")
|
||||||
|
# 将日期和星期信息发送给用户
|
||||||
|
dispatcher.utter_message(text=f"今天是 {date_str} {week_day_zh}。")
|
||||||
|
|
||||||
|
|
||||||
|
class ActionAskTime(Action):
|
||||||
|
def name(self):
|
||||||
|
return "action_ask_time"
|
||||||
|
|
||||||
|
async def run(self, dispatcher, tracker, domain):
|
||||||
|
# 获取当前时间
|
||||||
|
now = datetime.now()
|
||||||
|
# 将时间格式化为字符串
|
||||||
|
time_str = now.strftime("%H:%M")
|
||||||
|
# 将时间信息发送给用户
|
||||||
|
dispatcher.utter_message(text=f"现在是 {time_str}。")
|
||||||
|
|
||||||
|
def parse_datetime(datetime_str):
|
||||||
|
try:
|
||||||
|
datetime_obj = parse(datetime_str, fuzzy=True)
|
||||||
|
if "周" in datetime_str: # 处理相对日期,如 "周五"
|
||||||
|
today = datetime.now().date()
|
||||||
|
weekday_diff = (datetime_obj.weekday() - today.weekday()) % 7
|
||||||
|
datetime_obj = today + relativedelta(days=weekday_diff)
|
||||||
|
return datetime_obj
|
||||||
|
except ValueError:
|
||||||
|
print("无法解析日期和时间")
|
39
test/rasa/config.yml
Normal file
39
test/rasa/config.yml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
recipe: default.v1
|
||||||
|
assistant_id: 20230416-203150-proud-texture
|
||||||
|
language: zh
|
||||||
|
pipeline:
|
||||||
|
# # No configuration for the NLU pipeline was provided. The following default pipeline was used to train your model.
|
||||||
|
# # If you'd like to customize it, uncomment and adjust the pipeline.
|
||||||
|
# # See https://rasa.com/docs/rasa/tuning-your-model for more information.
|
||||||
|
- name: JiebaTokenizer
|
||||||
|
- name: RegexFeaturizer
|
||||||
|
- name: LexicalSyntacticFeaturizer
|
||||||
|
- name: CountVectorsFeaturizer
|
||||||
|
- name: CountVectorsFeaturizer
|
||||||
|
analyzer: char_wb
|
||||||
|
min_ngram: 1
|
||||||
|
max_ngram: 4
|
||||||
|
- name: DIETClassifier
|
||||||
|
epochs: 100
|
||||||
|
constrain_similarities: true
|
||||||
|
- name: EntitySynonymMapper
|
||||||
|
- name: ResponseSelector
|
||||||
|
epochs: 100
|
||||||
|
constrain_similarities: true
|
||||||
|
- name: FallbackClassifier
|
||||||
|
threshold: 0.3
|
||||||
|
ambiguity_threshold: 0.1
|
||||||
|
policies:
|
||||||
|
# # No configuration for policies was provided. The following default policies were used to train your model.
|
||||||
|
# # If you'd like to customize them, uncomment and adjust the policies.
|
||||||
|
# # See https://rasa.com/docs/rasa/policies for more information.
|
||||||
|
- name: MemoizationPolicy
|
||||||
|
- name: RulePolicy
|
||||||
|
- name: UnexpecTEDIntentPolicy
|
||||||
|
max_history: 5
|
||||||
|
epochs: 100
|
||||||
|
- name: TEDPolicy
|
||||||
|
max_history: 5
|
||||||
|
epochs: 100
|
||||||
|
constrain_similarities: true
|
||||||
|
|
33
test/rasa/credentials.yml
Normal file
33
test/rasa/credentials.yml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# This file contains the credentials for the voice & chat platforms
|
||||||
|
# which your bot is using.
|
||||||
|
# https://rasa.com/docs/rasa/messaging-and-voice-channels
|
||||||
|
|
||||||
|
rest:
|
||||||
|
# # you don't need to provide anything here - this channel doesn't
|
||||||
|
# # require any credentials
|
||||||
|
|
||||||
|
|
||||||
|
#facebook:
|
||||||
|
# verify: "<verify>"
|
||||||
|
# secret: "<your secret>"
|
||||||
|
# page-access-token: "<your page access token>"
|
||||||
|
|
||||||
|
#slack:
|
||||||
|
# slack_token: "<your slack token>"
|
||||||
|
# slack_channel: "<the slack channel>"
|
||||||
|
# slack_signing_secret: "<your slack signing secret>"
|
||||||
|
|
||||||
|
#socketio:
|
||||||
|
# user_message_evt: <event name for user message>
|
||||||
|
# bot_message_evt: <event name for bot messages>
|
||||||
|
# session_persistence: <true/false>
|
||||||
|
|
||||||
|
#mattermost:
|
||||||
|
# url: "https://<mattermost instance>/api/v4"
|
||||||
|
# token: "<bot token>"
|
||||||
|
# webhook_url: "<callback URL>"
|
||||||
|
|
||||||
|
# This entry is needed if you are using Rasa Enterprise. The entry represents credentials
|
||||||
|
# for the Rasa Enterprise "channel", i.e. Talk to your bot and Share with guest testers.
|
||||||
|
rasa:
|
||||||
|
url: "http://localhost:5002/api"
|
49
test/rasa/data/nlu.yml
Normal file
49
test/rasa/data/nlu.yml
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
version: "3.1"
|
||||||
|
|
||||||
|
nlu:
|
||||||
|
- intent: greet
|
||||||
|
examples: |
|
||||||
|
- 你好
|
||||||
|
- hello
|
||||||
|
|
||||||
|
|
||||||
|
- intent: goodbye
|
||||||
|
examples: |
|
||||||
|
- 再见
|
||||||
|
- 不聊了
|
||||||
|
- 回头说
|
||||||
|
- 先这样
|
||||||
|
|
||||||
|
- intent: ask_time
|
||||||
|
examples: |
|
||||||
|
- 现在几点钟了?
|
||||||
|
- 请告诉我现在的时间
|
||||||
|
- 你知道现在是几点吗?
|
||||||
|
|
||||||
|
- intent: ask_date
|
||||||
|
examples: |
|
||||||
|
- 今天是几号?
|
||||||
|
- 今天星期几?
|
||||||
|
|
||||||
|
- intent: out_of_scope
|
||||||
|
examples: |
|
||||||
|
- 今天天气真好
|
||||||
|
- 我想去公园走走
|
||||||
|
- 我需要去上玩吗
|
||||||
|
- 其实小明也是一个好人
|
||||||
|
- 如何计算圆周率呢
|
||||||
|
- 1加1等于几
|
||||||
|
- 冲咖啡要什么水温
|
||||||
|
- 广州有什么地方玩
|
||||||
|
- 广州有什么东西吃
|
||||||
|
- 荔枝湾在哪里
|
||||||
|
- 我现在是不是该睡觉呢
|
||||||
|
- 番禺区
|
||||||
|
- 广州市
|
||||||
|
- 你知道广州吗
|
||||||
|
- 还有别的推荐吗
|
||||||
|
- 为什么
|
||||||
|
- 怎么办
|
||||||
|
- 怎么去
|
||||||
|
- 还有别的吗
|
||||||
|
- 你的速度可以快一点吗
|
30
test/rasa/data/rules.yml
Normal file
30
test/rasa/data/rules.yml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
version: "3.1"
|
||||||
|
|
||||||
|
rules:
|
||||||
|
|
||||||
|
- rule: 闲聊的回应
|
||||||
|
steps:
|
||||||
|
- intent: out_of_scope
|
||||||
|
- action: action_gpt_response
|
||||||
|
|
||||||
|
- rule: Say goodbye
|
||||||
|
steps:
|
||||||
|
- intent: goodbye
|
||||||
|
- action: utter_goodbye
|
||||||
|
|
||||||
|
- rule: Say hello
|
||||||
|
steps:
|
||||||
|
- intent: greet
|
||||||
|
- action: utter_greet
|
||||||
|
|
||||||
|
- rule: 用户询问日期
|
||||||
|
steps:
|
||||||
|
- intent: ask_date
|
||||||
|
- action: action_ask_date
|
||||||
|
|
||||||
|
- rule: 用户询问时间
|
||||||
|
steps:
|
||||||
|
- intent: ask_time
|
||||||
|
- action: action_ask_time
|
||||||
|
|
||||||
|
|
0
test/rasa/data/stories.yml
Normal file
0
test/rasa/data/stories.yml
Normal file
25
test/rasa/domain.yml
Normal file
25
test/rasa/domain.yml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
version: "3.1"
|
||||||
|
|
||||||
|
intents:
|
||||||
|
- greet
|
||||||
|
- goodbye
|
||||||
|
- ask_time
|
||||||
|
- ask_date
|
||||||
|
- out_of_scope
|
||||||
|
|
||||||
|
responses:
|
||||||
|
utter_greet:
|
||||||
|
- text: "你好,有什么帮到你呢?"
|
||||||
|
|
||||||
|
utter_goodbye:
|
||||||
|
- text: "那我先离开了,一会有事叫我"
|
||||||
|
- text: "先不打扰你了,你可以随时唤醒我"
|
||||||
|
|
||||||
|
session_config:
|
||||||
|
session_expiration_time: 60
|
||||||
|
carry_over_slots_to_new_session: true
|
||||||
|
|
||||||
|
actions:
|
||||||
|
- action_ask_time
|
||||||
|
- action_ask_date
|
||||||
|
- action_gpt_response
|
2
test/rasa/endpoints.yml
Normal file
2
test/rasa/endpoints.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
action_endpoint:
|
||||||
|
url: "http://localhost:5055/webhook"
|
BIN
test/rasa/models/20230423-112023-mild-goldfinch.tar.gz
Normal file
BIN
test/rasa/models/20230423-112023-mild-goldfinch.tar.gz
Normal file
Binary file not shown.
10
test/rasa/nlp_rasa.py
Normal file
10
test/rasa/nlp_rasa.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import json
|
||||||
|
import requests
|
||||||
|
|
||||||
|
def question(cont):
|
||||||
|
url="http://localhost:5005/webhooks/rest/webhook"
|
||||||
|
req = json.dumps({"sender": "user", "message": cont})
|
||||||
|
headers = {'content-type': 'application/json'}
|
||||||
|
r = requests.post(url, headers=headers, data=req)
|
||||||
|
a = json.loads(r.text)[0].get('text')
|
||||||
|
return a
|
5
test/rasa/readme.txt
Normal file
5
test/rasa/readme.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
1、安装启动chatglm(github)
|
||||||
|
2、安装rasa 包:rasa、rasa-sdk
|
||||||
|
3、进入test/rasa目录启动actions:rasa run actions
|
||||||
|
4、启动rasa api server:rasa run --enable-api -p 5006
|
||||||
|
5、fay_core.py 引入nlp_rasa.py
|
91
test/rasa/tests/test_stories.yml
Normal file
91
test/rasa/tests/test_stories.yml
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#### This file contains tests to evaluate that your bot behaves as expected.
|
||||||
|
#### If you want to learn more, please see the docs: https://rasa.com/docs/rasa/testing-your-assistant
|
||||||
|
|
||||||
|
stories:
|
||||||
|
- story: happy path 1
|
||||||
|
steps:
|
||||||
|
- user: |
|
||||||
|
hello there!
|
||||||
|
intent: greet
|
||||||
|
- action: utter_greet
|
||||||
|
- user: |
|
||||||
|
amazing
|
||||||
|
intent: mood_great
|
||||||
|
- action: utter_happy
|
||||||
|
|
||||||
|
- story: happy path 2
|
||||||
|
steps:
|
||||||
|
- user: |
|
||||||
|
hello there!
|
||||||
|
intent: greet
|
||||||
|
- action: utter_greet
|
||||||
|
- user: |
|
||||||
|
amazing
|
||||||
|
intent: mood_great
|
||||||
|
- action: utter_happy
|
||||||
|
- user: |
|
||||||
|
bye-bye!
|
||||||
|
intent: goodbye
|
||||||
|
- action: utter_goodbye
|
||||||
|
|
||||||
|
- story: sad path 1
|
||||||
|
steps:
|
||||||
|
- user: |
|
||||||
|
hello
|
||||||
|
intent: greet
|
||||||
|
- action: utter_greet
|
||||||
|
- user: |
|
||||||
|
not good
|
||||||
|
intent: mood_unhappy
|
||||||
|
- action: utter_cheer_up
|
||||||
|
- action: utter_did_that_help
|
||||||
|
- user: |
|
||||||
|
yes
|
||||||
|
intent: affirm
|
||||||
|
- action: utter_happy
|
||||||
|
|
||||||
|
- story: sad path 2
|
||||||
|
steps:
|
||||||
|
- user: |
|
||||||
|
hello
|
||||||
|
intent: greet
|
||||||
|
- action: utter_greet
|
||||||
|
- user: |
|
||||||
|
not good
|
||||||
|
intent: mood_unhappy
|
||||||
|
- action: utter_cheer_up
|
||||||
|
- action: utter_did_that_help
|
||||||
|
- user: |
|
||||||
|
not really
|
||||||
|
intent: deny
|
||||||
|
- action: utter_goodbye
|
||||||
|
|
||||||
|
- story: sad path 3
|
||||||
|
steps:
|
||||||
|
- user: |
|
||||||
|
hi
|
||||||
|
intent: greet
|
||||||
|
- action: utter_greet
|
||||||
|
- user: |
|
||||||
|
very terrible
|
||||||
|
intent: mood_unhappy
|
||||||
|
- action: utter_cheer_up
|
||||||
|
- action: utter_did_that_help
|
||||||
|
- user: |
|
||||||
|
no
|
||||||
|
intent: deny
|
||||||
|
- action: utter_goodbye
|
||||||
|
|
||||||
|
- story: say goodbye
|
||||||
|
steps:
|
||||||
|
- user: |
|
||||||
|
bye-bye!
|
||||||
|
intent: goodbye
|
||||||
|
- action: utter_goodbye
|
||||||
|
|
||||||
|
- story: bot challenge
|
||||||
|
steps:
|
||||||
|
- user: |
|
||||||
|
are you a bot?
|
||||||
|
intent: bot_challenge
|
||||||
|
- action: utter_iamabot
|
Loading…
Reference in New Issue
Block a user