核心概念 #

概念总览 #

text
┌─────────────────────────────────────────────────────────────┐
│                  LlamaIndex 核心概念                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    数据层                           │   │
│  │  Document ──→ Node ──→ Embedding                    │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                  │
│                           ▼                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    索引层                           │   │
│  │  VectorStoreIndex / SummaryIndex / TreeIndex        │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                  │
│                           ▼                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    检索层                           │   │
│  │  Retriever ──→ Node Postprocessor                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                  │
│                           ▼                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    响应层                           │   │
│  │  Response Synthesizer ──→ Query Engine             │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Document(文档) #

什么是 Document? #

Document 是 LlamaIndex 中数据的顶层容器,代表一个完整的文档源。

python
from llama_index.core import Document

doc = Document(
    text="这是文档的完整文本内容...",
    metadata={
        "source": "example.pdf",
        "author": "张三",
        "date": "2024-01-01",
        "category": "技术文档",
    },
    doc_id="doc_001",
)

Document 属性 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Document 结构                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Document                                                   │
│  ├── text: str           文档的完整文本内容                  │
│  ├── metadata: dict      文档的元数据                        │
│  │   ├── source          来源文件                           │
│  │   ├── author          作者                               │
│  │   ├── date            日期                               │
│  │   └── ...             其他自定义字段                      │
│  ├── doc_id: str         文档唯一标识                        │
│  └── relationships: dict  与其他节点的关系                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

创建 Document #

python
from llama_index.core import Document

doc = Document(text="直接创建的文档")

doc = Document(
    text="带元数据的文档",
    metadata={"source": "manual", "type": "example"},
)

from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()

Document 元数据 #

python
doc = Document(
    text="文档内容",
    metadata={
        "filename": "report.pdf",
        "page": 1,
        "category": "financial",
        "tags": ["report", "2024"],
    },
)

print(doc.metadata["filename"])
print(doc.get_metadata_str())

Node(节点) #

什么是 Node? #

Node 是 Document 的子块,是索引和检索的基本单位。一个 Document 可以被分割成多个 Node。

python
from llama_index.core import TextNode

node = TextNode(
    text="这是一个文本节点的内容",
    metadata={"source": "example.pdf", "page": 1},
    node_id="node_001",
)

Node 类型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Node 类型                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  TextNode                                                   │
│  ├── 最常用的节点类型                                        │
│  └── 包含文本内容                                            │
│                                                             │
│  ImageNode                                                  │
│  ├── 图像节点                                                │
│  └── 包含图像路径或 URL                                      │
│                                                             │
│  IndexNode                                                  │
│  ├── 索引节点                                                │
│  └── 引用其他节点或索引                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Node 分割 #

python
from llama_index.core import Document
from llama_index.core.node_parser import SentenceSplitter

doc = Document(text="很长的文档内容..." * 100)

splitter = SentenceSplitter(
    chunk_size=512,
    chunk_overlap=50,
)

nodes = splitter.get_nodes_from_documents([doc])

print(f"分割成 {len(nodes)} 个节点")

for node in nodes:
    print(f"节点 ID: {node.node_id}")
    print(f"文本长度: {len(node.text)}")
    print(f"元数据: {node.metadata}")

Node 解析器 #

python
from llama_index.core.node_parser import (
    SentenceSplitter,
    TokenTextSplitter,
    MarkdownNodeParser,
    CodeSplitter,
)

splitter = SentenceSplitter(
    chunk_size=1024,
    chunk_overlap=100,
)

token_splitter = TokenTextSplitter(
    chunk_size=512,
    chunk_overlap=50,
)

md_parser = MarkdownNodeParser()

code_splitter = CodeSplitter(
    language="python",
    chunk_lines=40,
    chunk_lines_overlap=15,
)

Node 关系 #

python
from llama_index.core import Document
from llama_index.core.node_parser import SentenceSplitter

doc = Document(text="第一句。第二句。第三句。第四句。")
nodes = SentenceSplitter().get_nodes_from_documents([doc])

for node in nodes:
    print(f"节点: {node.node_id[:8]}...")
    if node.prev_node:
        print(f"  前节点: {node.prev_node.node_id[:8]}...")
    if node.next_node:
        print(f"  后节点: {node.next_node.node_id[:8]}...")
    print(f"  父文档: {node.ref_doc_id[:8] if node.ref_doc_id else 'None'}")

Index(索引) #

什么是 Index? #

Index 是组织和检索数据的结构,它将 Node 以特定方式组织起来,支持高效查询。

text
┌─────────────────────────────────────────────────────────────┐
│                    索引类型                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  VectorStoreIndex(向量索引)                                │
│  ├── 最常用的索引类型                                        │
│  ├── 基于 Embedding 相似度检索                              │
│  ├── 适合语义搜索和问答                                      │
│  └── 需要 Embedding 模型                                    │
│                                                             │
│  SummaryIndex(摘要索引)                                    │
│  ├── 遍历所有节点                                            │
│  ├── 适合文档总结                                            │
│  └── 不需要 Embedding                                        │
│                                                             │
│  TreeIndex(树索引)                                         │
│  ├── 层级结构                                                │
│  ├── 从根到叶查询                                            │
│  └── 适合大型文档集                                          │
│                                                             │
│  KeywordTableIndex(关键词索引)                             │
│  ├── 提取关键词                                              │
│  ├── 精确匹配                                                │
│  └── 适合关键词搜索                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

VectorStoreIndex #

python
from llama_index.core import VectorStoreIndex, Document

documents = [Document(text="文档内容...")]

index = VectorStoreIndex.from_documents(documents)

index = VectorStoreIndex(nodes)

query_engine = index.as_query_engine()
response = query_engine.query("你的问题")

SummaryIndex #

python
from llama_index.core import SummaryIndex, Document

documents = [Document(text="很长的文档内容...")]

index = SummaryIndex.from_documents(documents)

query_engine = index.as_query_engine(response_mode="tree_summarize")

response = query_engine.query("总结这篇文档的主要内容")

TreeIndex #

python
from llama_index.core import TreeIndex, Document

documents = [
    Document(text="文档1内容..."),
    Document(text="文档2内容..."),
    Document(text="文档3内容..."),
]

index = TreeIndex.from_documents(documents)

query_engine = index.as_query_engine()

response = query_engine.query("查询问题")

KeywordTableIndex #

python
from llama_index.core import KeywordTableIndex, Document

documents = [Document(text="Python 是一种编程语言...")]

index = KeywordTableIndex.from_documents(documents)

query_engine = index.as_query_engine()

response = query_engine.query("Python 编程")

Retriever(检索器) #

什么是 Retriever? #

Retriever 负责从索引中检索相关节点,是查询引擎的核心组件。

python
from llama_index.core import VectorStoreIndex

index = VectorStoreIndex.from_documents(documents)

retriever = index.as_retriever(
    similarity_top_k=3
)

nodes = retriever.retrieve("你的查询")

for node in nodes:
    print(f"相似度: {node.score:.4f}")
    print(f"内容: {node.text[:100]}")

Retriever 类型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Retriever 类型                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  VectorIndexRetriever                                       │
│  ├── 向量相似度检索                                          │
│  └── 最常用的检索器                                          │
│                                                             │
│  SummaryIndexRetriever                                      │
│  ├── 返回所有节点                                            │
│  └── 适合总结任务                                            │
│                                                             │
│  TreeIndexRetriever                                         │
│  ├── 从根到叶检索                                            │
│  └── 层级遍历                                                │
│                                                             │
│  KeywordTableRetriever                                      │
│  ├── 关键词匹配                                              │
│  └── 精确搜索                                                │
│                                                             │
│  RouterRetriever                                            │
│  ├── 路由选择                                                │
│  └── 组合多个检索器                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

自定义 Retriever #

python
from llama_index.core import VectorStoreIndex
from llama_index.core.retrievers import VectorIndexRetriever

index = VectorStoreIndex.from_documents(documents)

retriever = VectorIndexRetriever(
    index=index,
    similarity_top_k=5,
)

nodes = retriever.retrieve("查询内容")

组合检索器 #

python
from llama_index.core import VectorStoreIndex, KeywordTableIndex
from llama_index.core.retrievers import (
    VectorIndexRetriever,
    KeywordTableSimpleRetriever,
    RouterRetriever,
)
from llama_index.core.tools import RetrieverTool

vector_index = VectorStoreIndex.from_documents(documents)
keyword_index = KeywordTableIndex.from_documents(documents)

vector_retriever = VectorIndexRetriever(
    index=vector_index,
    similarity_top_k=3,
)
keyword_retriever = KeywordTableSimpleRetriever(
    index=keyword_index,
)

retriever = RouterRetriever(
    retrievers=[
        RetrieverTool.from_defaults(
            retriever=vector_retriever,
            description="适合语义搜索",
        ),
        RetrieverTool.from_defaults(
            retriever=keyword_retriever,
            description="适合关键词搜索",
        ),
    ],
)

nodes = retriever.retrieve("查询内容")

Response Synthesizer(响应合成器) #

什么是 Response Synthesizer? #

Response Synthesizer 负责将检索到的节点合成为最终回答。

python
from llama_index.core import VectorStoreIndex, get_response_synthesizer

index = VectorStoreIndex.from_documents(documents)

response_synthesizer = get_response_synthesizer(
    response_mode="compact",
)

query_engine = index.as_query_engine(
    response_synthesizer=response_synthesizer,
)

响应模式 #

text
┌─────────────────────────────────────────────────────────────┐
│                    响应模式                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  compact(默认)                                             │
│  ├── 合并节点后一次性生成                                    │
│  └── 适合大多数场景                                          │
│                                                             │
│  refine                                                     │
│  ├── 逐个节点迭代优化回答                                    │
│  └── 适合需要精细回答的场景                                  │
│                                                             │
│  tree_summarize                                             │
│  ├── 分层总结后合并                                          │
│  └── 适合文档总结                                            │
│                                                             │
│  simple_summarize                                           │
│  ├── 简单拼接后生成                                          │
│  └── 快速但可能丢失细节                                      │
│                                                             │
│  no_text                                                    │
│  ├── 不生成回答,只返回节点                                  │
│  └── 适合只需要检索结果的场景                                │
│                                                             │
│  accumulate                                                 │
│  ├── 对每个节点单独生成回答                                  │
│  └── 适合并行处理                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用不同模式 #

python
from llama_index.core import VectorStoreIndex, get_response_synthesizer

index = VectorStoreIndex.from_documents(documents)

compact_synthesizer = get_response_synthesizer(response_mode="compact")

refine_synthesizer = get_response_synthesizer(response_mode="refine")

tree_synthesizer = get_response_synthesizer(response_mode="tree_summarize")

query_engine = index.as_query_engine(
    response_synthesizer=refine_synthesizer,
)

Query Engine(查询引擎) #

什么是 Query Engine? #

Query Engine 是端到端的查询接口,整合了检索器和响应合成器。

python
from llama_index.core import VectorStoreIndex

index = VectorStoreIndex.from_documents(documents)

query_engine = index.as_query_engine()

response = query_engine.query("你的问题")
print(response)

查询引擎配置 #

python
query_engine = index.as_query_engine(
    similarity_top_k=3,
    response_mode="compact",
    streaming=True,
)

query_engine = index.as_query_engine(
    retriever=custom_retriever,
    response_synthesizer=custom_synthesizer,
    node_postprocessors=[postprocessor],
)

查询引擎类型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    查询引擎类型                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  RetrieverQueryEngine                                       │
│  ├── 基础查询引擎                                            │
│  └── 检索 + 合成                                             │
│                                                             │
│  MultiStepQueryEngine                                       │
│  ├── 多步查询                                                │
│  └── 迭代检索                                                │
│                                                             │
│  RetryQueryEngine                                           │
│  ├── 重试查询                                                │
│  └── 检测并重试                                              │
│                                                             │
│  RouterQueryEngine                                          │
│  ├── 路由查询                                                │
│  └── 选择合适的查询引擎                                      │
│                                                             │
│  SubQuestionQueryEngine                                     │
│  ├── 子问题查询                                              │
│  └── 分解复杂问题                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

多步查询引擎 #

python
from llama_index.core import VectorStoreIndex
from llama_index.core.query_engine import MultiStepQueryEngine

index = VectorStoreIndex.from_documents(documents)

query_engine = MultiStepQueryEngine(
    query_engine=index.as_query_engine(),
    num_steps=3,
)

response = query_engine.query("复杂问题")

子问题查询引擎 #

python
from llama_index.core import VectorStoreIndex
from llama_index.core.query_engine import SubQuestionQueryEngine
from llama_index.core.tools import QueryEngineTool

index = VectorStoreIndex.from_documents(documents)

query_engine_tools = [
    QueryEngineTool.from_defaults(
        query_engine=index.as_query_engine(),
        name="knowledge_base",
        description="知识库查询",
    ),
]

query_engine = SubQuestionQueryEngine.from_defaults(
    query_engine_tools=query_engine_tools,
)

response = query_engine.query("比较文档 A 和文档 B 的异同")

Node Postprocessor(节点后处理器) #

什么是 Node Postprocessor? #

Node Postprocessor 在检索后对节点进行处理,如重排序、过滤等。

python
from llama_index.core import VectorStoreIndex
from llama_index.postprocessor.cohere_rerank import CohereRerank

index = VectorStoreIndex.from_documents(documents)

cohere_rerank = CohereRerank(
    api_key="your-cohere-key",
    top_n=3,
)

query_engine = index.as_query_engine(
    similarity_top_k=10,
    node_postprocessors=[cohere_rerank],
)

常用后处理器 #

python
from llama_index.postprocessor.sentence_transformer_rerank import (
    SentenceTransformerRerank,
)
from llama_index.postprocessor.long_context_reorder import LongContextReorder
from llama_index.core.postprocessor import (
    SimilarityPostprocessor,
    KeywordNodePostprocessor,
)

similarity_processor = SimilarityPostprocessor(
    similarity_cutoff=0.7
)

keyword_processor = KeywordNodePostprocessor(
    required_keywords=["Python"],
    exclude_keywords=["Java"],
)

reorder_processor = LongContextReorder()

rerank_processor = SentenceTransformerRerank(
    model="cross-encoder/ms-marco-MiniLM-L-6-v2",
    top_n=3,
)

query_engine = index.as_query_engine(
    similarity_top_k=10,
    node_postprocessors=[
        similarity_processor,
        rerank_processor,
    ],
)

数据流转图 #

text
┌─────────────────────────────────────────────────────────────┐
│                    完整数据流转                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 数据加载                                                 │
│     数据源 ──→ SimpleDirectoryReader ──→ Documents          │
│                                                             │
│  2. 文档分割                                                 │
│     Documents ──→ NodeParser ──→ Nodes                      │
│                                                             │
│  3. 向量化                                                   │
│     Nodes ──→ Embedding Model ──→ Embeddings                │
│                                                             │
│  4. 索引构建                                                 │
│     Nodes + Embeddings ──→ Index                            │
│                                                             │
│  5. 查询处理                                                 │
│     Query ──→ Retriever ──→ Nodes                          │
│            ──→ Postprocessor ──→ Filtered Nodes            │
│            ──→ Synthesizer ──→ Response                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

下一步 #

理解核心概念后,接下来学习 数据连接器 了解如何加载各种数据源!

最后更新:2026-03-30