RAG的一些思考与细节
Langchain needle in haystack 实验
长上下文之后,越后面的部分的事实性细节越容易找,尤其是多事实的情况下
引发的一个思考是 rerank 时是否需要将最关注的块放在 prompt 的最后面,也就是倒序?
- 后补: 但其实又有attention sink相关的研究,可能还是需要具体任务具体测试分析

Maybe recency bias in LLMs:只记得最近的了
No retrieval guarantees

query analysis:将 question 联系到正确的文档
routing (to right DB)
full doc -> summary -> embedding: doc 中噪声非常大, summary 是必要的,语义层次的保留 level 通过 prompt 保证
self-reflection 听起来很美好,但实际常常用不到,太慢了,并且搜不出来更多是前期处理没做好,再换着花样也很难搜出来
HyDE 对于高度 Domain Knowledge 和抽象性理解的任务基本没用:
一些自己的解释
- 能否生成正确的假设文档, 难
- 即使通过先行的小批量搜索教导 LLM 根据这些 example 生成假设文档,也很难让 LLM 从这些文档中抽取某个泛化的问题,经常会 过度 specific 而导致后续漏掉文档
- 目前实验下来垂域脏文档类型最好的解决方案还是 reranker,embedder 如果不微调分布太接近了,例如全部的 chunk 都在 0.5~0.6 之间,意义寥寥
和数据分析的结合:
分析波动->(数据分析)找出波动的阶段-> 对每个波动的阶段做查询
GraphRag 这种 KG-based 的方法经常强调“对整个数据集信息的整合”
但这个要分领域,例如,个人知识库之中,这是好的
但垂域的知识文档常常是相似的格式,固定的路由,同时信息的整合关键不在“多实体”的关系上,而是在于“单个实体随时间的变化”上。
又或者说实体关系 本身应该建模成一个包含时间的
如果仅仅是靠新加入的文档来动态更新 KG 的话,滞后性会很强
在这种半结构化的模板式文档中,LLM 实际上在干一个 Fuzzy DB manager, 提取信息,充当一个搜索引擎
利用 KG 进行某种意义上的多跳推理本质上也只是对文档的多次检索,推理跳数越多,关系越复杂,离线生成 KG 就越难,不是所有领域都像是法律一样有一个明确的 A 判例引用 BCD 法条的连接关系的,这样复杂的 KG 在要想随时间变化也更不可能
从某种意义上来说,KG 是在横向生成,而类似金融这种领域的 RAG 做的是纵向的 Timeline, 这部分对于关键实体是有数据的,并且可能数据都不需要自己做(例如各种行情的图),而离线准备好这些 timeline 之后,如何在 timeline 上进行一个跳跃和查询分析才是关键的。
如果从 DB 的角度上分析的话,金融领域这种关注点快速变化的 RAG 系统(with cache)也就相当于 lazy generated timeseries DB 了,例如问了一个 A 的价格变化,就像是生成了一个 time, delta_price, event(detail) 的 timeseries DB 表,把生成 reason 这样的 LLM 工作 lazy 化了而已
chunk 的前总结和后总结(离线在线)
离线总结最大的问题在于总结哪些方面,实际上是文档预处理的一个部分
最简单的方法就是整个提示模板每个 chunk 问一次 LLM,有 langchain 的 map reduce 等稍微 high level 一点的工具可以支持这个事情
对长文档总结更有效一些的做法是利用好 embedding,先对 chunk embedding 做聚类,再每个聚类里面抽几个 chunk, 从而保证多样性和 chunk 数量的平衡
后总结,或者说 query-based 总结大体上是用 LLM 做比较多,但对于时延和开销的增加太高了,一个比较新的方法是 paragraph sentence-level mask bert(自己造的词),在段落中根据 q, d 的交叉编码得到句子级别的二进制掩码,从而删除无关部分。有一篇 ICLR2025 基于 bge 训了个,https://huggingface.co/blog/nadiinchi/provence
provence效果非常好,又快又几乎对齐例如GPT4.1这种顶级模型的效果
另一个思路就是绕过这个问题,切小块,依赖 rerank 和重新合并乃至知识图谱检索之类的策略保证相关性,也就是在查询完之后是合并还是切分的思路差距