Hannibal046 / nanoColBERT

Simple replication of [ColBERT-v1](https://arxiv.org/abs/2004.12832).
76 stars 13 forks source link

请问下为啥要复现这样一个模型呢? #1

Closed NLPJCL closed 9 months ago

NLPJCL commented 9 months ago

或者请教下作者,在大家都直接优化双塔模型的时代,bge,m3e等。这个模型有什么意义呢?如果直接来排序,可能没交互式的好,如果来检索,又比双塔重一点、

Hannibal046 commented 9 months ago

哈喽你好,我感觉ColBERT这一些系列的工作还是非常有意义的.虽然在检索上会比双塔的慢,但原作者也在不断地优化(ColBERTv2,PLAID). 以及Deepmind的follow-up: XTR, 比ColBERT快了2-3个数量级; Meta的follow-up: CITADEL比原来的ColBERT快了40倍

其次ColBERT的结构本身就决定了效果一定会比双塔的好,同时具有很好的泛化性(BEIR benchmark中唯一优于BM25的dense模型).

虽然目前有些双塔模型优化地非常好(Dragon),但理论上这些trick都能搬到ColBERT上. (但原作者他们重心好像都到DSPy上去了)

最后,其实我也有复现双塔模型,你可以参考这个nanoDPR

NLPJCL commented 9 months ago

感谢回答~有空再认真看下。

NLPJCL commented 9 months ago

您好,请教您一个细节问题,ColBERT v1,在端到端的检索topk个文档的时候,论文中是先为query中的每个token去检索k'个doc。请问下 1.query检索的时候,是如何检索的呢?单向量的检索,就直接用query的整个向量和库里所有的doc的向量计算内积即可。这里doc的每个token都有向量。那么是怎么为query中的单个token,利用faiss检索到对应的doc呢?

Hannibal046 commented 9 months ago

每个query token都取top-k,然后用set去重: https://github.com/Hannibal046/nanoColBERT/blob/f7d069b97697a9b33fae0208036cb3bfeab7ed11/retrieve.py#L113-L122

NLPJCL commented 9 months ago

您好,我想问的是检索的时候是怎么计算相似度的。因为 query这边是一个 token 的一个 向量,而一个 doc 那边有多个 token,是多个向量。其实不了解,doc 做 index 的时候,是每个 token 的向量都存储吗?还是?

---原始邮件--- 发件人: @.> 发送时间: 2024年2月2日(周五) 凌晨0:52 收件人: @.>; 抄送: @.**@.>; 主题: Re: [Hannibal046/nanoColBERT] 请问下为啥要复现这样一个模型呢? (Issue #1)

直接取Top-k: https://github.com/Hannibal046/nanoColBERT/blob/f7d069b97697a9b33fae0208036cb3bfeab7ed11/retrieve.py#L113-L122

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

Hannibal046 commented 9 months ago

对的,每个query和doc都会存多个vector

NLPJCL commented 9 months ago

感谢回复~ 是每个 doc 的每个 token,都存储一个向量吗? query 的 一个 token 的向量在检索时,检索 topk 个 doc 侧的 token,然后对应到具体的 doc 嘛?

感觉这样代价太大了吧,因为相当于 doc 侧要存储,全部 doc 的 token 总数个向量。

---原始邮件--- 发件人: @.> 发送时间: 2024年2月2日(周五) 凌晨0:59 收件人: @.>; 抄送: @.**@.>; 主题: Re: [Hannibal046/nanoColBERT] 请问下为啥要复现这样一个模型呢? (Issue #1)

对的,每个query和doc都会存多个vector

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

Hannibal046 commented 9 months ago

是的,代价相比于single vector retrieval会大

NLPJCL commented 9 months ago

好嘞, respect, 感谢深夜的回复讨论~如果是原始版本这种检索,那感觉工业界不可能应用。

不过 比如 chatpdf 的这种 rag 倒是可以,doc 数据不多, 提前直接把全量 doc 的 emb 抽取存下来。有 query 后,直接对 query 抽 embedding,然后把全量 doc 加载进来,直接计算分值就行。

---原始邮件--- 发件人: @.> 发送时间: 2024年2月2日(周五) 凌晨1:08 收件人: @.>; 抄送: @.**@.>; 主题: Re: [Hannibal046/nanoColBERT] 请问下为啥要复现这样一个模型呢? (Issue #1)

是的,代价相比于single vector retrieval会大

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>