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…

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

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

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

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

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

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

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

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

什么牌子的开放式耳机质量好?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…

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

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

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…

美国前总统特朗普竟然入驻TikTok,粉丝破24万

大家好&#xff01; 我是老洪&#xff01; 刚看到一则关于美国前总统特朗普的新闻&#xff0c; 特朗普竟然入驻TikTok了&#xff0c;太令人惊讶了。&#xff08;为什么惊讶&#xff0c;后面再说&#xff09; 更为惊人的是&#xff0c;他的到来竟然引来了众多粉丝的热烈追捧&…

如何从清空的回收站中恢复已删除的Word文档?

“嗨&#xff0c;我将 10 个 Word 文档移动到回收站&#xff0c;然后用清洁软件清理回收站。现在我意识到我犯了一个大错误——我删除了错误的文件。我想知道是否可以从清空的回收站中恢复已删除的Word文档。我没有数据恢复的经验&#xff0c;也不精通计算机技术。有没有简单的…

三.一布局和布局切换的实践与探索

在前端开发中&#xff0c;灵活的布局切换是一项非常实用的功能。今天&#xff0c;我想和大家分享一下如何在主组件中通过更换 Layout 目录下的组件来实现布局切换。 首先&#xff0c;我们有一个主组件 index.vue&#xff0c;它承担着整个页面的主要逻辑和展示。 而在 Layout …

SG90舵机(Arduino)/XY轴摇杆使用(Arduino)

XY轴摇杆使用 需要注意&#xff0c;必须是 ADC 引脚才可以接收模拟信号输入 /** 接线* PS2摇杆 Arduino* x A0* y A1* sw 7 */const int yg_x_pin A0; const int yg_y_pin A1; const int yg_btn_pin 7; // 摇杆按下的输入引脚 void…

旋转编码器、DS1302 实时时钟、红外遥控模块、雨滴探测传感器 | 配合Arduino使用案例

旋转编码器 旋转编码器是一种用作检测自动化领域中的角度、速度、长度、位置和加速度的传感器。 有绝对式和增量式&#xff0c;这里使用增量式&#xff08;相对&#xff09;。 绝对输出只是周的当前位置&#xff0c;是他们成为角度传感器。增量输出关于轴的运动信息&#xff0…

Python中degrees怎么用

degrees() 函数可以将弧度转换为角度。 语法 以下是 degrees() 方法的语法&#xff1a; import math math.degrees(x) 注意&#xff1a;degrees() 是不能直接访问的&#xff0c;需要导入 math 模块&#xff0c;然后通过 math 静态对象调用该方法。 参数 x -- 一个数值。 返…

视频SK配置教程

视频SK配置教程 提供的pika接口服务&#xff08;国外的&#xff0c;所以要反代&#xff09;&#xff0c;创建一个pika账号并开通pika套餐 反向配置教程 https://blog.csdn.net/u012241616/article/details/139391954?spm1001.2014.3001.5502 1、进入站点后台->功能->…

.Net Core Console 项目如何使用 HttpClient 与 Web 服务通信

前言 HttpClient 类是在 .NET Framework 4.5 和 .NET Core 中引入的新的 HTTP 客户端类&#xff0c;是 .NET 用于发送和接收 HTTP 请求的类&#xff0c;相比之前的 WebRequest 和 HttpWebRequest&#xff0c; 它提供了现代的、易用的 API&#xff0c;并且具有更好的性能和扩展…

2024 cicsn magicvm

文章目录 参考检查逆向vm::runvm::vmvm_alu::set_inputvm_mem::set_inputvm_id::runvm_alu::runvm_mem::run 漏洞思路参考的exp 参考 https://forum.butian.net/share/3048 https://akaieurus.github.io/2024/05/20/2024%E5%9B%BD%E8%B5%9B%E5%88%9D%E8%B5%9Bpwn-wp/#SuperHea…