Spring AI vs LangChain4J
前面我们介绍过Spring AI和LangChain4j了,同时也介绍过Spring AI Alibaba,在RAG这个章节中我们介绍了关于他们内置的一些分块器、文档处理器等等,也介绍了很多RAG的优化技术,包括元数据过滤、问题改写、查询路由、查询构造、问题澄清、混合检索、HyDE、重排排序等等。 那么,综合来看,我们要做一个RAG,用哪种更合适呢?
✅Spring AI 和 LangChain4J中文档处理功能对比
前面两个章节我们介绍过了Spring AI和LangChain4J中的RAG中文档分段的相关支持,我们把他们放一起做个简单的对比: LLMentor
✅Spring AI 和 LangChain4J的模块化RAG功能对比
前面两个章节我们介绍过了Spring AI和LangChain4J中的模块化RAG的相关支持,我们把他们放一起做个简单的对比: 同样都支持的功能:查询富化、查询重写、查询扩展、以及提示增强部分的功能。 SpringAI中支持,但是Lang LLMentor 上面这2篇文章中,我们介绍过关于Spring AI和LangChain4j中的一些支持的差异,整体看下来,两个的功能差不多,都有些自己的优势,也都有不足的地方。 最终我们选择的是LangChain4j+ Python,主要原因如下: 1、在文档处理中,不管是Spring AI还是LangChain4j,支持的都不够,我们决定都不用,而是用更牛逼的Python,他有很多现成的工具可以帮我们更好的做文档处理。 2、LangChain4J支持混合检索和重排序,而Spring AI不支持,需要我们自己基于他的Advisor机制来实现。
向量数据库
向量数据库有很多选择,包括我们前面讲过的pgvector,在这个项目中,我们换个方案,选择使用ElasticSearch + IK分词器。
因为我们在项目中要用到混合检索,ES本身就同时支持语义相似检索和关键词检索,可以直接用它来做混合检索,就不需要搞两个不同的数据库了。
(当然,其实pgsql也支持全文检索和向量检索的,虽然他的全文检索用的比较少哈,但是也是支持的。所以,如果只用pgvector的话,也不是不能实现,或者你就想用pg+es,也不是不行,其实这块影响不算大,实际写简历的时候可以根据你自己比较熟悉的,或者公司主要用的技术栈来写。)
那么存储方案就是:
向量存储:es
关系型数据存储:mysql
文档内存存储:es
缓存的存储:redis
文件的存储:minio
如果要用pgsql+pgvector的话,也不是不行,那么组合就是:
向量存储:pg
关系型数据存储:pg
文档内存存储:es
缓存的存储:redis
文件的存储:minio
文件存储
我们需要针对文档、图片等等内容做存储,我们选择开源的minio,这个大家都比较熟悉,上手成本低。
关系型数据库
除了需要es来做混合检索以外,我们的应用还需要做一些数据存储的,比如对话信息存储,用户信息存储,权限管理等等,这部分,我们选择使用MySQL,相比于pgsql来说,用户基数更大,熟悉的人更多,SQL更简单一些。
图数据库
图数据库,我们选择neo4j,因为他最牛逼,排名第一。
https://db-engines.com/en/ranking/graph+dbms

其他框架
Spring Boot 我们选择3.5.6,虽然4.0已经出了,但是实测和很多框架存在不兼容问题,没办法,只能用3.5了。 JDK我本地用的JDK 21,建议大家都用这个版本,或者最低也要JDK 17以上。 另外,还用到了myabtis、mybatisplus、fastjson等框架。。。