LlamaIndex高级使用

什么是 LlamaIndex 在 Rag 发挥的作用 以及与传统 Rag 的区别

1.LlamaIndex 简介

LlamaIndex(原 GPT Index)是一个专门为大模型构建索引、检索和数据管道的框架,核心目标是让 LLM 更好地连接和利用私有数据。

传统 RAG 通常是这样实现的:

# 传统 RAG 伪代码
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA

# 1. 切分文档
texts = text_splitter.split_documents(documents)

# 2. 向量化 + 存储
vectorstore = FAISS.from_documents(texts, OpenAIEmbeddings())

# 3. 检索 + 生成
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever()
)

问题:

  • 数据加载、切分、索引需要自己写很多代码
  • 检索策略单一(通常是简单的向量相似度)
  • 缺乏对数据结构的深度优化
  • 难以处理复杂的多模态、多源数据

LlamaIndex 在 RAG 中的作用

  1. 数据连接层

  from llama_index import SimpleDirectoryReader, VectorStoreIndex

  # 一行代码加载多种数据源
  documents = SimpleDirectoryReader('data').load_data()
  # 支持 PDF、Markdown、JSON、数据库、API、Notion 等 100+ 数据源

  2. 智能索引策略

  from llama_index import VectorStoreIndex, ListIndex, TreeIndex

  # 不同索引策略适应不同场景
  vector_index = VectorStoreIndex.from_documents(documents)  # 向量索引
  tree_index = TreeIndex.from_documents(documents)           # 树形索引(层次化)
  list_index = ListIndex.from_documents(documents)           # 列表索引(顺序检索)

  3. 高级检索能力

  # 混合检索:向量 + ��键词
  query_engine = index.as_query_engine(
      retrieval_mode="hybrid",  # 混合检索
      similarity_top_k=5,
      alpha=0.7  # 向量检索权重
  )

  # 自动重查询(Query Transformation)
  query_engine = index.as_query_engine(
      mode="recursive_retrieve",  # 递归检索
      use_async=True,
  )

  4. 结构化数据解析

  from llama_index.readers import SimpleReader

  # 自动识别表格、图表、层级结构
  documents = reader.load_data(
      file_path="report.pdf",
      extract_tables=True,  # 提取表格
      extract_images=True   # 提取图片
  )

核心优势示例

传统 RAG 检索(简单向量检索)

只能找到语义相似的片段
query = "公司的财务状况如何?"
返回:提到"财务"的某个片段,可能不准确

LlamaIndex 检索(智能路由 + 多层检索)

自动理解查询意图,选择最优检索路径
query = "公司的财务状况如何?"

  1. 识别这是关于财务的查询
  2. 路由到财务相关索引(如果有分片)
  3. 先检索关键字 + 向量混合
  4. 自动重排序结果
  5. 返回最相关的财务报表片段

什么时候用 LlamaIndex?

✅ 适合使用 LlamaIndex 的场景:

  • 数据源复杂(多种格式、多模态)
  • 需要高精度检索(医疗、法律、金融)
  • 文档结构化程度高(技术文档、财报)
  • 需要灵活的检索策略(不只是向量相似度)

❌ 可以用传统 RAG 的场景:

  • 简单的文本问答
  • 数据源单一(纯文本)
  • 快速原型验证

总结

LlamaIndex 本质上是 RAG 的"专业版":

  • 传统 RAG:自己搭积木,需要处理每个环节
  • LlamaIndex:封装了数据→索引→检索的全流程,提供更智能的检索策略

可以把 LlamaIndex 理解为 "给 LLM 准备数据的操作系统",让数据检索这件事变得更专业、更高效。

2. llamaindex 核心组件

image

plaintext

1. Data Connectors(数据连接器)

功能:用于从各种数据源(数据库、API、文件系统等)提取数据,并将其转换为适合 LlamaIndex 处理的格式。

支持的数据源

  • 本地文件(TXT、PDF、CSV、JSON、Markdown 等)
  • 数据库(PostgreSQL、MongoDB、SQL 等)
  • Web 爬取(网站、Notion、Google Drive、Slack)
  • API(调用 REST API 或 GraphQL API 获取数据)

代码示例:

import os

# 设置环境变量(LlamaIndex 会自动读取)
os.environ['OPENAI_API_KEY'] = 'sk-wEIft9KDlqY9'
os.environ['OPENAI_API_BASE'] = 'https://xiaoai.plus/v1'

#%%
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

# 读取本地文档
reader = SimpleDirectoryReader(
    input_dir="./data",
    required_exts=[".pdf"],
    recursive=True #递归读取子目录
)
# 创建文档读取器(方式二:简单方式)
# 注意:这行覆盖了上面的 reader,所以上面的配置没用了
reader = SimpleDirectoryReader("./data")  # 读取 data 目录下所有支持的文件
documents_origin = reader.load_data()
#%%
from pprint import pprint

for document in documents_origin:
    
    pprint(document.text)
    print('-'*130)
index = VectorStoreIndex.from_documents(documents_origin)
#步骤三,构建查询引擎
query_engine = index.as_query_engine()
#步骤四,得到结果
response = query_engine.query("同仁堂安宫牛黄丸的市场价格,中文回答")
print(response)

上述是一个基础的读取器,但是还存在两个问题
* 我们能不能继续扩大我们的处理数据来源呢:包含本地文件、网页、数据库等等
* 我们发现他并不能很好地读取图片、表格的数据【RAG面试必问问题】

posted @ 2026-01-16 19:56  执语  阅读(11)  评论(0)    收藏  举报