RAG学习心得
之前因为协会的需求,也尝试过使用Ollama、AnythingLLM、FastGPT等本地工具来搭建本地的知识库,不过没有特别深入的去了解各环节的策略或者优化方法。
但最近因为可能需要先尝试搭建一个空气类知识库的MVP,所以又深入了解了一下RAG,看了一下LLamaIndex这个框架,才发现之前通过工具来使用RAG的经历,漏掉了RAG中的一些细节和策略,也发现其不是简简单单的开箱即用。所以本文主要是记录我对RAG的学习记录。
基于LLamaIndex这本书里的讲解以及之前看文章记下的笔记,尝试对RAG的各个环节中的流程或者策略选择进行一个大致的补全如下:
1. 数据处理
- 结构化、非结构化
- 分段(分隔符、分段大小)
- 重叠窗口
- 元数据提取
2. 创建索引
- 创建摘要
- 为了减少数据量或提高检索效率
- 但在某些场景下可能会丢失细节信息
3. 向量化数据并存储
- 选择向量模型
- 向量库
- FAISS、Pinecone、Weaviate、Milvus、Chroma
4. 用户查询处理
- 清洗用户输入(去除噪声、标准化拼写、大小写统一等)
- 意图识别、query改写、泛化
- 向量化用户query
5. 检索
- 向量检索
- top k
- 余弦、欧式
- 关键字检索
- 使用倒排索引(如 Elasticsearch、BM25)进行关键词匹配。适用于精确匹配、术语类问题。
- 混合检索
6. 重排序模型
- 需要更精细地评估每个 chunk 与 query 的相关性
- top k
7. 生成回答
- 构建prompt
- 回答优化(Post-processing)
- 去重与合并:避免多个 chunk 提供重复信息。
- 引用标注:标注答案中的信息来源(chunk ID 或原文链接)。
- 事实验证:检查生成内容是否准确(可用外部工具或人工审核)。
- 语气调整:根据应用场景调整正式程度(如客服 vs 技术报告)。
补全下来才发现,在一些工具上使用RAG定制化确实没有代码框架这么多,在公司内部的知识库平台上,甚至可选择的设置仅仅“Top K”,当然平台内部也进行了一些策略,比如“query改写、回答prompt构建”,只是没有面向用户开放自定义而已。
而且类似Coze等平台,确实不需要把过多的参数开放给用户自己调试,毕竟面向的用户本就不是程序员或者一些技术大牛,定位是低代码平台,对于大多数人来说,固定部分的参数,得到较平衡的性能,才是真正的开箱即用。“简单易用”和“灵活定制”确实比较难平衡。
就我自己这个MVP而言,因为工具已经固定了,就是内部的平台,所以在向量化、检索、查询方面已经没法更改了。那么我觉得主要考虑的是数据收集和处理、Top K、prompt构建这三个部分。