【AIGC】AI如何匹配RAG知识库:关键词搜索
gaoyangw 2024-11-05 10:19 28 浏览 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数据库的方法。
相关推荐
- 营销技巧:学会顾问式销售,让客户主动找上你,让销售变得很简单
-
营销技巧:学会顾问式销售,让客户主动找上你,让销售变得很简单在很多人的想象中,当销售员的,在跟客户沟通的过程中,总是处于弱势地位,要处处小心谨慎,不能得罪客户,惹客户不高兴了,会因此失去这单业务,甚至...
- 工业品网络营销/工业品营销真相:软文一鱼多吃订单拿到爆
-
工业品网络营销/工业品营销真相:软文一鱼多吃订单拿到爆。不用文采飞扬,工业品做软文营销,照样能拿询盘。首先你要记住,写工业品软文,不需要诗情画意,直接上干货就行了,因为客户都是专业人士,客户更看中你的...
- 互联网快速引流到私域的秘籍大揭秘!
-
在如今这个互联网时代,私域流量就像是一座宝藏,谁能成功将公域流量引入私域,谁就有可能挖到属于自己的“金矿”。那么,如何在互联网上快速引流到私域呢?别着急,下面就为你一一道来。一、内容营销:打造吸睛“诱...
- 「58种营销手段,你用过几个?」(营销 手段)
-
最近,艺人徐艺洋一周前回应怀孕传闻一事引发热议,有人质疑她回应过于高调,也有人认为是过度营销。在我看来,徐艺洋及时回应怀孕传闻是艺人在舆论时代的必要自保之举,更是维护个人职业形象的关键动作。·首先从艺...
- 什么是网站沙盒,企业网站排名,如何快速脱离沙盒期?
-
在做SEO的过程中,我们都非常清楚,每一个网站从域名刚刚注册的那一刻起,它就是一个全新的网站,而当这个域名来到互联网中的时候,意味着所有的一切都需要头开始,比如:①累积网站在搜索引擎中的信誉。②针...
- 高考无人机防作弊 域名wurenji.cn售5位数
-
史诗级灾难大片《高考》在经过两天的全国公映后即将下档,而在这场一年一度的大片中,不仅有全国上百万的高三学子家长的倾情加盟,连高大上的无人机都亲自出马担任监考一职,其域名wurenji.cn更是在日前被...
- 谷歌为“OptimizeGoogle.com”域名申请域名仲裁
-
站长之家(chinaz.com)6月8日消息在域名的问题上,谷歌从来都不会“心慈手软”。据外媒近日消息称,谷歌以“容易引起混淆”为由,就“OptimizeGoogle.com”域名向美国国家仲裁论坛(...
- 新浪SAE推免费网站备案服务 已开启公测
-
站长之家(Chinaz.com)7月16日消息据站长之家获悉,新浪云(SinaAppEngine)已启动全国备案服务。据新浪官方表示,SAE的备案服务是免费的,备案之后,域名可绑定国内服务器,暂不提供...
- 佳能官网弃用canon.com 转用自家全新顶级域名global.canon
-
站长之家(ChinaZ.com)5月19日消息,佳能官网近日启用了全新顶级域名global.canon,用户通过原域名canon.com访问时网页将会直接跳转至新域名。佳能官网启用全新顶级域名glob...
- 百万美元首页网站现状:广告链接很多已失效
-
站长之家(ChinaZ.com)7月25日消息,百万格子网站是在2005年由英国威尔特郡一名21岁的学生亚历克斯·图(AlexTew)构想并创办的一个网站,目的是要赚钱来筹措他的大学...
- 又是一起诉讼案!这次原持有人丢了域名ETHZ.com
-
近日一起UDRP诉讼在WIPO(世界知识产权组织)宣判,争议域名为ETHZ.com。最终专家组裁定原告获得域名,原域名持有人“无端”丢了域名。域名ETHZ.com注册于1999年5月,距今有着超过16...
- 一场由“租”来的千万域名引发的口水战
-
这几天,国内比特币交易平台OKcoin与比特币著名投资人RogerVer吵得不可开交。什么情况?这需要从一个千万域名bitcoin.com说起。“比特币”域名bitcoin.com,在比特币界赫赫有...
- 推荐两个关于安全的使用网站,使用后感觉太可怕了
-
经常有小伙伴给我留言:我想学安全方面的技术,有没有什么速成的办法?其实我很想告诉他速成的办法,但遗憾的是真的没有,黑客技术需要对计算机底层原理、计算机网络、操作系统等课程有相当了解的基础上才能有所深度...
- 阿里网商银行开业 启用新域名mybank.cn
-
站长之家(Chinaz.com)6月30日消息马云谋划了这么多年的网商银行终于获准,正式开业了。阿里巴巴将网商银行取名为“mybank”,且早已买下域名mybank.cn以及mybank.net。在网...
- “情色”来袭!新顶级域名 .sex 开放注册 85刀起
-
站长之家(Chinaz.com)11月4日消息据外媒消息称,新顶级域名.sex已于今日开放注册。其实,.sex并不是第一个与“性”相关的新顶级域名。如.porn、.adult、.sexy等新顶级域名均...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 网站建设 (107)
- 百度收录 (50)
- 搜索引擎排名优化 (49)
- 关键词优化工具 (51)
- 外贸网站建设 (56)
- seo整站优化吧 (50)
- 苏州网站建设 (59)
- 百度搜索推广 (61)
- 关键词优化公司 (51)
- 广州网站建设 (48)
- 电商网站建设 (49)
- 百度站长平台 (48)
- 网站模板 (51)
- 厦门网站建设 (52)
- 百度快照推广 (51)
- 免费网页在线客服系统 (53)
- 雷神代刷网站推广 (53)
- 手机网站建设 (53)
- 网站维护 (53)
- 网页制作教程 (66)
- 百度收录批量查询工具 (48)
- 网站服务器 (53)
- 学生个人网页制作html (56)
- 一键优化 (67)
- 网页制作软件 (49)