这几天有个需求是把传统RAG(naive rag)改成主动式RAG(Agentic RAG),原因是因为传统RAG只能进行简单的语义检索,无法进行条件式的数据筛选。
在前面的文章也简单介绍过传统RAG和主动RAG的区别,前者基于语义相似性,后者基于数据处理;前者是静态的,后者是动态的。
举例来说就是,我问社保和社保数据是不一样的;前者是问与社保相关的政策和基本常识,后者是问我交了多少钱,能领多少补助。
一个是问概念,一个是查数据。
理解智能体
之所以写这篇文章的原因,作者本来是想趁周末把主动式RAG的功能给搞个初版出来,然后后面能够轻松一点;但等到真正去做的时候,突然发现自己好像不知道智能体是什么了;虽然从概念上知道智能体是模型和工具的结合体,但从实际操作上突然不知道该怎么下手了。
这种现象也不是第一次出现,在之前也出现过了解一个新的技能时刚开始感觉自己什么都学会了,想通了但突然有一天发现好像什么都忘了,然后过段时间又慢慢回想起来了,这时你发现对这项技能的理解都不一样了。
这可能就是人生三境界中的看山是山——看山不是山——看山又是山吧。
之所以突然搞不明白的原因是,因为业务场景比较复杂,既需要条件查询也需要相似度查询;但为了保证召回率,好像又都需要。这时使用工具和不使用工具好像并没什么区别了。
使用工具的目的本来就是想更准确的召回数据,但如果召不回,那还要工具干嘛。
然后这个问题想了一天都没想明白,本来想的是再想不明白就先动手做一下,因为很多事情是想不明白的,但做着做着就明白了。
但今天晚饭后出门散步,也可能是因为心情放松了,然后改进思路就打开了。
从业务上来说,我需要的是智能体能够更准确的召回数据;但从技术上来说,智能体只是一个让大模型使用工具的技术栈。
而从运行流程上来讲,大模型用来理解和分析用户问题,并且根据工具的定义来选择合适的工具并生成参数。
因此,主动式RAG的核心是让模型选择合适的工具,并且这个工具能够返回准确的数据。
然后我们虽然能尽量告诉模型选择哪个工具,但我们无法决定模型选择哪个工具;因此,我们只能尽量保证工具返回数据的质量,所以这就是我们解决问题的突破口。
怎么让工具召回更高质量的数据呢?
那就是使用更好的查询方式,比如条件查询肯定会比相似度查询更准确。
智能体的核心是工具,大模型只负责决定调用哪个工具,以及调用工具的参数,而大模型最终生成的效果是由工具返回的数据质量决定的。

