rag系统中,如果召回的文本里有一个超链接,要怎么办?

这事很容易发生在拥有联网搜索功能的rag上,或者文档之间非独立的情况。例如现在要处理的是一份年终报表,数据要从其他地方摘,主文档会给出大量超链接指向其他目标文档,又不直接指出在哪一页哪一行。

对于报表这个例子,我的想法是:每当rag遇到一个超链接时,应该带着“我想要获得某个信息”的问题去解析对应的超链接文档,因此通过LLM和超链接的附近的上下文来提取问题是很重要的操作。然后可以分解迭代地解析或者你够nb直接把整个文档塞进去解析都行,让llm“大海捞针”摘出问题对应需要的信息。这就完成了对超链接的处理。

对于联网搜索类rag,例如kimi,它的顶部会有这些过程信息:理解问题、搜索网页、已阅读xx个网页。网页后面有的还带时间。
显然,kimi先拆解了我提出的问题并生成搜索关键字,这些关键字去搜索后返回大量链接,kimi要实时分析这些链接。我不觉得kimi需要处理链接中的链接,那样就无底洞了,第一层信息已经足够回答大多数问题了。
kimi阅读网页的顺序很有趣,有时间的排名更靠前,说明rerank中时间很重要,而且检索来源应该设置了过滤器,对于某类问题,需要在某些特定网站平台搜索结果,例如我搜索batchnorm和layernorm实际应用中的性能差距,kimi搜索了batchnorm性能 和 layernorm性能 这两个词,12个网页来自:pytorch官方文档、csdn、百度智能云、百度开发者中心、极市开发者平台。唯一的pytorch官方文档位居第一,即使它只有layernorm的信息,这肯定是因为对网站有针对某搜索关键字的相关度or可信度的记录。
说回正题。kimi解析每个网页的时间不同,肯定是在针对我的query做实时内容抽取,12个网页抽取完再编上号码汇总,且在回答每一点时(kimi和其他模型都喜欢把答案拆成几个点回答),模型被训练在特定位置输出特殊的引用token,以指向该句话or该论点的编号来源。以上是我的观察,结论是kimi对于超链接的处理仍然是带着问题去抽取和解析可能存在答案的文本(类似于摘要),而不是启用rag功能先chunk后embedding再recall再解析recall文档。且一个细节是kimi不直接输出表格,这个功能还不稳定,用户体验差,因此它在总结时会用自然语言描述表格的信息。

提供的参考引用中未提及RAG召回文本中图片的方法相关内容。不过一般而言,在RAG召回文本中图片可以考虑以下常见方法: ### 基于元数据关联 在文档处理阶段,为图片添加详细的元数据,如图片标题、描述、关键词等。在召回时,将用户的查询与这些元数据进行匹配。例如,如果用户查询“苹果公司的标志图片”,系统可以搜索元数据中包含“苹果公司”和“标志”的图片记录。这种方法简单直接,但依赖于元数据的准确性和完整性。 ### 视觉特征匹配 使用计算机视觉技术提取图片的视觉特征,如颜色直方图、SIFT特征、深度学习提取的特征向量等。在召回时,将用户的文本查询转化为特征向量,然后与图片的特征向量进行相似度计算。例如,使用预训练的卷积神经网络(CNN)提取图片的特征,再通过余弦相似度等方法来找到与查询最匹配的图片。 ### 多模态嵌入 将文本和图片映射到同一个多模态嵌入空间中,使得语义相近的文本和图片在该空间中的距离较近。在召回时,将用户的文本查询嵌入到该空间,然后搜索空间中距离最近的图片嵌入。这种方法可以更好地捕捉文本和图片之间的语义关联,但需要大量的多模态数据进行训练。 ### 基于文本 - 图片对齐模型 利用专门的文本 - 图片对齐模型,如CLIP(Contrastive Language - Image Pretraining),该模型可以学习文本和图片之间的关联。在召回时,使用CLIP模型计算用户文本查询与图片之间的相似度得分,根据得分进行排序和召回。 ```python import torch import clip from PIL import Image # 加载CLIP模型 device = "cuda" if torch.cuda.is_available() else "cpu" model, preprocess = clip.load("ViT-B/32", device) # 定义文本查询 text_query = "一只可爱的猫" text_inputs = clip.tokenize([text_query]).to(device) # 加载图片 image_path = "cat_image.jpg" image = preprocess(Image.open(image_path)).unsqueeze(0).to(device) # 计算文本和图片的特征 with torch.no_grad(): text_features = model.encode_text(text_inputs) image_features = model.encode_image(image) # 计算相似度 text_features /= text_features.norm(dim=-1, keepdim=True) image_features /= image_features.norm(dim=-1, keepdim=True) similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1) print(f"文本查询与图片的相似度: {similarity.item()}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值