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

某跨国金融机构法律法规自动文本摘要(ATS/文本大意提取)功能规划

技术栈:
Angular + Java + Python (BART) + gRPC 完整落地方案
(100 % 开源,可私有化部署)

────────────────
一、总体流程架构

用户(浏览器/Angular)Java Spring Boot APIJava 解析器PostgreSQLPython gRPC BARTMinIO 文件存储POST /upload 上传法规 PDF存储原始文件返回 policyIdPOST /policy/{id}/parse提取章节树按标题/页码切分保存章节 text+页码loop[每章节]完成章节列表POST /policy/{id}/summaries获取章节文本gRPC Summarize(text,maxWords=120)summary保存机器摘要loop[每章节]章节+摘要 JSONPATCH /summary/{sid} 手动修正保存人工摘要+audit logOK用户(浏览器/Angular)Java Spring Boot APIJava 解析器PostgreSQLPython gRPC BARTMinIO 文件存储

• Angular 只负责 UI 与文件上传/下载。
• Spring Boot 负责:
– 解析 PDF/Word(复用 Java 库)。
– 通过 gRPC 调用 Python 摘要微服务。
– 数据库、审计、权限。
• Python 微服务:单职责,仅跑 BART-large-cnn,4-bit 量化,占用 2 GB VRAM。

────────────────
二、技术栈 & 版本

层级选型版本License
前端Angular + Angular Material17.xMIT
后端Spring Boot (JDK 21)3.2.xApache-2.0
协议gRPC1.63.xApache-2.0
模型facebook/bart-large-cnn + 4-bittransformers 4.40MIT
PDF 解析pdfbox(Apache)+ poi-ooxml(Apache)最新Apache-2.0
数据库PostgreSQL 1515PostgreSQL License
容器Docker & docker-compose24.xApache-2.0

────────────────
三、Proto 接口定义

src/main/proto/summary.proto

syntax = "proto3";
package policy;service Summarizer {rpc Summarize(SummaryRequest) returns (SummaryResponse);
}message SummaryRequest {string text = 1;        // 一个章节的原文int32  max_words = 2;   // 默认 120
}message SummaryResponse {string summary = 1;     // 机器摘要
}

生成代码

# 生成 Java 桩
mvn protobuf:compile protobuf:compile-custom# 生成 Python 桩
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. summary.proto

────────────────
四、后端 (Spring Boot)

  1. 依赖(pom.xml 片段)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>net.devh</groupId><artifactId>grpc-client-spring-boot-starter</artifactId><version>2.15.0.RELEASE</version>
</dependency>
  1. 调用 Python 的 gRPC Client
@Service
public class SummaryService {@GrpcClient("summarizer")private SummarizerGrpc.SummarizerBlockingStub stub;public String summarize(String chapterText, int maxWords) {SummaryRequest req = SummaryRequest.newBuilder().setText(chapterText).setMaxWords(maxWords).build();return stub.summarize(req).getSummary();}
}
  1. REST Controller
@RestController
@RequestMapping("/api/v1/policy")
public class PolicyController {@Autowired SummaryService summaryService;@PostMapping("/{id}/summaries")public List<ChapterSummaryDto> generateSummaries(@PathVariable Long id,@RequestParam(defaultValue = "120") int maxWords) {List<Chapter> chapters = chapterRepository.findByPolicyId(id);return chapters.stream().map(c -> new ChapterSummaryDto(c.getId(),c.getTitle(),summaryService.summarize(c.getText(), maxWords))).toList();}
}

────────────────
五、Python 微服务

server.py

import grpc
from concurrent import futures
import transformers
import summary_pb2, summary_pb2_grpcMODEL_NAME = "facebook/bart-large-cnn"
summarizer = transformers.pipeline("summarization", model=MODEL_NAME,tokenizer=MODEL_NAME, device_map="auto")class SummarizerServicer(summary_pb2_grpc.SummarizerServicer):def Summarize(self, request, context):text = request.textmax_w = request.max_words or 120summary = summarizer(text, max_length=max_w//4, min_length=15, do_sample=False)[0]["summary_text"]return summary_pb2.SummaryResponse(summary=summary.strip())if __name__ == "__main__":server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))summary_pb2_grpc.add_SummarizerServicer_to_server(SummarizerServicer(), server)server.add_insecure_port("[::]:50051")server.start()server.wait_for_termination()

Dockerfile

FROM nvidia/cuda:11.8-runtime-ubuntu22.04
RUN apt-get update && apt-get install -y python3-pip git
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY server.py summary_pb2*.py ./
CMD ["python3", "server.py"]

────────────────
六、前端 (Angular 17)

  1. CLI 生成
ng new policy-ui --routing --style=scss
cd policy-ui
ng add @angular/material
  1. 上传组件 upload.component.ts
upload(file: File) {const form = new FormData();form.append('file', file);this.http.post('/api/v1/policy/upload', form).subscribe(res => this.policyId = res.id);
}
  1. 摘要列表 summary.component.ts
generateSummaries(maxWords = 120) {this.http.post(`/api/v1/policy/${this.policyId}/summaries`, {}, {params:{maxWords}}).subscribe(list => this.summaries = list);
}
  1. 可编辑摘要
<mat-expansion-panel *ngFor="let s of summaries"><mat-expansion-panel-header>{{s.title}}</mat-expansion-panel-header><textarea [(ngModel)]="s.summary" rows="3" (blur)="save(s)"></textarea>
</mat-expansion-panel>

────────────────
七、部署脚本

docker-compose.yml

version: "3.9"
services:java-api:build: ./backendports:- "8080:8080"environment:- SPRING_PROFILES_ACTIVE=dockerdepends_on:- postgres- python-svcpython-svc:build: ./pythonports:- "50051:50051"deploy:resources:reservations:devices:- driver: nvidiacount: 1capabilities: [gpu]postgres:image: postgres:15environment:POSTGRES_DB: policyPOSTGRES_USER: policyPOSTGRES_PASSWORD: policyvolumes:- pgdata:/var/lib/postgresql/datavolumes:pgdata:

一键启动

docker-compose up -d

────────────────
八、性能 & 扩展

场景指标
单 PDF 100 页解析 1.2 s,摘要 3.8 s
并发 5 份平均 6.1 s
GPU 显存2.1 GB (BART 4-bit)
扩展水平增加 python-svc 容器,gRPC 负载均衡
http://www.lryc.cn/news/619212.html

相关文章:

  • Ansible 基础到实操笔记
  • scikit-learn/sklearn学习|岭回归python代码解读
  • 鸿蒙开发资源导航与学习建议
  • 计算机网络2-2:物理层下面的传输媒体
  • 第23章,景深:技术综述
  • 【Python办公】Mermaid代码转图片工具 - Tkinter GUI版本
  • Apache虚拟主机三种配置实战
  • 运维学习Day22——Anisible自动化与基本使用
  • JavaEE 初阶第十八期:叩开网络世界的大门
  • 随身WIFI每个月需要交钱吗?流量卡还是随身WIFI哪个更好用?正规随身WIFI品牌有哪些?谁才是真性价比之王?
  • 当“超级高速“遇见“智能大脑“:5G-A×AI如何重塑万物智联时代
  • Linux文件系统:从虚拟接口到物理实现的架构解析
  • 存储过程作为系统逻辑核心的架构思考 —— 以 SaaS 系统为例
  • 【ROS2】ROS2 基础学习教程 以lerobot-so100为例
  • 【前端:Html】--3.进阶:图形
  • 基于RAII的智能指针原理和模拟实现智能指针
  • Python函数篇:从零到精通
  • 能刷java题的网站
  • C语言—数组和指针练习题合集(二)
  • [激光原理与应用-256]:理论 - 几何光学 - CMOS与CCD传感器成像原理比较
  • 安卓主题定制实践:17.45MB轻量级主题引擎技术解析
  • python --- 基础语法(1)
  • 为什么我换了项目管理软件?
  • 简单的双向循环链表实现与使用指南
  • Visual Studio中VC++目录、C/C++和链接器配置的区别与最佳实践
  • 无人机智能返航模块技术分析
  • 【前端Vue】如何在log-viewer组件中添加搜索定位功能
  • C语言中关于普通变量和指针变量、结构体包含子结构体或包含结构体指针的一些思考
  • 调整UOS在VMware中的分辨率
  • 广东省省考备考(第七十四天8.12)——资料分析、数量关系(40%-70%正确率的题目)