对话小系统(智能图书助手)

对话小系统(智能图书助手)

    • 文章说明
    • 核心代码
    • 效果展示
    • 源码下载

文章说明

现在GPT的功能十分强大,是否可以利用开源的接口来实现自己的智能小助手呢,我想到可以提供一些能力接口,然后对问询内容进行意图识别,采用指定接口进行业务逻辑处理,然后将内容呈现给用户,这样的较为智能的小助手,感觉还是蛮不错的

目前采用的是网页的形式呈现,也可以考虑采用语音播报的形式,形成初级的智能助手;当然,这方面还需要继续研究了

核心代码

前端页面中可以配置接口、意图,以及相应的对话接口;框架的逻辑为采用GPT识别用户输入的内容,将指定的意图列表传给它,让它来分辨目前的对话,当前问询内容属于哪个意图,然后再采用配置的处理接口进行业务处理;在问询过程中会记录一些上下文信息,然后在后续的业务处理过程中可以使用到

目前的对话页面代码展示

<script setup>
import {nextTick, onBeforeMount, onMounted, reactive, ref} from 'vue';
import BookDetail from "@/showPage/BookDetail.vue";
import BookSearchResult from "@/showPage/BookSearchResult.vue";
import BookBorrowHistoryList from "@/showPage/BookBorrowHistoryList.vue";
import BookCurrentBorrowList from "@/showPage/BookCurrentBorrowList.vue";
import BookBorrowHistoryChart from "@/showPage/BookBorrowHistoryChart.vue";
import {handleIntention} from "@/util/handleIntention";

const data = reactive({
  messages: [],
  newMessageText: "",
});

onBeforeMount(() => {
  data.messages.push({
    sender: 'system',
    intentionName: "初始提示信息",
    text: '我是智能图书助手,有什么可以帮您的吗?',
  });
});

const sendMessage = () => {
  if (data.newMessageText.trim() !== '') {
    data.messages.push({
      sender: 'user',
      text: data.newMessageText,
    });
    const messageItem = handleIntention(data.newMessageText);
    messageItem.sender = "system";
    data.messages.push(messageItem);
    nextTick(() => {
      scrollToBottom();
    });
    data.newMessageText = '';
  }
};

const chatMain = ref();

function scrollToBottom() {
  if (chatMain.value) {
    chatMain.value.scrollTop = chatMain.value.scrollHeight;
  }
}

onMounted(() => {
  scrollToBottom();
});
</script>

<template>
  <div class="chat-container">
    <header class="chat-header">
      <h2>对话记录</h2>
    </header>
    <main ref="chatMain" class="chat-main">
      <ul class="message-list">
        <template v-for="(message, index) in data.messages" :key="index">
          <li v-if="message.sender === 'user'" class="message user-message">
            <div class="message-content">{{ message.text }}</div>
            <img alt="Avatar" class="avatar" src="@/img/1.jpg"/>
          </li>
          <li v-if="message.sender !== 'user'" class="message system-message">
            <img alt="Avatar" class="avatar" src="@/img/2.jpg"/>
            <template v-if="message.intentionName === '初始提示信息' || message.intentionName === '其他意图'">
              <div class="message-content">{{ message.text }}</div>
            </template>
            <template v-if="message.intentionName === '查询书籍具体信息'">
              <BookDetail :available="message.available" :book-author="message.bookAuthor"
                          :book-brief="message.bookBrief" :book-name="message.bookName"/>
            </template>
            <template v-if="message.intentionName === '查询书籍'">
              <BookSearchResult :books="message.books"/>
            </template>
            <template v-if="message.intentionName === '查询借阅历史'">
              <BookBorrowHistoryList :borrowHistory="message.borrowHistory"/>
            </template>
            <template v-if="message.intentionName === '查询当前借阅情况'">
              <BookCurrentBorrowList :currentBorrows="message.currentBorrows"/>
            </template>
            <template v-if="message.intentionName === '查询借阅历史图表展示'">
              <BookBorrowHistoryChart :borrowHistory="message.borrowHistory"/>
            </template>
          </li>
        </template>
      </ul>
    </main>
    <footer class="chat-footer">
      <textarea v-model="data.newMessageText" @keyup.enter="sendMessage" placeholder="输入信息..." rows="3"
                class="message-input"></textarea>
      <button @click="sendMessage">发送</button>
    </footer>
  </div>
</template>

<style lang="scss" scoped>
.chat-container {
  display: flex;
  flex-direction: column;
  height: 100%;
  width: 100%;
  margin: auto;
  background-color: #f4f4f4;
  border-radius: 8px;
  overflow: hidden;

  .chat-header {
    background-color: #3498db;
    color: white;
    padding: 1rem;
    text-align: center;
  }

  .chat-main {
    flex-grow: 1;
    padding: 1rem;
    overflow-y: auto;
    overflow-x: hidden;
    background-color: #fff;

    &::-webkit-scrollbar {
      background-color: transparent;
      height: 0.5rem;
      width: 0.5rem;
    }

    &::-webkit-scrollbar-thumb {
      background-color: #7f8c8daa;
      border-radius: 0.5rem;
    }

    .message-list {
      list-style-type: none;
      margin: 0;
      padding: 0;

      .message {
        display: flex;
        align-items: flex-start;
        margin-bottom: 1rem;
        word-break: break-all;

        .avatar {
          width: 40px;
          height: 40px;
          border-radius: 50%;
          margin-right: 0.5rem;
        }

        .message-content {
          max-width: 70%;
          padding: 0.5rem;
          border-radius: 8px;
          font-size: 1rem;
        }
      }

      .user-message {
        justify-content: flex-end;

        .avatar {
          margin-left: 0.5rem;
        }

        .message-content {
          background-color: #e74c3c;
          color: white;
        }
      }

      .system-message {
        justify-content: flex-start;

        .message-content {
          background-color: #3498db;
          color: white;
        }
      }
    }
  }

  .chat-footer {
    display: flex;
    padding: 1rem;
    background-color: #fff;
    box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);

    .message-input {
      flex-grow: 1;
      padding: 0.5rem;
      border: 1px solid #ddd;
      border-radius: 4px;
      margin-right: 0.5rem;
      resize: none;
      min-height: 48px;
      font-size: 1rem;
      line-height: 1.5;
      font-family: 'Arial', 'Helvetica Neue', Helvetica, sans-serif;
      font-weight: 400;
      letter-spacing: 0.02em;

      &:focus {
        outline: none;
        border-color: #3498db;
        box-shadow: 0 0 5px rgba(52, 152, 219, 0.5);
      }
    }

    button {
      padding: 0.5rem 1rem;
      background-color: #3498db;
      color: white;
      border: none;
      border-radius: 4px;
      cursor: pointer;
      transition: background-color 0.3s;
      min-height: 48px;
      display: flex;
      align-items: center;
      justify-content: center;

      &:hover {
        background-color: #2980b9;
      }
    }
  }
}
</style>

其中本demo的部分代码采用GPT生成,感觉生成的页面样式上还蛮不错的

效果展示

系统首页
在这里插入图片描述

意图管理
在这里插入图片描述

接口管理
在这里插入图片描述

源码下载

对话型系统

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数智读书笔记系列006 协同进化:人类与机器融合的未来

书名:协同进化&#xff1a;人类与机器融合的未来 作者:[美]爱德华阿什福德李 译者:李杨 出版时间:2022-06-01 ISBN:9787521741476 中信出版集团制作发行 爱德华・阿什福德・李&#xff08;Edward Ashford Lee&#xff09;是一位在计算机科学与工程领域颇具影响力的学者&am…

C# 探险之旅:第二十七节 - 类型class(属性) —— 给你的类穿上“属性”的外衣

嘿&#xff0c;探险家们&#xff01;欢迎再次踏上我们的C#奇幻之旅。今天&#xff0c;我们要聊聊一个超级有趣的话题——类的“属性”。想象一下&#xff0c;如果我们要给类穿上一件酷炫的外衣&#xff0c;那属性就是这件外衣上的各种口袋和装饰&#xff0c;让类变得既实用又拉…

数据保护策略:如何保障重要信息的安全

一、什么是数据安全&#xff1f; 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程&#xff0c;负责监督信息的收集、存储和传输。 机密性&#xff1a;保护数据免遭未授权方访问。 完整性&#xff1a;保护数据免遭未经授权的修改、损坏…

Mvc、Springmvc框架

一.Mvc&#xff1a; 1.概念&#xff1a; MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 、View视图 、Controller控制层&#xff1b; 结构图&#xff1a; 二.Springmvc: 1.概念&#xff1a; springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计…

【CSS in Depth 2 精译_078】12.6 调整字间距,提升可读性 + 12.7 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…

Python高性能web框架-FastApi教程:(2)路径操作装饰器方法

路径操作装饰器方法 1. fastapi支持的各种请求方式 app.get() app.post() app.put() app.patch() app.delete() app.options() app.head() app.trace()2. 定义不同请求方式的路由 # 定义GET请求的路由 app.get(/get) def get_test():return {method: get方法} app.get(/get)…

PostgreSQL 入门

下载与安装 部分国产数据库采用PostgreSQL作为基础进行研发&#xff0c;因此先尝试了解一下原始数据库情况。 PostgreSQL 简称 PG 官网&#xff1a;https://www.postgresql.org/ PostgreSQL “世界上最先进的开源关系型数据库” 这是官网上的口号。 PostgreSQL: The World…

Java-26 深入浅出 Spring - 实现简易Ioc-02 无IoC与AOP场景下实现业务

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

工作流审批功能全解析:提升流程效率的关键要素

1. 引言 在当今数字化时代&#xff0c;企业与组织的运营效率在很大程度上依赖于高效、精准的工作流审批系统。随着业务日益复杂且多样化&#xff0c;审批流程变得愈加细致和灵活。一个完善的工作流审批系统不仅能确保任务在组织内部有序流转、协调各方资源&#xff0c;还能实现…

API接口示例:电商商品评论数据

当然&#xff0c;以下是一个简化的电商商品评论数据API接口的示例。请注意&#xff0c;这只是一个示例&#xff0c;实际的API接口可能会更加复杂&#xff0c;并且会包含更多的验证、错误处理和安全措施。 API接口示例&#xff1a;电商商品评论数据 基础信息 API名称&#xf…

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由

网络层数据封装 首先IP地址封装在网络层&#xff0c;它用于标识一台网络设备&#xff0c;其中IP地址分为两个部分&#xff0c;网络地址和主机地址&#xff0c;通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言&#xff0c;它细分为五类&#xff0c;A,B,C,D,E,…

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB&#xff0c;并例化到顶层设计&#xff0c;发现UART_RX管脚在进行管脚分配时没有显示出来&#xff0c;最后发现是CoreAPB3总线IP核配置不对导致&#xff0c;改为如下配置后正常。

SEGGER | 基于STM32F405 + Keil - RTT组件01 - 移植SEGGER RTT

导言 RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的技术&#xff0c;它结合了SWO和半主机的优点&#xff0c;具有极高的性能。 使用RTT可以从MCU非常快速输出调试信息和数据&#xff0c;且不影响MCU实时性。这个功能可以用于很多支持J-Link的设备和MCU&#xff0…

SpringBoot集成JWT和Redis实现鉴权登录功能

目前市面上有许多鉴权框架&#xff0c;鉴权原理大同小异&#xff0c;本文简单介绍下利用JWT和Redis实现鉴权功能&#xff0c;算是抛砖引玉吧。 主要原理就是“令牌主动失效机制”&#xff0c;主要包括以下4个步骤&#xff1a; (1)利用拦截器LoginInterceptor实现所有接口登录拦…

29.在Vue 3中使用OpenLayers读取WKB数据并显示图形

在Web开发中&#xff0c;地理信息系统&#xff08;GIS&#xff09;应用越来越重要&#xff0c;尤其是在地图展示和空间数据分析的场景中。OpenLayers作为一个强大的开源JavaScript库&#xff0c;为开发者提供了丰富的地图展示和空间数据处理能力。在本篇文章中&#xff0c;我将…

【bWAPP】 HTML Injection (HTML注入)

我们都是在一条铺满荆棘的新路上摸索着前行&#xff0c;碰个鼻青眼肿几乎不可避免&#xff0c;而问题在于&#xff0c;我们能不能在这条路上跌倒之后&#xff0c;爬起来继续走下去。 HTML Injection - Reflected (GET) get方式的html代码注入 漏洞url&#xff1a;http://ran…

内网是如何访问到互联网的(华为源NAT)

私网地址如何能够访问到公网的&#xff1f; 在上一篇中&#xff0c;我们用任意一个内网的终端都能访问到百度的服务器&#xff0c;但是这是我们在互联网设备上面做了回程路由才实现的&#xff0c;在实际中&#xff0c;之前也说过运营商是不会写任何路由过来的&#xff0c;那对于…

tomcat的优化和动静分离

tomcat的优化 1.tomcat的配置优化 2.操作系统的内核优化 注意&#xff1a;设置保存后&#xff0c;需要重新ssh连接才会看到配置更改的变化 vim /etc/security/limits.conf # 65535 为Linux系统最大打开文件数 * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 *…

粗略的过一下StableDiffusion3的一些方面

什么是Stable Diffusion 3 Stable Diffusion 3是由Stability AI开发的最新且最先进的文本生成图像模型之一&#xff0c;在图像保真度、多主体处理和文本遵循性方面实现了显著提升。该模型采用了全新的多模态扩散变压器&#xff08;MMDiT&#xff09;架构&#xff0c;并为图像和…

测试工程师八股文04|计算机网络 和 其他

一、计算机网络 1、http和https的区别 HTTP和HTTPS是用于在互联网上传输数据的协议。它们都是应用层协议&#xff0c;建立在TCP/IP协议栈之上&#xff0c;用于客户端&#xff08;如浏览器&#xff09;和服务器之间的通信。 ①http和https的主要区别在于安全性。http是一种明…