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

飞书文档

打通Rasa Action Server和LLM接口的尝试方法的更多相关文章

  1. struts2的action访问servlet API的三种方法

    学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...

  2. 不同版本的SQL Server之间数据导出导入的方法及性能比较

    原文:不同版本的SQL Server之间数据导出导入的方法及性能比较 工作中有段时间常常涉及到不同版本的数据库间导出导入数据的问题,索性整理一下,并简单比较下性能,有所遗漏的方法也欢迎讨论.补充. 0 ...

  3. Loadrunner Http接口Get/Post方法性能测试脚本解析

    最近使用LoadRunner 11进行了一次完整的Http WEB接口性能测试,下面介绍下Http接口Get/Post方法性能测试脚本通用编写方法. 1. Http接口性能测试基本流程 首先定义了一个 ...

  4. Action访问Servlet API的三种方法

    一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器 ...

  5. Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决

    Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...

  6. C# 索引器,实现IEnumerable接口的GetEnumerator()方法

    当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...

  7. 通过实现System.IComparable接口的CompareTo方法对两个类进行比较

    假设现在有一个学生类 class Student { int age; public Student(int age) { this.age = age; } } 要使学生类之间能进行比较,实现Sys ...

  8. ICompare接口、Sort()方法

    1.接口中的方法并不实现具体功能,继承于该接口的类必须实现具体功能. 核心思想:对修改封闭,对扩展开放. 2.Sort()方法: 默认:Sort(内容) 英文:按照首字母顺序排序,首字母相同则看第二个 ...

  9. 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法

    无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问.)” (Microsoft SQL Server,错误: 5120)的解决方法   问题描述: 在附加数据库到sql server时,附 ...

  10. Java8新特性——接口的默认方法和类方法

    Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只 ...

随机推荐

  1. (Good topic)贪心+二分查找:最长上升子序列(3.14 leetcode每日打卡)

    给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 说明 ...

  2. Codeforces Round #693 (Div. 3) A~E 题解

    写在前边 链接:Codeforces Round #693 (Div. 3) 没有打,闲的没事补一下题. A. Cards for Friends 链接:A题链接 题目大意: 给定一张\(w*h\)的 ...

  3. (Good topic)单词的压缩编码(leetcode3.28每日打卡)

    给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell&quo ...

  4. Mariadb 10.4 root 用户无法使用无密码登录的原因

    Mariadb现在是网站建设中使用的主流数据库之一,当前它很多个版本:10.1.10.2.10.3.10.4. 其中10.1和10.2在程序中使用root用户登录连接数据库都没有什么问题. 如果是10 ...

  5. Android 输入系统介绍

    目录 一.目的 二.环境 三.相关概念 3.1 输入设备 3.2 UEVENT机制 3.3 JNI 3.4 EPOLL机制 3.5 INotify 四.详细设计 4.1 结构图 4.2 代码结构 4. ...

  6. cyclone3内部资源

    CycloneIII内部资源概述 目录 CycloneIII内部资源概述 Logic Elements and Logic Array Blocks(逻辑元件和逻辑阵列块) LE LAB LAB In ...

  7. GMAC网卡Fixed-Link模式

    GMAC网卡Fixed-Link模式 GMAC fixed-link固定链接模式,mac与对端的连接方式是写死的,通常用于mac to mac(不排除mac to phy的情况).内核要支持fixed ...

  8. 制作交互式页面动画 | animate+javaweb

    目前是做得这样的作业,有想法改一改.

  9. JSR223取样器详解

    相比于BeanShell 取样器,JSR223取样器具有可大大提高性能的功能(编译)如果需要,一定要使用JSR223取样器编写脚本是更好的选择!!! 属性描述名称:显示的此取样器的描述性名称,可自定义 ...

  10. 使用 anasible 搭建一个多 master 多 worker 的 k8s 集群

    使用 ansible 搭建一个多 master 多 worker 的 k8s 集群 kubernetes + istio 是目前最强大,也是最易于使用的服务网格方案.要使用kubernetes + i ...