引言
RAG是减少模型错觉并使模型能够分析和回答私有领域相关知识的最简单、最有效的方法。除了使用RAG 之外,您还可以了解如何实现它们。 RAG的实现过程包括语义搜索和关键词搜索。在本文中,我们将使用jieba 库和TF-IDF 实现关键字搜索RAG。jieba库简介
jieba(结巴)是Python中广泛使用的分词库,特别适合处理中文文本。 jieba库不仅支持基本的分词功能,还提供关键词提取、词性标注、命名实体识别等多种功能。在关键词检测领域,jieba库中的TF-IDF和TextRank算法被广泛用于从文本中提取关键词。TF-IDF简介
TF-IDF(词频-逆文档频率)是信息检索和文本挖掘中常用的一种加权技术。通过计算整个语料库中的文档频率(词频,TF)和逆文档频率(IDF)来评估单词的重要性和相关性。 TF-IDF的计算公式如下。实践
让我们模拟用户提问。根据问题,模型从知识库中检索相关文档,并根据检索到的文档生成答案。 假设用户输出为发送给顺丰速运的text1。 text2 有多个以“;”分隔的文档,我们实现关键字搜索RAG 来搜索text2 中的文档。文本1。 例子 # texttext='发送至顺丰速运' # text2text2='您好,这是您的客服电话吗?您好,我想通过顺丰速运寄件,请给我您的订单号。xxxxxx;好的。我们将通过顺丰速运发送。使用jieba库提取关键词。
# 剪切text2并将其作为文档Documents=text2.split(';')# 提取关键字的函数def extract_keywords(text): return jieba.analysis.extract_tags(text)# 提取查询关键字query_keywords=extract_keywords(text) #提取文档关键词documents_keywords=[文档内文档的extract_keywords(doc)] 计算TF-IDF
# 计算查询关键词的词频(TF) query_keyword_counts=Counter(query_keywords)# 文档总数total_documents=len(documents)# 计算所有关键词的逆文档频率(IDF) all_keywords=set()for doc_keywords inDocuments_keywords: all_keywords .update ( doc_keywords)keyword_idf={}for keywords in all_keywords: doc_count_having_keyword=sum(1 for doc_keywords inDocuments_keywords if keywords in doc_keywords)keyword_idf[keyword]=math.log((1 + total_documents)/(1 + doc_count_having_keyword)) + 1 # 计算查询关键字TF-IDFquery_tfidf={}for 关键字,query_keyword_counts.items(): tf=计数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={} 对于关键字,在doc_keyword_counts.items(): 中计数tf=count idf=keyword_idf.get(keyword, 0) doc_tfidf[keyword]=tf * idf document_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) 分母=math.sqrt(sum1) * math.sqrt(sum2) denominator: 否则返回0.0。 else: return float(numerator)/denominator# 计算文档和查询之间的相似度simpleities=[]for doc_tfidf inDocuments_tfidf: minimality=cosine_similarity(query_tfidf, doc_tfidf) minimities.append(similarity)# 按相似度对结果进行排序returnssorted_documents=sort(zip(documents) ,相似度), key=lambda x: x[1],reverse=True)# i, (doc, Score) enumerate(zip(documents,相似度)) : print(f'Document { i +1}: {doc }\nScore: {分数}\n')
分数越高,文档与查询词的匹配程度越好。可以看到,我们根据关键词进行搜索,找到了最适合text1的文档,文档2。
Document 1: 您好,这是您的客服电话吗Score: 0.0Document 2: 您好,我想通过顺丰寄件Score: 0.4472135954999579Document 3: 请给我您的订单号Score: 0.0Document 4: