RAG(Retrieval-Augmented Generation)是一种基于检索的生成模型,将生成模型和检索系统结合起来,在文本生成任务中,结合外部知识库来提高模型的表现。它通过两步流程来生成答案:首先从外部数据库或文档中检索相关信息,然后通过生成模型(如GPT、BART等)基于检索到的信息生成答案。
RAG模型的工作流程可以简要分为以下几个步骤:
检索阶段:
用户输入查询问题。
使用检索系统(如BM25、FAISS、Dense Retriever等)从预先构建的知识库中检索出与问题相关的文本片段。
生成阶段:
将检索到的相关文本作为输入,结合查询问题,喂入生成模型(如DeepseekR1,GPT4等)。
生成模型根据检索到的信息生成最终的回答。
在RAG模型中,首先需要准备一个外部知识库。这可以是任何结构化或非结构化的文本数据,例如文档集合、维基百科、产品信息、技术文档等。为了提高检索效果,可以进行以下预处理:
文本切分:将大段文本切分成小块(如段落、句子、词条等),便于后续的高效检索。
向量化:将文本数据转化为向量表示,常用的技术包括TF-IDF、Word2Vec、BERT等。向量化后的数据将存储在数据库中,供检索模型使用。
这一步的文本切分决定了后续排序质量,如果切分不好,后续可能会出现排序出现问题的情况。
检索模块是RAG流程的核心,目的是快速找到与查询问题相关的文本。常见的检索方法包括:
基于关键词的检索:如BM25,通过查询中出现的关键词与文档中关键词的匹配来计算相关性。
在检索任务中,模型的主要目的是根据查询从大量文档中找到最相关的文本片段。下面是一些常见的检索模型及其使用方法。
步骤 1: 使用 BM25 对文档进行预处理,计算文档的 IDF 值。
步骤 2: 对查询进行分词,计算每个查询词在文档中的词频(TF)。
步骤 3: 根据 BM25 的公式计算文档与查询的相关性得分。
常用工具:
Whoosh:一个纯 Python 的信息检索库,支持 BM25 算法。
Elasticsearch:一个分布式搜索引擎,内置 BM25 算法。
from whoosh.index import create_in
from whoosh.fields import Schema, TEXT
from whoosh.qparser import QueryParser
from whoosh import scoring
# 创建索引
schema = Schema(content=TEXT(stored=True))
ix = create_in("indexdir", schema)
# 添加文档
writer = ix.writer()
writer.add_document(content="Hello world")
writer.add_document(content="Who is the king of the world?")
writer.commit()
# 查询
searcher = ix.searcher(weighting=scoring.BM25F())
query = QueryParser("content", ix.schema).parse("world")
results = searcher.search(query)
for result in results:
print(result['content'])
密集检索(Dense Retrieval):利用深度学习模型(如BERT、RoBERTa)将查询和文档转换为向量表示,然后计算相似度(如余弦相似度)。
2. Dense Retrieval(密集检索)
Dense Retrieval 通过将查询和文档转换为稠密向量(通常使用深度学习模型)来计算它们之间的相似度。与传统的基于关键词的检索方法不同,Dense Retrieval 能够捕捉到语义层面的相似度。
使用方法
• 步骤 1: 使用预训练的语言模型(如 BERT、RoBERTa)将文档和查询分别编码为向量。
• 步骤 2: 计算查询向量与文档向量的相似度(通常使用余弦相似度或欧几里得距离)。
• 步骤 3: 返回与查询最相似的文档。
其他常用的检索:
FAISS:用于大规模向量检索,能够处理百万级别的文档和查询。(待测试)
Elasticsearch:一个开源的分布式搜索引擎,适用于结构化和非结构化数据的检索。(待测试)