Skip to content

一、核心链路总览(LlamaIndex官方定义)

{"type":"load_by_key","key":"banner_image_0","image_type":"search"} LlamaIndex的RAG链路通过索引层(Indexing)查询层(Querying) 实现闭环,核心架构如下:

mermaid
graph TD
    subgraph 索引构建阶段
        A[数据加载] --> B[文档预处理]
        B --> C[节点分割]
        C --> D[向量嵌入]
        D --> E[索引存储]
    end
    subgraph 查询推理阶段
        F[用户查询] --> G[查询解析]
        G --> H[检索器匹配]
        H --> I[上下文整合]
        I --> J[LLM生成]
        J --> K[结果输出]
    end
    E --> H[检索器匹配]

二、索引构建阶段:知识库的底层实现

1. 数据加载(Data Loading)

核心目标:适配多源数据格式,统一转换为Document对象

  • 关键类与实现
    python
    from llama_index.core import SimpleDirectoryReader, Document
    from llama_index.readers.web import SimpleWebPageReader
    
    # 1. 本地文件加载(支持PDF/Markdown/Excel等20+格式)
    reader = SimpleDirectoryReader(input_dir="./docs", recursive=True)
    docs = reader.load_data()  # 返回Document列表,含text/metadata属性
    
    # 2. 网页数据加载
    web_reader = SimpleWebPageReader()
    web_docs = web_reader.load_data(urls=["https://example.com/article"])
    
    {
      "id": "relation.id",
      "type": "type",
      "domain": "relation.domain",
      "description": "{relation.source_entity}->{relation.target_entity}",
      "brand": "domain.brand_name",
      "series": "domain.series_name",
      "qa_split": "qa_split"

}

- **技术细节**:
- `Document`类封装原始文本与元数据(如文件路径、修改时间),元数据可用于后续过滤检索
- 支持自定义`BaseReader`扩展数据源(如数据库、Notion API)

#### 2. 文档预处理与节点分割
**核心目标**:平衡嵌入精度与上下文完整性
- **基础分割策略**:
```python
from llama_index.core.node_parser import RecursiveCharacterTextSplitter

# 递归字符分割器(默认推荐)
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1024,          # 子节点字符数
    chunk_overlap=200,        # 重叠窗口(避免语义断裂)
    separators=["\n\n", "\n", ". "]  # 优先按段落分割
)
nodes = splitter.get_nodes_from_documents(docs)  # 生成Node对象
  • 高级分割方案
    分割策略核心类适用场景
    父文档分割ParentDocumentSplitter长文档(如论文),子块检索+父块生成
    语义分割SentenceSplitter短文本(如新闻),按句子边界分割
    代码分割CodeSplitter代码文件,按函数/类分割

3. 向量嵌入(Embedding)

核心目标:将Node转换为可检索的向量表示

  • 默认实现与自定义
    python
    from llama_index.core import Settings
    from llama_index.embeddings.openai import OpenAIEmbedding
    from llama_index.embeddings.huggingface import HuggingFaceEmbedding
    
    # 1. 使用OpenAI嵌入(默认)
    Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-large")
    
    # 2. 本地化部署(HuggingFace)
    Settings.embed_model = HuggingFaceEmbedding(
        model_name="BAAI/bge-large-zh-v1.5",
        device="cuda"  # 支持GPU加速
    )
  • 技术细节
    • 嵌入维度自动适配索引类型(如VectorStoreIndex默认600-1536维)
    • 支持异步嵌入处理(aindex.from_documents)提升大规模数据效率

4. 索引构建与存储

核心目标:构建高效检索结构,支持多种存储后端

  • 基础向量索引
    python
    from llama_index.core import VectorStoreIndex
    
    # 从节点构建索引(自动完成嵌入计算)
    index = VectorStoreIndex(
        nodes,
        embed_model=Settings.embed_model,
        show_progress=True  # 显示构建进度
    )
    # 持久化存储
    index.storage_context.persist(persist_dir="./storage")
    # 加载已有索引
    from llama_index.core import StorageContext, load_index_from_storage
    storage_context = StorageContext.from_defaults(persist_dir="./storage")
    index = load_index_from_storage(storage_context)
  • 高级索引类型
    索引类型核心类技术优势
    知识图谱索引KnowledgeGraphIndex支持实体关系推理
    树形索引TreeIndex长文档层级检索
    关键词表索引KeywordTableIndex精确关键词匹配

三、查询推理阶段:从查询到回答的实现

1. 检索器(Retriever):RAG的核心检索单元

核心目标:精准匹配查询与知识库节点

  • 基础向量检索器
    python
    # 从索引创建检索器
    retriever = index.as_retriever(
        similarity_top_k=5,  # 返回Top5相似节点
        vector_store_query_mode="default",  # 余弦相似度匹配
        filters=[MetadataFilter(key="author", value="金庸")]  # 元数据过滤
    )
    # 执行检索
    from llama_index.core import QueryBundle
    query_bundle = QueryBundle("郭靖学会了哪些功夫?")
    nodes = retriever.retrieve(query_bundle)
  • 高级检索器实现
    1. 递归检索器(RecursiveRetriever)
      解决多块分散信息问题,递归探索节点关联:
      python
      from llama_index.core.retrievers import RecursiveRetriever
      
      recursive_retriever = RecursiveRetriever(
          root_id="vector",  # 根检索器ID
          retriever_dict={"vector": retriever},  # 检索器映射
          node_dict={node.node_id: node for node in nodes},  # 节点字典
          verbose=True  # 输出递归过程
      )
    2. 混合检索器(HybridRetriever)
      融合向量、关键词、知识图谱多路召回:
      python
      class HybridRetriever(BaseRetriever):  # 自定义混合检索器
          def __init__(self, vector_ret, keyword_ret, kg_ret):
              self.vector_ret = vector_ret
              self.keyword_ret = keyword_ret
              self.kg_ret = kg_ret
      
          def _retrieve(self, query_bundle):
              # 多路检索
              vector_nodes = self.vector_ret.retrieve(query_bundle)
              keyword_nodes = self.keyword_ret.retrieve(query_bundle)
              kg_nodes = self.kg_ret.retrieve(query_bundle)
              # 权重融合(向量0.6 + 关键词0.3 + 图谱0.1)
              all_nodes = vector_nodes * 6 + keyword_nodes * 3 + kg_nodes * 1
              # 去重
              unique_nodes = list({n.node_id: n for n in all_nodes}.values())
              return unique_nodes[:10]  # 返回Top10

2. 查询引擎(QueryEngine):检索与生成的封装

核心目标:整合检索结果与LLM,生成带来源的回答

  • 基础使用
    python
    # 从检索器创建查询引擎
    query_engine = index.as_query_engine(
        retriever=recursive_retriever,
        streaming=True,  # 流式输出
        citation_mode="all"  # 显示所有引用来源
    )
    # 执行查询
    response = query_engine.query("郭靖的降龙十八掌师从何人?")
    # 输出结果与来源
    print(response)
    for source in response.source_nodes:
        print(f"来源:{source.metadata['file_name']}, 相关性:{source.score:.2f}")
  • 技术细节
    • RetrieverQueryEngine为核心实现类,默认使用SimplePromptTemplate构造上下文
    • 支持自定义ResponseSynthesizer实现复杂生成逻辑(如多轮总结、引用格式化)

3. 进阶优化:重排序与反馈闭环

  • 重排序实现(提升相关性):
    python
    from llama_index.core.postprocessor import CrossEncoderReranker
    
    # 集成Cross-Encoder重排序(Recall@5提升至92%)
    reranker = CrossEncoderReranker(
        model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",
        top_n=3  # 保留Top3高相关节点
    )
    # 注入查询引擎
    query_engine = index.as_query_engine(
        retriever=retriever,
        node_postprocessors=[reranker]
    )
  • 反馈闭环(持续优化):
    python
    # 记录用户反馈
    from llama_index.core.evaluation import RelevancyEvaluator
    
    evaluator = RelevancyEvaluator()
    feedback = evaluator.evaluate_response(
        query=query_bundle,
        response=response
    )
    # 反馈用于微调检索器(如调整Top-K、重排序权重)

四、生产环境关键技术与避坑指南

1. 性能优化

优化点实现方案效果提升
检索速度向量库量化(FAISS IVF_PQ)时延降低60%
内存占用索引分片存储支持TB级数据
并发处理异步查询引擎(aquery方法)支持1000+ QPS

2. 知识图谱冷启动

解决初始数据不足问题:

python
from llama_index.core.llms import OpenAI
from llama_index.core.knowledge_graph import SimpleKnowledgeGraph

# 用LLM自动抽取三元组构建初始图谱


<NolebasePageProperties />




llm = OpenAI(model="gpt-4-turbo")
kg = SimpleKnowledgeGraph.from_documents(
    docs,
    llm=llm,
    max_triplets_per_chunk=5  # 每块抽取5个三元组
)

3. 监控与观测

通过Llama Trace追踪链路性能:

python
from llama_index.core.tracing import set_global_handler

# 启用LangSmith追踪(监控检索时延、重排序效率)
set_global_handler("langsmith")

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写