【AIGC】AI如何匹配RAG知识库:关键词搜索_rag 的场景知识库匹配
关键词搜索
- 引言
- jieba库简介
- TF-IDF简介
- 实践
-
- 例子
- 用jieba库提取关键词
- 计算TF-IDF
- 计算文档和查询相似度
- 结果
- 完整代码:
- 总结
引言
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库分割关键词并使用TF-IDF去实现关键词搜索RAG,搜索text2中最适配text1的文档。
例子
# Example texttext = \"发到顺丰\"# Example text2text2 = \"您好,是您拨打的客服电话吗;你好,我的这个货想要通过顺丰去发;订单号发我一下;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-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-IDFquery_tfidf = { }for keyword