多向量检索(ColBERT)
为每个文档建立多个向量(每个令牌或每个分块一个),以实现细粒度匹配。
多向量检索(ColBERT) 是 CoddyKit 上的免费 AI Agents 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Agents 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Agents 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
一个向量并不够
标准 RAG 会将每个片段嵌入为单个向量。该向量包含片段中的所有信息的平均表示,因此会丢失细粒度信号。
多向量检索会为每个文档存储 MULTIPLE 个向量,并进行更加精确的匹配。
ColBERT 思路
ColBERT(Khattab 和 Zaharia,2020 年)会分别嵌入文档中的每个 TOKEN 和查询中的每个词元,然后计算最大相似度:
score(q, d) = sum over q_token in q: max over d_token in d: cos(q_token, d_token)ColBERT 为什么优于单向量
- 能够捕捉文档的多个方面(一个向量无法做到)
- 更好地处理长文档
- 对罕见词的召回率更高
ColBERT 的成本
不再为每个片段存储一个向量,而是为每个词元存储一个向量:
- 如果一个片段包含 500 个词元,存储量就会增加 500 倍
- 每次搜索都要比较更多的向量对
量化和剪枝可以将这一成本降低 10–50 倍,但成本仍然很高。
ColBERTv2
ColBERTv2 增加了残差压缩——将词元聚类到质心中,并将每个词元存储为(质心 ID、小残差)。存储量可降低 50 倍。
运行 ColBERT
RAGatouille 库让这一过程变得简单:
# pip install ragatouille
from ragatouille import RAGPretrainedModel
rag = RAGPretrainedModel.from_pretrained('colbert-ir/colbertv2.0')
rag.index(collection=documents, index_name='my_corpus')
results = rag.search(query='What is the refund policy?', k=5)多向量的实际应用
除了 ColBERT,还有其他多向量方法:
- 父子文档——嵌入小片段,检索较大的父文档
- 摘要 + 片段——同时嵌入文档摘要和各个片段
- 假设问题——为每个文档合成问答对并进行嵌入
Hypothetical Questions Pattern
def index_with_hypos(doc):
# Generate 5 plausible questions this doc could answer
questions = llm.invoke(f'Write 5 questions answered by this doc:\n{doc}').content.split('\n')
for q in questions:
vector_db.add(embed(q), payload={'doc': doc, 'question': q})
# Now queries that match a stored hypothetical question retrieve the doc.Parent-Child with LangChain
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
store = InMemoryStore()
retriever = ParentDocumentRetriever(
vectorstore=child_vectorstore,
docstore=store,
child_splitter=child_splitter, # small
parent_splitter=parent_splitter # large
)
retriever.add_documents(documents)
# Indexes small chunks, returns large parents.何时使用 ColBERT
- 高风险搜索(法律、医疗)
- 长文档
- 能够承担存储成本的场景
何时跳过
- 小型语料库
- 对延迟敏感的路径
- 受成本限制的项目
与 BM25 混合
要获得最高召回率,请将多向量检索与经典的 BM25 关键词搜索结合起来。使用倒数排名融合来合并结果。
ColBERT 的权衡
使用 ColBERT 风格的多向量检索时,主要的权衡是什么?
回顾
每个片段只有一个向量会丢失信息。ColBERT 为每个词元存储向量,以获得更高的精确度。RAGatouille 让这一过程变得简单。在召回率重要且成本允许时使用它。
常见问题解答
「多向量检索(ColBERT)」课时是免费的吗?
是的 — 「多向量检索(ColBERT)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Agents 课程的其余内容,请升级到 CoddyKit PRO。 AI Agents 课程共包含 4 节课。
「多向量检索(ColBERT)」这节课中我会学到什么?
为每个文档建立多个向量(每个令牌或每个分块一个),以实现细粒度匹配。 你通过在浏览器中直接运行的动手代码来练习 AI Agents,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Agents 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Agents 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「多向量检索(ColBERT)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Agents 课中编写并运行代码吗?
能。每节 AI Agents 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用交叉编码器重新排序
- HyDE:假设性文档嵌入
- 多向量检索(ColBERT)
- RAG 评估(RAGAS、Recall@K)