LlamaIndex 接入教程
构建强大的 RAG 应用,轻松连接自定义数据与 LLM
什么是 LlamaIndex?
LlamaIndex(原 GPT Index)是一个专门用于构建 RAG(检索增强生成)应用的数据框架,让 LLM 能够轻松连接和查询自定义数据。
数据连接
支持 100+ 数据源:PDF、数据库、API、Notion 等
智能索引
向量、关键词、图索引等多种索引方式
精准查询
语义搜索、混合检索、重排序等
高性能
优化的查询管道,支持流式输出
💡 LangChain vs LlamaIndex:
• LangChain - 通用 AI 应用框架,适合构建各种类型的 AI 应用
• LlamaIndex - 专注于数据和 RAG 的框架,更适合知识库、文档问答场景
• 两者可以配合使用
• LangChain - 通用 AI 应用框架,适合构建各种类型的 AI 应用
• LlamaIndex - 专注于数据和 RAG 的框架,更适合知识库、文档问答场景
• 两者可以配合使用
安装 LlamaIndex
bash
# 安装核心包
pip install llama-index
# 安装 OpenAI 兼容的嵌入模型支持
pip install llama-index-embeddings-openai
# 安装向量存储(可选)
pip install llama-index-vector-stores-chroma
# 安装文档加载器(按需)
# pip install llama-index-readers-file # 文件读取
# pip install llama-index-readers-web # 网页读取
# pip install llama-index-readers-database # 数据库读取
配置 XiDao Api
环境变量配置
bash
# Linux / macOS
export OPENAI_API_KEY="sk-你的API_KEY"
export OPENAI_BASE_URL="https://api.xidao.online/v1"
# Windows (PowerShell)
$env:OPENAI_API_KEY="sk-你的API_KEY"
$env:OPENAI_BASE_URL="https://api.xidao.online/v1"
代码中配置
Python
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
# 配置 LLM
Settings.llm = OpenAI(
model="gpt-4o",
api_key="sk-你的API_KEY",
base_url="https://api.xidao.online/v1"
)
# 配置 Embedding 模型
Settings.embed_model = OpenAIEmbedding(
model="text-embedding-3-small",
api_key="sk-你的API_KEY",
base_url="https://api.xidao.online/v1"
)
基础 RAG 示例
最简单的 RAG 应用
Python
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core import Settings
# 配置 API
Settings.llm = OpenAI(
model="gpt-4o",
api_key="sk-你的API_KEY",
base_url="https://api.xidao.online/v1"
)
Settings.embed_model = OpenAIEmbedding(
api_key="sk-你的API_KEY",
base_url="https://api.xidao.online/v1"
)
# 1. 加载文档
documents = SimpleDirectoryReader("./data").load_data()
# 2. 创建索引
index = VectorStoreIndex.from_documents(documents)
# 3. 创建查询引擎
query_engine = index.as_query_engine()
# 4. 查询
response = query_engine.query("这个项目的主要功能是什么?")
print(response)
📁 准备测试数据:
在当前目录创建
在当前目录创建
./data 文件夹,放入一些 .txt 或 .md 文件即可开始测试。
数据连接器
LlamaIndex 支持从多种数据源加载数据。
加载本地文件
Python
from llama_index.core import SimpleDirectoryReader
from llama_index.readers.file import PDFReader, MarkdownReader
# 加载目录中的所有文件
reader = SimpleDirectoryReader(
input_dir="./docs",
required_exts=[".pdf", ".md", ".txt", ".docx"],
recursive=True
)
documents = reader.load_data()
print(f"加载了 {len(documents)} 个文档")
加载网页内容
Python
from llama_index.readers.web import SimpleWebPageReader
# 安装依赖:pip install llama-index-readers-web
urls = [
"https://example.com/article1",
"https://example.com/article2"
]
reader = SimpleWebPageReader(html_to_text=True)
documents = reader.load_data(urls)
print(f"从 {len(urls)} 个网页加载了 {len(documents)} 个文档")
手动创建文档
Python
from llama_index.core import Document
# 手动创建文档
documents = [
Document(
text="XiDao Api 提供稳定的 AI API 中转服务...",
metadata={"source": "internal", "category": "intro"}
),
Document(
text="支持的模型包括 Claude、GPT、Gemini 等...",
metadata={"source": "internal", "category": "models"}
),
]
# 直接使用这些文档创建索引
index = VectorStoreIndex.from_documents(documents)
高级索引策略
自定义分块策略
Python
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 自定义分块器
splitter = SentenceSplitter(
chunk_size=1024, # 每块最大字符数
chunk_overlap=200, # 块之间重叠字符数
)
# 加载并分割文档
documents = SimpleDirectoryReader("./data").load_data()
nodes = splitter.get_nodes_from_documents(documents)
# 创建索引
index = VectorStoreIndex(nodes)
print(f"创建了 {len(nodes)} 个节点")
使用外部向量数据库
Python
import chromadb
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.embeddings.openai import OpenAIEmbedding
# 初始化 ChromaDB
chroma_client = chromadb.PersistentClient(path="./chroma_db")
chroma_collection = chroma_client.get_or_create_collection("xidao_docs")
# 创建向量存储
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 配置 embedding
embed_model = OpenAIEmbedding(
api_key="sk-你的API_KEY",
base_url="https://api.xidao.online/v1"
)
# 从文档创建索引(会持久化到 ChromaDB)
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
embed_model=embed_model
)
print("索引已保存到 ChromaDB")
查询引擎
LlamaIndex 提供多种查询方式来满足不同场景需求。
基本查询
Python
# 基本查询引擎
query_engine = index.as_query_engine()
response = query_engine.query("XiDao Api 有什么优势?")
print(f"回答: {response}")
# 查看引用的源节点
for node in response.source_nodes:
print(f"- 相关度: {node.score:.3f}")
print(f" 内容: {node.text[:100]}...")
流式查询
Python
# 流式输出
streaming_query_engine = index.as_query_engine(streaming=True)
response = streaming_query_engine.query("详细介绍产品特性")
# 流式打印结果
for text in response.response_gen:
print(text, end="", flush=True)
相似度搜索
Python
# 获取相似文档(不生成回答)
retriever = index.as_retriever(similarity_top_k=5)
nodes = retriever.retrieve("价格和计费")
for i, node in enumerate(nodes):
print(f"\n--- 结果 {i+1} (相关度: {node.score:.3f}) ---")
print(node.text[:200])
对话引擎
对话引擎支持多轮对话,能够记住上下文历史。
Python
from llama_index.core.chat_engine import CondensePlusContextChatEngine
# 创建对话引擎
chat_engine = index.as_chat_engine(
chat_mode="condense_plus_context", # 压缩上下文 + 检索
similarity_top_k=3,
verbose=True
)
# 多轮对话
response1 = chat_engine.chat("你们支持哪些模型?")
print(f"AI: {response1.response}")
response2 = chat_engine.chat("Claude 模型的价格是多少?")
print(f"AI: {response2.response}")
# 对话引擎会记住之前的上下文
流式对话
Python
# 流式对话
streaming_chat = index.as_chat_engine(
chat_mode="condense_plus_context",
streaming=True
)
response = streaming_chat.chat("总结一下产品特点")
# 流式输出
for token in response.response_gen:
print(token, end="", flush=True)
⚠️ 生产环境建议:
• 使用持久化的向量数据库(如 ChromaDB、Pinecone)
• 对于大量文档,考虑使用更高级的索引策略
• 监控 Token 使用量,优化成本
• 定期更新索引以保持数据新鲜度
• 使用持久化的向量数据库(如 ChromaDB、Pinecone)
• 对于大量文档,考虑使用更高级的索引策略
• 监控 Token 使用量,优化成本
• 定期更新索引以保持数据新鲜度