【AIGC】AI如何匹配RAG知识库:关键词搜索
gaoyangw 2024-11-05 10:19 20 浏览 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数据库的方法。
相关推荐
- 义乌推广营销公司seo,霸屏推广多少?
-
推广营销公司SEO是指通过优化网站内容、结构和关键词,提高网站在搜索引擎中的排名,以吸引更多的潜在客户和流量,从而实现营销目标。...
- 搜索效果差,试试这几个办法
-
搜索质量差,找不到所需内容时,可以尝试以下几种方法:换搜索工具;优化关键词;使用搜索指令;多看一些结果。1、换搜索工具搜索效果差,那就换个搜索工具,看看其它搜索引擎的结果。...
- 铲除网站死链接详细操作指南
-
死链接会危机网站的安全,死链接的存在意味着网站存在毛病。首先要认识HTTP状态码含义:不能访问的链接称为死链接。当我们访问我们网站页面的时候,它会返回一个三位数的信号给我们的浏览器。比如我打电话给你,...
- 想要网站快速地被收录,你试过这些方法了没?
-
做网站优化的,都有一个共同的梦想那就是想要网站可以快速地被搜索引擎收录,而且收录量还要大。然而现实总是残酷的,在现在这搜索引擎算法中不使用作弊的手法情况下,想要网站达到秒收录绝不是网上那些随便说的一些...
- 百度收录URL无标题泛目录站群系统
-
尽量使用满年备案米或者历史备案米,白板备案米需要强引蜘蛛,历史米可以保留主站直接开目录本地先操作(服务器操作也是可以)1:本地先配置关键字,其它不用管,一行一个。2:data/url这个文件夹设置自己...
- 网站快速收录工具大公开!用对方法流量轻松翻倍
-
大家都知道,搜索引擎可是网站流量的关键入口。要是网站的URL不能及时被收录,哪怕内容再好,也很难获得满意的曝光量。不过别担心,147seo新推出了一款超实用的URL批量推送收录工具,而且它支持...
- 利用专题页打造关键词排名绿色通道
-
很多朋友在做SEO的时候,经常会遇到大量长尾词没有排名,针对性的做了大量的工作,但是作用不大,关键词仍旧难以上来,非常纠结。今天悟道SEO跟大家分享一下利用专题页面,为你的大量长尾关键词开通排名绿色通...
- 如何解决关键词排名急剧下降的方法
-
1、搜索引擎自身的原因搜索引擎的算法时常都会有细微的改变,这样或多或少的会影响到网站排名,这种情况有的时候过几天就恢复了,有的一直不会恢复。解决办法:对于这种原因,你先要分析下原因,并且到大型的seo...
- 网站关键词排名:网站排名上不去怎么办?
-
多数企业都知道,网站优化很重要,网站关键词排名也是。咱们都希望站点收录更多更快,但是很多企业网站建成后,只被收录,排名却上不去,一点流量都没有。而且网站关键词排名老是出现较大波动,时高时低,让人琢磨不...
- 郑州企业网站关键词排名最专业的公司
-
网站的关键词排名在当今时代,却受到了人们更高的关注率。因为网站的关键词排名,会直接影响到网站曝光率、点击率和访问量,尤其是企业网站,会直接决定该企业网站的潜在意向客户资源的积累量。现在上网的人几乎都...
- 关键词如何快速排名
-
关键词如何快速排名关键词排名是指在搜索引擎中,某个关键词对应的网页在搜索结果中的位置。在互联网时代,关键词排名对于网站的流量和曝光度至关重要。然而,随着搜索引擎算法的不断升级和优化,关键词排名变得越来...
- 网站关键词排名会被哪些操作影响?
-
相信各位做网站优化的朋友们都知道一件事是,内容为王,很多朋友为了达到这一目的,埋头苦干,但是还是没有排名,这是为什么呢?网站关键词排名会被哪些操作影响?那么,接下来小编就跟大家分享下影响网站关键词...
- 核心关键词排名一夜消失?未被惩罚的网站如何应对幽灵降权!
-
深夜的流量监控面板上,原本稳定的核心关键词排名突然集体下滑。没有警告邮件,GoogleSearchConsole后台也没有任何人工处罚记录——这正是让众多网站管理者困惑的"幽灵更新"...
- SEO关键词优化全攻略,从选词到排名的实战技巧
-
做SEO的小伙伴们肯定都有个头疼的问题:到底怎么优化关键词才最有效呢?别急,当你弄清楚目标关键词和长尾关键词的区别,学会挖掘长尾词之后,就该正式开启关键词优化之旅啦!...
- SE排名与Moz:找到正确的搜索引擎优化工具,用于2025
-
厌倦了搜索引擎优化工具,没有真正帮助你发展?如你计划2025年的战略,找到正确的平台,可以改变一切。两个名字你可能遇到:SE排名与Moz.两者都提供的功能等级跟踪关键的研究,并建立链接,但他们适...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 网站建设 (107)
- 网站开发 (47)
- 网络推广哪个平台好 (47)
- 百度收录 (50)
- 搜索引擎排名优化 (49)
- 关键词优化工具 (51)
- 外贸网站建设 (56)
- seo整站优化吧 (50)
- 广州seo (47)
- 苏州网站建设 (59)
- 百度搜索推广 (61)
- 关键词优化公司 (51)
- 广州网站建设 (48)
- 电商网站建设 (49)
- 百度站长平台 (48)
- 网站模板 (51)
- 厦门网站建设 (52)
- 百度快照推广 (51)
- 免费网页在线客服系统 (53)
- 雷神代刷网站推广 (53)
- 手机网站建设 (53)
- 网站维护 (53)
- 网页制作教程 (66)
- 百度收录批量查询工具 (48)
- 网站服务器 (53)