打通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工程化

飞书文档

打通Rasa Action Server和LLM接口的尝试方法的更多相关文章
- struts2的action访问servlet API的三种方法
学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...
- 不同版本的SQL Server之间数据导出导入的方法及性能比较
原文:不同版本的SQL Server之间数据导出导入的方法及性能比较 工作中有段时间常常涉及到不同版本的数据库间导出导入数据的问题,索性整理一下,并简单比较下性能,有所遗漏的方法也欢迎讨论.补充. 0 ...
- Loadrunner Http接口Get/Post方法性能测试脚本解析
最近使用LoadRunner 11进行了一次完整的Http WEB接口性能测试,下面介绍下Http接口Get/Post方法性能测试脚本通用编写方法. 1. Http接口性能测试基本流程 首先定义了一个 ...
- Action访问Servlet API的三种方法
一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器 ...
- Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决
Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...
- C# 索引器,实现IEnumerable接口的GetEnumerator()方法
当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [ ...
- 通过实现System.IComparable接口的CompareTo方法对两个类进行比较
假设现在有一个学生类 class Student { int age; public Student(int age) { this.age = age; } } 要使学生类之间能进行比较,实现Sys ...
- ICompare接口、Sort()方法
1.接口中的方法并不实现具体功能,继承于该接口的类必须实现具体功能. 核心思想:对修改封闭,对扩展开放. 2.Sort()方法: 默认:Sort(内容) 英文:按照首字母顺序排序,首字母相同则看第二个 ...
- 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法
无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问.)” (Microsoft SQL Server,错误: 5120)的解决方法 问题描述: 在附加数据库到sql server时,附 ...
- Java8新特性——接口的默认方法和类方法
Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只 ...
随机推荐
- CF1526C2
与简单版的思路完全一致,只需要改一下范围. 可以去看我简单版本的博客. 题目简化和分析: 给您一个数组,在其中选择若干个数使得: 任意前缀和 \(\ge 0\) 数量尽可能的大 我们可以使用贪心策略, ...
- 解密Prompt系列17. LLM对齐方案再升级 WizardLM & BackTranslation & SELF-ALIGN
话接上文的指令微调的样本优化方案,上一章是通过多样性筛选和质量过滤,对样本量进行缩减,主打经济实惠.这一章是通过扩写,改写,以及回译等半监督样本挖掘方案对种子样本进行扩充,提高种子指令样本的多样性和复 ...
- 【Unity3D】资源管理
1 前言 Unity 中资源管理方案主要有 Resources.TextAsset.ScriptableObject .AssetDatabase.PlayerPrefs.Addressables ...
- 入手react的 第一坑
npm verb cli /usr/local/bin/node /usr/local/bin/npm npm info using npm@9.8.1 npm info using node@v18 ...
- Kubernetes网络
kubernetes-Service 1.service存在的意义 1.防止破的失联(服务发现) 2.定义一组pod的访问策略(提供负载均衡) 2.pod与service的关系 1.通过lablel- ...
- kubernetes组件介绍-service概念
kubernetes组件介绍 MESOS APACHE 分布式资源管理框架 2019-5 Twitter > Kuberneets Dcocker Swarm 2019-07 阿里云宣布 Doc ...
- PKUSC & GDCPC 2023 游记
离得太近,游记打算扔一起. 有没有神仙面基啊 /kel. PKUSC 2023 Day -? 突然听说不给 NOI Linux,震惊. 前情提要:在从 CSP 开始就全员强制 linux 的 LN 为 ...
- JVM-JAVA基本类型
1 package javap.fload; 2 3 import static jdk.nashorn.internal.objects.Global.Infinity; 4 5 public cl ...
- picgo+GitHub搭建图床
picgo+GitHub 搭建图床 目录 picgo+GitHub 搭建图床 图床的概念 使用 GitHub 创建图床服务器 在 GitHub 上面新建仓库 生成 token 令牌 创建 img 分支 ...
- 在 Ubuntu 22.04 系统上为 SSH 开启基于时间的 TOTP 认证
前言 一次性密码(英语:one-time password,简称OTP),又称动态密码或单次有效密码,是指电脑系统或其他数字设备上只能使用一次的密码,有效期为只有一次登录会话或一段短时间内.基于时间的 ...