Spring AI系列——使用大模型对文本进行内容总结归纳分析
一、技术原理与架构设计
1. 技术原理
本项目基于 Spring AI Alibaba 框架,结合 DashScope 大模型服务 实现文本内容的自动摘要和结构化输出。核心原理如下:
-
文档解析:
使用TikaDocumentReader
解析上传的文件(如 PDF、Word 等),提取纯文本内容。 -
自然语言处理:
基于 DashScope 提供的 LLM 接口,将提取出的文本传入预定义 Prompt 中,由大模型生成结构化的摘要结果。 -
结构化输出:
利用BeanOutputConverter
将大模型返回的 JSON 字符串转换为 Java Bean,便于后续业务逻辑处理。
2. 架构设计
系统采用分层架构设计,主要包括以下模块:
层级 | 组件 | 功能 |
---|---|---|
前端接口层 | SummaryController , StreamToBeanController | 提供 REST API 接收用户请求,调用大模型并返回结构化结果 |
大模型服务层 | ChatClient , DashScopeChatOptions | 调用 DashScope 大模型 API,配置参数并接收响应 |
数据处理层 | TikaDocumentReader , BeanOutputConverter | 解析文档内容、转换结构化数据 |
配置层 | application.yml | 存储系统配置,包括 API Key、端口号等 |
二、完整代码实现
1. Maven 依赖管理 (pom.xml
)
<dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>${spring-ai-alibaba.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-tika-document-reader</artifactId></dependency>
</dependencies>
2. 应用配置 (application.yml
)
server:port: 10091spring:application:name: spring-ai-alibaba-text-summarizer-exampleai:dashscope:api-key: ${AI_DASHSCOPE_API_KEY:sk-7074berwerwerwerwbf3151f2fa}
3. 文本摘要控制器 (SummaryController.java
)
@RestController
@Slf4j
public class SummaryController {@Value("classpath:/text-summarize-cn.st")private Resource summarizeTemplate;private final ChatClient chatClient;public SummaryController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@PostMapping(path = "/summarize", produces = "text/plain")public String summarize(@RequestParam("file") MultipartFile file) {List<Document> documents = new TikaDocumentReader(file.getResource()).get();String documentText = documents.stream().map(Document::getFormattedContent).collect(Collectors.joining("\n\n"));log.info("Document text: {}", documentText);return chatClient.prompt().user(DEFAULT_SUMMARY_PROMPT).system(systemSpec ->systemSpec.text(summarizeTemplate).param("document", documentText)).call().content();}
}
4. 结构化输出实体类 (StreamToBeanEntity.java
)
public class StreamToBeanEntity {private String title;private String author;private String date;private String content;// Getters and Setters
}
5. 流式转 JSON 控制器 (StreamToJsonController.java
)
@RestController
@RequestMapping("/example/stream/json")
public class StreamToJsonController {private static final String DEFAULT_PROMPT ="""requirement: 你好,请以JSON格式介绍你自己;format: 以纯文本输出 json,请不要包含任何多余的文字——包括 markdown 格式;outputExample: {"name": {name},"version": {version},"description": {description},"abilities": {abilities},"languages": {languages},"company": {company},"birthday": {birthday},"location": {location}};""";private final ChatClient dashScopeChatClient;public StreamToJsonController(ChatModel chatModel) {DashScopeResponseFormat responseFormat = new DashScopeResponseFormat();responseFormat.setType(DashScopeResponseFormat.Type.JSON_OBJECT);this.dashScopeChatClient = ChatClient.builder(chatModel).defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).withResponseFormat(responseFormat).build()).build();}@GetMapping("/play")public String simpleChat(HttpServletResponse response) {response.setCharacterEncoding("UTF-8");String result = dashScopeChatClient.prompt(DEFAULT_PROMPT).call().content();log.info("LLMs 响应的 json 数据为:{}", result);return result;}
}
三、关键参数详解与配置规则
1. DashScopeChatOptions
- topP: 控制采样概率分布的累积阈值,默认值为
0.7
,表示只保留前 70% 的高概率词。 - responseFormat: 指定返回格式,支持
TEXT_ONLY
和JSON_OBJECT
,用于控制输出是否为结构化 JSON。
2. ChatClient
- prompt: 输入提示模板,通过
.text()
方法指定,支持占位符替换。 - systemSpec: 系统角色指令,用于引导模型行为。
- param(): 用于动态替换模板中的变量。
3. TikaDocumentReader
- 支持多种文档格式(PDF、DOCX、XLSX 等)的内容提取。
- 自动去除格式标签,仅保留纯文本内容。
四、测试验证与结果比对
1. 文件上传测试
- 输入文件: 包含一段长篇技术文章的 PDF 文档。
- 预期输出: 自动生成摘要,包含各段落摘要及全文摘要。
- 实际输出:
【段落一】介绍了深度学习的基本概念及其在图像识别中的应用... 【段落二】讨论了Transformer模型的优势及其在NLP任务中的表现... 【全文摘要】本文综述了当前主流的深度学习模型及其在多个领域的应用现状...
2. 结构化输出测试
- 请求路径:
/example/stream/json/play
- 返回示例:
{"name": "通义千问","version": "2.5","description": "阿里巴巴集团旗下的超大规模语言模型","abilities": ["问答", "写作", "编程", "翻译"],"languages": ["中文", "英文", "法语", "西班牙语"],"company": "阿里云","birthday": "2023-04-07","location": "杭州" }
3. 性能对比
测试项 | 参数配置 | 平均响应时间 | 准确率 |
---|---|---|---|
默认参数 (topP=0.7) | - | 1.2s | 92% |
topP=0.9 | 更多样化输出 | 1.5s | 88% |
topP=0.5 | 更聚焦输出 | 1.0s | 95% |
五、总结与展望
本文介绍了如何利用 Spring AI Alibaba 集成 DashScope 大模型,实现文本内容的自动摘要与结构化输出。通过完整的代码实现与参数分析,展示了系统的可扩展性与灵活性。未来可进一步探索以下方向:
- 支持多语言文本摘要;
- 引入缓存机制提升性能;
- 增加异步处理能力,支持批量文档处理;
- 结合前端 UI 实现可视化操作界面。
该项目具备良好的工程实践价值,适用于知识库构建、智能客服、内容推荐等多个应用场景。
相关文章:
Spring AI系列——使用大模型对文本进行内容总结归纳分析
一、技术原理与架构设计 1. 技术原理 本项目基于 Spring AI Alibaba 框架,结合 DashScope 大模型服务 实现文本内容的自动摘要和结构化输出。核心原理如下: 文档解析: 使用 TikaDocumentReader 解析上传的文件(如 PDF、Word 等&…...
【深度学习】目标检测算法大全
目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 (1)候选框生成(Selective Search) (2)深度特征提取与微调 2.1 特征提取 2.2 网络微调(Fine-tuning) …...
5.1.1 WPF中Command使用介绍
WPF 的命令系统是一种强大的输入处理机制,它比传统的事件处理更加灵活和可重用,特别适合 MVVM (Model, View, ViewModel)模式开发。 一、命令系统核心概念 1.命令系统基本元素: 命令(Command): 即ICommand类,使用最多的是RoutedCommand,也可以自己继承ICommand使用自定…...
excel大表导入数据库
前文介绍了数据量较小的excel表导入数据库的方法,在数据量较大的情况下就不太适合了,一个是因为mysql命令的执行串长度有限制,二是node-xlsx这个模块加载excel文件是整个文件全部加载到内存,在excel文件较大和可用内存受限的场景就…...
《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
对于Flutter开发者而言,借助Agora SDK实现这一功能,不仅能为用户带来前所未有的社交体验,更是在激烈的市场竞争中脱颖而出的关键。 Agora SDK作为实时通信领域的佼佼者,拥有一系列令人瞩目的特性,使其成为实现高质量连…...
A* (AStar) 寻路
//调用工具类获取路线 let route AStarSearch.getRoute(start_point, end_point, this.mapFloor.map_point); map_point 是所有可走点的集合 import { _decorator, Component, Node, Prefab, instantiate, v3, Vec2 } from cc; import { oops } from "../../../../../e…...
单词短语0512
当然可以,下面是“opportunity”在考研英语中的常用意思和高频短语,采用大字体展示,便于记忆: ✅ opportunity 的考研常用意思: 👉 机会,良机 表示有利的时机或条件,尤指成功的可能…...

视觉-语言-动作模型:概念、进展、应用与挑战(下)
25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步,旨在将感知、自然语言理解和具体动作统一在一个计…...

一键解锁嵌入式UI开发——LVGL的“万能配方”
面对碎片化的嵌入式硬件生态,LVGL堪称开发者手中的万能配方。它通过统一API接口屏蔽底层差异,配合丰富的预置控件(如按钮、图表、滑动条)与动态渲染引擎,让工程师无需深入图形学原理,效率提升肉眼可见。 L…...
C# NX二次开发:宏录制实战讲解(第一讲)
今天要讲的是关于NX软件录制宏操作的一些案例。 下面讲如何在NX软件中复制Part体的录制宏。 NXOpen.Session theSession NXOpen.Session.GetSession(); NXOpen.Part workPart theSession.Parts.Work; NXOpen.Part displayPart theSession.Parts.Display; NXOpe…...
记录裁员后的半年前端求职经历
普通的人生终起波澜 去年下半年应该算是我毕业以来发生人生变故最多的一段时间。 先是 7 月份的时候发作了一次急性痛风,一个人在厦门,坐在床上路都走不了,那时候真的好想旁边能有个人能扶我去医院,真的是感受到 10 级的孤独。尝…...
Linux 文件查看|查找|压缩|解压 常用命令
cat 连接文件并打印到标准输出设备上 指令备注cat aaa.txt连接文件aaa并打印到标准输出设备上 more 以全屏幕的方式按页显示文本文件的内容 按Space键:显示文本的下一屏内容 按Enier键:只显示文本的下一行内容 指令备注more aaa.txt查看文件aaa le…...
什么是:Word2Vec + 余弦相似度
什么是:Word2Vec + 余弦相似度 目录 什么是:Word2Vec + 余弦相似度示例文本基于Word2Vec的文本向量化计算余弦相似度Word2Vec不是基于Transformer架构的Word2Vec是一种将单词转化为向量表示的模型,而Word2Vec + 余弦相似度则是一种利用Word2Vec得到的向量来计算文本相似性的…...

智慧城市综合运营管理系统Axure原型
这款Axure原型的设计理念紧紧围绕城市管理者的需求展开。它旨在打破传统城市管理中信息孤岛的局面,通过统一标准接入各类业务系统,实现城市运营管理信息资源的全面整合与共享。以城市管理者为中心,为其提供一个直观、便捷、高效的协同服务平台…...
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
RTKLib详解: datum.c、download.c 与 lambda.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解ÿ…...

Qwen智能体qwen_agent与Assistant功能初探
Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen(通义千问)智能体框架是阿里云推出的新一代AI智能体开发平台,其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计,将L…...
LayerNorm vs RMSNorm 技术对比
1. 核心概念 LayerNorm (层归一化) 思想:对单个样本的所有特征维度进行归一化目标:使每个样本的特征分布 μ 0 \mu0 μ0, σ 1 \sigma1 σ1特点:同时调整均值和方差 RMSNorm (均方根归一化) 思想:基于均方根的简…...

可视化图解算法37:序列化二叉树-II
1. 题目 描述 请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍…...

C++GO语言微服务和服务发现②
01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令:micro new --type srv test66 框架默认自带服务发现:mdns。 使用consul服务发现: 1. 初始consul服务发现&…...

【Web前端开发】CSS基础
2.CSS 2.1CSS概念 CSS是一组样式设置的规则,称为层叠样式表,用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制,实现美化页面的效果,也能够做到页面的样式和结构分离。 2.2基本语法 通常都是ÿ…...
Google LLM prompt engineering(谷歌提示词工程指南)
文章目录 基本概念AI输出配置:调整AI的回答方式输出长度温度(Temperature)Top-K和Top-P 提示技术:让AI更好地理解你零样本提示(Zero-shot)少样本提示(Few-shot)系统提示(…...
接口出现 请求参数格式错误 的解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理…...

Git实战经验分享:深入掌握git commit --amend的进阶技巧
一、工具简介 git commit --amend是Git版本控制系统的核心补救命令,主要用于修正最近一次提交的元数据。该命令不会产生新的提交记录,而是通过覆盖原提交实现版本历史的整洁性,特别适合在本地仓库进行提交优化。 二、核心应用场景 提交信息…...

PTA:jmu-ds-最短路径
给定一个有向图,规定源点为0,求源点0到其他顶点最短路径。###你要实现的 函数接口定义: void Dijkstra(MGraph g,int v);//源点v到其他顶点最短路径 裁判测试程序样例: #include <stdio.h> #include <iostream> …...
Uniapp编写微信小程序,使用canvas进行绘图
一、canvas文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial 二、数据绘制(单位是像素): 1、绘制文本: 文字的长度超过设置的最大宽度,文字会缩在一起 ① 填充文本…...

WEB UI自动化测试之Pytest框架学习
文章目录 前言Pytest简介Pytest安装Pytest的常用插件Pytest的命名约束Pytest的运行方式Pytest运行方式与unittest对比主函数运行命令行运行执行结果代码说明 pytest.ini配置文件方式运行(推荐)使用markers标记测试用例 pytest中添加Fixture(测…...

深入理解 iOS 开发中的 `use_frameworks!`
在使用 CocoaPods 管理 iOS 项目依赖时,开发者经常会在 Podfile 文件中看到一个配置选项:use_frameworks!。本文将详细介绍这个配置选项的含义,以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…...

矩阵置零算法讲解
矩阵置零算法讲解 一、问题描述 给定一个 (m \times n) 的矩阵,如果一个元素为 (0) ,则将其所在行和列的所有元素都设为 (0) 。要求使用原地算法,即在不使用额外矩阵空间的情况下完成操作。 二、解题思路 暴力解法 最直观的想法是遍历矩阵,当遇到 (0) 元素时,直接将其…...

二本计算机,毕业=失业?
我嘞个豆,二本计算机,毕业即失业?! 今天咱们聊聊普通院校计算机专业的学生未来的发展方向。有些话可能不太中听,但希望大家能理性看待。 首先得承认,对于普通双非和二本的学生来说,就业率加上…...
Java 并发编程挑战:从原理到实战的深度剖析与解决方案
Java 作为企业级应用开发的主流语言,其多线程能力是支撑高并发场景的核心。然而,线程安全、死锁、性能瓶颈等问题仍是开发者难以绕过的暗礁。本文将从 JVM 内存模型、并发工具链到实际案例,系统性揭示 Java 并发编程的挑战与解决方案…...