《AI Agent智能体与MCP开发实践:基于Qwen3大模型(人工智能技术丛书)》(王晓华)【摘要 书评 试读】- 京东图书

RAG是一种将信息检索与文本生成相结合的技术方案,旨在提升大模型在特定知识场景下回答的准确性和可靠性。传统RAG将用户问题转换为向量,并在知识库中进行语义匹配,检索出相关文档片段,再交由大模型生成答案。

这种方式有效缓解了大模型的幻觉问题,使输出内容更具依据性与可解释性。然而,传统RAG在实际应用中仍面临多重挑战:一是召回不完全,关键信息可能未被检索到;二是召回内容不够精准,混杂大量无关信息;三是上下文长度受限,影响模型处理效率和输出质量。

更深层次的问题在于,垂直领域的问答往往需要理解隐藏在文本背后的深层逻辑。根据问题类型,答案可分为四类:表面问答、总结问答、深度问答和关系问答。传统RAG在处理后两类问题时表现有限,一方面因为通用大模型缺乏领域专业知识,另一方面是由于答案所需的前提知识常分散在多个文本片段中,需要进行多跳推理(Multi-hop Reasoning)和结构化整合。

为此,RAG技术正朝着更智能的方向演进。首先,构建双轨知识存储体系,包括向量数据库,用于保存原始文本,以及知识图谱,用于提取实体、属性、关系三元组,形成结构化知识网络。其次,引入深度问题解析机制,对问题中的核心要素进行拆解,比如识别涉及的实体、属性、关系及具体场景。再次,在答案生成阶段,根据问题类型动态组合不同方法,如向量搜索、图谱查询、大模型推理等,实现多模态输出。最终,强调可解释性,输出完整的思考链,包括问题解析逻辑、知识检索路径及推理依据,从而构建更加贴近人类思维模式的智能问答系统。

5.1.1  RAG的定义与核心流程

RAG是一种结合信息检索与文本生成技术的新型人工智能范式,旨在通过融合外部知识库中的结构化或非结构化信息,提升大模型在复杂问答、推理任务中的表现能力。其核心思想是将传统的自然语言处理流程拆解为两个关键阶段:首先利用高效的检索机制从大规模知识源中提取与用户问题相关的信息片段,然后基于这些信息构建上下文提示,并输入生成模型中进行答案生成。这种“先检索后生成”的架构打破了传统大模型依赖内部参数记忆知识的局限性,使得系统能够在不重新训练的前提下动态接入最新的、特定领域的知识内容。

从技术实现的角度来看,RAG的核心流程可以分为3个主要环节:问题表示、知识检索和答案生成。

首先是问题表示阶段,用户输入的问题通常以自然语言形式存在,需要经过编码器模型转换为语义向量。这一过程常借助预训练的语言模型完成,从而获得一个能够反映问题语义特征的高维向量表示。该表示不仅捕捉了问题的字面含义,还包含了上下文语境和潜在意图的信息。

其次是知识检索阶段,这是RAG区别于传统生成模型的关键步骤。在这一阶段,系统会将问题向量与预先构建的知识库中的文档向量进行相似度计算,采用最近邻搜索(如Faiss、Annoy等高效算法)找出最相关的若干个文档片段。这些片段可能来自网页、论文、数据库记录或其他形式的文本资料。为了提升检索效果,近年来的研究逐步引入多模态表示、层次化索引结构以及语义重排序策略,确保召回结果既具备广度也具有精度。此外,部分先进方法还尝试结合知识图谱中的实体关系进行联合检索,从而增强对深层语义的理解能力。

最后是答案生成阶段,系统将检索到的相关文档与原始问题拼接成上下文提示,作为输入提供给生成模型。生成模型通常是基于Transformers架构的大规模语言模型。在这一过程中,模型不仅要理解问题本身,还需准确整合多个检索结果中的信息,排除冗余干扰,形成连贯、准确且有逻辑性的回答。为了提高生成质量,研究者提出了多种优化策略,包括注意力机制调整、多跳推理框架设计以及生成过程中的事实一致性校验等。

值得注意的是,RAG并非简单的“检索+生成”叠加,而是一个高度协同的系统工程。它要求各个模块之间具备良好的交互机制和反馈调节能力。例如,在检索阶段若未能命中关键信息,生成模型可能会输出错误答案;而在生成阶段如果无法有效筛选和整合检索结果,也可能导致回答质量下降。因此,现代RAG系统往往引入强化学习、元学习等机制,持续优化各模块之间的协作效率,提升整体系统的鲁棒性和适应性。

RAG技术的出现,标志着大模型应用从封闭式知识体系向开放式知识融合的重大转变。它不仅解决了传统生成模型中存在的“知识固化”问题,也为构建可解释、可扩展的智能问答系统提供了可行路径。尤其是在医疗、法律、金融等专业领域,RAG能够有效弥补通用大模型在垂直场景下的知识短板,显著提升问答系统的准确性与可信度。随着检索算法的进一步优化、生成模型的持续演进以及多模态数据的广泛接入,RAG有望成为下一代智能问答系统的核心支撑技术。

5.1.2  数据处理与分块策略

RAG的核心在于依据用户提出的问题或提示,从特定的数据集中检索并获取相关的数据信息,并在此基础上生成准确、相关且具有上下文支持的回答。

在具体使用上,对于一般的检索性内容,会对其进行分块处理。RAG中的分块策略对系统的检索和生成质量至关重要。以下是对RAG中分块策略的详细说明。

1. 常用分块方法

1)基于规则的分块

  • 固定大小分块:按照预先设定的固定长度将文本划分为若干块。这种方法简单直观,但可能导致上下文割裂和语义完整性受损。
  • 重叠切分:在相邻文本块之间引入一定的重叠部分,确保上下文的连贯性。例如,每个文本块与前一个块有50个字符的重叠。
  • 智能截断:在切分文本时,尽量选择在标点符号或段落结束处进行截断,避免打断句子,保持语义的完整性。
  • 以递归方法:递进地将文本按照不同的层级进行分割,优化固定大小文本切块的缺陷。

下面是一个固定大小分块的简单实现:

def fixed_size_chunk(text, chunk_size=200):

    """

    将文本按照固定长度进行分块。

   

    参数:

        text (str): 输入文本

        chunk_size (int): 每个块的最大字符数

   

    返回:

        List[str]: 分块后的文本列表

    """

    return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]

2)特殊格式文本分块

  • HTML、Markdown等:这些文本具有特殊结构,切分时应尽量保留其内在结构,如标签、标题、代码块等。

3)基于语义的分块

  • Embedding-based:利用嵌入模型将文本映射到低维空间,根据语义相似度进行分块。
  • Model-based:使用预训练模型(如BERT)进行文本切分。通过预测句子间的语义关系,确定切分点。
  • LLM-based:利用LLM捕捉文本中的语义信息,生成更精细的数据分块。例如,通过构建提示词与LLM交互获取(提议),实现更精细的数据分块。

2. 分块策略的优化

1)保持语义完整性

  • 避免句子被拆分:使用标点符号作为切分点,确保每个文本块包含完整的句子。
  • 考虑段落关联性:尽量将同一段落的内容保留在同一个文本块中,避免语义断裂。

2)控制文本块长度

  • 设定合理的长度阈值:根据向量化模型和大模型对不同长度文本的处理效果,设定适当的文本块长度阈值。
  • 动态调整:根据文本内容和结构实时调整文本块长度,实现个性化处理。

3)重叠切分

  • 设定重叠长度:如设定每个文本块之间有50个字符的重叠,保留上下文连接,增强模型理解。

4)结合向量化模型性能

  • 适配模型特性:深入了解向量化模型的特点,选择合适的分块策略。
  • 优化向量表示:采用加权平均、注意力机制或分层编码等方法,提升向量表示的质量。

5)考虑大模型的输入限制

  • 输入长度控制:确保召回的文本块总长度不超过大模型的输入限制。
  • 优先级排序:根据文本块与查询的相关性进行排序,优先输入最重要的内容。
  • 内容精炼:对重要的长文本块进行压缩或摘要,确保核心信息得以保留。

3. 前沿方法推荐

1)Chunking分割

引入新的粒度级别,由段落内具有深层语言逻辑联系的多个句子组成。通过基于困惑度(Perplexity, PPL)的分割方法和动态合并策略,实现细粒度和粗粒度文本分割之间的平衡。

2)Late Chunking分割

先使用长上下文嵌入模型处理整个文档,然后进行分块。这种方法能够保留更多的上下文信息,提升分块的质量。

3)Anthropic的上下文检索

每个块都会与完整的文档一起发送给LLM,由LLM为每个块添加相关上下文,产生信息更丰富的嵌入。

4. 结合业务场景与文本特点选择合适的分块策略

  • 分析业务需求:理解具体应用的目标和要求,如专业领域应用、长文档处理或实时响应场景等。
  • 分析文本特点:考虑文本的结构特征(如结构化、非结构化或多语言文本),选择适合的分块方法。
  • 多方案对比:尝试不同的分块策略和工具,进行实验验证。
  • 制订评估指标:如检索性能、生成质量和用户反馈等,客观评估分块策略的效果。
  • 数据驱动的优化:基于实验数据和评估结果,对分块策略进行参数调优和问题定位,采用渐进式优化的方法,不断提升系统的性能。

可以看到,选择合适的文本分块策略对于RAG系统的成功至关重要。需要根据具体的应用场景、文本类型以及模型特性来选择最合适的分块方法。通过不断实验和优化,可以找到适合特定任务的最佳实践。

5.1.3  Rerank机制详解

在检索增强生成(RAG)系统中,重排序(Rerank)是一个至关重要的步骤。它的主要作用是优化初步检索阶段的结果,以提高最终答案的相关性和准确性。虽然传统的信息检索模型能够根据查询从大规模文档库中找到相关的内容,但它们的排序机制通常基于简单的统计特征,例如词频、逆文档频率等。这些方法可能无法充分捕捉到语义层面的相关性,导致一些真正相关的文档被遗漏或排名较低。

Rerank的核心思想是在初步检索结果的基础上,利用更强大的语言模型或者专门训练的排序模型对候选文档进行重新评估和排序。相比于传统检索模型的粗粒度排序,Rerank能够更加精细地分析查询与文档之间的关系,并通过上下文理解、语义匹配以及逻辑推理来提升排序效果。在面对复杂问题时,这种深度排序能力特别重要,因为它可以帮助我们筛选出那些虽然表面不显眼但却包含关键信息的文档。

在RAG系统中,通常会先使用一个高效的向量检索器(如FAISS或Weaviate)从知识库中快速获取top-k个最相似的文本块作为候选答案。然而,由于向量空间中的相似度计算往往只关注局部特征而忽略全局语义,因此这些候选答案并不总是最优的选择。此时,引入Rerank可以进一步精炼这些候选答案,确保最终提供给生成模块的信息是最具价值的。

Rerank的实现方式多种多样,常见的包括基于预训练语言模型的方法(如BERT-based排序)、神经网络排序模型(如RankNet、LambdaMART)以及结合强化学习的技术等。其中,基于BERT的排序模型因其出色的语义建模能力而受到广泛关注。这类模型通常将查询和文档拼接在一起,然后输入Transformers结构中进行联合编码,最后通过分类层预测两者之间的相关性得分。这种方法不仅考虑了词级别的匹配,还能捕捉句子乃至段落级别的语义关联,从而显著提升排序质量。

此外,Rerank还有助于缓解“长尾”效应,即某些重要但不易被发现的信息未能进入初始检索列表的问题。通过对整个候选集进行全面再评估,Rerank可以有效识别并提升那些原本排名靠后的优质内容的位置,进而为用户提供更全面且准确的答案。

下面是一个简单的Rerank计算Embedding的方法:

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# 加载预训练的排序模型和对应的分词器
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("cross-encoder/ms-marco-MiniLM-L-6-v2")

def rerank(query, documents):
    # 构造输入格式:[CLS] query [SEP] document [SEP]
    inputs = tokenizer([f"{query} {doc}" for doc in documents], padding=True, truncation=True, return_tensors="pt")
    
    with torch.no_grad():
        outputs = model(**inputs)
        scores = torch.softmax(outputs.logits, dim=1)[:, 1].tolist()  # 获取相关性得分
    
    # 返回按新得分排序后的文档及其原始索引
    ranked_docs = sorted(zip(scores, documents), key=lambda x: x[0], reverse=True)
    return [(score, doc) for score, doc in ranked_docs]

# 示例数据
query = "What is the capital of France?"
documents = [
    "Paris is the capital city of France.",
    "France has many beautiful cities including Lyon and Marseille.",
    "The Eiffel Tower is located in Paris."
]

ranked_results = rerank(query, documents)

print("Re-ranked Documents:")
for score, doc in ranked_results:
    print(f"Score: {score:.4f}, Document: '{doc}'")

在上面这个示例中,我们定义了一个rerank()函数,它接收用户查询和一组候选文档作为输入,并返回经过重新排序后的文档列表。函数内部通过调用分词器构造符合要求的输入格式,随后将这些输入传递给模型进行推理,最终输出的是每个文档与其对应查询之间的相关性得分,并按照得分高低对文档进行重新排列。

需要注意,在实际部署时还需要考虑性能优化问题,比如批量处理请求、缓存常用结果以及采用更高效的模型架构等措施。同时,也可以尝试不同的排序算法和技术组合,以寻找最适合特定应用场景的实践方案。总之,合理运用Rerank技术对于提升RAG系统的整体表现具有重要意义。

Logo

更多推荐