本文使用最简单的方法对打通 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. 通过资源名称得到资源id

    demo地址 主要应用类 package com.example.activitylibrary; import android.app.Activity; import android.os.Bun ...

  2. Java11配置maven

    这里假设Java11和maven都正确安装,使用的版本为Java11.maven3.6.1 测试环境变量 Java win + r 打开运行,输入 cmd,打开命令行提示符,输入java --vers ...

  3. gitlab ci 集成 eslint/prettier/tsc 做代码审查,并使用 eslint 输出作为显示代码质量

    前言 想自动化一下公司里代码的部分审查,最初想用 reviewdog 的,但是公司的域名基本都在 VPN 中访问的,gitlab ci 的容器中是访问不到的,于是乎实验了 gitlab 代码质量功能. ...

  4. Oracle11g安装教程(带安装包)

    找了半天没在官网上找到Oracle11g的安装包下载,又找了半天,终于在网上的一个教程里找到安装包的网盘链接.现在在这记一下防止以后重新找麻烦. 网盘链接 百度云盘链接:[https://pan.ba ...

  5. 从零开始编写一个 Python 异步 ASGI WEB 框架

    从零开始编写一个 Python 异步 ASGI WEB 框架 前言 本着 「路漫漫其修远兮,吾将上下而求索」 的精神,这次要和朋友们分享的内容是<从零开始编写一个 Python 异步 ASGI ...

  6. 数据类型python

    type()语句的用法 运行结果

  7. umich cv-6-1 循环神经网络基本知识

    这节课中介绍了循环神经网络的第一部分,主要介绍了循环神经网络的基本概念,vanilla循环网络架构,RNN的一些应用,vanilla架构的问题,更先进的rnn架构比如GRU和LSTM 循环神经网络基本 ...

  8. html-7(JavaScript-1)

    放在函数里面 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  9. auto关键词

    前言 这个东西在新版本的 C 语言中还是很常用的,尤其是用到 for 循环中.蒟蒻之前也是对这个了解不多,基本没用过(除非迫不得已,因为我的C++编译器太逊了,不支持此操作,用这个操作还得用在线 ID ...

  10. 由后缀表达式题目:stoi atoi 函数新发现

    洛谷上的题:有些·表示一个操作结束~假装没看到 1 #include<iostream> 2 #include<stack> 3 #include<string> ...