20240603每日AI------------项目引入Spring Cloud Alibaba AI (二)

项目源码解析

在这里插入图片描述

前端代码:

<div class="container"><h1>Spring Cloud Alibaba AI Example</h1><form id="form"><label for="message">User Message</label><input type="text" id="message" name="message" placeholder="Entry your question...(make api key is effective)!"><br><br><input type="submit" value="Send"></form><br><div id="loader" class="loader" style="display: none;"></div><div id="chat-box" class="chat-box"></div>
</div>

该代码引入一个form表单,供用户进行信息输入
chat-box为AI机器回复后,自动补充的div,可为用户展示对应的AI消息。

JavaScript代码

var loader = document.getElementById("loader");document.getElementById("form").addEventListener("submit", function(event) {event.preventDefault();var messageInput = document.getElementById("message");var message = messageInput.value;messageInput.value = "";var chatBox = document.getElementById("chat-box");var userMessage = document.createElement("div");userMessage.className = "message user-message";userMessage.textContent = "User: " + message;chatBox.appendChild(userMessage);chatBox.scrollTop = chatBox.scrollHeight;loader.style.display = "block";var xhr = new XMLHttpRequest();xhr.open("GET", "http://localhost:8080/ai/example?message=" + encodeURIComponent(message), true);xhr.onreadystatechange = function() {if (xhr.readyState === 4) {loader.style.display = "none";if (xhr.status === 200) {var response = xhr.responseText;var botMessage = document.createElement("div");botMessage.className = "message bot-message";var botMessageText = document.createElement("span");botMessageText.className = "message-text";botMessage.appendChild(botMessageText);botMessageText.innerHTML = marked.marked(response);chatBox.appendChild(botMessage);chatBox.scrollTop = chatBox.scrollHeight;} else if (xhr.status === 400) {var error = JSON.parse(xhr.responseText);var errorMessage = document.createElement("div");errorMessage.className = "message bot-message";errorMessage.textContent = "Bot: " + error.message;chatBox.appendChild(errorMessage);chatBox.scrollTop = chatBox.scrollHeight;} else {var errorMessage = document.createElement("div");errorMessage.className = "message bot-message";errorMessage.textContent = "Bot: Failed to connect to the backend service. Please make sure the backend service is running.";chatBox.appendChild(errorMessage);chatBox.scrollTop = chatBox.scrollHeight;}}};xhr.onloadstart = function() {loader.style.display = "block";};xhr.onloadend = function() {loader.style.display = "none";};xhr.send();
});

以上代码编写了一个前后端的请求方法,请求后端/example接口,当用户点击消息发送时候实时和后端接口进行交互,后台接口获取到请求后,根据AI大模型返回给前端消息。

后端代码

controller层


("tongYiSimpleServiceImpl")
private TongYiService tongYiSimpleService;("/example")
public String completion((value = "message", defaultValue = "Tell me a joke")String message
) {return tongYiSimpleService.completion(message);
}
("/stream")
public Map<String, String> streamCompletion((value = "message", defaultValue = "请告诉我西红柿炖牛腩怎么做?")String message
) {return tongYiSimpleService.streamCompletion(message);
}

service层

public interface TongYiService {/*** Hello World example.** @param message conversation content question.* @return AI answer.*/String completion(String message);}/*** Stream call.** @param message conversation content question.* @return AI answer.*/Map<String, String> streamCompletion(String message);

impl层
编写聊天服务实现类,由 Spring AI 自动注入 ChatClient、StreamingChatClient,ChatClient 屏蔽底层通义大模型交互细节。


public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {private final ChatClient chatClient;private final StreamingChatClient streamingChatClient;public TongYiSimpleServiceImpl(ChatClient chatClient, StreamingChatClient streamingChatClient) {this.chatClient = chatClient;this.streamingChatClient = streamingChatClient;}
}public String completion(String message) {Prompt prompt = new Prompt(new UserMessage(message));return chatClient.call(prompt).getResult().getOutput().getContent();}public Map<String, String> streamCompletion(String message) {StringBuilder fullContent = new StringBuilder();streamingChatClient.stream(new Prompt(message)).flatMap(chatResponse -> Flux.fromIterable(chatResponse.getResults())).map(content -> content.getOutput().getContent()).doOnNext(fullContent::append).last().map(lastContent -> Map.of(message, fullContent.toString())).block();log.info(fullContent.toString());return Map.of(message, fullContent.toString());}

结语

自此一个简单的Spring Cloud Alibaba AI的聊天机器人就集成好了,后续会继续跟进讲解如何实现文生图等其余AI功能。

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

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

相关文章

大模型PEFT(一)之推理实践学习记录

1. 简介 多种模型: LLaMA、Mistral、Mixtral-MoE、Qwen、Yi、Gemmha、Baichuan、ChatGLM、Phi等等。集成方法:(增量)预训练、指令监督微调、奖励模型训练、PPO训练和DPO训练。多种精度:32比特全参数微调、16比特冻结微调、16比特LORA微调和基于AQLM/AWQ/GPTQ/LLM.int8 的2/4/8…

一篇文章掌握Java的80%:面向对象与并发编程

Java作为一种广泛使用的计算机编程语言&#xff0c;其强大之处在于其面向对象的特性和对并发编程的良好支持。作为一名程序员&#xff0c;我深知掌握Java的面向对象概念、集合框架、多线程与并发编程&#xff0c;以及JVM基础对于编写高效、可维护的代码至关重要。本文将引导你快…

操作字符串获取文件名字(包含类型)

记录一种操作字符串获取文件名字的操作方式&#xff0c;方便后期的使用。示例&#xff1a; 输入&#xff1a;"D:/code/Test/Test.txt" 输出&#xff1a;"Test.txt" 设计思路&#xff1a; 首先查找路径中最后一个”/“&#xff0c;然后再通过字符串截取的…

湖南源点调研 为什么中小企业产品上市前一定要做市场调研?

本文由湖南长沙&#xff08;产品前测&#xff09;源点调研咨询编辑发布 可能有很多企业主会表示&#xff0c;市场调研&#xff0c;产品调研&#xff0c;不都是大公司、大品牌、上市公司才会有的流程吗&#xff0c;像我们这种小企业、小品牌、小厂家没有必要去那么做&#xff0…

Python文本分词工具库-jieba

内容目录 一、分词二、设置分词三、词性信息四、关键词提取 jieba库是一个针对中文文本的分词工具库&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;领域的中文文本预处理阶段。 主要功能: 中文分词&#xff1a;能够将连续的中文文本切割成有意义的词语序列&a…

变压器中性点接地电阻柜的出厂标准是什么

变压器中性点接地电阻柜的出厂标准是什么&#xff1f; 现代电气配电系统中&#xff0c;接地电阻是保障人身安全的非常重要的设施。在高压电气设备中&#xff0c;中性点接地电阻柜的作用是限制设备中的过电流和短路故障所产生的电流&#xff0c;以保障人身安全。变压器中性点接…

杨辉三角形及其C语言实现

一、引言 杨辉三角形&#xff08;Pascal’s Triangle&#xff09;&#xff0c;又称帕斯卡三角形&#xff0c;是一个在数学中经常出现的数表。它的构造规则非常简单&#xff1a;三角形中的每个数字等于它上方两数字之和&#xff08;或者说&#xff0c;它是位于它肩上的两个数字…

开源VS闭源:大模型发展路径之争,你站哪一派?

文章目录 引言一、数据隐私1.1开源大模型的数据隐私1.2 闭源大模型的数据隐私1.3 综合考量 二、商业应用2.1 开源大模型的商业应用2.2 闭源大模型的商业应用2.3 商业应用的综合考量 三、社区参与3.1 开源大模型的社区参与3.2 闭源大模型的社区参与3.3 综合考量 结论 引言 在人…

解析“分层引流”在颅内感染治疗中的价值意义

临床中&#xff0c;化脓性颅内感染的治疗一直是界内关注的重点。近年来&#xff0c;得益于医疗技术的持续革新与提升&#xff0c;颅内感染的治疗方法也获得了不断的更新与优化。在此背景下&#xff0c;北京精诚博爱医院所倡导的“分层引流”理念&#xff0c;作为一种新兴的治疗…

外贸小白到销冠,如何30天快速提升?

外贸从业8年&#xff0c;在工厂从0-1做外贸&#xff0c;外贸的坑踩过很多&#xff0c;也做出了很多出色的业绩&#xff0c;希望这篇文章可以给到外贸新人快速提升的思路。 对于刚刚进入外贸行业的职场新人&#xff1f;应该怎么做&#xff1f; 第一个月应该学什么&#xff1f;…

什么牌子的开放式耳机质量好?2024超强实力派品牌推荐!

耳机对于一个音乐人有重要这个不必多说&#xff0c;我朋友是个音乐编辑&#xff0c;他经常需要长时间佩戴耳机进行音频编辑和混音工作。在尝试过多款开放式耳机后&#xff0c;都没找到合适的。今天&#xff0c;我将从专业角度为大家带来几款热门开放式耳机的测评报告&#xff0…

第二证券炒股知识:股票内盘外盘代表什么意思?

股票内盘是主动性卖盘&#xff0c;表明以买入价成交的股数&#xff0c;持股的投资者主动以等于或是低于买一、买二、买三、买四、买五的价格卖出手中持有的股份&#xff0c;买入成交数量核算参加内盘。 股票外盘是主动性买盘&#xff0c;表明以卖出价成交的股数&#xff0c;场…

跟着大佬学RE(一)

学了一个 map&#xff08;&#xff09;函数的使用 import base64rawData "e3nifIH9b_CndH" target list(map(ord, rawData)) # map 函数将 rawData 中的每个字符传递给 ord 函数。ord 函数返回给定字符的 Unicode 码点 print(target) # 打印 map 对象的内存地址&…

电脑中病毒了怎么办?7招教你保护电脑安全!

“不知道怎么回事&#xff0c;我的电脑莫名其妙就中病毒了&#xff0c;实在不知道应该怎么操作了&#xff0c;希望大家可以帮我&#xff01;” 在数字化时代的浪潮中&#xff0c;电脑已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;就像任何事物都有其阴暗面一样&am…

Python | 武理刷题

1. 为什么是非法的&#xff1f; a1a1 在Python&#xff08;以及大多数其他编程语言&#xff09;中&#xff0c;表达式 a1a1 是非法的&#xff0c;因为它试图将一个值&#xff08;a1 的结果&#xff09;赋给一个表达式&#xff08;a1 本身&#xff09;&#xff0c;而不是一个…

ip地址快速切换软件有哪些好处

ip地址快速切换软件有哪些好处&#xff1f;IP地址快速切换软件具有诸多显著的好处&#xff0c;以下是对其主要优势的详细阐述&#xff1a; 首先&#xff0c;IP地址快速切换软件极大地提升了网络活动的灵活性和便捷性。对于需要经常切换网络环境或进行多账号管理的用户而言&…

新版 Vivado 2024.1分享(附安装包)

Vivado新版本来了&#xff0c;文末附下载方法。 Vivado 2024.1版本的亮点主要集中在多个方面的功能增强和优化上。 Vivado 2024.1版主要亮点&#xff1a; 通用访问与性能提升&#xff1a; MicroBlaze™ V软处理器&#xff08;基于RISC V开源ISA&#xff09;提供了更广泛的通…

Python应用开发——Streamlit 创建多页面应用程序进行APP的构建

创建多页面应用程序 在附加功能中,我们介绍了多页面应用程序,包括如何定义页面、构建和运行多页面应用程序,以及如何在用户界面的页面间导航。更多详情,请参阅多页面应用程序指南Multipage apps - Streamlit Docs 在本指南中,让我们通过将上一版本的 streamlit hello 应…

基于深度学习的音乐合成算法实例

基于深度学习的音乐合成算法可以生成高质量的音乐片段。以下是一个简化的基于深度学习的音乐合成算法实例,使用了LSTM网络来生成音乐序列。这个示例展示了如何使用LSTM网络来训练和生成音乐。 数据准备 首先,需要准备训练数据。可以使用MIDI文件作为训练数据,并将其转换为…

AI大模型在穿戴设备健康中的心率深度融合与案例分析

文章目录 1. 架构设计2. 应用场景3. 实现步骤3.1 步骤1&#xff1a;数据预处理3.2 步骤2&#xff1a;边缘计算初步分析3.3 步骤3&#xff1a;数据上传到云端3.4 步骤4&#xff1a;云端复杂分析3.5 步骤5&#xff1a;深度学习模型训练与部署 4. 云端API设计4.1 安装Flask4.2 API…