打通Rasa Action Server和LLM接口的尝试方法

发布时间 2024-01-01 23:41:04作者: 扫地升

  本文使用最简单的方法对打通 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工程化

飞书文档