本文使用最简单的方法对打通 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. Util应用框架快速入门(4) - 集成测试开发入门

    本文演示Util应用框架开发的项目中如何编写集成测试. 准备 完成 Web Api 快速入门,本文将在之前生成的示例项目上讲解集成测试的开发. 测试概述 自动化测试对于Util应用框架的开发非常重要, ...

  2. Codeforces Round 902 Div 1 (CF 1876)

    A. Helmets in Night Light 按花费 sort 一下,\(b<p\) 就让他用 \(b\) 的花费告诉别人,剩下的人一开始用 \(p\) 的花费告诉即可. B. Effec ...

  3. ResNet详解:网络结构解读与PyTorch实现教程

    本文深入探讨了深度残差网络(ResNet)的核心概念和架构组成.我们从深度学习和梯度消失问题入手,逐一解析了残差块.初始卷积层.残差块组.全局平均池化和全连接层的作用和优点.文章还包含使用PyTorc ...

  4. 搓一个Pythonic list

      总所周知,Python语言当中的list是可以存储不同类型的元素的,对应到现代C++当中,可以用std::variant或者std::any实现类似的功能.而Python官方的实现当中用到了二级指 ...

  5. Python 利用pandas和matplotlib绘制双柱状图

    在数据分析和可视化中,常用的一种图形类型是柱状图.柱状图能够清晰地展示不同分类变量的数值,并支持多组数据进行对比.本篇文章将介绍如何使用Python绘制双柱状图. 准备工作 在开始绘制柱状图之前,需要 ...

  6. ORACLE 视图合并SQL优化案例

    朋友给了一条SQL说跑8个小时才出结果,结果集很小75条数据,给他安排一下. SQL如下: SELECT DISTINCT T.XLA_TYPE, T.XLA_CODE, T.VENDOR_CODE, ...

  7. Grafana新手教程-实现仪表盘创建和告警推送

    前言 最近在使用Grafana的时候,发现Grafana功能比想象中要强大,除了配合Prometheus使用之外,他自身都可以做很多事情,可视化和监控平台,还可以直接根据用户自定义的告警规则完成告警和 ...

  8. 28. 干货系列从零用Rust编写正反向代理,项目日志的源码实现

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  9. Linux TTY/PTS

    转载:https://segmentfault.com/a/1190000009082089 当我们在键盘上敲下一个字母的时候,到底是怎么发送到相应的进程的呢?我们通过ps.who等命令看到的类似tt ...

  10. logstash 配置文件语法介绍

    大家好,我是蓝胖子,之前在构建服务监控实践那个系列里,有提到用logstash来做日志的收集,但是对于logstash的配置文件语法没有做很详细的介绍,今天就来详细聊聊logstash配置文件的语法. ...