Search for documents with similar texts

news2024/10/6 2:27:27

题意:搜索具有相似文本的文档

问题背景:

I have a document with three attributes: tags, location, and text.

我有一份文档,包含三个属性:标签、位置和文本。

Currently, I am indexing all of them using LangChain/pgvector/embeddings.

目前,我正在使用 LangChain/pgvector/embeddings 对所有这些进行索引。

I have satisfactory results, but I want to know if there is a better way since I want to find one or more documents with a specific tag and location, but the text can vary drastically while still meaning the same thing. I thought about using embeddings/vector databases for this reason.

我目前的结果令人满意,但我想知道是否有更好的方法,因为我想找到具有特定标签和位置的一个或多个文档,但文本可能变化很大而意思仍然相同。出于这个原因,我考虑过使用嵌入/向量数据库。

Would it also be a case of using RAG (Retrieval-Augmented Generation) to "teach" the LLM about some common abbreviations that it doesn't know?

是否也可以利用 RAG(检索增强生成)来“教授”大型语言模型(LLM)一些它不知道的常见缩写呢?

import pandas as pd

from langchain_core.documents import Document
from langchain_postgres import PGVector
from langchain_postgres.vectorstores import PGVector
from langchain_openai.embeddings import OpenAIEmbeddings

connection = "postgresql+psycopg://langchain:langchain@localhost:5432/langchain"
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
collection_name = "notas_v0"

vectorstore = PGVector(
    embeddings=embeddings,
    collection_name=collection_name,
    connection=connection,
    use_jsonb=True,
)


# START INDEX

# df = pd.read_csv("notes.csv")
# df = df.dropna()  # .head(10000)
# df["tags"] = df["tags"].apply(
#     lambda x: [tag.strip() for tag in x.split(",") if tag.strip()]
# )


# long_texts = df["Texto Longo"].tolist()
# wc = df["Centro Trabalho Responsável"].tolist()
# notes = df["Nota"].tolist()
# tags = df["tags"].tolist()

# documents = list(
#     map(
#         lambda x: Document(
#             page_content=x[0], metadata={"wc": x[1], "note": x[2], "tags": x[3]}
#         ),
#         zip(long_texts, wc, notes, tags),
#     )
# )

# print(
#     [
#         vectorstore.add_documents(documents=documents[i : i + 100])
#         for i in range(0, len(documents), 100)
#     ]
# )
# print("Done.")

### END INDEX

### BEGIN QUERY

result = vectorstore.similarity_search_with_relevance_scores(
    "EVTD202301222707",
    filter={"note": {"$in": ["15310116"]}, "tags": {"$in": ["abcd", "xyz"]}},
    k=10, # Limit of results
)

### END QUERY

问题解决:

There is one primary unknown here, what is the approximate or average number of tokens in the "text" part of your input.

这里有一个主要的未知因素,即你输入中“文本”部分的大致或平均token数是多少。

Scenario 1: You do not have a very long input (say, somewhere around 512 tokens)

场景1:你的输入不是很长(大约512个token左右)

In this case, to get better results, you can train your own "embedding-model", please look at my answer here which has some info around it.

在这种情况下,为了获得更好的结果,你可以训练自己的“嵌入模型”。请参考我之前的回答,其中有一些相关信息。

Once you get right embedding model, you index corresponding text vectors in you RAG pipeline. There are a couple of other steps as well which are applicable to all the scenarios, so, I will add them at the end.

一旦你获得了合适的嵌入模型,你就可以在你的RAG管道中索引相应的文本向量。还有一些其他步骤适用于所有场景,因此,我将在最后添加它们。

Scenario 2: You have a very long input per document, say, every "text" input is huge (say, ~8000 tokens, this number can be anything though). In this case you can leverage symbolic search instead of vector search. Symbolic search because, in any language, to describe something which really means the same or has similar context, there will surely be a lot of words overlap in source and target text. It will be very rare to find 10 pages text on a same topic that does not have a lot of work overlap.

场景2:每个文档的输入都非常长,例如,每个“文本”输入都很大(大约8000个标记,尽管这个数字可以是任何数)。在这种情况下,你可以利用符号搜索而不是向量搜索。之所以选择符号搜索,是因为在任何语言中,为了描述具有相同含义或相似上下文的内容,源文本和目标文本中肯定会有很多词汇重叠。很难找到关于同一主题但文字重叠不多的10页文本。

So, you can leverage symbolic search here, ensemble it with vector based validators and use an LLM service that allows long context prompts. So, you find some good candidates via symbolic searches, then, pass it on the long context LLM to for remaining parts.

因此,你可以在这里利用符号搜索,将其与基于向量的验证器结合使用,并使用允许长上下文提示的大型语言模型(LLM)服务。首先,通过符号搜索找到一些好的候选文档,然后将其传递给长上下文LLM以处理剩余部分。

Steps Applicable to all the scenarios:        适用于所有场景的步骤:

1. You json object should also contain "tag", "location" along with "text" and "vector"

你的JSON对象应该同时包含“tag”(标签)、“location”(位置)、“text”(文本)和“vector”(向量)

{"text":"some text",
"text_embedding":[...], #not applicable in symbolic search

"location":"loc",
"tags":[]
}

2. This way, when you get matches from either vector search or symbolic search; you will further able to filter or sort based on other properties like tags and location

这样,当你从向量搜索或符号搜索中获得匹配项时,你将能够基于其他属性(如标签和位置)进行进一步的过滤或排序。

Please comment if you have more doubts!        如果你还有更多疑问,请随时评论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lua: 轻量级多用途脚本语言

Lua 是一种高效而轻量级的脚本语言,具备强大的扩展性和灵活性,广泛应用于游戏开发、嵌入式系统、Web 应用等多个领域。本文将深入探讨 Lua 的特性、应用场景以及如何使用 Lua 进行开发。 1. Lua 的起源与发展 Lua 的发展始于上世纪90年代初,…

GPT-5:AI新时代的领航者与我们的未来

一、引言:GPT-5的崭新时代 在科技的浪潮中,人工智能(AI)领域正迎来一个崭新的纪元。GPT-5,作为OpenAI的最新成果,无疑将成为这个新时代的领航者。从GPT-1到GPT-4,我们见证了AI在自然语言处理领域…

零基础开始学习鸿蒙开发-页面导航栏布局设计

1.设定初始页(Idex.ets) import {find} from ../pages/find import {home} from ../pages/home import {setting} from ../pages/setting Entry Component struct Index {private controller: TabsController new TabsController()State gridMargin: number 10State gridGut…

开源分享:一套完整的直播购物系统源码

直播购物已经成为一种炙手可热的电商模式,吸引了无数商家和消费者的目光。对于开发者来说,构建一个功能齐全、用户体验优良的直播购物系统是一项复杂的任务。本文将分享一套完整的直播购物系统源码,帮助开发者快速搭建自己的直播购物平台。 …

决策树划分属性依据

划分依据 基尼系数基尼系数的应用信息熵信息增益信息增益的使用信息增益准则的局限性 最近在学习项目的时候经常用到随机森林,所以对决策树进行探索学习。 基尼系数 基尼系数用来判断不确定性或不纯度,数值范围在0~0.5之间,数值越低&#x…

IDEA中Maven配置依赖和排除依赖

目录 依赖配置 添加依赖的几种方式: 1.利用中央仓库搜索的依赖坐标 2.利用IDEA工具搜索依赖 3.熟练上手maven后,快速导入依赖 排除依赖 依赖配置 依赖:指当前项目运行所需要的jar包。一个项目中可以引入多个依赖: 例如&am…

ASP.NET Core 6.0 使用 Action过滤器

Action过滤器 在ASP.NET Core中,Action过滤器用于在执行Action方法之前或之后执行逻辑。你可以创建自定义的Action过滤器来实现这一点。 继承 ActionFilterAttribute 类: [TypeFilter(typeof(CustomAllActionResultFilterAttribute))]public IActionRe…

李秘书专业写作:关于晋升受阻或不公待遇的申诉(范文)

李秘书专业写作:关于晋升受阻或不公待遇的申诉(范文) 尊敬的公司领导: 您好! 我谨以此信向公司提出申诉,关于我在近期晋升职位时遭受的不公待遇。我深感自己的辛勤付出和优异业绩未得到应有的认可&#…

Python逻辑控制语句 之 判断语句--if 嵌套

1.if 嵌套介绍 在⼀个if(elif else) 语句中 嵌套另⼀个 if(elif else ) 语句判断条件存在递进关系才会使⽤. 即 只有第⼀个条件成⽴,才会判断第⼆个条件 应用场景:在之前条件满足的前提下 ,再增加额外的判断 2.if 嵌套语法 if 判断条件1: 判断条件1成立…

【Kubernetes学习】

K8S基础概念一 一、k8s是什么?二、k8s功能三、k8s组件四、k8s概念总结 一、k8s是什么? kubernetes,简称k8s,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本…

昇思25天学习打卡营第7天|linchenfengxue

Vision Transformer图像分类 1.Vision Transformer(ViT)简介 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由…

Zynq7000系列FPGA中的DMA控制器简介(二)

AXI互连上的DMA传输 所有DMA事务都使用AXI接口在PL中的片上存储器、DDR存储器和从外设之间传递数据。PL中的从设备通过DMAC的外部请求接口与DMAC通信,以控制数据流。这意味着从设备可以请求DMA交易,以便将数据从源地址传输到目标地址。 虽然DMAC在技术…

pdf拆分,pdf拆分在线使用,pdf拆分多个pdf

在数字化的时代,pdf文件已经成为我们日常办公、学习不可或缺的文档格式。然而,有时候我们可能需要对一个大的pdf文件进行拆分,以方便管理和分享。那么,如何将一个pdf文件拆分成多个pdf呢?本文将为你推荐一种好用的拆分…

033基于SSM+Jsp的多用户博客个人网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

Java----面向对象----总复习

面向对象 面向对象的程序设计思想(Object Oriented Programming),简称OOP.是一种设计者思想.关注的焦点是类,参照现实中的事务,将事务的属性特征,行为抽象出来,用类来表示.代码结构:以类为组织单位,每种事务都有自己的属性和行为,功能, 思想:从宏观上 帮助我们把握,整体分析整…

独家原创 | Matlab实现CNN-Transformer多变量时间序列预测

SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-Transformer多变量时间序列预测; 2.运行环境为Matlab2023b…

理解论文笔记:基于贝叶斯网络和最大期望算法的可维护性研究

看了与上一篇研究方向一致的文章,上一篇19年的,这一篇22年的更新。若有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了使用贝叶斯网络和历史数据对无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了总结。 本文的其余部分组织如下:第二节论述…

对数函数转换公式

对数函数换底公式. 1. 2. 3. 以上公式可以由以下公式推导而来, 1. 2. 3. 4.

【Python系列】列表推导式:简洁而强大的数据操作工具

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Avue框架学习

Avue框架学习 我们的项目使用的框架是 Avue 在我看来这个框架最大的特点是可以基于JSON配置页面上的From,Table以及各种各样的输入框等,不需要懂前端就可以很快上手,前提是需要多查一下文档 开发环境搭建 由于我本地的环境全是用docker来搭建的,所以我依然选择用docker搭建我…