如何构建智能聊天系统

聊天分为听、思考、读,简单的通过ASR、LLM、TTS三类模型的组合可以实现,最近openai推出支持多模态的GPT-4o模型,可以把三个模型真正融合成在一起。 现在市面上的模型百花齐放,各有所长。要实现可落地的方案,需要结合业务,验证模型效果,同时也要考虑方案的可行性,有些模型在国内能用,有些在国内不能用。

模型的选择过程

  1. 选择候选模型
  2. 准备测试数据集
  3. 使用模型生成测试结果
  4. 结果打分

聊天协议的选择

完整的聊天交互是,用户说完话,通过ASR识别出来用户说的内容,发送给聊天模型,模型生成内容后转出语音内容,发送给用户。 客户端与服务端通信的协议推荐用websocket,它在需要频繁交互的场景比http更适合。http每次请求都需要握手,还会带上很多header,降低了整体的传输效率;另一方面,websocket支持全双工,服务端可以主动推送消息给客户端。 websocket作为TCP协议的简单包装,支持文本和二进制数据,协议格式十分精简,保证了传输的性能。这也是一把双刃剑,就需要业务根据需要自己定义传输数据的协议。自定义协议的好坏直接影响到后续的扩展。子协议我们推荐使用stomp协议,它是参考了http的设计理念,由command、header和body构成,也支持ack/nack、断线重连等功能。它是轻量级的协议,不像http那样适用大多数的web场景,它只适用于一部分场景。stomp预定义了可用的command,客户端和服务端能使用的command也不一样。 所以,最终的聊天协议选择是websocket+stomp的组合。

模型的接入

ASR模型

以微软为例,ASR模型的输入是音频流,输出是文本,输出的形式包含流式和完整输出。这输出完整的内容之前,会跟进完整音频做一次校准,所以内容可能会跟流式输出的有差异。 对接的方式,如果在客户端接入模型,只需引入微软的SDK,SDK会自动获取设备的音频流。另外,微软的服务在国外,从国内调用需要经过防火墙,对响应时间有影响。首个文字返回的时间在1.5~2.7秒之间,平均1.6秒左右(杭州访问微软东亚节点)。 如果在服务端接入模型,就需要客户端将音频数据,先传给服务端,服务音频内容不断追加到模型的输入流里。首个文字返回的时间在1.6~2.3秒之间,平均1.9秒左右(杭州访问香港服务器,转发到微软东亚节点)。

LLM模型

拿到ASR识别的完整的内容后,交给LLM模型生成待回复内容。LLM模型考虑智力水平的话,首选的是GPT系列,包括GPT-3.5、GPT-4、GPT-4o,还有Claude3系列。考虑聊天效果的话,考虑使用国内的豆包、MiniMax系列的模型,聊天内容跟自然。 接入模型的方式比较简单,以接入openai为例,申请到token后,调用它的聊天接口就可以。接入豆包会复杂些,需要先创建连接点(模型实例),再生成对应待过期时间的token(最长30天)。 另外,接模型从零开始,有一些现成的框架。java工程推荐使用spring-ai框架,它更新迭代比较快,能快速支持openai新的接口格式。另外还有4.6k个star的TheoKanning/openai-java,不过已经5个月没更新了。 openai的聊天接口支持流式和完整返回,流式的协议是SSE,完整返回是JSON格式。要按场景选择返回的格式,实时聊天推荐是流式,因为完整返回时间比较慢。以输出10个英文单词为例,完整返回的时间GPT-3.5要700ms,GPT-4要2s,GPT-4o要1s。另外,内容返回给用户之前,还要做敏感词检测,所以边输出边检测效率会更高。

TTS模型

LLM生成的文本,要通过TTS转出语音后才会输出给用户。与ASR相反,TTS模型输入是文本,输出是音频。对TTS模型的要求是多语言的支持、音色的丰富程度和个性化。微软TTS对多语言支持最好,也有丰富的音色。通过SSML的描述方式,还能控制语速和情感。openai的TTS能根据文本推断出相应的情感,不需要在输入端做额外标记,但它只对英语支持较好,中文发音像是老外说中文。 以微软TTS为例,在服务端接入,如果是linux服务器,需要安装微软的语音库。之后项目里引入对应版本的SDK,就可以直接获取转换后的音频二进制数组。10个文字左右的延迟在400ms左右(香港调用微软东亚节点)。 另外,微软TTS调用前需要初始化客户端,会有点耗时,可以先预初始化,提高请求响应速度。

模型切换

各模型厂商都在快速的迭代模型,效果、性能都在提升,成本也在下降。这决定了我们要有快速接入和切换模型的能力。可能是单个模型的替换,也可能是多个模型换成一个多模态的模型,例如GPT-4o就是多模态的。 要支持这种能力,在模型调用上,我们需要先跟具体的模型厂商解耦,单独抽象出一套请求接口规范。 幸运的是spring ai项目正在做这件事,它定义了和模型交互的流程,也已经支持一部分国外的模型,包括openai的大部分模型。但它没有支持国内的模型,这就需要我们做扩展。 在开发框架上支持多模型后,还剩一个最大的问题,就是服务部署地区。海外的模型,只能在非大陆地区调用。不然从国内去访问会有很大的延迟(防火墙),并且可能被限制访问,如openai限制了大陆地区使用模型。国内的模型,最好在国内调用,网络状况会更好。如何部署调用的服务,不仅仅是技术问题,还需要考虑业务发展。在极端的情况下,也能考虑将功能拆成多个服务,分地域部署。这样维护和扩展都成本都会提高。折中的方案是,部署在亚太附近,例如:东京、首尔、香港等。

模型测试

对于不同版本和厂商的模型,我们在使用前和使用中都需要持续的观测它们的表现。这就需要有一套流程和工具去持续测试模型的性能和效果。

ASR模型

关注识别的准确度,准备一批语音,将模型输出的文字和标准文本进行相似度匹配,判断整体的准确度。需要考虑的因素有,发音的准确度、背景音、口音等。

LLM模型

关注回答内容的准确度,如果输出格式是json,可以直接判断json的内容。如果输出是开放到文本,就需要人工介入检查。或者通过prompt来提取文本的信息,返回结构化内容,再进行判断。例如,问数字人的名字,它回答“我叫Leo”。我们就可以用提取名字的prompt获得名字信息,再跟答案比较。

TTS模型

关注生成语音的准确度,可以将生成内容用ASR转成文本,再和原文进行比较。这样可能有点一定的误差,但是能减少人工的检查成本。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现万花筒效果:创造炫目的动态图案

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制万花筒图案的函数主循环 完整代码 引言 万花筒效果通过反射和旋转图案创造出美丽的对称图案。在这篇博客中,我们将使用Python来实现一个动态的万花筒效果。通过利用Pygame库&#xf…

数据结构算法之B树

一、绪论 1.1 数据结构的概念和作用 1.2 B树的起源和应用领域 二、B树的基本原理 2.1 B树的定义和特点 2.2 B树的结构和节点组成 2.3 B树的插入 2.4 B树的删除操作 三、B树的优势和应用 3.1 B树在数据库系统中的应用 3.2 B树在文件系统中的应用 3.3 B树在内存管理中…

java+mysql教师管理系统

完整源码地址 教师信息管理系统使用命令行交互的方式及数据库连接实现教师信息管理系统,该系统旨在实现教师信息的管理,并根据需要进行教师信息展示。该软件的功能有如下功能 (1)基本信息管理(教师号、姓名、性别、出生年月、职称、学历、学位、教师类型…

Linux基础指令介绍与详解——原理学习

前言:本节内容标题虽然为指令,但是并不只是讲指令, 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法, 很抱歉, 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的,…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(五)Jenkins配置

一、背景 Jenkins(本地宿主机搭建) 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码(可不改,如果运行报allure找不到就直接注释掉) …

Linux修炼之路之进程概念,fork函数,进程状态

目录 一:进程概念 二:Linux中的进程概念 三:用getpid(),getppid()获取该进程的PID,PPID 四:用fork()来创建子进程 五:操作系统学科的进程状态 六:Linux中的进程状态 接下来的日子会顺顺利利&#xf…

《梦醒蝶飞:释放Excel函数与公式的力量》8.3 COUNTBLANK函数

8.3 COUNTBLANK函数 在数据处理和分析中,我们经常需要识别和统计数据集中的空白单元格。COUNTBLANK函数是Excel中用于统计某个范围内空白单元格数量的强大工具。 8.3.1 函数简介 COUNTBLANK函数用于统计指定范围内的空白单元格数量。这在数据清洗、数据完整性检查…

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型) 一, 文档介绍二, 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三, MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…

昇思MindSpore学习入门-保存与加载

在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,本章节我们将介绍如何保存与加载模型。 保存和加载模型权重 保存模型使用save_checkpoint接口,…

从hugging face 下模型

支持国内下载hugging face 的东西 下模型权重 model_id 是红色圈复制的 代码 记得设置下载的存储位置 import os from pathlib import Path from huggingface_hub import hf_hub_download from huggingface_hub import snapshot_downloadmodel_id"llava-hf/llava-v1…

格拉姆角场(GAF)将一维序列转化为图像

格拉姆角场(Gramian Angular Field, GAF)是一种将一维时间序列数据转换为二维图像表示的有效方法。以下是关于格拉姆角场(GAF)的详细解释,包括其原理、步骤以及优势和应用: 一、原理 格拉姆角场通过将一维…

Mysql和ES使用汇总

一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id,通过ES查询获取查询商品的列表中展示的数据,通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的; 为什么ES一般…

[Labview] 二维数组写入表格

就一个二维数组写表,CSDN天天让我改进质量 简直是迫害完美主义 天知道Labview有什么思路好写,就一个破连连看(ˉ▽ˉ;)... 随便写点什么碎碎念占字数好了

未公开 GeoServer开源服务器wfs远程命令执行漏洞 已复现(CVE-2024-36401)

0x01 阅读须知 技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成…

Qt自定义信号

1.Teacher类下定义信号signals: Student类下定义槽函数&#xff1a; Teacher.h #pragma once#include <QObject>class Teacher : public QObject {Q_OBJECTpublic:Teacher(QObject *parent);~Teacher(); signals:void Ask(); //老师向学生提问void Ask(QString str);…

WebStorm配置路径别名(jsconfig.json)

项目是 ViteVueTs 新建一个 jsconfig.json文件 {"compilerOptions": {"baseUrl": ".","paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dist"] }然后在 vite.confi…

C语言的数据结构:图的基本概念

前言 之前学过了其它的数据结构&#xff0c;如&#xff1a; 集合 \color{#5ecffd}集合 集合 —— 数据元素属于一个集合。 线型结构 \color{#5ecffd}线型结构 线型结构 —— 一个对一个&#xff0c;如线性表、栈、队列&#xff0c;每一个节点和其它节点之间的关系 一个对一个…

燃料电池混合电源的能量管理系统

这个例子显示了燃料电池混合电源的能量管理系统。 这个例子展示了燃料电池混合电源的能量管理系统。 电路描述 本文给出了基于燃料电池的多电动飞机应急动力系统的仿真模型。随着MEA中起落架和飞控系统的电气化程度的提高&#xff0c;常规应急电源系统(冲压式空气涡轮或空气驱…

01:Linux的基本命令

Linux的基本命令 1、常识1.1、Linux的隐藏文件1.2、绝对路径与相对路径 2、基本命令2.1、ls2.2、cd2.3、pwd / mkdir / mv / touch / cp / rm / cat / rmdir2.4、ln2.5、man2.6、apt-get 本教程是使用的是Ubuntu14.04版本。 1、常识 1.1、Linux的隐藏文件 在Linux中&#xf…

【ROS中Cjson文件的作用】

在ROS (Robot Operating System) 中&#xff0c;.json 文件通常用于存储配置信息、数据序列化或者在某些情况下用于网络通信和数据交换。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于…