当前位置: 首页 > article >正文

ChatGLM3-6B-128K与SpringBoot集成:企业级应用开发

ChatGLM3-6B-128K与SpringBoot集成企业级应用开发1. 引言在企业级应用开发中AI能力的集成已经成为提升产品竞争力的关键因素。ChatGLM3-6B-128K作为支持128K上下文长度的开源大语言模型为企业处理长文本任务提供了强大的技术基础。当它与SpringBoot这一流行的Java开发框架结合时能够构建出稳定、高效且易于维护的AI应用系统。传统的AI模型集成往往面临部署复杂、性能瓶颈和扩展性差等问题。通过SpringBoot的标准化开发模式我们可以将这些复杂的技术细节封装成简单的API接口让业务开发团队能够快速调用AI能力专注于业务逻辑的实现。本文将带你一步步实现ChatGLM3-6B-128K与SpringBoot的完整集成方案涵盖API设计、性能优化和安全性考虑为你提供一套可落地的企业级AI应用开发方案。2. 环境准备与模型部署2.1 系统要求在开始集成之前确保你的开发环境满足以下基本要求内存至少16GB RAM推荐32GBGPUNVIDIA显卡显存至少8GB推荐16GB以上存储20GB可用空间用于模型文件和依赖库Java环境JDK 11或更高版本Python环境Python 3.82.2 模型部署ChatGLM3-6B-128K支持多种部署方式对于企业级应用我们推荐使用Ollama进行容器化部署# 拉取ChatGLM3-6B-128K模型 ollama pull chatglm3:6b # 启动模型服务 ollama run chatglm3:6b模型服务启动后默认会在11434端口提供API服务。你可以通过简单的HTTP请求测试模型是否正常运行curl http://localhost:11434/api/generate -d { model: chatglm3:6b, prompt: 你好请介绍一下你自己, stream: false }2.3 SpringBoot项目初始化使用Spring Initializr创建一个新的SpringBoot项目添加必要的依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies3. API集成设计3.1 定义统一的请求响应模型为了保持代码的清晰性和可维护性我们首先定义标准的请求和响应模型Data Builder NoArgsConstructor AllArgsConstructor public class ChatRequest { NotBlank(message 消息内容不能为空) private String message; private Double temperature; private Integer maxTokens; private Boolean stream; } Data Builder NoArgsConstructor AllArgsConstructor public class ChatResponse { private String id; private String message; private Long created; private String model; private Usage usage; } Data Builder NoArgsConstructor AllArgsConstructor public class Usage { private Integer promptTokens; private Integer completionTokens; private Integer totalTokens; }3.2 实现模型服务层创建模型服务类封装与ChatGLM3模型的通信逻辑Service Slf4j public class ChatGLMService { private final RestTemplate restTemplate; private final String modelApiUrl http://localhost:11434/api/generate; public ChatGLMService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate restTemplateBuilder .setConnectTimeout(Duration.ofSeconds(30)) .setReadTimeout(Duration.ofSeconds(60)) .build(); } public ChatResponse sendMessage(ChatRequest chatRequest) { try { MapString, Object requestBody new HashMap(); requestBody.put(model, chatglm3:6b); requestBody.put(prompt, chatRequest.getMessage()); requestBody.put(stream, false); if (chatRequest.getTemperature() ! null) { requestBody.put(temperature, chatRequest.getTemperature()); } if (chatRequest.getMaxTokens() ! null) { requestBody.put(max_tokens, chatRequest.getMaxTokens()); } ResponseEntityMap response restTemplate.postForEntity( modelApiUrl, requestBody, Map.class); return processResponse(response.getBody()); } catch (Exception e) { log.error(调用ChatGLM服务失败, e); throw new RuntimeException(AI服务暂时不可用); } } private ChatResponse processResponse(MapString, Object response) { return ChatResponse.builder() .id(UUID.randomUUID().toString()) .message((String) response.get(response)) .created(System.currentTimeMillis() / 1000) .model(chatglm3-6b-128k) .usage(Usage.builder() .totalTokens((Integer) response.get(total_duration)) .build()) .build(); } }3.3 创建REST控制器实现业务接口层提供对外的API服务RestController RequestMapping(/api/chat) Validated Slf4j public class ChatController { private final ChatGLMService chatGLMService; public ChatController(ChatGLMService chatGLMService) { this.chatGLMService chatGLMService; } PostMapping(/completion) public ResponseEntityChatResponse chatCompletion( Valid RequestBody ChatRequest chatRequest) { log.info(收到聊天请求: {}, chatRequest.getMessage()); ChatResponse response chatGLMService.sendMessage(chatRequest); return ResponseEntity.ok(response); } GetMapping(/health) public ResponseEntityMapString, String healthCheck() { MapString, String status new HashMap(); status.put(status, UP); status.put(model, chatglm3-6b-128k); status.put(timestamp, Instant.now().toString()); return ResponseEntity.ok(status); } }4. 性能优化策略4.1 连接池优化配置专用的RestTemplate来优化HTTP连接性能Configuration public class RestTemplateConfig { Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .requestFactory(() - new HttpComponentsClientHttpRequestFactory( HttpClient.create() .responseTimeout(Duration.ofSeconds(60)) .followRedirect(true) )) .setConnectTimeout(Duration.ofSeconds(30)) .setReadTimeout(Duration.ofSeconds(60)) .build(); } }4.2 异步处理支持对于长时间运行的AI任务实现异步处理避免阻塞主线程Service Slf4j public class AsyncChatService { private final ChatGLMService chatGLMService; private final ThreadPoolTaskExecutor taskExecutor; public AsyncChatService(ChatGLMService chatGLMService) { this.chatGLMService chatGLMService; this.taskExecutor new ThreadPoolTaskExecutor(); this.taskExecutor.setCorePoolSize(5); this.taskExecutor.setMaxPoolSize(10); this.taskExecutor.setQueueCapacity(25); this.taskExecutor.initialize(); } Async public CompletableFutureChatResponse processAsync(ChatRequest chatRequest) { return CompletableFuture.completedFuture( chatGLMService.sendMessage(chatRequest) ); } }4.3 缓存机制实现简单的响应缓存减少重复请求对模型的压力Service Slf4j public class CachedChatService { private final ChatGLMService chatGLMService; private final CacheString, ChatResponse responseCache; public CachedChatService(ChatGLMService chatGLMService) { this.chatGLMService chatGLMService; this.responseCache Caffeine.newBuilder() .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES) .build(); } public ChatResponse getCachedResponse(ChatRequest chatRequest) { String cacheKey generateCacheKey(chatRequest.getMessage()); return responseCache.get(cacheKey, key - chatGLMService.sendMessage(chatRequest) ); } private String generateCacheKey(String message) { return Integer.toString(message.hashCode()); } }5. 安全性考虑5.1 输入验证与过滤加强输入验证防止恶意输入和注入攻击Component public class InputValidator { private static final int MAX_INPUT_LENGTH 4096; private static final Pattern MALICIOUS_PATTERN Pattern.compile((?i)(\\b)(drop|delete|insert|update|exec|union|select|script|javascript)(\\b)); public void validateInput(String input) { if (input null || input.trim().isEmpty()) { throw new IllegalArgumentException(输入内容不能为空); } if (input.length() MAX_INPUT_LENGTH) { throw new IllegalArgumentException(输入内容长度超过限制); } if (containsMaliciousContent(input)) { throw new SecurityException(输入包含不安全内容); } } private boolean containsMaliciousContent(String input) { return MALICIOUS_PATTERN.matcher(input).find(); } }5.2 速率限制实现API速率限制防止滥用Component public class RateLimiter { private final CacheString, AtomicInteger requestCounts; private final int MAX_REQUESTS_PER_MINUTE 60; public RateLimiter() { this.requestCounts Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES) .build(); } public boolean allowRequest(String clientId) { AtomicInteger count requestCounts.get(clientId, key - new AtomicInteger(0)); return count.incrementAndGet() MAX_REQUESTS_PER_MINUTE; } }5.3 敏感信息过滤在响应返回前进行敏感信息过滤Component public class ResponseFilter { private static final Pattern SENSITIVE_PATTERN Pattern.compile((?i)(password|token|key|secret|credential)); public ChatResponse filterSensitiveInfo(ChatResponse response) { String filteredMessage filterMessage(response.getMessage()); return ChatResponse.builder() .id(response.getId()) .message(filteredMessage) .created(response.getCreated()) .model(response.getModel()) .usage(response.getUsage()) .build(); } private String filterMessage(String message) { // 实现具体的敏感信息过滤逻辑 return message.replaceAll(SENSITIVE_PATTERN.pattern(), ***); } }6. 企业级部署建议6.1 容器化部署使用Docker容器化部署SpringBoot应用FROM openjdk:11-jre-slim WORKDIR /app COPY target/chatglm-springboot.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar, \ --spring.profiles.activeprod, \ --server.port8080]6.2 健康检查与监控集成Spring Boot Actuator进行应用监控management: endpoints: web: exposure: include: health,metrics,info endpoint: health: show-details: always metrics: export: prometheus: enabled: true6.3 日志管理配置结构化日志输出便于日志分析和监控logging: level: com.example: INFO pattern: console: %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n file: name: logs/application.log max-size: 10MB7. 总结通过本文的实践我们成功将ChatGLM3-6B-128K大语言模型集成到SpringBoot框架中构建了一个完整的企业级AI应用解决方案。这个方案不仅提供了强大的AI能力还考虑了性能优化、安全性、可维护性等企业级应用必须关注的方面。在实际使用中这种集成方式展现出了很好的灵活性。SpringBoot的成熟生态让我们能够快速构建RESTful API而ChatGLM3-6B-128K的长文本处理能力为各种企业场景提供了强大的支持。无论是文档分析、智能客服还是内容生成这个基础架构都能很好地胜任。需要注意的是在生产环境中还需要进一步完善监控告警、自动扩缩容、备份恢复等机制。同时根据具体的业务需求可能还需要考虑模型微调、多模型路由等高级功能。但这个基础架构已经为企业级AI应用的开发奠定了坚实的技术基础。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

ChatGLM3-6B-128K与SpringBoot集成:企业级应用开发

ChatGLM3-6B-128K与SpringBoot集成:企业级应用开发 1. 引言 在企业级应用开发中,AI能力的集成已经成为提升产品竞争力的关键因素。ChatGLM3-6B-128K作为支持128K上下文长度的开源大语言模型,为企业处理长文本任务提供了强大的技术基础。当它…...

ai coding工具共性(五)sub agent(1)介绍

一、为什么需要sub agentssub agent 的本质,不是提升模型能力,而是引入“软件工程中的分层与职责划分”到 AI 推理过程。它通过将一个复杂任务拆解为多个受限子任务,使每个 agent 在更小、更干净的上下文中运行,从而降低上下文污染…...

从时序到实战:深入解析1-Wire单总线通信协议

1. 1-Wire协议的前世今生 第一次接触1-Wire总线是在2013年做智能农业项目时,当时需要监测大棚内的土壤温度。项目经理扔给我一包DS18B20传感器,说"用这个,一根线就能搞定"。我当时盯着那根细如发丝的信号线,怎么也想不明…...

春秋云境CVE-2019-1010153

1.阅读靶场介绍看到zzcms,相信各位彦祖们也想到博主的zzcms万能玩法哟2.启动靶场如下所示3.拼接/admin进入后台账号密码是admin/admin4.寻找文件上传的位置这里我们找到了这个地方bp抓包,改为phtml绕过5.中国蚁剑启动数据库操作找到下图所示位置有不懂的…...

A Systematic Study of Data Modalities and Strategies for Co-training Large Behavior Models for Robot

《利用多样化数据协同训练构建大规模具身模型》由丰田研究所(TRI)进行的大规模实证研究,系统性地探究了如何通过引入多样化的外部数据(协同训练)来提升视觉-语言-动作(VLA)大模型在机器人操作任…...

从控制器视角解析DDR4 DIMM:UDIMM、RDIMM与LRDIMM的实战选型指南

1. DDR4内存基础:控制器与DIMM的协同原理 当你拆开一台电脑或服务器时,内存条总是最显眼的部件之一。但很少有人注意到,这些看似简单的电路板背后,其实隐藏着一套精密的通信系统。作为内存控制器工程师,我经常需要解释…...

DownKyi:自媒体创作者的视频资源效能倍增工具

DownKyi:自媒体创作者的视频资源效能倍增工具 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。…...

湿度计算不再难:从绝对湿度到相对湿度的保姆级教程(含Python代码示例)

湿度计算不再难:从绝对湿度到相对湿度的保姆级教程(含Python代码示例) 在气象学、农业、工业生产和日常生活中,湿度是一个至关重要的参数。无论是设计一个智能家居系统,还是开发气象监测设备,亦或是进行环境…...

魔法粘贴快速入门 (2分钟)

欢迎访问官网:Liii STEM官网,扶稳键盘 笔记敲出推背感。 魔法粘贴 (magic paste) 魔法粘贴是干什么的? 将纯文本、网页、PDF、手写公式等内容中的文本、代码、公式、图表等结构无损地(99%)一键…...

Android tinyalsa深度解析之pcm_params_format_test调用流程与实战(一百六十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…...

别再只用官方商店了!手把手教你给CasaOS添加这8个宝藏第三方应用源

解锁CasaOS隐藏玩法:8个必装第三方应用源全指南 当你第一次打开CasaOS的官方应用商店时,可能会被它简洁的界面所吸引。但随着使用深入,不少用户会发现官方商店的应用选择有限,难以满足个性化需求。这就像拥有一台高性能智能手机&a…...

避坑指南:LeRobot项目舵机配置中的5个常见错误及解决方法(飞特STS3215专用)

LeRobot项目飞特STS3215舵机配置避坑实战手册 在机器人开发领域,舵机配置往往是项目落地的第一道门槛。最近在LeRobot项目中配置飞特STS3215舵机时,我踩遍了几乎所有可能的坑。这篇文章不会重复官方文档的基础操作,而是聚焦五个最棘手的实际问…...

Android tinyalsa深度解析之pcm_params_get_mask调用流程与实战(一百六十七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…...

Anaconda3环境变量配置避坑指南:解决‘conda command not found‘问题

Anaconda3环境变量配置深度解析:从原理到实战的完整避坑手册 刚完成Anaconda3安装的兴奋感,往往会被终端里冰冷的"conda: command not found"提示瞬间浇灭。这不是个例——据统计,超过35%的Anaconda用户在初次安装后都会遇到环境变…...

大模型初探:收藏这份指南,小白也能轻松入门!

大模型(Large Model)是泛指参数规模庞大(十亿至万亿级)、能处理多模态数据(文本、图像、音频等)的通用AI模型;大语言模型(Large Language Model, LLM)是大模型的子集&…...

WeKnora:面向深层文档理解与智能检索的 RAG 框架

WeKnora 是一个基于大语言模型 (LLM) 的框架,专为深层文档理解和语义检索而设计,特别擅长处理复杂的异构文档。它采用模块化架构,结合了多模态预处理、语义向量索引、智能检索和大模型推理。 你可以将它理解为一个为团队量身打造的“超级知识…...

3分钟掌握NCM解密:开源工具ncmdump实现网易云音乐跨平台播放自由

3分钟掌握NCM解密:开源工具ncmdump实现网易云音乐跨平台播放自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在其他设备播放而烦恼吗?这款开源工具ncmdump让你快速…...

【亲测】笔记本token免费,window下本地养个龙虾(Openclaw+Ollama)看看?

目录环境检查查看显卡状态检查conda环境跑通OllamaOllama自带API下载模型模型“复读机”问题安装openclaw配置环境浅浅体验一下本人笔记本显卡是GTX1070 8G显存(算是老古董显卡了),cpu是i7-8750H 6核12线程,内存32G,在window下,尝…...

颠覆传统:3倍效率提升的Markdown到PPT智能转换解决方案

颠覆传统:3倍效率提升的Markdown到PPT智能转换解决方案 【免费下载链接】md2pptx Markdown To PowerPoint converter 项目地址: https://gitcode.com/gh_mirrors/md/md2pptx 通过创新解析引擎与模板系统,实现技术文档到演示文稿的自动化转换&…...

洛谷:P5743 【深基7.习8】猴子吃桃

题目描述一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n 天早上起来一看,只剩下 1 个桃子了。请问小猴买了几个桃子?输入格式输入一个正整数 n…...

Android开发必知:fitsSystemWindows的正确使用姿势(附常见问题排查)

Android开发实战:深度解析fitsSystemWindows的适配艺术 在Android应用开发中,系统UI(状态栏和导航栏)的适配一直是开发者面临的棘手问题之一。特别是当应用需要实现沉浸式体验或全屏显示时,如何正确处理系统窗口的占位…...

【Python】Flask与Django对比详解:教你如何选择最适合你的Web框架

文章目录 引言:为何选择Python Web框架?Flask简介:轻量级的灵活之选 ?? Flask的核心特点 Django简介:全能型的强大框架 ?? Django的核心特点 Flask与Django的详细对比 架构设计功能与扩展性性能与效率模板系统ORM(…...

RAPTOR与C语言实战:经典算法练习精解(附完整代码)

1. RAPTOR与C语言入门:为什么选择这对组合? 刚开始学编程的时候,很多人都会纠结该从哪里入手。我当年也是一样,试过各种工具和语言,最后发现RAPTOR流程图工具配合C语言简直是绝配。RAPTOR的图形化界面能让你直观地看到…...

别再用-O2了!航天级C项目实测:-Og -fno-omit-frame-pointer -mthumb -mfloat-abi=hard 这组参数让故障率下降89.7%(附MISRA-C合规报告)

第一章:C语言边缘编译优化参数的工程必要性在嵌入式系统、物联网终端与实时控制设备等资源受限的边缘场景中,C语言仍是主流开发语言。然而,标准编译流程(如默认 gcc -O0)生成的目标代码往往未针对硬件约束(…...

带标注的麻将识别数据集,六千多张图片,识别率96.7%,可识别麻将的点数和类型,如1条,8萬,2饼東南西北中發白板等,支持yolo,coco json,pascal voc xml格式

带标注的麻将识别数据集,六千多张图片,识别率96.7%,可识别麻将的点数和类型,如1条,8萬,2饼東南西北中發白板等,支持yolo,coco json,pascal voc xml格式 数据集比较大&am…...

Scroll Reverser终极指南:如何让macOS触控板和鼠标滚动方向完美共存

Scroll Reverser终极指南:如何让macOS触控板和鼠标滚动方向完美共存 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 还在为macOS系统中触控板和鼠标的滚动方向冲突而…...

Fish-Speech-1.5实战教程:从安装到生成,手把手教你制作多语言语音

Fish-Speech-1.5实战教程:从安装到生成,手把手教你制作多语言语音 1. 为什么你需要这个语音合成工具? 想象一下,你正在为一个多语言产品演示视频寻找配音,或者需要为你的在线课程生成不同语言的讲解音频。传统方法要…...

Genshin FPS Unlocker:突破帧率枷锁的技术革新与实战指南

Genshin FPS Unlocker:突破帧率枷锁的技术革新与实战指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 当144Hz显示器只能输出60fps画面时,就像给跑车装上了限速…...

从零到一:OptimizePI Pre-layout PDN前仿真实战指南

1. OptimizePI入门:电源完整性设计新手指南 刚接触电源完整性(PI)设计时,我和很多新手工程师一样,面对密密麻麻的电路板和复杂的仿真参数一头雾水。直到遇见了OptimizePI这款神器,才发现原来PDN(电源分配网络)前仿真可以如此直观高…...

小白程序员必看:掌握Skills轻松玩转大模型应用与工作流自动化(收藏版)

文章通过面试经历引出Skills在大模型应用中的重要性,阐述了Skills作为延迟加载的sub-agent概念,并详细对比了Skills与Prompt、MCP、Function Calling的区别。文章强调Skills通过自然语言定义专项能力,实现模块化与可复用性,并以代…...