(四)基于文本的QA问答系统——biencoder方法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

biencoder方法

加载预训练模型

我们使用Muennighoff/SGPT-125M-weightedmean-msmarco-specb-bitfit预训练模型。

tokenizer = AutoTokenizer.from_pretrained("Muennighoff/SGPT-125M-weightedmean-msmarco-specb-bitfit",cache_dir = './SGPT-125M-weightedmean-msmarco-specb-bitfit')
model = AutoModel.from_pretrained("Muennighoff/SGPT-125M-weightedmean-msmarco-specb-bitfit",cache_dir = './SGPT-125M-weightedmean-msmarco-specb-bitfit')

获得query、doc的初始、结束标识符编码

SPECB_QUE_BOS = tokenizer.encode("[", add_special_tokens=False)[0]
SPECB_QUE_EOS = tokenizer.encode("]", add_special_tokens=False)[0]

SPECB_DOC_BOS = tokenizer.encode("{", add_special_tokens=False)[0]
SPECB_DOC_EOS = tokenizer.encode("}", add_special_tokens=False)[0]

分词并编码

def tokenize_with_specb(texts,is_query):
    # Tokenize without padding
    batch_tokens = tokenizer(texts, padding=False, truncation=True)
    # Add special brackets & pay attention to them
    for seq, att in zip(batch_tokens["input_ids"], batch_tokens["attention_mask"]):
        if is_query:
            seq.insert(0, SPECB_QUE_BOS)
            seq.append(SPECB_QUE_EOS)
        else:
            seq.insert(0, SPECB_DOC_BOS)
            seq.append(SPECB_DOC_EOS)
        att.insert(0, 1)
        att.append(1)
    # Add padding
    batch_tokens = tokenizer.pad(batch_tokens, padding=True, return_tensors="pt")
    return batch_tokens

获得词嵌入结果

def get_weightedmean_embedding(batch_tokens, model):
    # Get the embeddings
    with torch.no_grad():
        # Get hidden state of shape [bs, seq_len, hid_dim]
        last_hidden_state = model(**batch_tokens, output_hidden_states=True, return_dict=True).last_hidden_state

    # Get weights of shape [bs, seq_len, hid_dim]
    weights = (
        torch.arange(start=1, end=last_hidden_state.shape[1] + 1)
        .unsqueeze(0)
        .unsqueeze(-1)
        .expand(last_hidden_state.size())
        .float().to(last_hidden_state.device)
    )

    # Get attn mask of shape [bs, seq_len, hid_dim]
    input_mask_expanded = (
        batch_tokens["attention_mask"]
        .unsqueeze(-1)
        .expand(last_hidden_state.size())
        .float()
    )

    # Perform weighted mean pooling across seq_len: bs, seq_len, hidden_dim -> bs, hidden_dim
    sum_embeddings = torch.sum(last_hidden_state * input_mask_expanded * weights, dim=1)
    sum_mask = torch.sum(input_mask_expanded * weights, dim=1)

    embeddings = sum_embeddings / sum_mask

    return embeddings

计算相似度

query_embeddings = get_weightedmean_embedding(tokenize_with_specb(queries, is_query=True), model)
doc_embeddings = get_weightedmean_embedding(tokenize_with_specb(docs, is_query=False), model)

# Calculate cosine similarities
# Cosine similarities are in [-1, 1]. Higher means more similar
cosine_sim_0_1 = 1 - cosine(query_embeddings[0], doc_embeddings[0])
cosine_sim_0_2 = 1 - cosine(query_embeddings[0], doc_embeddings[1])
cosine_sim_0_3 = 1 - cosine(query_embeddings[0], doc_embeddings[2])

小结

分词、词嵌入、计算向量相似度,这是一种很朴素的方法,在大多数简单问题上性能表现优良。但是考虑到由于独立进行编码,因此被模型重点考虑的是句子的语义相似度而不是逻辑关系

【NAACL 2021】AugSBERT:用于改进成对句子评分任务的 Bi-encoder 数据增强方法 论文地址:https://arxiv.org/abs/2010.08240目前,最先进的 NLP 架构模型通常重用在 Wikipedia 和 Toronto Books Corpus 等大型文本语料库上预训练的 BERT 模型作为基线。通过对深度预训练的 BERT 进行微调,发明了许多替代架构,例如 DeBERT、RetriBERT、RoBERTa ……它们对各种语言理解任务的基准进行了实质性改进。在 NLP 中的常见任务中,成对句子评分在信息检索、问答、重复问题检测或聚类等方面有广泛的应用。 阅读详情

相关推荐

Bi-Encoder vs. Cross-Encoder

Bi-Encoder 和 Cross-Encoder 是两种常见的模型架构,主要用于自然语言处理NLP)中的文本匹配、问答、检索等任务。它们的主要区别在于如何处理输入文本以及计算相似度的方式。独立编码:两个文本分别通过编码器(如 BERT)生成各自的向量表示。相似度计算:通过计算两个向量的点积、余弦相似度等方式,得到文本之间的相似度分数。1.2 优点高效:由于两个文本的编码是独立的,可以预先计算并缓存文档的向量表示,适合大规模检索任务。

撑一把纸伞,等一位佳人 1629

NLP Bi-Encoder和Re-ranker(引流:Cross Encoder 交叉编码器 ReRanker)

如何将BI和Cross Encoder配合使用?可以先用BI-Encoder选出top 100个候选项,再用Cross-Encoder挑选最佳选项。

duoyasong5907的博客 3043

Bi-Encoder 与 Cross-Encoder 全解析:原理、对比与实战模型推荐

Bi-Encoder 是一种将 Query 和 Document 分别编码为向量的架构,通常用于大规模语义检索任务。Cross-Encoder 将 Query 和 Document 拼接后,一起输入到一个 Transformer 模型中,进行整体编码与匹配打分。应用场景推荐使用方式大规模语义检索Bi-Encoder + 向量数据库小规模高质量排序高性能企业RAG系统。

Harry的博客 3460

论文笔记之《Pre-trained Language Model for Web-scale Retrieval in Baidu Search》

预训练语言模型在百度搜索中的应用

Transfer 1791

()基于文本的智能QA问答系统——项目进展1

面向问题的信息检索系统 1、查找关键词抽取算法 ​ 尝试了textRank和FastTextRank抽取算法 ​ 跑通了textRank ​ 实现截图: 2、实现段落分割 3、实现简单python和java通信 基于预训练模型的文档语义检索系统 1、实现hugging face预训练模型加载 2、crossencoder方法实现 注意分数越大,相关度越高,第三条相关度最高,经人工检验符合要求。 3、测试不同的prompt 4、biencoder方法实现 第三条是最符合qu

m0_56927733的博客 864

Location Aware Modular Biencoder for Tourism Question Answering

传统的方法是对每个问题和POI的配对进行编码,但当候选项数量增加时,这种方法变得低效,不适用于实际应用。为了解决这个问题,作者提出了一个名为Location Aware Modular Biencoder(LAMB)的模型,它将问答任务视为一个密集向量检索问题,通过利用嵌入空间相似性来检索与问题最相关的POI。首先使用容易和中等难度的负样本进行模型的预热训练,然后切换到使用中等和困难负样本的混合进行训练。:首先使用容易和中等难度的负样本进行模型的预热训练,然后切换到使用中等和困难负样本的混合进行训练。

步子哥的博客 403

DPR进阶技巧:负采样策略与硬负例挖掘的深度优化

Dense Passage Retriever(DPR)作为开源域问答任务的核心工具,其性能高度依赖于负采样策略的设计与硬负例挖掘的质量。本文将系统解析DPR中负采样的实现机制,提供硬负例优化的实用技巧,帮助开发者提升模型检索精度。 ## 负采样基础:从随机到策略性选择 DPR的负采样机制在[train_dense_encoder.py](https://link.gitcode.com/i/

gitblog_01139的博客 571

强化RAG:微调Embedding还是LLM?

拥有一个好的RAG应用程序需要一个由优秀的软件工程师组成的团队来开发前端和可扩展的后端,优秀的数据工程师来处理用于开发RAG的数据管道和多个数据库,一些优秀的机器学习工程师+数据科学家开发模型并对文本块、Embedding性能、良好的数据检索方法进行实验,然后合成数据、路由器、代理等。如前所述,微调不仅可以提高基本模型的性能,而且较小(微调)的模型通常可以在训练它的任务集上胜过较大(更昂贵)的模型。因此,已经完成了Embedding的微调,如上所述,微调Embedding有助于提高数据检索的准确性。

qingkahui24689的博客 961

Bi-Encoder vs Cross-Encoder

维度Bi-Encoder编码方式查询和文档独立编码查询和文档联合编码计算效率高,适合大规模检索低,适合小规模精细排序语义交互较弱强,捕捉细粒度上下文关系适用场景大规模语义搜索、实时响应精准排序、重排序、语义匹配计算资源需求低高结合实际需求,合理选择或结合使用Bi-Encoder和Cross-Encoder,能够在效率与准确率之间取得最佳平衡。以上内容基于多篇权威资料总结整理,并结合官方示例代码进行演示,便于理解和应用。

Turbo.AI,专注AI工程化 1893

Bi-Encoder 和 Cross-Encoder

可以使用一个两阶段的查找流水线,首先使用 bi-encoder 快速高效的检索一个结果候选列表;然后使用 cross encoder 去重排序这些最相关的结果。多级搜索管道可受益于 bi-encoder 的高效检索方法和 cross-encoder 的高精确度,从而在大规模数据集上进行有效搜索。结合 Bi-Encoder 和 Cros-Encoder 来提高 RAG 流水线。

weixin_46034279的博客 1064

RAG检索模型选型:Bi-Encoder、Cross-Encoder、SPLADE与ColBERT的技术对比

本文解析RAG系统中Bi-Encoder、Cross-Encoder、SPLADE与ColBERT的核心机制,探讨如何平衡高召回与高精准。通过多阶段架构组合稀疏与稠密检索,实现高效准确的语义搜索。

deephub 949

【AI 大模型】RAG 检索增强生成 ⑧ ( 文本相似度排序 | Bi-Encoder 双编码器 | Cross-Encoder 交叉编码器 )

一、文本相似度排序 1、向量数据库查询弊端 2、二次排序的必要性 2、相似度排序模型 3、Bi-Encoder 双编码器 4、Cross-Encoder 交叉编码器 5、结合使用 6、Bi-Encoder 双编码器 与 Cross-Encoder 交叉编码器 对比 二、Bi-Encoder 双编码器 用法实例 三、Cross-Encoder 交叉编码器 用法实例 1、Cross-Encoder 交叉编码器 实现原理 4、Cross-Encoder 交叉编码器 代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1万+

Bi-Encoder vs Cross-Encoder:如何选择最适合你的语义搜索模型?

本文深入解析了Bi-Encoder和Cross-Encoder在语义搜索中的原理与实战应用,帮助开发者在检索速度与结果精度之间找到最佳平衡。通过对比分析、性能指标评估及中文场景推荐方案,为模型选型提供实用指南,特别适合需要优化语义搜索系统的工程师。

weixin_29051193的博客 248

RAG系统文本检索优化:Cross-Encoder与Bi-Encoder架构技术对比与选择指南

本文将深入分析这两种编码架构的技术原理、数学基础、实现流程以及各自的优势与局限性,并探讨混合架构的应用策略。

deephub 1475

NLP: SBERT介绍及sentence-transformers库的使用

bi-encoder是一种独立编码方式,即输入的两个文本会被分别编码为独立的向量,然后通过计算这两个向量的相似度来判断文本之间的关系。Sentence-BERT(简写SBERT)模型是BERT模型最有趣的变体之一,通过扩展预训练的BERT模型来获得固定长度的句子特征,主要用于句子对分类、计算两个句子之间的相似度任务。三元组网络架构的SBERT模型的任务计算出一个特征,使锚定句和正向句之间的相似度高,锚定句和负向句之间的相似度低。在SBERT中,通过汇聚所有标记的特征来计算整个句子的特征。

读万卷书 行万里路 3904

2022年几款前沿的文本语义检索/Sentence Embedding方法:Gradient Cache, SGPT,ART,DPTDR,RocketQAv2, ERNIE-Search等

上面的一些工作都是最近调研的比较有代表性的工作,其中包含了百度的一些工作,因为百度在搜索领域有着得天独厚的优势,我也使用了一些RocketQA等系列的模型,在学术和工业落地场景上都有着不错的效果,除了这些工作外还有SimLM,ColBERTv2等工作。更多关于语义检索方向的内容讲解,请参考本栏目后续的文章,如果有不懂的内容,请留言,我随即为大家安排上哈。

Learning from the mistakes 2531

Cross-Encoder(交叉编码器)和 Bi-Encoder(双编码器)

摘要: Cross-Encoder(交叉编码器)和Bi-Encoder(双编码器)是NLP中处理文本匹配的两种模型。Bi-Encoder通过独立编码双文本生成向量后计算相似度,适合大规模检索(高效但精度较低);Cross-Encoder联合编码双文本,利用交叉注意力捕获细粒度交互,精度高但计算成本大,适用于精细匹配。实际应用中常结合两者:先用Bi-Encoder快速筛选候选,再用Cross-Encoder重排序以平衡效率与精度。

Cachel Wood的博客 718

检索模型bi-encoder笔记

检索模型bi-encoder笔记

enthan809882的博客 81

实体链指(2)EL:Disambiguation-Only

本篇主要了介绍了Disambiguation-Only实体链指任务的具有代表性的2篇论文:《Neural Cross-Lingual Entity Linking》和《Scalable Zero-shot Entity Linking with Dense Entity Retrieval》

小白的专栏 971
上一篇: (三)基于文本的QA问答系统——SGPT:GPT Sentence Embeddings for Semantic Search解读
下一篇: (五)基于文本的QA问答系统——corss-encoder方法
Simonsdu
博客等级 码龄7年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值