Spring AI系列——使用大模型对文本进行内容总结归纳分析

news2025/5/13 17:29:27

一、技术原理与架构设计

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: 10091

spring:
  application:
    name: spring-ai-alibaba-text-summarizer-example

  ai:
    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_ONLYJSON_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.2s92%
topP=0.9更多样化输出1.5s88%
topP=0.5更聚焦输出1.0s95%

五、总结与展望

本文介绍了如何利用 Spring AI Alibaba 集成 DashScope 大模型,实现文本内容的自动摘要与结构化输出。通过完整的代码实现与参数分析,展示了系统的可扩展性与灵活性。未来可进一步探索以下方向:

  • 支持多语言文本摘要;
  • 引入缓存机制提升性能;
  • 增加异步处理能力,支持批量文档处理;
  • 结合前端 UI 实现可视化操作界面。

该项目具备良好的工程实践价值,适用于知识库构建、智能客服、内容推荐等多个应用场景。

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

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

相关文章

【深度学习】目标检测算法大全

目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 &#xff08;1&#xff09;候选框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取与微调 2.1 特征提取 2.2 网络微调&#xff08;Fine-tuning&#xff09; …

视觉-语言-动作模型:概念、进展、应用与挑战(下)

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

一键解锁嵌入式UI开发——LVGL的“万能配方”

面对碎片化的嵌入式硬件生态&#xff0c;LVGL堪称开发者手中的万能配方。它通过统一API接口屏蔽底层差异&#xff0c;配合丰富的预置控件&#xff08;如按钮、图表、滑动条&#xff09;与动态渲染引擎&#xff0c;让工程师无需深入图形学原理&#xff0c;效率提升肉眼可见。 L…

智慧城市综合运营管理系统Axure原型

这款Axure原型的设计理念紧紧围绕城市管理者的需求展开。它旨在打破传统城市管理中信息孤岛的局面&#xff0c;通过统一标准接入各类业务系统&#xff0c;实现城市运营管理信息资源的全面整合与共享。以城市管理者为中心&#xff0c;为其提供一个直观、便捷、高效的协同服务平台…

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen&#xff08;通义千问&#xff09;智能体框架是阿里云推出的新一代AI智能体开发平台&#xff0c;其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计&#xff0c;将L…

可视化图解算法37:序列化二叉树-II

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

C++GO语言微服务和服务发现②

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

【Web前端开发】CSS基础

2.CSS 2.1CSS概念 CSS是一组样式设置的规则&#xff0c;称为层叠样式表&#xff0c;用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制&#xff0c;实现美化页面的效果&#xff0c;也能够做到页面的样式和结构分离。 2.2基本语法 通常都是&#xff…

Git实战经验分享:深入掌握git commit --amend的进阶技巧

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

PTA:jmu-ds-最短路径

给定一个有向图&#xff0c;规定源点为0&#xff0c;求源点0到其他顶点最短路径。###你要实现的 函数接口定义&#xff1a; void Dijkstra(MGraph g,int v);//源点v到其他顶点最短路径 裁判测试程序样例&#xff1a; #include <stdio.h> #include <iostream> …

WEB UI自动化测试之Pytest框架学习

文章目录 前言Pytest简介Pytest安装Pytest的常用插件Pytest的命名约束Pytest的运行方式Pytest运行方式与unittest对比主函数运行命令行运行执行结果代码说明 pytest.ini配置文件方式运行&#xff08;推荐&#xff09;使用markers标记测试用例 pytest中添加Fixture&#xff08;测…

深入理解 iOS 开发中的 `use_frameworks!`

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

矩阵置零算法讲解

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

二本计算机,毕业=失业?

我嘞个豆&#xff0c;二本计算机&#xff0c;毕业即失业&#xff1f;&#xff01; 今天咱们聊聊普通院校计算机专业的学生未来的发展方向。有些话可能不太中听&#xff0c;但希望大家能理性看待。 首先得承认&#xff0c;对于普通双非和二本的学生来说&#xff0c;就业率加上…

[docker基础二]NameSpace隔离实战

目录 一 实战目的 二 基础知识 1)dd 命令详解 2)mkfs命令详解 3)df命令详解 4)mount 命令详解 5)unshare命令详解 三 实战操作一(PID隔离) 四 实战操作二(MOunt隔离) 1&#xff09;创建 Mount 隔离进程 2&#xff09;在新进程里边&#xff0c;创建空白文件&#…

Day22打卡-复习

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号人员生还预测https://www.kaggle.com/competitions/titanic/overview K…

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图)

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图) 代码示下,不再赘述。 动作面板组件:https://nutui-uniapp.netlify.app/components/feedback/actionsheet.html 项目背景 业务需求 描述: uniapp + vue3 + 京东Nut框架:实现登录弹框组…

C++类和对象--中阶

C类和对象中阶 01. 类的6个默认成员函数 在 C 中&#xff0c;类有 6 个特殊的默认成员函数&#xff08;不是 6 个构造函数&#xff09;&#xff0c;它们会在特定情况下由编译器自动生成。包括构造函数&#xff0c;析构函数&#xff0c;拷贝构造和赋值运算符重载&#xff0c;取…

数据签名在区块链中的独特应用与挑战

随着信息技术的飞速发展&#xff0c;分布式系统因其高效、可靠、可扩展等显著优点&#xff0c;在众多领域得到了极为广泛的应用。分布式系统通过网络将多个独立的计算节点连接在一起&#xff0c;协同完成复杂的任务&#xff0c;这种架构使得系统具备了强大的容错能力和负载均衡…

数据可视化大屏——物流大数据服务平台(二)

代码分析&#xff1a; 物流大数据平台代码分析 这是一个基于 Bootstrap 和 ECharts 构建的物流大数据平台前端页面&#xff0c;设计采用了经典的三栏布局&#xff0c;主要展示河南省及全国的物流数据可视化内容。下面从多个维度进行分析&#xff1a; 1. 页面结构分析 整体采…