前几天看了港中深的graphrag,看到ToG实现的还相对挺复杂的,所以有兴趣再重新读一下ToG2的代码
基本思路从这里就可以看出来:
* ToG1是让模型在图上自行探索,每次探索一跳的子图,然后让模型做prune实体/关系,最终得到结果
* ToG2相比于ToG1的点在于做entity prune的时候,会加上context来对entity打分。然后在每次reason的时候,也会带上这次得分高的chunk context
看实现的话,核心在:
* para_rank_topk中,这里会把每个实体对应的chunk,都和问题计算一个相关性得分
* 这里有多种方法,比如bm25, colbert, bi encoder, cross encoder
* 保留得分最高的topk个chunk,然后综合计算得分
* 每一个实体的得分是对应的chunk的得分加上一个排名的衰减,排名越高相对得分就越高
*
* 这里相关的chunk也会被放到实体的信息中返回出去,然后再做rerank,用于强化模型后续的问答
这里有一个值得思考的点,就是如果图上面是混合了提取出来的关系图,以及原始的chunk/doc的话,是不是用ToG1的思路就可以自动做到ToG2的事情了。
更延伸一点,究竟是关系图单独使用,然后我们手动附加chunk信息,还是让模型自己去探索。
* 可能又是一个bitter lesson的问题了
还有一个可以想的点,是每一轮问答,针对一条链单独做处理呢,还是这个多跳的过程是一起处理的呢。多跳一起处理的话,可能还涉及到上下文长度的问题,可能很容易就拉到过多的上下文了。
文章评论