程序员应该熟悉的概念(9)向量相似度(vector similarity)
在之前的文章 嵌入和语义检索 中,我们了解了把文本变成向量的方法,由于这些向量相当于将文本做了分类:语义相近的距离越近,所以这些向量就可以很方便的应用于语义检索场景了。 比较向量相似度(vector similarity)的常见算法主要分为两大类: 1️⃣ 基于“角度/方向”的度量 2️⃣ 基于“距离/差异”的度量 下面我们系统的整理一下。 ...
在之前的文章 嵌入和语义检索 中,我们了解了把文本变成向量的方法,由于这些向量相当于将文本做了分类:语义相近的距离越近,所以这些向量就可以很方便的应用于语义检索场景了。 比较向量相似度(vector similarity)的常见算法主要分为两大类: 1️⃣ 基于“角度/方向”的度量 2️⃣ 基于“距离/差异”的度量 下面我们系统的整理一下。 ...
语义检索是指系统能够理解用户查询的深层含义(语义),而不仅仅是匹配字面关键词。它通过分析上下文、同义词、相关概念等,查找与查询意图最相关的信息,即使文档中没有完全相同的词语。 与关键词检索的区别: 关键词检索:基于字面匹配,查找包含用户输入的特定词语的文档。它不理解词语的含义,因此可能遗漏意思相关但用词不同的内容,或返回用词相同但意思不符的结果。 语义检索:基于意义匹配,理解查询和文档的“意思”。它能找到表达方式不同但含义相近的内容,返回更符合用户真实意图的结果。 简单来说:关键词检索是“找词”,语义检索是“懂意”。 例如:如果用关键词检索“苹果”,那么可能找到我们吃的苹果以及苹果公司的相关信息;而语义检索会考虑检索内容的上下文,它能断定这个苹果是“苹果公司”,所以只会检索“苹果公司”的相关内容出来。 ...
使用本地大模型可以根据需要给文本打标签,本文介绍了如何基于 langchain 和本地部署的大模型给文本打标签。 本文使用 llama3.1 作为本地大模型,它的性能比非开源大模型要查一下,不过在我们可以调整提示词后,它也基本能达到要求。 ...
上一篇文章: 本地大模型编程实战(02)语义检索(1) 详细介绍了如何使用 langchain 实现语义检索,为了演示方便,使用的是 langchain 提供的内存数据库。 在实际工作中,更多的使用场景是将矢量化的数据物理存储下来,在查询的时候在从存储介质中读取矢量数据进行查询,不会每次使用矢量数据时都必须想做嵌入。 本文描述了如何使用 Chroma 对csv数据进行矢量化,并且将矢量存储在硬盘中,未来查询矢量数据时,直接从硬盘中读取矢量数据进行查询。 另外,如果数据量大一些,矢量化数据是很花时间的,我们将使用进度条显示嵌入csv的进度。 ...
我们在百度、必应、谷歌等搜索引擎中使用的检索都是基于字符串的:用户输入字符串后,搜索引擎先对搜索内容进行分词,然后在已经进行了倒排索引的巨大数据库中找出最符合用户要求的结果。 语义检索与其主要的区别是:它根据文本的真正含义进行搜索,其基本思路是将待检索的内容都转变成矢量(这个过程也叫做嵌入),转化矢量的基本原则是:语义相近的内容距离更近、相似性更高。 当用户输入检索内容时,也是先把检索内容变成矢量,然后去矢量数据库中找到最相似的文档。这样检索出来的结果并不依据字面的意思,而是依据语义的相似度。 本文描述了如何使用 langchain 和 大语言模型 以及 矢量数据库 完成pdf内容的语义检索。 在对内容进行矢量化时使用了 nomic-embed-text,这个模型个头小,英文嵌入效果不错。 后面还将涉及到以下内容: 文档和文档加载器 文本分割器 嵌入 向量存储和检索器 ...