资讯动态

LlamaIndex 问答(RAG)实战指南:从语义搜索到多文档路由与子问题查询

发布时间:2026/9/12 17:10:03 来源:尧图企业网站定制
LlamaIndex 问答RAG实战指南从语义搜索到多文档路由与子问题查询【免费下载链接】llama_indexLlamaIndex is the document processing platform for AI项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index检索增强生成Retrieval Augmented GenerationRAG是 LLM 应用最核心的使用场景之一在私有数据PDF、网页、Slack、Notion、SQL 数据库等之上回答用户问题。本文以 docs/src/content/docs/framework/use_cases/q_and_a.md 为主线系统梳理 LlamaIndex 从简单到高级的 QA/RAG 技术栈并结合llama-index-core源码剖析查询引擎的底层机制帮助你掌握语义搜索、摘要、Text-to-SQL、查询路由与多文档子问题分解等完整实战方案。一、RAG 与非结构化文档问答QA 的数据大多以非结构化文档形式存在PDF、HTML、Notion 页面、Slack 消息等LlamaIndex 可以拉取这些文本并对其内容建立索引。最简单的查询模式有两种语义搜索Semantic Search与摘要Summarization。1. 语义搜索最简单的 QA 入口语义搜索指查询文档中与问题在字面或语义意图上匹配的特定信息通常通过简单的向量检索top-k完成。LlamaIndex 内置一个开箱即用的内存向量存储也可替换为任意向量存储集成代码只需四步from llama_index.core import VectorStoreIndex, SimpleDirectoryReader documents SimpleDirectoryReader(data).load_data() index VectorStoreIndex.from_documents(documents) query_engine index.as_query_engine() response query_engine.query(What did the author do growing up?) print(response)其底层链路是SimpleDirectoryReader读取本地目录中的文档 →VectorStoreIndex.from_documents将文档切分为节点Node并向量化写入向量存储 →as_query_engine()包装出查询引擎 →query()完成「向量检索 LLM 综合」两步。配套的完整入门教程见 starter_example.mdx更完整的「QA patterns」文档见 understanding/putting_it_all_together/q_and_a/index.md。2. 摘要跨文档综合摘要查询要求 LLM 遍历大量甚至全部文档后综合出答案典型问题如What is a summary of this collection of text?Give me a summary of person Xs experience with the company.这类场景适合使用SummaryIndex摘要索引其默认行为是遍历全部数据index SummaryIndex.from_documents(documents) query_engine index.as_query_engine(response_modetree_summarize) response query_engine.query(summarization_query)经验上将response_mode设为tree_summarize树状摘要能显著提升摘要质量——该模式会递归地对节点分组摘要最终合并成单一答案适合信息量大、需要多轮归并的摘要任务。二、QA over Structured Data结构化数据问答如果数据已经存在于 SQL 数据库、CSV 文件或其他结构化格式中LlamaIndex 可以直接对这些数据源发起查询包括两大典型能力Text-to-SQL把自然语言问题翻译为 SQL 操作再对数据库执行Text-to-Pandas把自然语言问题翻译为 Pandas 操作对 DataFrame 执行分析。这两类能力在 understanding/putting_it_all_together/structured_data/index.md 中有完整指引。核心思路是将 SQL 数据库或 Pandas DataFrame 包装为查询引擎/工具让 LLM 先理解数据 schema再生成对应查询语句并执行最后把执行结果综合为自然语言答案。补充仓库中的use_cases目录还包含专门的 text_to_sql.md 与 querying_csvs.md 用例文档分别聚焦 SQL 数据源与 CSV 数据的问答场景。三、高级 QA 主题复杂文档、多源合并与查询路由随着问题复杂度与数据规模上升需要更好的查询理解、检索策略与多数据源整合能力。LlamaIndex 提供了一系列进阶机制。1. 复杂文档的解析与索引当文档结构复杂PDF 中含文本、表格、图表、图片、页眉页脚时LlamaIndex 提供与LlamaParse官方文档解析服务集成的进阶索引/检索方案可参考llama_parse仓库中的 cookbook 示例以及本仓库中的 llama_parse.md 说明。2. 组合多个数据源当数据分散在 Slack、PDF、非结构化文本等多个来源时可以分别对每个来源建索引再将查询同时分发到多个数据源并合并结果。3. 跨异构数据源路由RouterQueryEngine当有多个数据源时应用可以先让 LLM 挑选最合适的来源再把问题路由过去。核心实现是RouterQueryEngine源码见 llama-index-core/llama_index/core/query_engine/router_query_engine.py。首先为不同数据源构建子索引并为每个子索引对应的查询引擎配上描述包装成QueryEngineToolfrom llama_index.core import TreeIndex, VectorStoreIndex from llama_index.core.tools import QueryEngineTool # define sub-indices index1 VectorStoreIndex.from_documents(notion_docs) index2 VectorStoreIndex.from_documents(slack_docs) # define query engines and tools tool1 QueryEngineTool.from_defaults( query_engineindex1.as_query_engine(), descriptionUse this query engine to do..., ) tool2 QueryEngineTool.from_defaults( query_engineindex2.as_query_engine(), descriptionUse this query engine for something else..., )然后在这些工具之上定义RouterQueryEngine。默认使用LLMSingleSelector作为路由器即让 LLM 依据各工具的description从候选查询引擎中选出最佳匹配项from llama_index.core.query_engine import RouterQueryEngine query_engine RouterQueryEngine.from_defaults( query_engine_tools[tool1, tool2] ) response query_engine.query( In Notion, give me a summary of the product roadmap. )源码级原理RouterQueryEngine继承自BaseQueryEngine其from_defaults会通过get_selector_from_llm(llm, is_multiselect_multi)构造选择器——select_multiFalse时为单选True时为多选。在_query执行流中router_query_engine.py#L160-L203选择器基于各QueryEngineTool的metadata与查询内容选出result.ind若只选中一个引擎则直接执行该引擎的query()若选中多个引擎多选场景会并行执行多个子引擎查询再通过内部的TreeSummarize综合器combine_responses将多个响应合并为最终答案并把selector_result写入响应的metadata供追踪。QueryEngineTool本身是AsyncBaseTool的子类见 llama-index-core/llama_index/core/tools/query_engine.py它把查询引擎包装成带name、description元数据的工具从而让选择器/Agent 能够看到每个子引擎的职责描述call/acall分别对应同步与异步的query/aquery调用。四、多文档查询SubQuestionQueryEngine 的子问题分解部分问题的答案分散在多个数据源中需要先分别查询再合并。除了显式的合成/路由流程LlamaIndex 通过SubQuestionQueryEngine支持更通用的多文档查询源码见 llama-index-core/llama_index/core/query_engine/sub_question_query_engine.py给定一个查询它先生成包含多个子问题的查询计划分别针对子文档执行子查询最后综合出最终答案。第一步为每个文档/数据源定义索引并用QueryEngineTool包装与路由场景类似但这里强调name与description的语义化命名from llama_index.core.tools import QueryEngineTool query_engine_tools [ QueryEngineTool.from_defaults( query_enginesept_engine, namesept_22, descriptionProvides information about Uber quarterly financials ending September 2022, ), QueryEngineTool.from_defaults( query_enginejune_engine, namejune_22, descriptionProvides information about Uber quarterly financials ending June 2022, ), QueryEngineTool.from_defaults( query_enginemarch_engine, namemarch_22, descriptionProvides information about Uber quarterly financials ending March 2022, ), ]第二步在这些工具之上定义SubQuestionQueryEnginefrom llama_index.core.query_engine import SubQuestionQueryEngine query_engine SubQuestionQueryEngine.from_defaults( query_engine_toolsquery_engine_tools )该引擎可以对任意数量的工具执行任意多个子查询后再综合答案因此特别适合跨文档的对比/对照查询compare/contrast以及针对特定文档的精准查询。源码级原理SubQuestionQueryEngine.from_defaultssub_question_query_engine.py#L87-L132会优先尝试使用基于 OpenAI 函数调用的OpenAIQuestionGenerator来自llama-index-question-gen-openai包若不可用则回退到通用的LLMQuestionGenerator。执行流程_query为由question_gen基于工具元数据生成一组SubQuestion每个子问题都带有目标tool_name若use_asyncTrue默认通过run_async_tasks并发执行所有子查询_aquery_subq为每个子问题构造SubQuestionAnswerPair子问题 答案 来源节点将每个 QA 对构造成TextNode连同原始source_nodes一起交给response_synthesizer.synthesize()生成最终答案单个子查询失败会被捕获并记录警告不会中断整体流程返回None后由filter(None, ...)过滤。五、其他进阶查询模式多步查询Multi-Step Queries面对复杂问题先分解为初始子问题再根据返回答案顺序生成后续子问题直到产出最终答案。例如对Who was in the first batch of the accelerator program the author started?模块会先拆出该作者创办的加速器项目是什么查询后再追问后续问题。相关实现与用法可参考 query_transformations 相关指南。时序查询Temporal Queries两种方式支持需要时间理解的查询——其一利用节点间的 prev/next 关系判断是否需要在检索时额外拉取上下文其二按时间新旧排序并过滤过期上下文。对应机制在 node_postprocessors 指南中有详细说明。六、资源地图从入门到生产级 RAG围绕 QA/RAGLlamaIndex 提供了分阶段的学习资源RAG 新手入门阅读 understanding 系列指南理解文档、节点、索引、查询引擎等基础概念。数据不出本地的本地化运行参考 privacy.md 与 starter_example_local.mdx两者均讲解基于 Hugging Face 嵌入、重排序模型加本地 LLM如 Ollama的全开源栈方案。RAG 优化进阶查阅 production_rag.md 高级主题指南覆盖分块策略、检索质量、评估与故障模式排查。自定义 RAG 工作流使用 workflows 编排高级的 Agentic RAG 流水线例如 Corrective RAG 工作流示例。深入单个模块以下模块指南是搭建简单到高级 QA/RAG 系统的核心参考资料Query Engines查询引擎Chat Engines对话引擎见 chat_enginesAgents代理见 agents七、从用例到代码的落地路径将上述用例落地的推荐路径是先用VectorStoreIndexSimpleDirectoryReader跑通最小语义搜索对照 starter_example.mdx 中的 RAG 示例再按数据形态升级——结构化数据走 Text-to-SQL/Text-to-Pandas多数据源先用RouterQueryEngine做路由、再用SubQuestionQueryEngine做子问题分解最终可用AgentWorkflow如 starter_example.mdx 中演示的FunctionAgent把这些查询引擎包装为 Agent 工具实现计算 检索 对话的统一入口。这些查询引擎均继承自BaseQueryEngine统一暴露同步query()与异步aquery()接口天然支持流式响应与回调追踪你可以据此在任意环节接入自己的检索器、合成器或回调管理器构建符合业务需求的自定义 QA 管线。【免费下载链接】llama_indexLlamaIndex is the document processing platform for AI项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价