创业:大模型RAG系统三个月的开发心得和思考
1. 前言
自从和员外上家公司离职后,我们就自己搞公司投入到了RAG大模型的AI产品应用的开发中,这中间有一个春节,前后的总时间大概是三个月左右,在这三个月期间,基本是昼夜兼程啊,到今天3月底结束,产品目前看是有了一个基础的雏形。
在这期间,员外负责整个产品的营销、商业客户的洽谈等方面的内容,我和阿包负责整体的技术架构搭建,代码从0-1的编写,我们是在24年1月26,产品初步上线了一个版本,开始接受企业客户的试用,这让我们接受到了大量的需求,以及我们产品在目前的市场环境中还存在哪些竞争力不足需要改进的地方。
三个月时间过去了,在我们的TorchV AI 产品初步成型之际,和大家分享一下开发RAG、LLM系统以来的一些心得和经验。
2. RAG简介
RAG(检索增强生成)名词一开始来源于2020年的一片论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》,旨在为大语言模型(LLM)提供额外的、来自外部知识源的信息。这样,LLM 在生成更精确、更贴合上下文的答案的同时,也能有效减少产生误导性信息的可能。
可以说在目前大模型井喷的今天,RAG作为一项为密集型知识NLP任务的处理指明了方向,配合AI大模型,让世界发生了翻天覆地的变化,数以万计的开发者都涌入这个赛道,同时竞争。
我们知道LLM目前存在的一些问题和挑战:
我自己理解LLM大模型本质就是一个二进制文件,所有的知识都通过压缩技术全部压缩在一个/多个GB的二进制文件中,最终在获取数据的时候,通过LLM的模型架构,推理能力,将所有的知识信息又生成出来。
- 在没有答案的情况下提供虚假信息(胡说八道、幻觉)。
- 模型知识的更新成本、周期、及大模型的通用能力问题(大公司才玩的转)
- 数据安全和隐私等问题
而RAG技术的出现,正好能有效的缓解目前大模型存在的一些问题,主要表现方面如下:
- 经济高效的处理知识&开箱即用:只需要借助信息检索&向量技术,将用户的问题和知识库进行相关性搜索结合,就能高效的提供大模型不知道的知识,同时具有权威性
- 有效避免幻觉问题:虽然无法100%解决大模型的幻觉问题,但通过RAG技术能够有效的降低幻觉,在软件系统中结合大模型提供幂等的API接口就可以发挥大模型的重大作用
- 数据安全:企业的数据可以得到有效的保护,通过私有化部署基于RAG系统开发的AI产品,能够在体验AI带来的便利性的同时,又能避免企业隐私数据的泄漏。
3. RAG技术&架构思考
既然我们知道,RAG作为密集型知识库的处理和大模型配合起来有着天然优势,那么如何做好RAG的开发?
RAG应用的基础技术核心是:让大模型依靠现有的数据(PDF/WORD/Excel/HTML等等)精准的回答用户的问题
这是最基础的功能,同时也是最低要求,任何做RAG领域的AI应用产品,技术层面都需要去突破解决的技术难题。
注意两个核心点:
- 依赖现有的知识库:依赖客户本身的数据是为了给大模型提供强有力的数据支撑,避免大模型胡说八道,企业私有的数据大模型并没有将数据纳入模型进行训练,所以大模型对于企业私有的数据及相关问题,大模型不可能知道,即使大模型能回答你这个领域的问题,那也是因为你这个问题在大模型训练的数据集中早就存在了,而且是公开的数据集和问题,而企业私有的数据(财务报告、隐私数据等)大模型是不可能拥有的
- 精准命中回答:一旦客户将自己的私有数据上传了之后,我们要做的就是依靠此数据精准回答用户的问题,而要做到精准回答命中,技术人员需要做多方面的努力。
技术人对于RAG应用考虑的最核心的就是这两点,而技术测为了要实现这一个目标,其覆盖的知识面以及技术难度都是非常大的。
我很早之前参考大模型的技术架构发展,为RAG画了一张类似的图,如下:
这里面我为做RAG系统的总结为三颗树,LLM大模型是土壤,主要为:数据工程、检索生成、业务系统
这里面并没有把对模型的微调放入进来,当我们把基础工程做到80分后,也许对Embedding模型、Chat模型等微调工作会加入进来,针对特定的业务场景做优化。
- 数据工程: 知识库的形式丰富多彩,这其中配合RAG我们要做的事情非常多,包括文件类型、格式、分割策略、知识类型、索引方式等等
- 检索生成:当我们处理完成数据后,配合大模型需要进行检索生成,而在这个过程中,包括:Prompt工程、算法策略、检索方式、中间件、大模型、查询处理等内容
- 业务系统: 这是配合商业行为所衍生的业务系统&上层产品应用,包括租户、计费、开放平台、洞察、运营等业务系统,这些业务系统在TorchV AI的产品体系都一一体现
通过上面的图,我们大概就能知道,RAG+LLM大模型系统的产品开发,是一个综合性非常强的工作内容,这就和大模型的训练一样,整个工程庞大繁杂,是一个系统性工程。
如果我们把三颗树中的每一项都作为一个技术因子,不同的步骤处理优化,都会影响着最终外部的商业的影响力,这就会产生量变到质变的转变。
假设:我们把数据工程和检索工程所有的步骤在技术层面提升了10%,那么我们在和同类竞品去竞争时,我们的优势是多大呢?
3.1 数据工程
在大模型圈子里,经典名言:Garbage in and garbage out,意思显而易见,你给大模型送的数据质量越高,那么大模型的响应回答效果就越好,反之,如果你丢垃圾给大模型,那么大模型也会给你返回垃圾~
所以从这点来看,上层的应用开发者,要做好知识库类型的产品,数据工程绝对是第一道拦路虎,从数据集的不同领域进行分类,目前存在非常多的数据格式
这里面包含的多种不同的挑战
- 常见文件解析:基于文件类型的数据集是最常见的,也是使用最广的,例如(PDF/WORD/Excel/CSV/Html/Markdown)等格式
- 关系型/NoSQL数据库: 用户的数据全部存储在数据库中间件中,例如MySQL/Postgres等,NoSQL数据库中,这种数据源的提取到是不难,开发者只需要根据不同的数据库标准协议进行对接抽取即可,要做的是适配不同的数据库类型
- 网络数据集:对于网络数据集的处理,那么就需要开发者精通爬虫之道,而网络上的数据集种类也是非常广的,普通的W3C网页(格式种类复杂繁多),视频、音频等等信息
- 不同类型的数据提取:包括文本、图片、表格、视频等,单单一个表格数据的在不同的文件格式的处理,就需要花费大量的精力去优化
- 提取方式的类别:传统的软件工程、OCR、大模型等等
- 分割策略:分割策略在RAG的技术体系中有着举足轻重的地位,分割的不好,会在信息检索(IR)的过程中丢失语义,包括:语义分割、大模型分割、按固定Token分割、文档结构分割等等
- Embedding索引构建:除了给每一个chunk块构建向量索引,元数据、标题、概要总结等等也会对系统准不准有不同的要求,同时还要和上层的业务进行结合。
- More...
在数据工程这棵树上,所有的技术发展都不是停滞不前的,这里仅仅只是列了一些基础的树枝,我相信在大模型AI井喷爆发的今天,会更快推进数据工程(ETL)的发展。
3.2 检索生成
当我们把所有的知识数据处理完毕,借助大模型来构建一个Chat系统时,信息检索技术则是必然要用到的
从这里我们好像发现,做RAG,无非就是做搜索?
在目前的RAG检索的技术体系中,最普遍的无非两种:关键词和向量语义检索
- 关键词检索:基于类似BM25这类词频倒排技术,通过统计关键词的方式来执行搜索,缺点是无语义信息
- 向量语义检索:通过将所有知识片段通过BERT等预训练语言模型进行表征提取,表示为多维的向量数据,通过KNN/ANN算法搜索获取结果。
当然,在目前的很多向量数据库中间件中,这两类检索引擎都得到了支持,或者是混合检索也是一种重要的技术手段。
在整个检索生成的过程中,这棵树同样关注的技术细节也非常的多,如下:
- Prompt工程:和大模型对话,技术人员必须掌握的Prompt工程,通过FewShot、CoT、ZeroShot等技术,针对不同的业务场景能发挥重大的作用,开发人员需要根据具体的业务场景来调试,同时也是和大模型对接,解决幂等性的重要手段
- LLM大模型:glm3/4、百川、千问、月之暗面、gpt3.5、gpt4等等大模型,在不同的场景、能力各有侧重,进行深度的业务调试/适配同样重要。
- 检索召回过程处理:多轮对话、查询重写、多跳、多路召回、子查询等等,伴随业务场景的深入,每一个Chain的环节保证稳定可靠,不是轻松的事
- 中间件:系统稳定高可用、可扩展离不开中间件的支持,如缓存、消息队列、向量数据库、图数据库等等都是必不可少的
- More:....
在检索生成的这棵树上,和数据工程密切配合不可分割,都是在降低大模型幻觉的道路上深挖技术细节。
4. 技术&产品领导驱动商业的发展
做RAG这类AI应用开发以来,感受最深的是和之前做产品/项目并不相同,一方面是技术栈发展较新,新技术带来的技术变革存在非常大的挑战,有了大模型之后,需求&想法也是五花八门,另外,目前的AI应用,我觉得更多的是技术&产品来领导驱动商业的发展,这和普通软件企业的开发流程或许有所不同。
这里我觉得几点非常重要:
- 新AI技术的迅速发展必然革新之前的软件流程和开发过程,在思想层面是必须转变的。
- 大模型幻觉很严重,通过RAG技术解决幻觉做60分很容易,但是把底层的能力提升到80分甚至90分,是非常难的事情,这需要一个长期累积迭代的过程。
- 企业客户不会为了一个只有60-70分的技术产品买单付费,对待软件编码、技术架构实现,开发人员在思想上也是需要转变的。
我们团队内部经过这段时间的迭代,也碰了很多客户的需求,团队的方向也是在发展中不断的进行调整。
我们在成立TorchV AI时,整体架构如下:
我们以RAG技术为核心,在上层做我们的中间件层,这里面最核心的三个:
主要核心问题聚焦在降低大模型幻觉、不同数据源连接上面
- TorchV IC(幂等分类器):让既定的事实数据发挥更大比重,引入尽可能多的幂等,对抗和降低LLM的幻觉;
- TorchV Actuator(执行器):优化TorchV特有风格的输出格式,包括交互界面的组装,对应用更友好;
- TorchV Connector(连接器):连接本地数据,有序解决本地化场景下数据多样性和复杂性问题.
通过RAG技术+中间件的方式,开发出了我们的第一个产品基线TorchV Bot。通过持续的产品迭代和不同客户需求碰撞,我们的TorchV Bot基线产品的架构也初步成型。如下图:
主要组件拆分如下:
- RAG和Agent:RAG(检索增强生成)和Agent是目前大语言模型落地到企业应用的事实标准,也是TorchV AI的核心中间件之一;
- Tenant:租户系统,这是我们支起多租户PaaS/SaaS平台的基础;
- OSS:在线文件存储,包括客户上传的文件,以及从URL中导入的数据等;
- ChatBot:TorchV AI会提供一个默认的Web版问答系统,客户可以在上面对知识进行测试,对于内部使用场景,也可以直接使用;
- 数据&洞察分析:对数据进行分析,包括客户预先设定的一些洞察条件,一旦触发条件,就会进行指定动作,如产品和服务的推荐,咨询分流等。客户在这里也可以对数据进行同步,导入到自己的系统,作为数据分析的数据基础;
- 知识库管理:创建知识库,为每个知识库上传和导入文件,一旦上传,文件立即被系统处理,变成chunk(小块文本)和embedding之后的向量数据等;
- 运营后台:包括计费系统、各类参数配置、对话记录查看和标注、用户权限设置和反馈处理等功能;
- 应用中心:一个客户即可创建多个应用,然后通过API对接自己的原有系统,或者根据API创建新应用。除了API之外,我们还提供一键嵌入的对接方式,只需引入几行js代码,即可在客户的Web应用上开启悬浮icon,提供TorchV AI的对话能力。
以上则是目前TorchV的产品雏形,更多细节可以访问官网:https://www.torchv.com
5. 架构&编程语言的选择
随着大模型LLM的爆火,很多开发者在选择开发RAG系统应用时,会可能无法着手。
起初在开发RAG应用的时候,我也纠结过编程语言的选择,在这期间走了很多的弯路,也得到了一些教训。
TorchV.AI的产品目前选择是Java+Python作为服务端的开发语言。
这里面有以下几个原因:
- 员外和我都是多年的Java语言开发出生,从编码、生态等方面的了解程度,那自然是不可能抛弃Java
- Python语言是无可避免的,但是在整个工程里面,职责是有分工的,无状态的一些逻辑操作都通过Python来实现
- 企业级开发语言以及技术组件生态
- 中间件丰富程度、开发社区的健康发展
下图是我画的一个Java
VS Python
这两个编程语言在不同领域的一些特性对比。
目前市面上开发RAG大模型应用最火的当属LangChain
、LlamaIndex
这两个框架,都是Python
语言进行开发,提供了开箱即用的功能,可能在不超过10行代码的情况下,就能轻松完成一个RAG大模型应用的demo。
我们起初也是在纠结在这期间如何更好的做取舍,后来团队内部经过讨论,还是将部分的业务逻辑放在Java语言中,重写RAG过程中的一些核心逻辑和组件。
这里面的思考:
- RAG架构涉及到的东西多且杂,开箱即用的LLM数据处理框架可能无法满足企业的业务诉求(需求变化多端)
- RAG目前并没有发展成为HTTP规范一样的协议约定,所以不同的RAG过程、LLM模型等都会导致RAG的效果差异
- 国内LLM百花齐放,无法开箱即用,国内的不同需求也需要满足(本地化适配)
结合在开发RAG应用中涉及到的数据工程等部分逻辑,我们结合两大语言的特性,也能很轻松的勾画出一张便语言级别的架构图,涵盖了在企业开发、业务场景落地时,如何快速的适配上层应用的需求。如下图所示:
在这张图中,我们可以清晰的看到,不同的任务&需求,职责分工是比较明确的。
- Java:使用Java生态时,针对业务系统的数据一致性,分布式、鉴权、限流等企业应用接口的特性开发,目前都有非常成熟的解决方案
- Python:涉及到无状态的服务时,支撑上层应用的处理,包括数据工程、Chat模型、数据处理、微调等系统工程,那么用Python是毫无疑问的
在这里,当我们使用应用开发时,挑选编程语言来开发应用服务,优先考虑的是生态和稳定性。
当然,这里面并没有唯一的标准,根据自己的实际情况出发来选择是最优的,以上仅仅只是分享一下我的看法。
6. 总结
好了,全文完,做一个总结:
- RAG、LLM等AI产品的开发是日新月异的,技术栈体系会飞速发展,对于公司而言,小步快跑,快速试错可能是非常重要的
- 应用场景目前仅仅只是聚焦在知识密集型任务,未来随着技术的发展,会扩展到更多的行业中。
TorchV.AI目前是刚起步阶段,也欢迎更多的企业客户试用,合作!!!
如果您有商务合作需求:
请扫码添加以下微信(员外TorchV),并请您告知您的称呼 和 企业名称 。
我们的官网地址:https://www.torchv.com
如果你也在关注大模型、RAG检索增强生成技术,欢迎关注我(公众号:八一菜刀)
7. References
创业:大模型RAG系统三个月的开发心得和思考的更多相关文章
- 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00
武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...
- PowerDesigner 学习:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- PowerDesigner 15学习笔记:十大模型及五大分类
个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...
- python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导
来源公式推导连接 https://blog.csdn.net/qq_36387683/article/details/88554434 关键词:灰色预测 python 实现 灰色预测 GM(1,1)模 ...
- 千亿参数开源大模型 BLOOM 背后的技术
假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...
- DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...
- 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发
[序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- Mac系统cocos2dx + android 开发环境配置
Mac系统cocos2dx + android 开发环境配置 /****************************************************** 这遍文章主要转载自:htt ...
- LED大屏发布系统
开发LED大屏发布系统已经有5.6年里了,可以根据专家.用户的要求进行布置,所有的数据都是通过TCP通讯获得的,所有的显示项目都是通过配置文件进行设置的,所以系统运行效率高.灵活.界面丰富多彩等.
随机推荐
- SpringBoot使用令牌桶算法+拦截器+自定义注解+自定义异常实现简单的限流
令牌桶 在高并发的情况下,限流是后端常用的手段之一,可以对系统限流.接口限流.用户限流等,本文就使用令牌桶算法+拦截器+自定义注解+自定义异常实现限流的demo. 令牌桶思想 大小固定的令牌桶可自行以 ...
- yum源配置脚本
# yum源配置脚本 #!/bin/bash mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bac ...
- 【Azure App Service】当App Service中使用系统标识无法获取Access Token时
问题描述 App Serive上的应用配置了系统标识(System Identity),通过系统标识获取到访问Key Vault资源的Access Token.但这次确遇见了无法获取到正常的Acces ...
- 【Azure 环境】标准版 Logic App 如何查看 Workflow的执行成功数和失败数的指标呢?
问题描述 在Azure中创建逻辑应用(Logic App),有两种计划类型.一是消费型,另一种是标准型. 在消费型的Logic App Metrics页面中,我们可以看见Workflow的执行成功数指 ...
- 2023 年值得一读的技术文章 | NebulaGraph 技术社区
在之前的产品篇,我们了解到了 NebulaGraph 内核及周边工具在 2023 年经历了什么样的变化.伴随着这些特性的变更和上线,在[文章]博客分类中,一篇篇的博文记录下了这些功能背后的设计思考和研 ...
- nginx设置访问账号密码
第一:为kibana加上了用户登陆访问 第二:不暴露服务器上5601端口,只开放80端口即可.这对服务器的安全也是一个很大的保护. 接下来我们就开始配置nginx与kibana. 一.配置nginx ...
- CPNtools协议建模安全分析---实例(三)
对于复杂的系统的建模或者协议的建模,各种颜色集的定义以及变量的声明很重要,要区分明确,对于函数行业进程的定义更加复杂.CPN对协议的描述只适合简单逻辑性的协议分析,如果协议包括复杂的算法,那么CPN就 ...
- 【规范】看看人家Git提交描述,那叫一个规矩
前言 缘由 没想到玩了多年git,竟然还有提交描述规范 事情起因: 在工作迭代过程中,偶然发现同组小帅哥Git提交描述总是和自己的不大一样,秉承好奇至上的我特意去研究了下.竟然发现提交了这么多年的Gi ...
- centos python3虚拟环境
为什么需要虚拟环境? 在使用 Python 语言时,通过 pip(pip3)来安装第三方包,但是由于 pip 的特性,系统中只能安装每个包的一个版本.但是在实际项目开发中,不同项目可能需要第三方包的不 ...
- import.meta.globEager('./src/components/**/*.vue'); 遍历文件
main.js const importAll = (modules) => { Object.keys(modules).forEach((key) => { const compone ...