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

RAG系统的需求分析

这个是一个基于私有知识库的智能对话平台允许用户上传文档构建专属知识库并通过自然语言交互的方式查询和获取知识。它结合了大语言模型和向量检索技术让用户通过对话的形式与自己的知识库进行高效交互应用场景个人用户场景:学习助手学生可以上传课堂笔记、教材构建个人知识库研究工具实验室拟整理论文资料进行跨文献知识连接与发现创作辅助作家内容创作者管理素材获取灵感和参考企业用户企业知识管理整合公司制度、流程文档、技术文档等内部知识新员工培训加速新员工学习曲线快速掌握公司业务知识技术支持技术团队快速解锁产品文档、AP文档故障处理方案客服服务教师整理教学资料为学生提供专业个人辅导专业领域场景法律咨询律师整理法规判列文档辅助法律分析医疗参考医生整理医学文件、诊疗指南、临床辅助决策教育培训教师整理教学资料为学生提供个性化辅导这个项目解决了哪些痛点的从技术的角度来看专业的企业知识管理存在很多重点最明显的就是信息孤岛问题。各个部门的文档分散在不同的系统中有的在文件有的在共享文件夹还有的在各种云盘中。员工想要找一个资料得在好几个地方翻来翻去效率低。而我们这个系统可以解决这个问题它不仅支持各种各样的文档形式还用Apache Tika这个强大的文档解析库来提取文本内容更重要的是他引入了组织标签的概念让不同部门的文档可以有序管理保证权限隔离Query(SELECT u FROM User u WHERE u.orgTags LIKE %:orgTag%)大文件上传传统的上传方式经常出现网络不稳定就上传失败得重来。而我们这个项目使用了分片上传技术把大文件切成一小块一小块的上传public void uploadChunk(String fileMd5, int chunkIndex, long totalSize, String fileName, MultipartFile file, String orgTag, boolean isPublic, String userId) throws IOException { logger.info([uploadChunk] 开始处理分片上传请求 fileMd5: {}, chunkIndex: {}, totalSize: {}, fileName: {}, fileMd5, chunkIndex, totalSize, fileName); // 检查分片是否已上传 if (isChunkUploaded(fileMd5, chunkIndex)) { logger.info(分片已存在跳过上传 fileMd5: {}, chunkIndex: {}, fileMd5, chunkIndex); return; } // 上传分片到MinIO String chunkPath String.format(%s/chunk_%d, fileMd5, chunkIndex); minioClient.putObject(PutObjectArgs.builder() .bucket(bucketName) .object(chunkPath) .stream(file.getInputStream(), file.getSize(), -1) .build()); // 在Redis中标记分片已上传 markChunkUploaded(fileMd5, chunkIndex); }我们使用了redis的BitMap来记录哪些上分片已经上传即使网络中断也能从断点续传不用从头开始传统关键词检索的时候经常出现这种情况我们明明知道这个文档有过相关的内容但是又是搜索不出来。因为你用的词和文档里面的不一样。而这个项目我们采用了混合检索的方式把ES的全文检索和向量语义搜索结合起来这样即使我们使用的词不完全匹配系统也能理解我们的意图找到相关文档/** * 执行向量化操作 * param fileMd5 文件指纹 * param userId 上传用户ID * param orgTag 组织标签 * param isPublic 是否公开 */ public void vectorize(String fileMd5, String userId, String orgTag, boolean isPublic) { // 获取文件分块内容 ListTextChunk chunks fetchTextChunks(fileMd5); if (chunks null || chunks.isEmpty()) { return; } // 提取文本内容 ListString texts chunks.stream() .map(TextChunk::getContent) .toList(); // 调用外部模型生成向量 Listfloat[] vectors embeddingClient.embed(texts); // 构建 Elasticsearch 文档并存储 ListEsDocument esDocuments IntStream.range(0, chunks.size()) .mapToObj(i - new EsDocument( UUID.randomUUID().toString(), fileMd5, chunks.get(i).getChunkId(), chunks.get(i).getContent(), vectors.get(i), deepseek-embed, // 更新为 DeepSeek 的模型版本 userId, orgTag, isPublic )) .toList(); elasticsearchService.bulkIndex(esDocuments); // 批量存储到 Elasticsearch }public void processMessage(String userId, String userMessage, WebSocketSession session) { logger.info(开始处理消息用户ID: {}, 会话ID: {}, userId, session.getId()); try { // 1. 获取或创建会话 ID String conversationId getOrCreateConversationId(userId); logger.info(会话ID: {}, 用户ID: {}, conversationId, userId); // 为当前会话创建响应构建器 responseBuilders.put(session.getId(), new StringBuilder()); // 创建一个CompletableFuture来跟踪响应完成状态 CompletableFutureString responseFuture new CompletableFuture(); responseFutures.put(session.getId(), responseFuture); // 2. 获取对话历史 ListMapString, String history getConversationHistory(conversationId); logger.debug(获取到 {} 条历史对话, history.size()); // 3. 执行带权限过滤的混合搜索 ListSearchResult searchResults searchService.searchWithPermission(userMessage, userId, 5); logger.debug(搜索结果数量: {}, searchResults.size()); // 4. 构建上下文 String context buildContext(searchResults, session.getId()); // 5. 调用 DeepSeek API 并处理流式响应 logger.info(调用DeepSeek API生成回复); deepSeekClient.streamResponse(userMessage, context, history, chunk - { // 累积响应内容 StringBuilder responseBuilder responseBuilders.get(session.getId()); if (responseBuilder ! null) { responseBuilder.append(chunk); } sendResponseChunk(session, chunk); }, error - { // 处理错误并完成future handleError(session, error); // 发送响应完成通知错误情况 sendCompletionNotification(session); responseFuture.completeExceptionally(error); // 清理会话响应构建器 responseBuilders.remove(session.getId()); responseFutures.remove(session.getId()); });项目包含的业务模块用户管理模块文档上传与解析模块知识库检索模块聊天助手模块聊天记录模块文档管理与组织模块疑问解答Embedding它是一种将离散数据转换为低维向量的技术通过神经网络学习将高维数据映射到低维连续空间同时保留数据间的语义关系的信息技术解决维度灾难问题减少计算和存储成本使计算机能够理解文本语义相似文本在下载空间中相近知识语义相关计算、搜索推荐等应用功能BitMap是什么其是一种数据结构其基本的思想是用bit作为标记某个元素对应的值采用空间换时间的方法实现高效存储和查询核心特点:每个元素仅有一个bit特标示位相比于传统存储方式能极大节省内存空间适用于海量数据去重问题如上一行数据的排查典型应用:数据库索引如oracle的位图索引用户标签系统如存储10亿用户的ID文件上传状态记录如redis中的bitmap标记分片上传状态图像处理作为图像格式存在如果在高并发场景下发现服务器频繁Full GC随导致系统延迟飙升你会从哪方面排查在高并发场景下排查频繁Full GC导致延迟飙升我会从以下几个方向系统排查堆内存配置优化检查堆内存分配比例确保-Xms和-Xmx设置相同避免动态扩容优化新生代与老年代比例(-XX:NewRatio)通常2:3较合适调整Eden与Survivor区比例(-XX:SurvivorRatio)推荐6-8限制元空间大小防止Metaspace泄漏GC算法选择与调优从默认Parallel ScavengeSerial Old切换到G1垃圾收集器考虑使用JDK 11的ZGC暂停时间可控制在10ms以内禁用UseAdaptiveSizePolicy避免JVM自适应调整引发Full GC添加GC日志参数(-XX:PrintGCDetails)进行详细分析对象生命周期管理分析对象是否过早晋升到老年代检查大对象直接分配问题查找内存泄漏点特别是静态变量和缓存使用对象池技术减少对象创建系统资源监控监控CPU、内存、SWAP使用情况分析Full GC触发时系统资源变化使用jstat、jmap、jstack等工具分析JVM状态代码层面优化检查HashMap等集合类使用是否合理减少循环内对象创建预分配slice/map等集合容量避免对象逃逸到堆这个项目为什么用websocket而不用用 SSE双向通信能力WebSocket支持双向实时通信客户端↔服务端。用户可能需要实时发送中断指令、调整提问或触发新操作如“重新回答”“切换模型”而AI的流式响应需即时反馈。SSE仅支持服务端单向推送无法满足用户主动交互的需求。SSE仅支持服务端→客户端单向推送无法处理用户实时输入。连接稳定性与状态管理WebSocket长连接更稳定适合高频交互场景如对话中频繁发送/接收消息。连接状态可被程序主动管理如心跳检测、异常重连。SSE依赖HTTP长连接但网络波动易导致连接中断且重连机制较弱。无原生连接状态管理需额外实现复杂逻辑。协议效率与性能WebSocket基于 TCP 的二进制协议数据帧开销小仅2字节头部适合传输大量实时数据如长文本流。传输效率高延迟低尤其适合低延迟交互场景。SSE基于 HTTP需携带HTTP头部如Content-Type: text/event-stream数据量较大时效率较低。文本格式如data: {...}需额外解析性能略逊。流式响应的实时性WebSocket支持真正的逐块流式输出AI生成内容时立即推送无需等待完整响应。用户可实时看到内容生成过程体验接近ChatGPT。SSE虽然也能流式推送但依赖HTTP分块传输Transfer-Encoding: chunked在复杂网络环境下可能存在延迟或丢包。扩展性与协议灵活性WebSocket协议独立于HTTP可承载任意类型数据文本、二进制便于未来扩展如语音、视频交互。支持自定义子协议如chat、file-transfer适配不同业务场景。SSE仅支持文本格式扩展性有限难以支持复杂交互需求。为何不选SSE虽然SSE实现简单原生浏览器API支持且适合单向数据推送如股票行情、日志流但派聪明的核心场景是双向对话用户需实时提问、修改问题、中断回答。AI需即时响应并流式输出答案。 WebSocket的双向性、低延迟和稳定性完美匹配这一需求而SSE单向推送的特性无法满足交互式对话的完整流程。总结特性WebSocketSSE通信方向双向客户端↔服务端单向服务端→客户端协议效率高二进制协议低开销中HTTP头部开销大连接稳定性强长连接可主动管理弱依赖HTTP易断线实时性极高逐块推送延迟低较高依赖HTTP分块扩展性强支持任意数据类型有限仅文本在派聪明中WebSocket 是实现“实时对话流式响应”的最优解兼顾了交互性、性能和用户体验而SSE更适合单向数据广播场景。

相关文章:

RAG系统的需求分析

这个是一个基于私有知识库的智能对话平台,允许用户上传文档构建专属知识库,并通过自然语言交互的方式查询和获取知识。它结合了大语言模型和向量检索技术,让用户通过对话的形式与自己的知识库进行高效交互应用场景个人用户场景:学习助手&…...

GLM-4.1V-9B-Base应用场景:建筑图纸关键结构识别与中文描述生成

GLM-4.1V-9B-Base应用场景:建筑图纸关键结构识别与中文描述生成 1. 建筑行业的AI视觉革命 在建筑设计领域,图纸解读一直是项耗时费力的工作。设计师需要花费大量时间分析图纸中的结构细节,撰写技术说明文档。传统的人工识别方式不仅效率低下…...

电子测试岗面试翻车实录:我的硬件知识与英语短板,以及如何逆袭”

一:首先进行英文的自我介绍Hello, my name isxxx .你好,我叫xxx。I’m 20 years old, and I’m currently a third-year student majoring inElectronic Information Engineering at xxxx我今年20岁,目前是xxx电子信息工程专业的大三学生。My…...

设备管理系统是什么?如何建立设备管理体系?

在现代企业的运转中,生产设备无疑是核心资产。无论是制造业的数控机床,还是建筑工地的重型机械,甚至是医疗机构的精密仪器,设备的稳定运行直接决定了企业的生产效率、产品质量和成本控制。然而,许多企业在设备管理上仍…...

OFA-COCO蒸馏版部署教程:Windows WSL2环境下PyTorch服务调试全流程

OFA-COCO蒸馏版部署教程:Windows WSL2环境下PyTorch服务调试全流程 1. 引言:为什么选择OFA图像描述模型? 你有没有遇到过这样的场景?手头有一堆图片,需要为它们配上文字说明,一张张手动写描述&#xff0c…...

【计算机视觉实战】第10章 | 单阶段目标检测YOLO与SSD:实时检测的极致追求

欢迎来到《计算机视觉实战》系列教程的第十章。在第九章我们学习了Faster R-CNN等两阶段检测器,它们精度高但速度慢。本章我们将学习单阶段检测器(One-stage Detector),特别是YOLO和SSD,它们在保持可观精度的同时实现了…...

Phi-4-mini-reasoning实战教程:批量处理CSV数学题库生成标准答案

Phi-4-mini-reasoning实战教程:批量处理CSV数学题库生成标准答案 1. 引言 数学老师们经常面临一个共同挑战:批改大量数学作业和试卷需要花费大量时间。传统方法需要逐题检查,效率低下且容易出错。今天,我们将介绍如何利用Phi-4-…...

豪鹏科技2025年财报透视:毛利率提升5.2个百分点,费用管控成效显著

豪鹏科技2025年财报透视:毛利率提升5.2个百分点,费用管控成效显著豪鹏科技2025年业绩表现亮眼,全年实现营业收入57亿元至60亿元,同比增长11.58%至17.45%;归母净利润1.95亿元至2.2亿元,同比大幅增长113.69%至…...

SEO和SEM对于中小企业的意义是什么_SEO 和 SEM 的报告指标有哪些

SEO和SEM对于中小企业的意义是什么 在当今的数字化时代,中小企业如何在竞争激烈的市场中脱颖而出,已成为每一个企业家关注的焦点。搜索引擎优化(SEO)和搜索引擎营销(SEM)作为两种重要的数字营销手段&#…...

管理员命令提示符 命令提示符 cmd

命令提示符区别...

小型纯电动汽车轮毂电机及大角度转向系统的数字化设计【含catia、solidworks、CAD图纸、答辩PPT、说明书】

小型纯电动汽车轮毂电机与大角度转向系统的数字化设计,是新能源汽车领域的关键技术突破方向。轮毂电机通过将驱动装置集成于车轮内部,实现了动力传递路径的简化与能量利用效率的提升,其分布式驱动特性使车辆具备更灵活的扭矩分配能力&#xf…...

快速部署Python3.10环境:Miniconda镜像实战教学

快速部署Python3.10环境:Miniconda镜像实战教学 1. 为什么选择Miniconda搭建Python环境? 在Python开发中,最让人头疼的问题之一就是环境管理。不同项目可能需要不同版本的Python和依赖库,直接安装会导致版本冲突。Miniconda提供…...

从选型到焊接:一份给嵌入式新手的晶振避坑指南(含32.768KHz实例)

从选型到焊接:嵌入式开发者的晶振实战避坑手册 第一次点亮自己设计的电路板时,那颗小小的晶振就像电子世界的心跳起搏器。记得三年前我为一个智能家居项目调试STM32时,连续三天卡在"晶振不起振"的问题上——电路图反复检查无误&…...

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

软考软件评测师备考避坑指南:5个高频失分章节深度解析 第一次打开软件评测师考纲时,我盯着密密麻麻的知识点列表发愣——这哪是考试大纲,分明是软件工程领域的百科全书。作为经历过三次备考最终以87分通过的老考生,我深刻理解那种…...

别再死记硬背了!用C++/Java手把手实现线索二叉树(附完整代码与避坑指南)

从零实现线索二叉树:C/Java双语言实战与陷阱全解析 第一次在面试白板上遇到线索二叉树的实现题时,我的手心全是汗。教科书上的递归图示看起来清晰,但真正要写出无bug的线索化代码时,那些ltag和rtag就像捉迷藏的孩子,总…...

SDXL 1.0电影级绘图工坊:RTX 4090专属,5分钟零基础部署教程

SDXL 1.0电影级绘图工坊:RTX 4090专属,5分钟零基础部署教程 1. 为什么选择SDXL 1.0电影级绘图工坊 如果你正在寻找一款能在RTX 4090上发挥极致性能的AI绘图工具,SDXL 1.0电影级绘图工坊绝对是你的不二之选。这款工具专为4090显卡优化&#…...

ARL灯塔扫不出指纹?手把手教你用Python脚本批量导入指纹库,提升资产识别准确率

ARL灯塔指纹识别优化实战:Python脚本批量导入与精准率提升指南 资产侦察灯塔(ARL)作为渗透测试领域的重要工具,其核心价值在于准确识别目标资产的技术特征。然而许多中级用户发现,默认指纹库在面对特定行业或新型资产…...

数据科学驱动的自动化分析:缠论量化开源工具包的技术实践与价值

数据科学驱动的自动化分析:缠论量化开源工具包的技术实践与价值 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码,适用于缠论量化研究,和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠论可视化 TradingView TV-SD…...

500套帐篷发往西非:我们凭什么拿下这单?

一句吐槽,让我们抓住了机会年初,天津京路发科技收到一封西非询盘:500套支架帐篷,用于安置点。客户顺带吐槽了一句:“之前的帐篷,没撑过上一个雨季。”我们懂了——价格不是关键,耐造才是。先看气…...

INNISO1接口模块

INNIS01 接口模块INNIS01 是一款应用于工业自动化控制系统中的接口模块,主要用于实现控制系统内部或与外部设备之间的信号连接与数据交互,属于系统中的通信与接口扩展单元。一、基本概述INNIS01 接口模块通常用于连接控制器与现场设备或其他功能模块&…...

GLM-OCR完整教程:部署、使用、API、案例,一篇搞定所有

GLM-OCR完整教程:部署、使用、API、案例,一篇搞定所有 1. GLM-OCR简介与核心优势 GLM-OCR是一款基于先进多模态架构的OCR识别工具,专为解决复杂文档理解问题而设计。与市面上大多数OCR工具不同,它不仅能识别文字,还能…...

别再为联合仿真头疼了!手把手教你用Amesim 2019和Matlab 2022b配置S-Function(Win10环境)

从零搭建Amesim与Matlab联合仿真环境:避坑指南与实战技巧 联合仿真技术已成为多物理场系统设计的黄金标准,但配置过程却让无数工程师在深夜的办公室里抓狂——编译器版本冲突、环境变量设置错误、接口编译失败,每一个环节都可能成为项目进度的…...

Excel 根据A列标签拆分为多个列数据

举例:如下图所示将AB列内容拆分为红色框内的格式方便绘制图表Sub SplitCategoriesToColumns()Dim ws As WorksheetDim lastRow As LongDim startRow As LongDim dict As ObjectDim keyOrder As New CollectionDim i As Long, j As LongDim key As VariantDim val As…...

余姚加工中心编程培训排行榜单

舜龙模具数控培训执行标准:学习进度一对一、培训一人、合格一人、成就一人;舜龙自有模具工厂,全程实战教学,所学贴合岗位实操,毕业即可对接就业。1998年-2026年,舜龙28年匠心传承。舜龙模具数控培训&#x…...

3步搞定黑苹果配置:OpCore-Simplify自动化工具如何解决90%的安装难题

3步搞定黑苹果配置:OpCore-Simplify自动化工具如何解决90%的安装难题 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 开篇:黑苹…...

学习网络安全至少需要什么配置的电脑?

很多同学对于学习 Web 渗透所需的电脑配置仍有疑问,所以老师结合自己的教学经验,总结了关于电脑配置要求的一些内容,遂成此文。当然,对于电脑配置的追求是无上限的,所以有条件的话最好还是搞一台配置强劲的电脑。 一、…...

防爆气象站为什么能够成为化工行业的必备仪器

防爆气象站能够成为化工行业的必备仪器,主要基于其本质安全设计、多参数精准监测、实时预警能力、环境适应性、合规管理支持及生产优化价值六大核心优势,这些特性直接解决了化工行业在安全管控、工艺控制及合规运营中的关键痛点。一、本质安全设计&#…...

EmbeddingGemma-300m部署指南:Ollama镜像+Prometheus监控+日志追踪一体化

EmbeddingGemma-300m部署指南:Ollama镜像Prometheus监控日志追踪一体化 想快速搭建一个功能强大、易于管理的文本向量化服务吗?EmbeddingGemma-300m作为谷歌推出的轻量级嵌入模型,凭借其3亿参数和出色的性能,是构建本地语义搜索、…...

数据仓库核心概念:事实表和维度表详解与实战应用

数据仓库核心概念:事实表和维度表详解与实战应用一、引言二、定义:什么是事实表?什么是维度表?2.1 事实表:定义2.2 维度表:定义三、结构流程图:事实表与维度表关联关系3.1 标准星型模型关联流程…...

Ostrakon-VL 模型推理加速实战:使用 .accelerate 库优化扫描速度

Ostrakon-VL 模型推理加速实战:使用 .accelerate 库优化扫描速度 1. 效果惊艳的开场 最近在测试Ostrakon-VL模型时,我发现了一个令人惊喜的事实:通过.accelerate库的几项简单优化,模型推理速度可以提升3倍以上,同时显…...