- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
1、前言 。
在6.28/29的稀土掘金开发者大会RAG专场上,我们公司CEO员外代表TorchV分享了我们在《RAG在企业应用中落地的难点与创新》 。
其中最后分享了两个观点:
。
。
对于AI应用的三个特点,我们在落地的时候,其实碰到的问题蛮多的,但是用过大模型或者AI产品的人应该都知道,目前基于大模型应用开发的C端产品其实在整体给人的感觉都是相对较小的工具居多,在帮助人类提效这件事上,借助于AI工具,能很好的完成日常繁杂的工作和学习任务。比如AI翻译、网页总结插件等等。这类产品更多的是偏C端为主,借助于互联网的生态以及开源技术的发展,只要功能/交互满足用户的要求,很快就能打动C端用户进行尝鲜试用甚至付费.
但是做B端类的产品,整个交付的过程就明显和C端不一样,在B端我们除了产品本身需要功能足够强大之外,我们还需要做AI的落地交付,这里面包含私有化定制/客户培训/私有化部署/软硬件适配等等繁杂的工作,整个交付周期漫长的多。这明显是和上面第二个观点相呼应的,产品+服务才能综合服务好B端的客户.
本篇是结合我们公司在B端RAG/大模型应用产品的落地交付的场景考虑,以实际场景出发,谈谈我对知识库类产品的技术架构的思考总结.
。
图3-业务架构 。
在文章的标题中,我已经标注了范围: RAG、大模型、非结构化数据 。
我们从这三个方面出发,在软件层面,我们如何来考虑这些新型的技术名词,将他们从技术/产品功能的角度进行拆解,实现对应的功能交付给我们的客户.
从业务的功能诉求来看,主要有几个方面:
而从技术侧考虑,技术人员需要关注的是:
技术的角度拆分,其实技术人员关注的点非常的多,每一项工作其实都可以是独立的中间件产品,要把这些全部整合到一块,并非易事.
写过Java的估计对上面这三个名词都已经滚瓜乱熟了,我记得很早之前,说面试你如果不会微服务,那都找不到工作(PS:现在好像不管你会什么,也同样都找不到)😂.
对于AI应用,可能更多的软件生态是由Python带动起来的,包括一些工具库LangChain、LlamaIndex等都是Python,虽然Java中也不乏有一些,比如LangChain4j、Spring-AI等组件,都是后起之秀,在整个生态稳定性等方面确实是落后了一节.
但可能很多人都在用过LangChain等框架后有一个共识,那就是当作工具用没有问题,但是上生产?问题太多了。我觉得主要的几个点:
而我们今天讨论的是整个产品的技术架构的选择,其实在上面业务功能/技术组件抽象那一节,我们已经拆分了功能和技术点,从技术点去看,这已经是一个集众多服务于一体的综合技术解决方案了。在应用层面的功能,我们是否还需要像以前那样,整一套微服务架构出来来开发业务功能?
我的个人看法是:根据团队配置,微服务可用可不用。但是应用程序必须天然分布式,支持横向扩展集群,弹性伸缩.
目前这个环境,项目搞微服务,最后的困境可能就是所有服务都是你一个人负责,写完a服务写b服务,再来个rpc调用,还要考虑数据熔断、可用性等等,小团队我觉得完全没必要折腾! 。
主要考虑的点:
1、海量非结构化数据处理的提效 。
在处理RAG产品类中,非结构化数据的处理除了快速解析之外,还需要将文本进行向量化,而我们在技术架构中需要能够快速的处理这些文件,通过Pipeline的方式,将非结构化数据最终存储到向量数据库中,这里面传统的做法不得不用消息中间件MQ,而应用层面的程序则可以通过考虑弹性伸缩的方式,扩充消费节点,以提高整体的处理效率 。
2、海量向量数据的存储/计算召回效率 。
当我们对非结构化数据进行提取后,需要经过Embedding模型进行向量化,这里面还涉及到文本的Chunking分块,所以底层向量数据的存储和计算必然是一个需要更全面的考虑向量数据库中间件,这其中包括:向量召回的性能、数据的存储/备份、多租户Schema级别数据权限等等 。
3、数据最终一致性 。
数据的Embedding处理、大模型调度扣费、缓存等等,在目前已经众多服务组件拆分的情况下,整个数据的处理任务我觉得需要保证数据的最终一致性,在分布式场景下,多节点处理时需要特别注意.
4、应用功能原子性(云原生) 。
整个应用层的功能,我觉得需要保持独立,并且保障稳定性,这点其实我觉得在私有化部署/交付的环节比较奏效。如果你是一名运维或者主力开发者,在一个完全内网隔离的环境下部署时,你会体会到这种便捷.
总之,我觉得在应用层面服务,服务端应该做的是:减少配置、轻量化、稳定 。
我们团队目前的开发语言是Java+Python的组合,主要有职责分工:
这里面很多开发可能会有一些担忧,对于Java语言的选择,是否在目前的RAG/大模型领域合适?其实最困惑的就是非结构化数据的处理,可能很多开发者看到目前开源的众多组件或者平台,都是Python的主技术栈,认为Java处理不了,其实这是完全有误区的,对于最难处理的PDF文件提取,Apache PDFBox绝对是值得你深挖的一个组件,当然Python本来就擅长数据处理/分析,可以根据团队的配置进行执行选择,这里面我觉得主要考虑的几个点:
1、团队人员配置 。
根据团队当前的主流编程语言去做技术架构上的选型和决策,并没有绝对意义上的以哪个编程语言为主,Java、Python、Go、NodeJS、TypeScript等等都可以.
2、软件生态&技术成熟度 。
上层应用产品的开发,肯定首先要考虑有哪些成熟的中间件和组件,来开发完成这一众多的需求,总不能从0到1造轮子,造轮子固然能提升开发人员的水平技能,但是在AI日益发展的今天,为公司产品尽早的找到PMF才是首要任务。需要综合考虑.
其他的编程语言我不了解,就非结构化数据的解析这一块,其实Python和Java都相对更加丰富和稳 定.
Java语言中比较好用的包括:Apache PDFBox、POI、Tika 。
Python中包括:PyMuPDF、pdfplumber、pypdf、camelot、python-docx等等 。
3、稳定性/集群/高可用 。
嗯,这里没有高并发,因为大家都没卡😂 。
大模型的产品相比较传统的业务在这点上并没有 太多的区别,稳定性/集群等特点也是需要的,技术人员在选择中间件时,也应当考虑这一点.
例如MQ消息中间件、缓存Redis等等 。
4、部署实施/交付 。
没错,最后一步部署实施这个环节也需要考虑,Docker确实能带来极大的便利,但是成本也是需要考量的,目前的Python生态打包整个Docker,压缩包动辄2、3G起步,其实也是蛮头疼的,如果你是使用K8s调度来部署,k8s拉取一个10G的镜像也不是那么快的😂 。
AI应用是一个需要快速试错、功能强大的某一个点去突破,技术架构上,也应当考虑整体的开发效率、生态等等.
这让我想起来十几年前的jQuery,一经面世,得到众多开发者的喜爱,经典名言:
Write Less, Do More!!!
在大模型日益健壮发展的同时,我们的技术架构,是否也应该做一次瘦身呢?
如果你也在关注大模型、RAG检索增强生成技术,欢迎关注我,一起探索学习、成长~! 。
最后此篇关于我对《RAG/大模型/非结构化数据知识库类产品》技术架构的思考、杂谈的文章就讲到这里了,如果你想了解更多关于我对《RAG/大模型/非结构化数据知识库类产品》技术架构的思考、杂谈的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
原谅那个疯狂的标题... 我试图理解面向对象编程中继承与接口(interface)的概念。所以我试图将它与我已经知道的东西联系起来,这就是 CSS。 在 CSS 中,您可以选择在允许元素“继承”样式的
我有一个 C 函数,它返回一个表示二进制数据的 unsigned char*。我在文档中注意到 SWIG 有一个很好的类型映射来处理二进制数据作为 C 函数的输入,但是当 C 函数返回二进制数据及其无
过去遇到过几次类似的问题,想知道用什么语言(方法)来解决类似的问题(我是J2EE/java开发人员): 问题:在一组可能的单词中,根据给定的规则(假设单词可以是 A 和 X 的组合,并且始终以 X 开
这个问题不太可能帮助任何 future 的访客;它只与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
如果我们已经开发了自己的ORM框架并且该框架在过去的几年中运行良好,那么为什么我们要为即将到来的软件项目学习和使用全新的.net技术,例如LINQ或Entity Framework或NHibernat
即使听起来很奇怪,我相信每个人在处理具有大量自定义组件的大型应用程序时都遇到过此类问题。某个地方生成了 AV,但应用程序仍在继续执行,稍后会出现错误。我不是在谈论多线程应用程序。只是关于通用的单线程应
我正在设计一个新项目,我正在尝试找出将数据/事件从服务器应用程序推送到客户端应用程序(即 WPF 应用程序)的方法。 我知道的两个是: 发布/订阅(即 NServiceBus) Full Duplex
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
这个问题在这里已经有了答案: C# .NET: How to check if we're running on battery? (6 个答案) 关闭 9 年前。 我发现许多 API 可以帮助确定
没有 JQUERY!我有一个下拉列表,用户可以在其中选择日期、月份和年份。我创建以下代码并使用 setFullYear 将这些值传递到变量中。有时我还会向这个变量添加天数,这就是变量 ev_num 的
我有一个控件,我想在表单和打印时以不同的方式绘制它。这是我做的方式: private void printDocument1_PrintPage(object sender, System.Drawi
我正在尝试确定从扫描文档中提取手写数据的最佳方法。 手写数据位于特定的方框区域。我生成了文档的数字版本,因此我知道方框区域的坐标,并且如果需要还可以生成文档的其他变体(即被屏蔽以使字段更容易提取的版本
背景 对于基于音乐的问题,我深表歉意,但细节并没有那么重要。我正在按顺序浏览一个 midi 文件,我正在寻找一种有效的方法来查找数据中的模式以找到称为连音符的东西。见下图: 连音符上方有数字(3 或
经验丰富的 Java 新手,寻求您的智慧: 如果无法确保在对象超出范围时执行某些特定的 block 代码,那么还有哪些其他方法可以提供相同的功能?(看起来 finalize 显然不是那个意思) 一个典
我正在玩一个小的油漆应用程序。我想创建不同的画笔提示(不仅仅是简单的线条)。基本思想是沿着鼠标移动重复(冲压)画笔 Nib 。因为鼠标移动不会为鼠标移动的每个像素分派(dispatch)所需的事件。我
我正在制作时间表应用程序。重要的类是: Period id: int clazz: Clazz SubjectTeacher subject: String teac
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this q
我有一个奇怪的任务要解决。我们有一个小型视频窗口(如 300x200 像素,256 色调色板)和 44kHz 2ch 声音在服务器上播放。我们需要将此流视频发送给一些客户端(1,2.. 最多 10 个
我很确定我在这里遗漏了一些东西,因为我对 Shapeless 还很陌生并且我正在学习,但是 Aux 技术实际上什么时候开始需要 ?我看到它是用来暴露一个 type通过将其提升为另一个“同伴”的签名来声
微软有什么理由仍然坚持使用 COM 技术(Office 组件仍然是 COM)……当所有用 COM 完成的事情都可以用 .Net 以更好、更有效的方式完成时 最佳答案 因为它需要一个 长完全重写Offi
我是一名优秀的程序员,十分优秀!