最近刚从太初元碁举办的「Teco-RAG 大模型开发任务挑战赛」出来,很遗憾没有获奖。上图是前 5 名的初赛成绩,下图是前 30 名的初赛成绩,我排 28 名,60.6 分,优秀奖的获奖线是 64.4 分,可以看出前 3 名的分数是有断层的,分数集中在 60-69 的区间内:
这个比赛还是很有实践意义的,因为它的关键点在于使用的是去年发布的 Qwen-7B-Chat,没错,不是 Qwen,也不是 Qwen2.5,而是去年发布的 Qwen!这个比赛的目的是为了探索通过工程化的方案使用低成本的开源模型开发 RAG,它的基座模型的能力相对于现在最新的模型差距较大,需要用工程化方案进行约束。
而我做出的优化只有两点:
- 修改 text_splitter 默认参数:chunk_size=640,chunk_overlap=64,small_chunk_size=192;
- 增加 BM25 检索召回,使用 jieba 的搜索引擎模式进行分词;
这两个优化从最开始的 40 分提高到了 60 分,不过当时由于对混合多路检索理解还不够,在后续的学习中,我发现稀疏检索 BM25 的检索数量(即 top_k)应该设置更大一些,与稠密检索(Embedding 向量检索)之间的比例应该是 3: 1,我当时在 BM25 设置的 top_k 是 5 条,在验证很多答案的时候,发现没有召回正确的文档片段。
由于 RAG 是明年我的重点工作方向之一,所以我需要重新思考。今年转入大模型应用开发,主要是 Agent、RAG 和 Fine-tuning 三个大方向,现在对 RAG 的理解还不够深刻,因此准备从零构建一个完整的 RAG 框架,也就是 Build RAG from scratch step by step。
标准的 RAG 流程还是比较简单的:
之前粗略地看过一篇《四万字长文巨献,一文读透RAG》的文章,当然细节太多了,也没有看完。RAG 应用有一句话:「一周出 demo,半年用不好」,整个流程实际上有很多可以优化的地方:
这里面我在学习的时候,忽略了一个很关键的环节,评估(Evaluation):不能在提交方案的时候才进行评估,事实上在每个新增功能和优化策略的时候,都应该进行评估!在 RAG 开发的过程中,需要经常跑测试,得到类似如下图片:
根据 Anthropic 的 Introducing Contextual Retrieval 这篇文章,实际上很多优化策略是无效的,如果没有一个合理的评测流程,会陷入大量的无用功。
这里我找到了 Ragas, 一个专门针对于 LLM 应用效果评估的库,根据文档 Testset Generation for RAG 和论文 Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena,以及「Teco-RAG 大模型开发任务挑战赛」的参赛经历,我决定接下来的评估策略如下:
使用最新的大模型(比如 GPT-4o、Gemini-2.0-Flash、GLM-4-Plus 等)针对不同的文档(金融、计算机等)生成评估测试集,使用较早版本的大模型(比如 Qwen-7B-Chat、Llama-2-7B-Chat、GLM-4-Air 等)进行 RAG 策略调试。
以上是我目前对 RAG 框架的思考,我正在基于 RapidAI 的 Knowledge-QA-LLM 项目进行开发,欢迎加入 ROADMAP 讨论:https://github.com/RapidAI/Knowledge-QA-LLM/pull/24。