打通Rasa Action Server和LLM接口的尝试方法
本文使用最简单的方法对打通 Rasa Action Server 和 LLM 接口进行了尝试,即当 Rasa 对话 intent 为 out_of_scope 时,调用 action_gpt_fallback 的 action,在 action 中根据 tracker.latest_message.get("text")拿到 user_input,然后再调用知识库模型的 API 接口。
一.actions.py 文件
# 这个文件包含你的自定义操作,可以用来运行自定义的Python代码。
# 看这个指南如何实现这些操作:
# https://rasa.com/docs/rasa/custom-actions
from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.events import SlotSet
from rasa_sdk.executor import CollectingDispatcher
from logging import getLogger
logger = getLogger(__name__) # 获取日志
class ActionGPTFallback(Action): # 继承Action类
def name(self) -> Text:
return "action_gpt_fallback"
def run(self, dispatcher: CollectingDispatcher, # CollectingDispatcher表示收集分发器
tracker: Tracker, # Tracker跟踪器
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]: # Dict[Text, Any]表示文本和任何类型的字典,domain表示域
# 获取用户输入
user_input = tracker.latest_message.get("text")
# 调用第三方接口处理 out_of_scope 的情况
# 这里只是一个示例,你需要根据实际情况替换成调用你的第三方接口的代码
response_from_third_party = self.call_third_party_api(user_input)
# 将第三方接口返回的信息发送给用户
dispatcher.utter_message(response_from_third_party)
return []
def call_third_party_api(self, user_input):
# 在这里编写调用第三方接口的代码,返回第三方接口的响应信息
import requests
import json
url = "http://127.0.0.1:7861/chat/knowledge_base_chat"
data = {
"query": user_input,
"knowledge_base_name": "samples",
"top_k": 3,
"score_threshold": 1,
"history": [],
"stream": False,
"model_name": "Qwen-1_8B-Chat",
"temperature": 0.7,
"max_tokens": 0,
"prompt_name": "default"
}
data = json.dumps(data)
headers = {'Content-Type': 'application/json'}
response = requests.post(url, data=data, headers=headers)
response = response.json()
print(response)
return response["answer"]
二.domain.yml 文件
version: "3.1"
intents:
- greet
- out_of_scope
responses:
utter_greet:
- text: "Hey! How are you?"
actions:
- action_gpt_fallback
session_config:
session_expiration_time: 60 <em># 会话过期时间,单位秒</em>
<em> </em>carry_over_slots_to_new_session: true <em># 是否将上一个会话的槽位带入到新的会话中</em>
说明:其它文件 nlu.yml、rules.yml、stories.yml、test_stories.yml、config.yml、credentials.yml、endpoints.yml 等文件参考[1]。
三.执行程序
1.加载模型:rasa run --cors "*"
(venv) PS L:\20231106_ConversationSystem\ChatCopilot\Rasa> rasa run --cors "*"
2024-01-01 21:05:29 INFO root - Starting Rasa server on http://0.0.0.0:5005
2024-01-01 21:05:30 INFO rasa.core.processor - Loading model models\20240101-202522-wan-mozzarella.tar.gz...
2024-01-01 21:06:39 INFO root - Rasa server is up and running.
2.运行 action server:rasa run actions
(venv) PS L:\20231106_ConversationSystem\ChatCopilot\Rasa> rasa run actions
2024-01-01 20:49:52 INFO rasa_sdk.endpoint - Starting action endpoint server...
2024-01-01 20:49:52 INFO rasa_sdk.executor - Registered function for 'action_gpt_fallback'.
2024-01-01 20:49:52 INFO rasa_sdk.endpoint - Starting plugins...
2024-01-01 20:49:52 INFO rasa_sdk.endpoint - Action endpoint is up and running on http://0.0.0.0:5055
3.运行 Web 页面:python -m http.server 8080
(venv) PS L:\20231106_ConversationSystem\ChatCopilot\Rasa\rasa-webchat> python -m http.server 8080
Serving HTTP on :: port 8080 (http://[::]:8080/) ...
4.运行 Langchain-Chatchat-0.2.8:python startup.py -a
5.和机器人进行对话
Rasa 中的对话场景是非常可控的,主要是意图识别(分类问题)、命名实体识别(NER,序列标注问题)、动作预测(利用各种统计/机器/深度学习进行预测,本质也是一个分类问题)。所以 Rasa 中甚至连关系抽取都没有用到。觉的 LLM 非常适合改造 Rasa,特别是 Zero/Few/One-Shot 的能力可以极大的提高模式划分的精度,以及 LLM 的生成能力,让 Rasa 机器人的回复更加的自然和多样。
ChatCopilot 整体思想是把 Rasa 场景编排能力(场景可控对话系统),RAG/Graph RAG 能力相结合来解决实际对话场景的落地问题。Rasa 可以解决多个场景的编排问题,非常适合任务型对话系统,当意图无法识别的时候,调用 Action Server 接口和 LLM 打通。RAG 的本质就是把非结构化文档(PDF/Word/TxT 等)低成本的、高效的利用起来,即语义细粒度检索问题,而 Graph RAG 将知识图谱引入 RAG 中,可以进一步提高精细粒度场景下的对话问题,比如医疗对话场景等。
参考文献
[1] https://github.com/ai408/nlp-engineering/tree/main/知识工程-对话系统/公众号代码/rasa-v2024010102
NLP工程化
1.本公众号以对话系统为中心,专注于Python/C++/CUDA、ML/DL/RL和NLP/KG/DS/LLM领域的技术分享。
2.本公众号Roadmap可查看飞书文档:https://z0yrmerhgi8.feishu.cn/wiki/Zpewwe2T2iCQfwkSyMOcgwdInhf
NLP工程化
飞书文档