百度360必应搜狗淘宝本站头条
当前位置:网站首页 > SEO教程 > 正文

【AIGC】AI如何匹配RAG知识库:关键词搜索

gaoyangw 2024-11-05 10:19 15 浏览 0 评论

引言

RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式,我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中,有语义搜索也有关键词搜索,我们这篇文章来用jieba库以及TF-IDF实现关键词搜索RAG。

jieba库简介

jieba(结巴)是一个在Python中广泛使用的分词库,特别适用于中文文本处理。jieba库不仅支持基本的分词功能,还提供了关键词提取、词性标注、命名实体识别等多种功能。在关键词检测领域,jieba库的TF-IDF和TextRank算法被广泛应用于提取文本中的关键词。

TF-IDF简介

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索和文本挖掘的常用加权技术。它通过计算词汇在文档中的频率(Term Frequency, TF)和在整个语料库中的逆文档频率(Inverse Document Frequency, IDF),来评估词汇的重要性和相关性。

TF-IDF的计算公式如下:

简单来说关键词出现的次数越多且存在于其他文档中的频率越低,那么这个关键词就越重要。

实践

我们来模拟用户询问问题,模型根据问题从知识库中检索出相关文档,并根据检索到的文档生成回答。

我们假设用户输出是text1,发到顺丰,text2中是多个文档,以";"隔开,我们使用jieba库实现关键词搜索RAG,搜索text2中最适配text1的文档。

例子

# Example text
text = "发到顺丰"

# Example text2
text2 = "您好,是您拨打的客服电话吗;你好,我的这个货想要通过顺丰去发;订单号发我一下;xxxxxx;好的我这边给您发顺丰"

用jieba库提取关键词

# 切割 text2 并将其作为文档
documents = text2.split(';')

# 提取关键词的函数
def extract_keywords(text):
    return jieba.analyse.extract_tags(text)

# 提取查询关键词
query_keywords = extract_keywords(text)

# 提取文档关键词
documents_keywords = [extract_keywords(doc) for doc in documents]

计算TF-IDF

# 计算查询关键词的词频 (TF)
query_keyword_counts = Counter(query_keywords)

# 总文档数
total_documents = len(documents)

# 计算所有关键词的逆文档频率 (IDF)
all_keywords = set()
for doc_keywords in documents_keywords:
    all_keywords.update(doc_keywords)

keyword_idf = {}
for keyword in all_keywords:
    doc_count_containing_keyword = sum(1 for doc_keywords in documents_keywords if keyword in doc_keywords)
    keyword_idf[keyword] = math.log((1 + total_documents) / (1 + doc_count_containing_keyword)) + 1

# 计算查询关键词的 TF-IDF
query_tfidf = {}
for keyword, count in query_keyword_counts.items():
    tf = count
    idf = keyword_idf.get(keyword, 0)
    query_tfidf[keyword] = tf * idf

# 计算所有文档的 TF-IDF
documents_tfidf = []
for doc_keywords in documents_keywords:
    doc_keyword_counts = Counter(doc_keywords)
    doc_tfidf = {}
    for keyword, count in doc_keyword_counts.items():
        tf = count
        idf = keyword_idf.get(keyword, 0)
        doc_tfidf[keyword] = tf * idf
    documents_tfidf.append(doc_tfidf)

计算文档和查询相似度

# 计算余弦相似度
def cosine_similarity(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum(vec1[x] * vec2[x] for x in intersection)
    sum1 = sum(vec1[x] ** 2 for x in vec1)
    sum2 = sum(vec2[x] ** 2 for x in vec2)
    denominator = math.sqrt(sum1) * math.sqrt(sum2)
    if not denominator:
        return 0.0
    else:
        return float(numerator) / denominator

# 计算文档与查询的相似度
similarities = []
for doc_tfidf in documents_tfidf:
    similarity = cosine_similarity(query_tfidf, doc_tfidf)
    similarities.append(similarity)

# 按相似度排序并返回结果
sorted_documents = sorted(zip(documents, similarities), key=lambda x: x[1], reverse=True)

# 打印结果
for i, (doc, score) in enumerate(zip(documents, similarities)):
    print(f"Document {i+1}: {doc}\nScore: {score}\n")

结果

Score得分越高,则文档越匹配查询词,可以看到,我们根据关键词搜索,找到了最适配text1的文档,Document 2。

Document 1: 您好,是您拨打的客服电话吗
Score: 0.0

Document 2: 你好,我的这个货想要通过顺丰去发
Score: 0.4472135954999579

Document 3: 订单号发我一下
Score: 0.0

Document 4: xxxxxx
Score: 0.0

Document 5: 好的我这边给您发顺丰
Score: 0.0

完整代码:

import jieba
from jieba.analyse import default_tfidf
from collections import Counter
import math

# Example text
text = "发到顺丰"

# Example text2
text2 = "您好,是您拨打的客服电话吗;你好,我的这个货想要通过顺丰去发;订单号发我一下;xxxxxx;好的我这边给您发顺丰"

# 切割 text2 并将其作为文档
documents = text2.split(';')

# 提取关键词的函数
def extract_keywords(text):
    return jieba.analyse.extract_tags(text)

# 提取查询关键词
query_keywords = extract_keywords(text)

# 提取文档关键词
documents_keywords = [extract_keywords(doc) for doc in documents]

# 计算查询关键词的词频 (TF)
query_keyword_counts = Counter(query_keywords)

# 总文档数
total_documents = len(documents)

# 计算所有关键词的逆文档频率 (IDF)
all_keywords = set()
for doc_keywords in documents_keywords:
    all_keywords.update(doc_keywords)

keyword_idf = {}
for keyword in all_keywords:
    doc_count_containing_keyword = sum(1 for doc_keywords in documents_keywords if keyword in doc_keywords)
    keyword_idf[keyword] = math.log((1 + total_documents) / (1 + doc_count_containing_keyword)) + 1

# 计算查询关键词的 TF-IDF
query_tfidf = {}
for keyword, count in query_keyword_counts.items():
    tf = count
    idf = keyword_idf.get(keyword, 0)
    query_tfidf[keyword] = tf * idf

# 计算所有文档的 TF-IDF
documents_tfidf = []
for doc_keywords in documents_keywords:
    doc_keyword_counts = Counter(doc_keywords)
    doc_tfidf = {}
    for keyword, count in doc_keyword_counts.items():
        tf = count
        idf = keyword_idf.get(keyword, 0)
        doc_tfidf[keyword] = tf * idf
    documents_tfidf.append(doc_tfidf)

# 计算余弦相似度
def cosine_similarity(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum(vec1[x] * vec2[x] for x in intersection)
    sum1 = sum(vec1[x] ** 2 for x in vec1)
    sum2 = sum(vec2[x] ** 2 for x in vec2)
    denominator = math.sqrt(sum1) * math.sqrt(sum2)
    if not denominator:
        return 0.0
    else:
        return float(numerator) / denominator

# 计算文档与查询的相似度
similarities = []
for doc_tfidf in documents_tfidf:
    similarity = cosine_similarity(query_tfidf, doc_tfidf)
    similarities.append(similarity)

# 按相似度排序并返回结果
sorted_documents = sorted(zip(documents, similarities), key=lambda x: x[1], reverse=True)

# 打印结果
for i, (doc, score) in enumerate(zip(documents, similarities)):
    print(f"Document {i+1}: {doc}\nScore: {score}\n")

总结

关键词匹配是RAG搜索中的一个很重要的方法之一,但是关键词匹配的缺点也很明显,就是关键词匹配的召回率很低,因为关键词匹配只匹配了关键词,而没有匹配到关键词的上下文。所以一般需要结合语义搜索去一起进行。 在上面我们的实践中,我们使用jieba库去进行分词,然后通过TF-IDF算法去计算关键词的权重,然后通过余弦相似度去计算文档和查询的相似度,最后通过相似度去排序,返回结果。基本上这个一个比较通用的关键词匹配RAG数据库的方法。

相关推荐

用AI软件在线批量查询快递动态,依关键字一键查指定单号

还在一个个复制粘贴快递单号?还在海量物流信息里找得眼花缭乱?首助编辑高手给你带来快递查询新姿势!AI加持的批量查询功能,不仅能同时追踪上百个快递动态,更能通过关键字一键锁定目标单号,就像给快递装了GP...

掌握Filter函数:轻松实现关键字模糊查找技巧

在工作中,我们需要根据某个关键字来查找相关的数据。比如,你想知道姓“李”的人员信息,或者姓“张”相关的信息。这时,我们就需要用到Excel中的模糊查询功能。...

关键字(关键字名词解释)

敬请老师批改。七律:普通人的命运或(命运)人生苦短命不同,有贫有富命多种。粗茶淡饭无痒痛,早鱼晚肉腹脂中。辛勤劳作身强健,空闲玩乐病多连。,...

装修网购省钱技巧,搜索“原产地+关键词”,能省好几万

砸锅卖铁买套房,谁能想到啊,后期装修如此烧钱,230万都不一定够。所以啊,装修买东西,能省则省,我推荐大家网购,比实体店便宜很多。不过大家网购注意技巧,搜索“产地+关键词”,这样既保证了价格便宜,而...

Excel快速定位关键词所在行号列号,告别繁琐手动查找!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!——首发于微信号:桃大喵学习记今天跟大家分享的是在Excel中快速查找关键词所在行号列号,通过精妙的公式组合可以快速定位关...

亚马逊快速寻找关键词的方法(亚马逊怎么快速找关键词)

亚马逊写链接需要找到精准关键词,先找到8-10个同行链接的asin图2,图3,粘贴到集合链接搜索狂框内,图4,所有同行链接都出现在亚马逊前天界面,这时候直接把同行链接标题里面的精准关键词扣下来进行排列...

干货收藏!高考填报志愿要了解的16个关键词

2024年高考已落下帷幕,考生即将面临志愿填报。什么是批次录取控制分数线?什么是院校调档分数线?平行志愿和顺序志愿有什么区别?16个关键词帮你了解高考志愿填报,转存!@人民日报来源:上海发布...

标品必看,关键词抢位助手的玩法(抢注关键词)

但凡是一个标品,那你一定知道展现的位置直接影响点击率和转化率。...

这16个关键词,高考报志愿一定要了解!

2024年高考已落下帷幕考生即将面临志愿填报什么是批次录取控制分数线?什么是院校调档分数线?平行志愿和顺序志愿有什么区别?16个关键词了解高考志愿填报↓↓转自人民日报微博来源:沈阳日报...

在 Excel 表格中模糊查找关键字,简配高配方法都有了

很多同学会觉得Excel单个案例讲解有些碎片化,初学者未必能完全理解和掌握。不少同学都希望有一套完整的图文教学,从最基础的概念开始,一步步由简入繁、从入门到精通,系统化地讲解Excel的各个知...

找到自己人生的关键词(找到自己的人生价值)

找到自己人生基因上的东西,再专注他,放大他。人生不是庸庸碌碌的,如能在很早时就找到自己刻在骨子里的东西,那就是莫大的喜悦。人生的上半场是用来尝试,寻找的,人生中半场是用来找到自己的关键词,不要多一个足...

干货收藏!高考报志愿要了解的16个关键词

2024年高考已落下帷幕,考生即将面临志愿填报。什么是批次录取控制分数线?什么是院校调档分数线?平行志愿和顺序志愿有什么区别?16个关键词了解高考志愿填报!(人民日报)来源:河北新闻网...

Excel多条件筛选别硬扛!FILTER函数3秒搞定N个关键字

今天咱们要攻克一个让无数据人头疼的难题:...

按关键字提取数据,学会方法很简单

小伙伴们好啊,今天咱们分享一个常见的数据提取问题——按关键字提取数据。...

告别熬夜整理!你的AI知识库该学会自己”觅食”了:关键词自动检索+资料归档+整理汇报

在信息爆炸的时代,整理和管理知识成为了一项艰巨的任务。本文将介绍如何利用AI技术,让知识库能够自动“觅食”,实现关键词自动检索、资料归档和整理汇报。之前分享过产品经理怎么用AI搭建你的专属知识库?(保...

取消回复欢迎 发表评论: