如果有一段很长的文档,包含以下内容
...以上省略若干段文字 ... abc 的指导思想如下: 一、要大力 xxxxxxx 二、要加强 xxxxxxx 三、要促进 xxxxxxx 四、要发挥 xxxxxxx 五、要改革 xxxxxxx 六、要总结 xxxxxxx 七、要克服 xxxxxxx ... ...以下省略若干段文字 依我去前写过的 rag demo 测试来看,在 chunking 阶段,按一定长度切开后向量化存储,那每个 chunk 向量之间已经没关联了,再使用关键字与每个 chunk embedding 后的向量得到最佳相似度的结果,比如:
- 提问:“促进 xxxx 的具体方案在哪里提出的?”,可能会匹配到包含"三、要促进 xxxxxxx"的 chunk ,但其它未包含相关关键字的结果就不在其中了。
- 提问:“abc 的指导思想是什么?”,也并不能得到全部的一~七的答案。
也搜索到了有一些优化方案(结合 ai ,可能有幻觉):
- 其于语义切割:智能 chunk size ,大概就是不固定 chunk size ,而是一点点增加字符,并立即向量化,存储向量化结果至数组,当检测到添加的新向量和之前的差异超过一个阈值时,切开;
- 层次化切割(如 RAPTOR):在以上基础上,对 chunk 进行聚类并生成摘要,在有必要的时候,可再对生成的摘要聚类形成摘要; 未经测试,只依靠我的意想,"二、要加强 xxx" 也未必就一定和 "三、要促进 xxx"向量相近被聚类?(可能我举的例子不好,实际情况下,不一定都是以“要 xxx”开头)
其它方案:
- GraphRAG:去年有试过,但是存在问题,对一篇长文太费 token ,而且慢;尝试使用本地模型( qwen2.5:14b )什么都跑不出来。
- HippoRAG: 刚搜索到的,看其 github 各项指标均比 GraphRAG 好,未尝试
疑问:
-
这个需求是不是不适合用 RAG 来做,在上下文长度不够时,有其它方法吗?就算上下文够,llm 真的能在这么大的上下文中准确无误的提取?
-
使用 rag 的话,使用层次化切割这种方案看起来不错,比如:形成 abc 的指导思想 | | | 一、 二、 三、 这种结构,检索时可以一层层由上向下展开,由下向上溯源。 但是搜了相关 RAPTOR RAG github repo ,看 star 数并不理想(几十),故对这种方案的真实实用性存疑。
-
如果还涉及一些总结性的提问,关键词可能在原文未涉及,在检索这一步使用相似度比对得到相关向量结果肯定不理想,又有什么好的方案?
题外话: RagFlow: 未针以上场景测试过,但 docker 搭建玩了一下,忘了放着不管,大概 1 个月后竟然把磁盘写满了(有一个 1.5T 的报错日志,全是 redis 未连接上的)
