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

相关推荐
星爷AG I6 小时前
12-9 社会记忆(AGI基础理论)
人工智能·agi
田里的水稻6 小时前
EP_基于UWB和单线激光雷达的托盘转送
人工智能·算法·数学建模·机器人·自动驾驶
隔壁大炮6 小时前
08. PyTorch_张量基本创建方式
人工智能·pytorch·python
pen-ai6 小时前
【Yolo系列】 评价指标
人工智能·yolo·目标跟踪
ZWZhangYu6 小时前
【LangChain专栏】LangChain模块中Chains 链的使用
人工智能·langchain
GuokLiu6 小时前
260223-Gartner Hype Cycle 2026 AI 报告调研与解读
人工智能
量子-Alex6 小时前
【大模型综述】Large Language Models: A Survey
人工智能
艾醒(AiXing-w)6 小时前
打破信息差——2月22日AI全景:算力理性、视频革命、安全合规,行业正式进入下半场
人工智能
天一生水water6 小时前
MCP入门教程
人工智能·microsoft
土拨鼠烧电路6 小时前
笔记08:供应链的生命线:预测、库存与韧性
人工智能·笔记