为答疑机器人扩展问题分类与路由功能

news2025/1/10 14:48:27

1.意图识别

在这里插入图片描述

2. 构建路由模块

简单的意图识别

from chatbot import llm

from config.load_key import load_key
load_key()

prompt = '''
【角色背景】
你是一个问题分类路由器,需要识别问题的类型。
---
【任务要求】
问题的类型目前有:公司内部文档查询、内容翻译、文档审查
你只能选择一类意图作为你的判断,并不要说任何无关内容。
---
【用户输入】
以下是用户输入,请判断:
'''
def get_question_type(question):
    """
    获取问题的类型

    参数:
    - question (str): 需要判断的问题文本

    返回值:
    - str: 问题类型,可能是 "文档审查" 、 "内容翻译"或“公司内部文档查询”
    """
    return llm.invoke(prompt + question)

print(get_question_type('https://www.promptingguide.ai/zh/techniques/fewshot'))
print('\n')
print(get_question_type('That is a big one I dont know why'))
print('\n')
print(get_question_type('作为技术内容工程师有什么需要注意的吗?'))

在这里插入图片描述
运行后发现,其实第一个问题是想问“文档审查”,但结果却是“内容翻译”。

2.1 优化策略:

我们可以利用提示词工程优化意图识别效果

路径:应用组件 - Prompt 工程
提示词自动优化工具

通用技巧: 提示词工程指南
少量样本提示((Few-Shot Prompting)
链式思考(Chain-of-Thought Prompting)
ReACT框架(Reason-Act)

明确输出格式:指定输出格式,使分类结果规范且易于解析。
Few-shot 示例:提供示例,帮助大模型理解每个类别的特征和分类规则。

from chatbot import llm
from config.load_key import load_key
load_key()

prompt = '''
【角色背景】
你是一个问题分类路由器,负责判断用户问题的类型,并将其归入下列三类之一:
1. 公司内部文档查询
2. 内容翻译
3. 文档审查

【任务要求】
你的任务是根据用户的输入内容,判断其意图并仅选择一个最贴切的分类。请仅输出分类名称,不需要多余的解释。判断依据如下:

- 如果问题涉及公司政策、流程、内部工具或职位描述与职责等内容,选择“公司内部文档查询”。
- 如果问题涉及任意一门非中文的语言,且输入中没有任何出现任何外语或出现“翻译”等字眼,选择“内容翻译”。
- 如果问题涉及检查或总结外部文档或链接内容,选择“文档审查”。
- 用户的前后输入与问题分类并没有任何关系,请单独为每次对话考虑分类类别。

【Few-shot 示例】
示例1:用户输入:“公司内部有哪些常用的项目管理工具?”
分类:公司内部文档查询

示例2:用户输入:“How can we finish the assignment on time?”
分类:内容翻译

示例3:用户输入:“https://help.aliyun.com/zh/model-studio/user-guide/long-context-qwen-long”
分类:文档审查

示例4:用户输入:“技术内容工程师需要设计和开发⾼质量的教育教材和课程吗?”
分类:文档审查

示例5:用户输入:“技术内容工程师核心职责是什么?”
分类:公司内部文档查询

【用户输入】
以下是用户的输入,请判断分类:

'''

def get_question_type(question):
    """
    获取问题的类型

    参数:
    - question (str): 需要判断的问题文本

    返回值:
    - str: 问题类型,可能是 "文档审查" 、 "内容翻译"或“公司内部文档查询”
    """
    return llm.invoke(prompt + question)

print(get_question_type('https://www.promptingguide.ai/zh/techniques/fewshot'))
print('\n')
print(get_question_type('That is a big one I dont know why'))
print('\n')
print(get_question_type('作为技术内容工程师有什么需要注意的吗?'))

在这里插入图片描述
优化后可以看出第一个问题的意图识别出来,是“文档审查”。

3. 文档自动审阅和修改

结合上面的意图识别,我们可以扩展对应的功能。

1.对内容进行文档审查。利用大语言模型可以进行网页审查。
2.利用RAG,查询企业内部信息。
3.翻译,大语言模型自带翻译功能。

from chatbot import rag
from chatbot import llm
from config.load_key import load_key
load_key()

# 加载索引并设置query engine
query_engine = rag.create_query_engine(index=rag.load_index())


prompt = '''
【角色背景】
你是一个问题分类路由器,负责判断用户问题的类型,并将其归入下列三类之一:
1. 公司内部文档查询
2. 内容翻译
3. 文档审查

【任务要求】
你的任务是根据用户的输入内容,判断其意图并仅选择一个最贴切的分类。请仅输出分类名称,不需要多余的解释。判断依据如下:

- 如果问题涉及公司政策、流程、内部工具或职位描述与职责等内容,选择“公司内部文档查询”。
- 如果问题涉及任意一门非中文的语言,且输入中没有任何出现任何外语或出现“翻译”等字眼,选择“内容翻译”。
- 如果问题涉及检查或总结外部文档或链接内容,选择“文档审查”。
- 用户的前后输入与问题分类并没有任何关系,请单独为每次对话考虑分类类别。

【Few-shot 示例】
示例1:用户输入:“公司内部有哪些常用的项目管理工具?”
分类:公司内部文档查询

示例2:用户输入:“How can we finish the assignment on time?”
分类:内容翻译

示例3:用户输入:“https://help.aliyun.com/zh/model-studio/user-guide/long-context-qwen-long”
分类:文档审查

示例4:用户输入:“技术内容工程师需要设计和开发⾼质量的教育教材和课程吗?”
分类:文档审查

示例5:用户输入:“技术内容工程师核心职责是什么?”
分类:公司内部文档查询

【用户输入】
以下是用户的输入,请判断分类:

'''

def get_question_type(question):
    """
    获取问题的类型

    参数:
    - question (str): 需要判断的问题文本

    返回值:
    - str: 问题类型,可能是 "文档审查" 、 "内容翻译"或“公司内部文档查询”
    """
    return llm.invoke(prompt + question)

def ask_v4(question):
    question_type = get_question_type(question)
    print(f'问题:{question}\n类型:{question_type}')
    if question_type == '文档审查':
        return llm.invoke('你是文档纠错专家,负责找出文档中或网页内容的明显错误,并且言简意赅的回复。如果没有明显问题,请直接回复没有问题\n' + question)
    elif question_type == '公司内部文档查询':
        return rag.ask(question, query_engine=query_engine)
    elif question_type == '内容翻译':
        return llm.invoke(f'你是一名翻译专家,你要识别不同语言的文本,并翻译为中文。\n{question}')
    else:
        return "未能识别问题类型,请重新输入。"

if __name__ == "__main__":
    print(ask_v4('https://www.promptingguide.ai/zh/techniques/fewshot'))
    print('')
    print(ask_v4('请帮我检查下这段文档:技术内容工程师有需要进行内容优化与更新与跨部门合作吗?'))
    print('')
    print(ask_v4('技术内容工程师有需要进行内容优化与更新与跨部门合作吗?'))
    print('')
    print(ask_v4('A true master always carries the heart of a student.'))

在这里插入图片描述
上面代码已经完成了大部分工作,但第一个问题识别成“文档审查”,如何优化,其实也是老套路。
在提示词多加一个实例

示例6:用户输入:“请帮我检查下这段文档:技术内容工程师核心职责是什么?”
分类:公司内部文档查询

再运行一下代码
在这里插入图片描述
发现这次结果就正确了。

总结

在这文章了,我们实现了一个小小的大语言agent功能,相对于Assistants一些工具类,我更喜欢重新用大语言去进行意图识别,因为还能进行多意图识别,并按顺序返回并按顺序执行任务。 当然,也可以借助类似Dify这些智能体流程编排。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring boot启动源码分析(三)之Environment准备

上一篇《spring-boot启动源码分析(二)之SpringApplicationRunListener》 环境介绍: spring boot版本:2.7.18 主要starter:spring-boot-starter-web 本篇开始讲启动过程中Environment环境准备,Environment是管理所有…

Pandas-RFM会员价值度模型

文章目录 一. 会员价值度模型介绍二. RFM计算与显示1. 背景2. 技术点3. 数据4. 代码① 导入模块② 读取数据③ 数据预处理Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.Ⅱ. 查看清洗后的数据Ⅲ. 把前四年的数据, 拼接到一起 ④ 计算RFM的原始值⑤ 确定RFM划分区间⑥ RFM计算过程⑦…

【理论】测试框架体系TDD、BDD、ATDD、DDT介绍

一、测试框架是什么 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。 A testing framewo…

FreeU: Free Lunch in Diffusion U-Net 笔记

FreeU: Free Lunch in Diffusion U-Net 摘要 作者研究了 U-Net 架构对去噪过程的关键贡献,并发现其主干部分主要在去噪方面发挥作用,而其跳跃连接主要是向解码器模块引入高频特征,这使得网络忽略了主干部分的语义信息。基于这一发现&#…

JAVA 使用apache poi实现EXCEL文件的输出;apache poi实现标题行的第一个字符为红色;EXCEL设置某几个字符为别的颜色

设置输出文件的列宽,防止文件过于丑陋 Sheet sheet workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME); sheet.setColumnWidth(0, 40 * 256); sheet.setColumnWidth(1, 20 * 256); sheet.setColumnWidth(2, 20 * 256); sheet.setColumnWidth(3, 20 * 25…

【STM32】无源蜂鸣器播放音乐《千与千寻》,HAL库

目录 一、工程链接 二、简单介绍 主要特点: 应用: 驱动电路: 三、原理图 四、cubeMX配置 时钟配置 五、keil配置 六、驱动编写 演奏函数 主函数编写 七、效果展示 八、驱动附录 music.h music.c 一、工程链接 STM32无源蜂鸣…

在 Vue 3 集成 e签宝电子合同签署功能

实现 Vue 3 e签宝电子合同签署功能,需要使用 e签宝提供的实际 SDK 或 API。 e签宝通常提供针对不同平台(如 Web、Android、iOS)的 SDK,而 Web 端一般通过 WebView 或直接使用嵌入式 iframe 来加载合同签署页面。 下面举个 &…

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value,其基础数据类型都是字符串。如,Hash型value的field与value的类型,List型,Set型,ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错,而 XML 格式发票因其结构化、标准化的特点,为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据:XML 格式发票…

Linux——修改USB网卡设备节点名称

修改驱动: 测试: 参考资料: https://blog.csdn.net/ablexu2018/article/details/144868950

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验(1)DMA结构体解释(2…

论文笔记(六十一)Implicit Behavioral Cloning

Implicit Behavioral Cloning 文章概括摘要1 引言2 背景:隐式模型的训练与推理3 隐式模型与显式模型的有趣属性4 policy学习成果5 理论见解:隐式模型的通用逼近性6 相关工作7 结论 文章概括 引用: inproceedings{florence2022implicit,titl…

高斯函数Gaussian绘制matlab

高斯 约翰卡尔弗里德里希高斯,(德语:Johann Carl Friedrich Gau,英语:Gauss,拉丁语:Carolus Fridericus Gauss)1777年4月30日–1855年2月23日,德国著名数学家、物理学家…

vue的路由守卫逻辑处理不当导致部署在nginx上无法捕捉后端异步响应消息等问题

近期对前端的路由卫士有了更多的认识。 何为路由守卫?这可能是一种约定俗成的名称。就是VUE中的自定义函数,用来处理路由跳转。 import { createRouter, createWebHashHistory } from "vue-router";const router createRouter({history: cr…

如何在 Ubuntu 22.04 上使用 LEMP 安装 WordPress 教程

简介: 本教程旨在指导你如何在 Ubuntu 22.04 上使用 LEMP 栈安装 WordPress。 WordPress 是一个用 PHP 编写的开源内容管理系统。LEMP 栈是 Linux,NGINX,MySQL 和 PHP 的缩写。WordPress 非常用户友好,并提供了多种选项&#xff…

PySide6基于QSlider实现QDoubleSlider

我在写小工具的时候,需要一个支持小数的滑动条。 我QSpinBox都找到了QDoubleSpinBox,QSlider愣是没找到对应的东西。 网上有好多对QSlider封装实现QDoubleSlider的文章。 似乎Qt真的没有这个东西,需要我们自行实现。 于是我也封装了一个&…

升级 Spring Boot 3 配置讲解 —— 支持断点传输的文件上传和下载功能

学会这款 🔥全新设计的 Java 脚手架 ,从此面试不再怕! 在现代 Web 应用中,文件上传和下载是非常常见的需求。然而,当文件较大时,传统的上传下载方式可能会遇到网络不稳定或传输中断的问题。为了解决这些问题…

Backend - C# EF Core 执行迁移 Migrate

目录 一、创建Postgre数据库 二、安装包 (一)查看是否存在该安装包 (二)安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行(针对visual studio) 查看迁移功能的常用命令: 查看…

KG-CoT:基于知识图谱的大语言模型问答的思维链提示

一些符号定义 知识图谱实体数量: n n n 知识图谱中关系类型数量: m m m 三元组矩阵: M ∈ { 0 , 1 } n n m \textbf{M} \in \{0, 1\}^{n \times n \times m} M∈{0,1}nnm, M i j k 1 M_{ij}^k 1 Mijk​1则说明实体 i i i和实…

HTML+CSS+JS制作中国传统节日主题网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个中国传统节日主题网站,包含首页、节日介绍页、民俗文化页、节日活动页、联系我们页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部横幅区 包含传统中国风格的网站标题中国传统…