Search for documents with similar texts

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

问题背景:

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 pdfrom langchain_core.documents import Document
from langchain_postgres import PGVector
from langchain_postgres.vectorstores import PGVector
from langchain_openai.embeddings import OpenAIEmbeddingsconnection = "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 QUERYresult = 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.mzph.cn/web/36981.shtml

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

相关文章

快速了解《大模型赋能下的AI2.0数字人平台》白皮书

在生成式AI和大模型的赋能下,数字人迎来AI 2.0时代。它能否成为每个人的“数字分身”,转化为新型的AI劳动力工具?商汤科技与上海市人工智能技术协会、零壹智库、增强现实核心技术产业联盟联合发布《大模型赋能下的AI 2.0数字人平台》。《白皮…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(二)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 1.1 何为 D3.js?1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形 ✔️ 第一部分【第二部分】✔️第三部分(精译中 ⏳) 1.2.3 Canvas 与 WebGL&#x…

读AI新生:破解人机共存密码笔记16对人工智能的治理

1. 愚蠢的、情绪化的人类 1.1. 与完美理性所设定的不可企及的标准相比,我们都是极其愚蠢的,我们受制于各种情绪的起伏,这些情绪在很大程度上支配着我们的行为 1.2. 为了充分了解人类的认知,我们(或者更确切地说&…

ORA-01775: 同义词的循环链问题

一、问题描述 ORA-01775: 同义词的循环链问题 二、 原因分析 同义词对应的对象(表等)已删除,不存在了。 可能原因: 删除数据库对象,但是忘记删除同义词。删除一个用户,但忘记删除此用户中相关的同义词…

@Param参数

Param参数 当方法参数大于两个的时候必须传递,只有一个的时候可以不传。大于两个的时候也可以用#{arg0}和#{arg1}。。。来取值 Param()括号里面的值对应sql语句中 # {} 里面的值 看AI的解释

模版方法模式详解:使用和实现的指南

目录 模版方法模式模版方法模式结构模版方法模式适合应用场景模版方法模式优缺点练手题目题目描述输入描述输出描述题解 模版方法模式 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步…

《昇思25天学习打卡营第3天|张量 Tensor》

文章目录 前言:今日所学:1. 创建张量2. 张量的属性3.张量索引与运算4. NumPy与Tensor的转换5. 稀疏张量 前言: 张量?张亮?张量是什么? 张量是一个可以用来表示在一些矢量、标量和其他张量之间的线性关系的…

leetcode 第133场双周赛 100333.统计逆序对的数目【计数dp/滚动数组/前缀和优化】

分析: 先考虑如下问题。 求长度为n,逆序对为m的排列数量。 可以考虑dp,dp[i][j]定义为长度为i,逆序对为j的排列数量。 dp[1][0] 1; //枚举排列长度,或者认为枚举当前需要插到长度为i-1的排列中的数字 for(int i 1…

OpenAI封杀不支持地区API:违规封号,7月9日生效

OpenAI 在检测用户使用其 API 的地区后,提示所有不支持位置的用户 昨晚,很多大模型应用的开发者、程序员都收到了 OpenAI 的警告信,心里一惊。 OpenAI 在检测用户使用其 API 的地区后,提示所有不支持位置的用户:即将封…

图书管理系统(附源码)

前言:前面一起和小伙伴们学习了较为完整的Java语法体系,那么本篇将运用这些知识连串在一起实现图书管理系统。 目录 一、总体设计 二、书籍与书架 书籍(Book) 书架(Booklist) 三、对图书的相关操作 I…

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中,如果你看到“该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的”这样的提示,通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤: 解决办法:…

kali/ubuntu安装vulhub

无须更换源,安装docker-compose apt install docker.io docker -vdocker-compose #提示没有,输入y安装mkdir -p /etc/docker vi /etc/docker/daemon.json #更换dockerhub国内源┌──(root㉿kali)-[/home/kali/vulhub-master/tomcat/CVE-2017-12615] …

dledger原理源码分析系列(三)-选主

简介 dledger是openmessaging的一个组件, raft算法实现,用于分布式日志,本系列分析dledger如何实现raft概念,以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的选主 关键词 Raft Openmessaging 心跳/选…

Linux安装redis教程(超级详细,新手必看)

环境: Centos 7.9 一、安装准备工作 1.配置gcc 安装redis前需要配置gcc: yum install gcc如果配置gcc出现依赖包问题,可以到主页查看帖子解决:https://blog.csdn.net/m0_59117906/article/details/134451622?spm1001.2014.300…

这四款软件很好用,可以提升工作、学习效率

TableConvert TableConvert是一个基于Web的在线表格转换工具,能够将多种格式的表格数据进行快速转换。它支持将Excel、URL、HTML、JSON、CSV等格式转换为Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用户只需将表格数据粘贴到编辑器&#…

本教程将指导如何通过 Vue 组件和后端 API 交互

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

CJSON库

目录 一、介绍 1、JSON是什么 2、为什么使用CJSON 3、JSON格式 二、使用CJSON构造JSON 1、创建对象 2、添加字段 3、转换格式 4、释放对象 三、使用CJSON解析JSON 1、解析数据 2、 获取字段 3、释放对象 一、介绍 1、JSON是什么 JSON是什么呢?JSON全称…

折半查找详解

一:折半查找概念 折半查找(也称为二分查找)是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;如果目标值大于或小于中间元素&#x…

SSM网上旅游信息管理系统-计算机毕业设计源码06975

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

微信小程序毕业设计-垃圾分类系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…