news 2026/8/11 5:30:35

LlamaIndex索引进阶:从向量搜索到复合索引,构建高性能RAG系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LlamaIndex索引进阶:从向量搜索到复合索引,构建高性能RAG系统

1. 从“能用”到“好用”:为什么你的RAG系统需要更精细的索引

如果你已经用LlamaIndex或LangChain搭建过一个基础的RAG(检索增强生成)系统,你可能会发现一个现象:初期Demo跑起来很顺利,但一旦把系统投入到真实业务场景,面对成百上千份、格式各异的文档时,效果就开始变得不稳定。有时候,系统能精准地找到你想要的答案;有时候,它却会返回一堆看似相关、实则无关的片段,或者干脆遗漏了最关键的信息。这种“时灵时不灵”的状态,正是基础RAG系统从“玩具”迈向“生产级工具”时遇到的核心瓶颈。

问题的根源,往往不在于大语言模型(LLM)不够聪明,而在于我们喂给它的“知识”——也就是检索到的上下文——不够精准、不够结构化。想象一下,你有一个巨大的图书馆(你的文档库),但图书管理员(检索器)只能通过模糊的关键词匹配来帮你找书,他可能会给你一堆书名里包含关键词的书,却无法理解你要的是一本关于“量子力学在计算机科学中的应用”的专著,而不是一本《量子力学入门》。基础的向量检索,就有点像这位只认关键词的图书管理员。

这就是LlamaIndex索引类型进阶的意义所在。它提供的远不止一个简单的“向量存储索引”。通过组合不同类型的索引,你可以为你的知识库构建一个多维度、结构化的“认知地图”。这张地图能告诉系统:哪些信息是核心概念(关键词索引),哪些信息彼此关联紧密(知识图谱索引),哪些是长篇大论中的精华摘要(摘要索引)。当一个问题进来时,系统不再是盲目地进行一次向量相似度搜索,而是可以像一位经验丰富的专家一样,先判断问题的类型,再选择最合适的“地图图层”和“导航策略”去查找答案。

我经历过不止一个项目,在从POC(概念验证)到上线的过程中,仅仅是把默认的向量索引替换为更符合业务逻辑的复合索引,问答的准确率(Hit Rate)就提升了30%以上,同时响应延迟还得到了优化。这背后的核心能力,正是对LlamaIndex多种索引类型及其组合策略的深度理解和灵活运用。接下来,我们就抛开那些简单的“Hello World”示例,深入探讨如何利用这些索引,构建一个真正高性能、高可用的RAG系统。

2. 超越向量搜索:LlamaIndex五大核心索引能力深度解析

很多人对LlamaIndex索引的理解,可能还停留在VectorStoreIndex上。确实,它是入门最快、使用最广的索引,但其能力边界也非常明显。要构建高性能RAG,我们必须掌握另外几种强大的索引,并理解它们各自解决的独特问题。

2.1 VectorStoreIndex:基石与它的局限性

VectorStoreIndex是LlamaIndex的默认选择,也是大多数RAG系统的起点。它的工作原理非常直观:

  1. 文档加载与切分:将文档(如PDF、Word)加载进来,并按一定策略(如按段落、按固定字符数)切分成一个个文本片段(Node)。
  2. 向量化嵌入:使用嵌入模型(如OpenAI的text-embedding-3-small)将每个文本片段转换为一个高维向量。
  3. 向量存储与检索:将这些向量存入向量数据库(如Chroma、Pinecone、Weaviate)。查询时,将问题也转换为向量,在数据库中查找最相似的K个文本片段。

它的优势是语义检索能力强,能够找到在字面上不匹配但含义相似的文本。但它的局限性同样突出:

  • “碎片化”问题:切分后的片段可能失去原文的连贯性和整体结构。一个问题可能需要综合多个片段的信息才能回答,但简单的Top-K检索可能无法完整覆盖。
  • 缺乏全局观:它擅长找“相似的段落”,但不擅长理解文档的宏观结构、核心主题列表或实体关系。
  • 对摘要性、筛选性问题无力:例如,“这篇长报告主要讲了哪三点?” 向量检索可能会返回三个包含具体细节的段落,而不是三个概括性的要点。

实操心得:不要盲目使用默认的128或512字符的固定长度切分。对于技术文档,按章节标题切分(使用MarkdownNodeParser或基于正则表达式)效果远好于固定长度。对于会议纪要,按发言人话轮切分可能更合理。切分策略是影响向量索引效果的首要因素。

2.2 SummaryIndex:为“宏观把控”而生

SummaryIndex的设计初衷,就是为了解决VectorStoreIndex缺乏全局观的问题。它不会将文档切分成细小的片段,而是为每个文档(或一组相关文档)生成一个或多个摘要。

它的工作流程是:

  1. 文档加载:同样加载文档,但可以保持较大的文本块。
  2. 摘要生成:调用LLM,为每个文本块生成一个简洁的摘要。你可以定义摘要的粒度和焦点(例如,“生成关于财务数据的摘要”或“生成关于技术方案的摘要”)。
  3. 索引构建:将这些摘要文本作为索引的基本单元存储起来。在底层,它通常也会为这些摘要生成向量,但其核心价值在于摘要本身。

当用户提出“这篇文章主要讲了什么?”、“这个季度报告有哪些亮点?”这类需要概括、总结、筛选的问题时,SummaryIndex能直接返回预先生成好的、凝练的摘要,而无需从海量细节中去拼凑答案。这极大地提升了回答此类问题的速度和准确性。

与VectorStoreIndex的对比

  • VectorStoreIndex:像一位能快速找到书中某一页某一段落的助手,擅长细节问答。
  • SummaryIndex:像一位为你预先写好读书笔记和章节概要的助手,擅长整体把握和要点提炼。

在实际系统中,我经常将SummaryIndex作为第一层“路由索引”。当用户问题听起来像是要一个概述时,系统优先查询SummaryIndex;当问题涉及具体细节时,再转向VectorStoreIndex

2.3 KeywordTableIndex:关键词的精准锚定

在语义搜索大行其道的今天,我们有时会忘记一个简单而强大的工具:关键词。KeywordTableIndex就是一个基于关键词的倒排索引。它会从文档中提取一系列关键词(可以基于简单的词频统计,也可以使用更复杂的NLP方法),然后建立“关键词->包含该关键词的文本节点”的映射。

它的核心优势在于精确匹配和可解释性。对于一些有明确专有名词、术语、产品代号或代码函数名的问题,关键词索引的命中是100%精确的。例如:

  • 用户问:“create_user这个API的参数有哪些?”
  • 向量搜索可能返回一些关于“用户创建”、“API设计”的泛泛而谈的段落。
  • 关键词索引会直接定位到文档中明确出现“create_user”这个词的所有节点,精准无比。

此外,关键词索引的检索过程是可解释的——你可以清楚地看到是哪个关键词触发了检索。这对于调试和构建可信的AI系统非常有价值。

避坑指南:纯关键词索引的缺点是对自然语言问题的泛化能力差。如果用户用“如何新建一个用户”来问,关键词索引可能就失效了。因此,它极少单独使用,而是作为混合检索中的一个重要组成部分。LlamaIndex的VectorStoreIndex其实内部就可以配置关键词检索器,实现“语义相似度+关键词匹配”的综合打分,这是提升召回率(Recall)的常用技巧。

2.4 KnowledgeGraphIndex:构建关联的智慧

这是构建复杂RAG系统的“王牌”。KnowledgeGraphIndex旨在从文本中提取实体(如人物、组织、概念、产品)以及实体之间的关系,并构建成一个知识图谱。

它的构建过程相对复杂:

  1. 图提取:使用LLM或专门的NER(命名实体识别)、RE(关系抽取)模型,从每个文本节点中提取(主语,关系,宾语)这样的三元组。例如,从“张三在苹果公司担任软件工程师”中,可以提取出(张三,就职于,苹果公司)和(张三,职位是,软件工程师)。
  2. 图存储:将这些三元组存储在图数据库(如Neo4j)或内存中的图结构中。
  3. 检索与推理:当查询到来时,系统可以:
    • 实体检索:直接查找与问题中实体相关的所有三元组,获取直接关联的事实。
    • 路径检索:在图中进行多跳查询。例如,问题“张三的同事有哪些?”,系统可以先找到“张三就职于苹果公司”,再找到“所有就职于苹果公司的人”,从而推理出答案。

知识图谱索引的强大之处在于关系推理和复杂查询。它特别适合以下场景:

  • 领域知识库:如医疗、金融、法律,其中概念间关系错综复杂。
  • 人物关系分析:从新闻、传记中梳理人物网络。
  • 因果、时序推理:理解事件A如何导致事件B。

我曾在一個企业内部知识管理项目中应用KnowledgeGraphIndex。我们将所有的产品文档、故障案例、解决方案都构建成图谱。当工程师遇到一个复杂故障时,他可以直接问“A组件故障通常会导致B服务出现什么现象?历史上谁处理过类似问题?”,系统能通过图谱的关联关系,将故障现象、根因分析、处理人和解决方案报告全部串联起来,而不仅仅是返回几篇独立的文档。

2.5 TreeIndex:层次化思想的体现

TreeIndex将文档组织成一个树状结构。它通常通过LLM,将大量的叶子节点(原始文本片段)总结、归纳成更高层的中间节点,最终形成一个树根(Root),即对整个文档集最顶层的摘要。

它的核心操作是查询。从根节点开始,LLM会判断查询应该路由到哪个子节点分支,以此类推,直到到达最相关的叶子节点。这个过程模拟了人类阅读目录、层层深入查找信息的方式。

TreeIndex的优势在于对超长文档的高效查询。它避免了一次性对所有片段进行向量相似度计算(计算量大),而是通过智能路由快速缩小范围。它适合处理书籍、长篇研究报告等结构清晰的文档。

然而,在当今RAG实践中,纯粹的TreeIndex使用得相对较少,因为其构建和查询过程涉及多次LLM调用,成本较高,且灵活性不如其他索引。它的思想更多被融合在了检索策略中,例如AutoMergingRetriever,它会在检索到多个细粒度节点后,自动尝试将它们合并到其父级节点,以获取更完整的上下文。

3. 组合拳的艺术:构建复合索引与智能路由

单独使用任何一种索引都有其局限。高性能RAG系统的精髓,在于根据不同的查询意图文档类型,动态选择最合适的索引或索引组合进行查询。LlamaIndex通过ComposabilityRouter模块完美支持了这一点。

3.1 索引组合(Composability)实战

最常见的组合模式是“摘要索引 + 向量索引”

场景:你有一个产品知识库,包含产品概述(白皮书)、详细API文档和用户案例。

  • 构建阶段
    1. 为每份产品白皮书创建一个SummaryIndex,生成一份概要。
    2. 将所有文档(包括白皮书、API文档、案例)的详细内容构建一个统一的VectorStoreIndex
  • 查询阶段
    • 当用户问“介绍一下你们公司的A产品”,查询路由到SummaryIndex,直接返回精炼的概述。
    • 当用户问“A产品的get_user接口在参数校验失败时返回什么错误码?”,查询路由到VectorStoreIndex,从API文档中检索精确细节。

在代码层面,LlamaIndex让你可以轻松地管理多个索引:

from llama_index.core import SummaryIndex, VectorStoreIndex, StorageContext from llama_index.core.node_parser import SentenceSplitter # 假设 docs_overview 是概述文档, docs_details 是详细文档 node_parser = SentenceSplitter(chunk_size=512) # 构建摘要索引 nodes_summary = node_parser.get_nodes_from_documents(docs_overview) summary_index = SummaryIndex(nodes_summary) # 构建向量索引 (详细文档) nodes_details = node_parser.get_nodes_from_documents(docs_details) vector_index = VectorStoreIndex(nodes_details) # 你可以将它们保存在同一个存储上下文中,方便后续统一加载 storage_context = StorageContext.from_defaults() storage_context.index_store.add_index(summary_index) storage_context.index_store.add_index(vector_index) # ... 保存 storage_context

3.2 智能路由(Router)的设计与实现

有了多个索引,如何自动决定用哪个?这就需要查询路由。LlamaIndex提供了LLMSingleSelectorLLMMultiSelector等路由机制。

其核心思想是:当查询到来时,先让一个轻量级的LLM(如GPT-3.5-turbo)分析这个查询的意图,并根据预定义的索引描述,选择最合适的一个或多个索引。

步骤

  1. 定义索引描述:为你创建的每个索引写一段清晰的描述,说明它包含什么内容,擅长回答什么问题。
    index_summaries = [ “该索引包含了所有产品的概要介绍和核心价值主张,适合回答‘是什么’、‘有什么特点’这类概述性问题。”, “该索引包含了所有API接口的详细文档、参数说明和错误码,适合回答具体的接口使用、参数细节等技术问题。”, “该索引以知识图谱形式存储了产品组件之间的关系和故障案例,适合回答涉及多个实体关联、故障排查路径的复杂问题。” ]
  2. 配置路由查询引擎
    from llama_index.core.query_engine import RouterQueryEngine from llama_index.core.selectors import LLMSingleSelector from llama_index.core.tools import QueryEngineTool # 为每个索引创建查询引擎工具 summary_tool = QueryEngineTool.from_defaults( query_engine=summary_index.as_query_engine(), description=index_summaries[0] ) vector_tool = QueryEngineTool.from_defaults( query_engine=vector_index.as_query_engine(), description=index_summaries[1] ) # ... 其他工具 # 创建路由查询引擎 router_query_engine = RouterQueryEngine( selector=LLMSingleSelector.from_defaults(), query_engine_tools=[summary_tool, vector_tool, ...] )
  3. 执行查询:现在,当你使用router_query_engine.query(“介绍一下A产品”)时,LLM会根据问题自动选择summary_tool对应的引擎来获取答案。

经验之谈:路由描述的撰写质量直接决定路由的准确性。描述要具体,避免模糊。例如,“包含技术文档”就不如“包含后端API接口文档、数据库Schema说明和部署脚本”。初期需要人工校验一些边界案例,不断优化这些描述。

3.3 混合检索(Hybrid Search):融合语义与关键词

这是提升召回率的“标配”技术。它同时进行向量搜索(语义)和关键词搜索(字面),然后将两者的结果按某种策略(如加权分数、重新排序)进行融合。

在LlamaIndex中,可以很容易地实现:

from llama_index.core import VectorStoreIndex from llama_index.core.retrievers import VectorIndexRetriever, KeywordTableSimpleRetriever from llama_index.core.retrievers import BaseRetriever from typing import List class HybridRetriever(BaseRetriever): def __init__(self, vector_retriever, keyword_retriever): self.vector_retriever = vector_retriever self.keyword_retriever = keyword_retriever def _retrieve(self, query: str) -> List[NodeWithScore]: # 并行执行两种检索 vector_nodes = self.vector_retriever.retrieve(query) keyword_nodes = self.keyword_retriever.retrieve(query) # 合并结果,这里使用简单的并集,实际中可以更复杂(如加权、去重、重排) all_nodes = [] node_ids = set() for n in vector_nodes + keyword_nodes: if n.node.node_id not in node_ids: node_ids.add(n.node.node_id) all_nodes.append(n) return all_nodes # 使用 vector_retriever = VectorIndexRetriever(index=vector_index) keyword_retriever = KeywordTableSimpleRetriever(index=keyword_index) hybrid_retriever = HybridRetriever(vector_retriever, keyword_retriever)

对于包含特定术语、代码、ID的查询,混合检索能确保它们被高优先级召回,大大减少了因语义Embedding“漂移”而导致的遗漏。

4. 面向生产环境:索引的优化、评估与迭代策略

构建索引不是一劳永逸的事情,尤其是在生产环境中。数据在变化,查询模式在演化,系统需要持续的观察和优化。

4.1 索引构建的性能与成本优化

  • 异步与批处理:构建索引,特别是为大量文档生成嵌入或调用LLM提取图谱,是IO和计算密集型任务。务必使用异步客户端和批处理API。例如,使用OpenAI的嵌入接口时,将文本组合成合理的批次(如每批100条)发送,能极大提升速度并利用其令牌折扣。
  • 增量更新:文档库每天都在增加新文件,重建整个索引的成本是不可接受的。LlamaIndex支持增量索引。核心是确保每个文档节点有一个稳定的ID(如基于文件路径和内容的哈希)。当新增文档时,只处理新文档,并将其节点插入到现有索引结构中。对于VectorStoreIndex,这意味着将新向量添加到向量数据库;对于KnowledgeGraphIndex,则需要将新提取的三元组合并到现有图谱中,并处理可能存在的冲突。
  • 缓存策略:对于SummaryIndex的摘要生成、KnowledgeGraphIndex的三元组提取,这些LLM调用结果可以进行缓存。如果同一份文档被多次处理(如在不同的测试环境中),缓存能节省大量成本和时间。可以使用简单的文件缓存或Redis等内存数据库。

4.2 如何科学评估你的索引效果

没有评估,优化就无从谈起。你需要一套指标来量化索引的性能:

  1. 检索阶段评估

    • 命中率(Hit Rate @ K):对于一组测试问题,答案所在的文档片段被检索到前K个结果中的比例。这是最核心的指标。
    • 平均倒数排名(MRR):答案所在片段在检索结果中的排名的倒数平均值。它衡量系统是否能把正确答案排得更靠前。
    • 检索延迟:从发起查询到返回检索结果的时间。这直接影响用户体验。
  2. 端到端评估

    • 答案准确性:使用LLM(如GPT-4)作为裁判,对比系统生成的答案和标准答案,在事实一致性、完整性上进行打分。这是最终效果的体现。
    • 人工评估:定期抽样一批真实用户查询,由领域专家评估答案质量。这是黄金标准。

如何构建测试集:从历史客服日志、社区论坛、产品文档的目录和标题中,提炼出真实、多样化的用户问题,并为每个问题标注出文档中对应的答案出处(Ground Truth)。这个测试集是你的“罗盘”。

4.3 迭代流程:从数据反馈到索引调优

建立一个数据驱动的迭代闭环:

  1. 监控与收集:在生产环境记录所有用户查询和系统返回的检索结果(注意隐私脱敏)。特别关注那些被用户标记为“不满意”或后续会话中用户重复提问的案例。
  2. 分析归因:对于效果差的案例,进行根因分析。
    • 检索失败:是向量搜索没找到?还是关键词没匹配上?查看检索到的节点内容,看是否与问题相关。可能需要调整文本切分策略、尝试不同的嵌入模型、或引入混合检索。
    • 检索到但答案生成差:检索到的上下文是否完整?是否包含了矛盾信息?可能需要调整检索到的节点数量(K值),或引入ContextualCompressionRetriever对检索结果进行去冗余和精炼。
    • 复杂推理失败:问题是否涉及多跳推理?如果是,考虑引入或强化KnowledgeGraphIndex
  3. 实验与验证:针对归因,设计优化方案(如调整索引类型、修改检索器参数、增加路由规则)。在测试集上验证优化方案是否提升了指标。
  4. 部署与观察:将经过验证的优化部署到生产环境,继续监控核心指标,开启下一个迭代周期。

这个过程中,LlamaIndex的模块化设计让你可以相对独立地调整索引、检索器、重排序器等组件,而不必推翻重来,这是其工程友好性的重要体现。

5. 高级模式与前沿探索:Agentic RAG与索引的融合

当你的RAG系统变得足够复杂和智能,它就开始向智能体(Agent)演进。这就是当前热门的Agentic RAG概念。在这种模式下,索引不仅仅是被动的数据源,而是成为了智能体进行规划、工具调用、反思迭代过程中的核心知识库。

5.1 作为智能体的工具(Tool)

在LangChain或LlamaIndex的智能体框架中,你可以将不同的查询引擎(背后是不同的索引)封装成“工具”(Tool)。智能体根据对用户目标的分解,自主决定调用哪个工具,甚至多次、顺序地调用多个工具。

例如,一个技术支持的智能体:

  1. 用户问题:“我的订单支付失败了,错误码是ERR_500,我用的Chrome浏览器。”
  2. 智能体规划:
    • 第一步:调用“错误码知识库工具”(基于KeywordTableIndex的查询引擎),查询ERR_500的通用含义。
    • 第二步:调用“支付系统故障案例图谱工具”(基于KnowledgeGraphIndex的查询引擎),查询ERR_500在支付场景下常见的关联原因(如网络超时、银行接口异常)。
    • 第三步:调用“浏览器兼容性文档工具”(基于VectorStoreIndex的查询引擎),查询Chrome浏览器下支付相关的已知问题。
  3. 智能体综合三步获取的信息,生成一个全面、结构化的回答。

在这里,不同类型的索引成为了智能体解决复杂问题的专用“技能包”。

5.2 动态索引与查询规划

更高级的模式是,智能体不仅查询索引,还能在对话过程中动态修改或增强索引。例如:

  • 用户:“我想了解新能源汽车。”
  • 智能体:从SummaryIndex中检索到概述信息返回给用户。
  • 用户:“具体说说电池技术。”
  • 智能体:此时,它可以判断用户进入了更专业的细分领域。它可以在后台动态地从庞大的VectorStoreIndex中,将与“电池技术”最相关的节点子集,临时构建一个更聚焦、更小的“电池技术子索引”,用于后续更深入的问答。这相当于为当前会话上下文创建了一个临时的、定制化的知识视图。

5.3 反思与索引增强

智能体还可以对失败的查询进行“反思”。当它发现根据现有索引无法给出好答案时,可以触发一个流程:尝试以不同的方式重新表述查询(查询重写),或从更底层的文档源中检索新的、可能未被索引的原始信息来补充上下文。这个过程产生的优质问答对,反过来又可以作为新的训练数据,用于优化嵌入模型或丰富知识图谱,实现索引的自我增强。

将LlamaIndex的强大索引能力与智能体的规划、工具调用、反思能力结合,是构建下一代自主、高效、可信的企业级知识应用的关键路径。这不再是一个简单的问答系统,而是一个能够深度理解问题、主动调动多维度知识、并持续进化的数字助手。

从我自己的实践来看,索引的进阶之路,就是从“一把锤子(向量索引)敲所有钉子”的粗放模式,走向“一个配备齐全、懂得根据材料选择工具的专业工匠”的精细模式。这条路没有终点,随着业务和数据的变化,你需要不断地审视你的“工具箱”,调整你的“策略”。但只要你掌握了LlamaIndex提供的这些核心索引能力,并理解了它们背后的设计哲学,你就拥有了应对各种复杂信息挑战的底气。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 5:30:33

ROS全覆盖路径规划实战:从算法选型到实车部署的完整避坑指南

1. 从“全覆盖”到“满地坑”:一个ROS开发者的真实心路如果你正在ROS(Robot Operating System)的海洋里折腾,想让你的机器人小车、无人机或者机械臂完成“扫地”式的全覆盖任务,那么“Coverage Path Planning”这个词对…

作者头像 李华
网站建设 2026/8/11 5:30:00

AI应用三端逆向实战:从Web到移动与桌面端的模型提取与协议分析

最近在分析一些AI应用时,发现其客户端(Web、Android、Windows)的防护机制越来越复杂,单纯靠传统逆向工具已经力不从心。无论是想学习其算法实现、进行安全审计,还是做兼容性研究,掌握一套系统的“AI三端逆向…

作者头像 李华
网站建设 2026/8/11 5:29:39

Halcon线段几何计算:中点、端点与角度详解

1. 项目概述:从像素坐标到几何洞察 在机器视觉的日常开发中,我们常常会遇到这样的场景:从一张图像中,我们通过边缘检测、模板匹配或者深度学习模型,得到了一条或多条线段。这些线段在Halcon的世界里,通常以…

作者头像 李华
网站建设 2026/8/11 5:29:30

存在主义视角下的自我认知与心理治疗实践

1. 存在主义视角下的自我认知重构 "你的存在,本身就是答案"这句话蕴含着深刻的哲学思考。在当代社会普遍存在的意义焦虑中,这句话像一剂解药直指核心——我们常常陷入"必须证明自己价值"的思维陷阱,却忽略了存在本身即是…

作者头像 李华
网站建设 2026/8/11 5:27:52

VS2022集成MinGW:打通Windows C++开发与开源生态的终极配置指南

1. 为什么要在VS2022里用MinGW? 如果你是一个C/C开发者,尤其是从Linux或跨平台开发转过来的,第一次在Visual Studio 2022(以下简称VS2022)里看到“MinGW”这个选项时,可能会有点懵。VS2022自带的MSVC编译器…

作者头像 李华
网站建设 2026/8/11 5:27:49

深入解析RoPE旋转位置编码:从复数几何到Transformer注意力实现

1. 项目概述:为什么我们需要“旋转”位置? 如果你玩过Transformer模型,无论是BERT、GPT还是T5,你肯定知道一个核心问题:Transformer本身是“排列不变”的。简单说,你把一句话的词序打乱再喂给它&#xff0c…

作者头像 李华