【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本身。

相关推荐
花千树-0106 小时前
MCP 协议通信详解:从握手到工具调用的完整流程
ai·langchain·aigc·agent·ai agent·mcp
Rubin智造社6 小时前
安全先行·自主编程|Claude Code Opus 4.7深度解读:AI开发进入合规量产时代
人工智能·anthropic·claude opus 4.7·mythos preview·xhigh努力等级·/ultrareview命令·自主开发ai
xinlianyq6 小时前
全球 AI 芯片格局生变:英伟达主导训练,国产算力崛起推理
人工智能
ShineWinsu7 小时前
AI训练硬件指南:GPU算力梯队与任务匹配框架
人工智能
范桂飓7 小时前
精选 Skills 清单
人工智能
码农的日常搅屎棍7 小时前
AIAgent开发新选择:OpenHarness极简入门指南
人工智能
AC赳赳老秦7 小时前
OpenClaw生成博客封面图+标题,适配CSDN视觉搜索,提升点击量
运维·人工智能·python·自动化·php·deepseek·openclaw
萝卜小白7 小时前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
geneculture7 小时前
从人际间性到人机间性:进入人机互助新时代——兼论融智学视域下人类认知第二次大飞跃的理论奠基与实践场域
人工智能·融智学的重要应用·哲学与科学统一性·融智时代(杂志)·人际间性·人机间性·人际间文性
GeeLark7 小时前
Android 16 is here. 行业首发
ai·自动化·aigc