
第 32 课 | LlamaIndex 入门用 50 行代码构建企业级知识库从零到一用 LlamaIndex 将行业报告、研究文档构建为可语义检索的知识库让 Agent 的回答有据可依。一、业务痛点Agent 的「知识幻觉」问题在场景二中我们让 Agent 查询数据库、生成图表、回答问题。但有一个根本问题没解决Agent 的知识从哪里来LLM 的训练数据有截止日期而且不可能包含你公司内部的行业报告、竞品分析、市场研究。如果直接问 Agent「智能手表市场有多大」它可能回答一个过时的数字或者干脆编造一个。这就是「知识幻觉」——Agent 不知道就说不知道但 LLM 不知道也会硬编。业务场景中这可能是致命的。老板问「华为手表在血压监测方面有什么优势」如果你的 Agent 给出一个似是而非的答案老板据此做了错误决策后果不堪设想。解决方案RAGRetrieval-Augmented Generation——检索增强生成。在 Agent 回答问题之前先从知识库中检索相关文档将检索结果作为上下文注入 Prompt让 LLM 基于真实数据回答。用户提问检索知识库相关文档注入PromptLLM 生成回答在 9-12 课我们已经学过 RAG 的基础组件BGE 嵌入、ChromaDB、Reranker。现在我们要用LlamaIndex这个框架把这些组件优雅地组装起来构建一个生产级的知识库系统。二、为什么选择 LlamaIndex在 RAG 领域LlamaIndex 和 LangChain 是最主流的两大框架。它们的定位不同维度LlamaIndexLangChain核心定位数据索引和检索通用 Agent 编排擅长领域RAG、知识库、文档问答工具调用、工作流、Agent数据连接器160 内置连接器需要自己写索引结构多种索引类型主要用于 Chain学习曲线低专注一件事中概念多最佳场景构建知识库、文档问答多步骤 Agent 编排简单来说LlamaIndex 做检索LangChain 做编排。两者可以配合使用——用 LlamaIndex 构建知识库用 LangChain/LangGraph 编排 Agent 工作流。LlamaIndex 的核心工作流查询检索索引构建数据加载 PDF/Word/网页Data ConnectorDocumentsNode Parser文档切分Nodes 节点Embedding向量化VectorStoreIndex向量索引 用户查询Query Engine检索 生成三、核心概念拆解3.1 Document文档LlamaIndex 中的最小数据单元。一份 PDF、一页网页、一段文本都可以是一个 Document。fromllama_index.coreimportDocument docDocument(text智能手表市场2025年规模预计达到850亿美元...,metadata{source:行业报告,date:2025-01,author:市场部})3.2 Node节点Document 通常太长需要切分为更小的检索单元称为 Node。每个 Node 包含一段文本 元数据 与其他 Node 的关系。fromllama_index.core.node_parserimportSentenceSplitter parserSentenceSplitter(chunk_size512,chunk_overlap50)nodesparser.get_nodes_from_documents(documents)chunk_size和chunk_overlap是关键参数chunk_size512每个节点约 512 个字符适合中文检索chunk_overlap50相邻节点重叠 50 字符避免关键信息被切分到两个节点3.3 Index索引将 Node 向量化后存储的结构。最常用的是VectorStoreIndexfromllama_index.coreimportVectorStoreIndex indexVectorStoreIndex(nodes,embed_modelembed_model)LlamaIndex 还支持其他索引类型SummaryIndex对文档做摘要适合「这份文档讲了什么」KeywordTableIndex基于关键词的索引适合精确匹配TreeIndex树形索引适合「总结文档的某个章节」3.4 Query Engine查询引擎将「检索 生成」封装为一步操作query_engineindex.as_query_engine(similarity_top_k3)responsequery_engine.query(智能手表市场规模)similarity_top_k3表示返回最相关的 3 个文档片段。四、代码实战构建行业报告知识库完整代码结构code/lesson-32-llamaindex/ ├── pyproject.toml # UV 依赖配置 ├── llamaindex_kb.py # 主程序 ├── data/ # 原始文档自动生成 │ ├── 智能手表市场分析2025.txt │ ├── 华为智能手表产品分析.txt │ ├── 供应链与成本分析.txt │ └── 风险评估框架.txt └── index_storage/ # 索引持久化自动生成核心代码分步讲解步骤 1准备数据defcreate_sample_reports():创建示例行业报告模拟真实的企业知识库文档DATA_DIR.mkdir(parentsTrue,exist_okTrue)# 创建 4 份模拟行业报告...实际项目中你的文档来源可能是公司内部的研究报告PDF、Word竞品分析文档Markdown行业数据Excel会议纪要飞书文档LlamaIndex 提供了 160 数据连接器支持从几乎所有数据源加载。步骤 2构建索引# 配置全局设置Settings.embed_modelHuggingFaceEmbedding(model_nameBAAI/bge-small-zh-v1.5)Settings.node_parserSentenceSplitter(chunk_size512,chunk_overlap50)# 加载文档documentsSimpleDirectoryReader(DATA_DIR).load_data()# 构建索引indexVectorStoreIndex.from_documents(documents)# 持久化index.storage_context.persist(persist_dirstr(INDEX_DIR))步骤 3查询知识库query_engineindex.as_query_engine(similarity_top_k3)responsequery_engine.query(智能手表市场规模有多大)关键设计决策决策点选择理由嵌入模型bge-small-zh-v1.5轻量384维CPU 友好中文效果好切分策略512 字符 50 重叠中文语义完整避免切断关键信息索引类型VectorStoreIndex语义检索适合自然语言查询持久化本地文件系统简单、零依赖适合小规模场景五、运行效果# 安装依赖cdcode/lesson-32-llamaindex uvsync# 运行uv run llamaindex_kb.py输出示例[步骤 1] 准备示例行业报告... [创建] .../智能手表市场分析2025.txt [创建] .../华为智能手表产品分析.txt [创建] .../供应链与成本分析.txt [创建] .../风险评估框架.txt 共创建 4 份示例报告 [步骤 2] 构建 LlamaIndex 知识库索引... 正在加载文档... 加载了 4 份文档 - 智能手表市场分析2025.txt: 885 字符 - 华为智能手表产品分析.txt: 832 字符 - 供应链与成本分析.txt: 843 字符 - 风险评估框架.txt: 833 字符 正在解析文档为节点... 生成了 12 个节点chunk [步骤 3] 查询知识库... 查询: 智能手表市场规模有多大 [1] 相关度: 0.8523 | 来源: 智能手表市场分析2025.txt 内容: 2025年全球智能手表市场规模预计达到 850 亿美元... 查询: 华为智能手表有哪些产品线 [1] 相关度: 0.8934 | 来源: 华为智能手表产品分析.txt 内容: 1. 华为 Watch GT 系列1500-2500 元...六、效果对比有无知识库的区别维度无知识库纯 LLM有知识库LlamaIndex RAG数据准确性依赖训练数据可能过时基于最新文档真实可靠可追溯性无法追溯信息来源每个回答可追溯到具体文档领域专业性通用知识不够深入公司内部数据专业对口更新成本需要重新训练模型更新文档即可实时生效幻觉风险高低有检索结果约束业务价值量化场景市场部需要调研「智能手表」行业撰写市场分析报告 人工方式 - 搜索行业报告 → 2 小时 - 阅读 10 份报告 → 4 小时 - 提取关键数据 → 1 小时 - 整理成摘要 → 1 小时 总计8 小时 × 150 元/时 1,200 元 知识库 RAG 方式 - 上传报告到知识库 → 5 分钟 - 自然语言提问 → 30 秒/问题 - 自动生成摘要 → 1 分钟 总计约 10 分钟 × 0.5 元 0.5 元 效率提升480 倍 成本节省99.96%七、常见问题与优化7.1 索引太大怎么办小规模1000 文档本地文件存储本课方案够用中规模1000-100000 文档使用 ChromaDB 作为向量存储后端大规模100000 文档使用 Milvus 或 Pinecone 等生产级向量数据库7.2 检索结果不准确怎么办增大chunk_overlap如 50 → 100减少信息截断调整chunk_size如 512 → 256提高检索精度加入 Reranker 重排序第 33 课将详细讲解使用混合检索向量 关键词7.3 文档更新了怎么办# 重新构建索引indexVectorStoreIndex.from_documents(new_documents)index.storage_context.persist(persist_dirINDEX_DIR)或者使用 LlamaIndex 的增量索引功能只更新变化的文档。八、本课小结这一课我们完成了 LlamaIndex 的入门理解 LlamaIndex 的定位专注于 RAG 和知识库构建的框架掌握四大核心概念Document → Node → Index → Query Engine构建了第一个知识库4 份行业报告12 个检索节点跑通了完整流程数据准备 → 索引构建 → 语义检索 → 效果对比下一课我们将进一步升级——实现混合检索、Rerank 重排序、查询改写把检索精度提升到 90%。配套代码code/lesson-32-llamaindex/llamaindex_kb.py200 行可直接运行