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

引言

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知识库匹配中的应用。

使用Qwen的embedding模型

python 复制代码
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}")

结果:

text 复制代码
Similarity1: 0.6644462831108588 
Similarity2: 0.49586189950477266

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

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

用spacy进行Embedding

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

python 复制代码
import spacy

nlp = 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 similarity

if __name__ == '__main__':
    text1 = '一起去运动吧'
    text2 = '一起去踢足球吧'
    text3 = '一起去坐飞机吧'
    similarities1 = contains_phrase_nlp(text1, text2)
    similarities2 = contains_phrase_nlp(text1, text3)
    print(f"Similarity1: {similarities1} \nSimilarity2: {similarities2}")

结果:

text 复制代码
Similarity1: 0.8225547086542833 
Similarity2: 0.8069693841904839

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

总结

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

相关推荐
命里有定数19 分钟前
Paper -- 洪水深度估计 -- 利用图像处理和深度神经网络绘制街道照片中的洪水深度图
图像处理·人工智能·dnn·洪水深度·高度估计
Guofu_Liao29 分钟前
大语言模型中Softmax函数的计算过程及其参数描述
人工智能·语言模型·自然语言处理
非自律懒癌患者30 分钟前
Transformer中的Self-Attention机制如何自然地适应于目标检测任务
人工智能·算法·目标检测
IT闫35 分钟前
使用微信小程序调用飞桨PaddleX平台自行训练的模型——微信小程序用训练的牡丹花模型Demo测试
人工智能·paddlepaddle
程序员X小鹿1 小时前
AI视频自动剪辑神器!点赞上万的影视剧片段,一键全自动剪辑,效率提升80%!(附保姆级教程)
aigc
Jurio.1 小时前
Conda 管理项目环境
人工智能·python·深度学习·conda·virtualenv·pip
曼城周杰伦1 小时前
自然语言处理:第六十二章 KAG 超越GraphRAG的图谱框架
人工智能·pytorch·神经网络·自然语言处理·chatgpt·nlp·gpt-3
Donvink1 小时前
多模态大语言模型——《动手学大模型》实践教程第六章
人工智能·深度学习·语言模型·自然语言处理·llama
Joyner20181 小时前
pytorch训练的双卡,一个显卡占有20GB,另一个卡占有8GB,怎么均衡?
人工智能·pytorch·python
我爱学Python!1 小时前
解决复杂查询难题:如何通过 Self-querying Prompting 提高 RAG 系统效率?
人工智能·程序人生·自然语言处理·大模型·llm·大语言模型·rag