【AIGC】AI如何匹配RAG知识库: Embedding实践,语义搜索

ops/2024/10/18 11:45:40/

引言

RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式,我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中Embedding是非常重要的手段。本文将带你简单地了解AI工具都是如何通过Embedding去完成语义分析匹配的。

Embedding技术简介

Embedding是一种将高维数据映射到低维空间的技术。在NLP中,Embedding通常用于将单词、句子或文档转换为连续的向量表示。这些向量不仅保留了原始数据的关键信息,还能够在低维空间中捕捉到语义上的相似性。

简单来说,就是机器无法直接识别人类的语言,所以需要通过Embedding去转化成机器能够理解和处理的数值形式。比如:"猫"和"狗"由于都是动物,所以它们的Embedding向量在空间上比较接近,而"猫"和"书"由于语义上没有直接关系,所以它们的Embedding向量在空间上距离较远。机器就是通过这样去理解人类语言的。
在这里插入图片描述

RAG知识库与Embedding的结合

RAG(Retrieval-Augmented Generation)是一种结合了检索和生成的模型架构。在RAG中,知识库的匹配是至关重要的一环。传统的匹配方法通常依赖于关键词匹配,这种方法在处理复杂语义时往往表现不佳。

通过使用Embedding技术,我们可以将知识库中的文档和查询语句转换为向量表示。这样,我们就可以利用向量之间的相似度来实现更精确的匹配。具体来说,我们可以通过计算查询向量与知识库中每个文档向量的余弦相似度,来确定最相关的文档,也就是类似上面提到的通过计算能用"猫"匹配出"狗",而不是"书"。

而通过这个我们就可以用用户输入的句子去匹配我们的数据库找到最相关的文档,从而实现RAG。

在这里插入图片描述

实践案例:Embedding在RAG知识库匹配中的应用

现在我们来做个简单的实践帮助大家去理解Embedding在RAG知识库匹配中的应用。

embedding_21">使用Qwen的embedding模型

import dashscope
from http import HTTPStatus
import numpy as np# 设置Qwen API密钥
dashscope.api_key = 'sk-xxx'def embed_text(text):"""将输入的文本转换为嵌入向量Args:text (str): 需要转换的文本Returns:list: 文本的嵌入向量Raises:Exception: 如果获取嵌入向量失败,抛出异常"""resp = dashscope.TextEmbedding.call(model=dashscope.TextEmbedding.Models.text_embedding_v2,input=text)# 检查响应状态码,如果成功则返回嵌入向量if resp.status_code == HTTPStatus.OK:return resp.output['embeddings'][0]['embedding']  # 提取嵌入向量else:raise Exception(f"Failed to get embedding: {resp.status_code}")def cosine_similarity(vec1, vec2):"""计算两个向量之间的余弦相似度Args:vec1 (list): 第一个向量vec2 (list): 第二个向量Returns:float: 两个向量之间的余弦相似度"""dot_product = np.dot(vec1, vec2)  # 计算点积norm_vec1 = np.linalg.norm(vec1)  # 计算第一个向量的范数norm_vec2 = np.linalg.norm(vec2)  # 计算第二个向量的范数return dot_product / (norm_vec1 * norm_vec2)  # 返回余弦相似度def calculate_similarity(text1, text2):"""计算两个文本之间的相似度Args:text1 (str): 第一个文本text2 (str): 第二个文本Returns:float: 两个文本之间的余弦相似度"""embedding1 = embed_text(text1)  # 获取第一个文本的嵌入向量embedding2 = embed_text(text2)  # 获取第二个文本的嵌入向量return cosine_similarity(embedding1, embedding2)  # 返回两个文本的余弦相似度if __name__ == '__main__':text1 = '一起去运动吧'text2 = '一起去踢足球吧'text3 = '一起去坐飞机吧'# 计算文本1和文本2之间的相似度similarities1 = calculate_similarity(text1, text2)# 计算文本1和文本3之间的相似度similarities2 = calculate_similarity(text1, text3)# 打印相似度结果print(f"Similarity1: {similarities1} \nSimilarity2: {similarities2}")

结果:

Similarity1: 0.6644462831108588 
Similarity2: 0.49586189950477266

可以看到Similarity1 是高于 Similarity2的,说明text1(运动)更匹配与text2(踢足球),假设text1是用户输入的输入,text2和text3是知识库,我们通过embedding后计算用户输入与知识库各个文档的余弦值,就可以匹配出text2与用户输入更相关(运动与踢足球更相关,而不是坐飞机),从而将对应文档输出出来。

当然,这样相当于使用整句进行对应的语义分析,实际RAG匹配过程中还涉及到很多技术,比如:语义检索、关键词检索、双路召回,双检索占比配置等。之后文章会再详细介绍。

用spacy进行Embedding

我们可以尝试直接用spacy库进行embedding,并计算相似度。

import spacynlp = spacy.load('zh_core_web_sm')def contains_phrase_nlp(text, phrase):doc = nlp(text)phrase_doc = nlp(phrase)for sent in doc.sents:similarity = phrase_doc.similarity(sent)return similarityif __name__ == '__main__':text1 = '一起去运动吧'text2 = '一起去踢足球吧'text3 = '一起去坐飞机吧'similarities1 = contains_phrase_nlp(text1, text2)similarities2 = contains_phrase_nlp(text1, text3)print(f"Similarity1: {similarities1} \nSimilarity2: {similarities2}")

结果:

Similarity1: 0.8225547086542833 
Similarity2: 0.8069693841904839

结果并不是很明显,第一组没有比第二组多,仅做一种方法参考。现在的例子比较简单,如果遇到复杂语义,可能效果会更好。

总结

Embedding技术在匹配RAG知识库中扮演着至关重要的角色。本文我们主要用Embedding进行语义匹配,之后文章会带来更丰富的方法。本文实践能够帮助各位更好地理解Embedding技术在RAG知识库匹配中的应用,以及Embedding本身。


http://www.ppmy.cn/ops/126464.html

相关文章

【系统架构设计师】案例专题六(8大系统架构设计之8): 大数据架构设计考点梳理

更多内容请见: 备考系统架构设计师-核心总结目录 文章目录 一、传统数据处理系统存在的问题二、大数据处理系统架构分析1、大数据处理系统面临挑战2、大数据处理系统架构特征三、Lambda架构1、Lambda架构对大数据处理系统的理解2、Lambda架构应用场景3、Lambda架构介绍4、Lamb…

人脸识别-特征算法

文章目录 一、LBPH算法1.基本原理2.实现步骤3.代码实现 二、Eigenfaces算法1.特点2.代码实习 三、FisherFaces算法1.算法原理2.算法特点3.代码实现 四、总结 人脸识别特征识别器是数字信息发展中的一种生物特征识别技术,其核心在于通过特定的算法和技术手段&#xf…

java幂等控制问题

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

华为OD机试 - 幻方修复(Java 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

【算法】力扣:K个一组反转链表

前置知识 数据结构-链表反转部分链表算法题的手写栈使用 难度: 初阶:使用容器, 难度中等。进阶:纯coding修改指针 ,难度中等,虽然leetcode是困难题。不过更加注重细节。 题目:反转 k 组中的…

“vue : 无法加载文件 D:\nodejs\node_global\vue.ps1,因为在此系统上禁止运行脚本”的解决方法

用VS Code来直接创建vue项目时,出现了以下错误,导致创建失败: 于是按照错误提示去查看了下出错原因:是因为PowerShell的执行政策阻止了该操作。用 Get-ExecutionPolicy 查看发现执行策略为受限状态: 解决方法如下&am…

ESP32-IDF USART 专题

目录 一、基本介绍1、配置结构体1.1 uart_config_t1.2 uart_intr_config_t1.3 uart_event_t 2、常用 API2.1 驱动相关2.1.1 uart_driver_install2.1.2 uart_driver_delete2.1.3 uart_is_driver_installed 2.2 中断相关2.2.1 uart_clear_intr_status2.2.2 uart_enable_intr_mask…

实践甘肃数据挖掘挑战赛作物与杂草的智能识别,基于YOLOv7全系列【tiny/l/x】参数模型开发构建田间低头作物杂草智能化检测识别模型

一、背景 田间杂草的有效管理是现代农业生产中面临的重要挑战之一。杂草不仅竞争作物的养分、 水分和阳光,还可能成为害虫和病原体的寄主,从而降低农作物的产量和品质。因此,开发 高效、精确的杂草检测和管理系统对于提高农业生产效率、降低化…