LlamaIndex诀窍:RAG 数据框架代表。
作为 RAG(检索增强生成)领域的头部框架,LlamaIndex 早已不只是“数据索引+问答”那么简单。很多用户把它当黑盒用,结果遇到性能瓶颈、幻觉问题、数据混乱。今天直接上干货,分享五个真正能提升 LlamaIndex 实战效率的技巧。
SentenceWindowNodeParser 替代默认解析器,告别上下文碎片默认的 SimpleNodeParser 按固定 token 数切分文档,容易把一句话切成两半,导致检索时语义断裂。改用 SentenceWindowNodeParser 后,每个节点保留前后各 N 句的窗口,检索时自动扩展上下文。
from llama_index.core.node_parser import SentenceWindowNodeParser
node_parser = SentenceWindowNodeParser.from_defaults(
window_size=3,
window_metadata_key="window",
original_text_metadata_key="original_text"
)
这样即使只命中某个句子,也能把前后关键信息一起喂给 LLM,回答质量直接提升一个档次。适合处理合同、论文这类逻辑紧密的长文档。
MetadataExtractor 注入结构化元数据很多人只把文档原文扔进去,忽略了元数据的作用。实际上,给每个节点打上“章节标题”“文件类型”“时间戳”等标签,能让检索精准度翻倍。
from llama_index.core.extractors import TitleExtractor, QuestionsAnsweredExtractor
from llama_index.core.ingestion import IngestionPipeline
pipeline = IngestionPipeline(
transformations=[
TitleExtractor(),
QuestionsAnsweredExtractor(questions=3),
]
)
比如给每个节点自动生成“该段落能回答哪些问题”,检索时直接匹配问题向量,比全文检索快得多。适合 FAQ 类知识库或客服系统。
RouterQueryEngine 做多源路由,避免“一个引擎通吃”当你的数据既有 PDF 又有数据库还有 API 接口时,别用单一索引。用 RouterQueryEngine 让 LlamaIndex 自动判断该调哪个子引擎。
from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.tools import QueryEngineTool
sql_tool = QueryEngineTool.from_defaults(query_engine=sql_engine, name="sql")
pdf_tool = QueryEngineTool.from_defaults(query_engine=pdf_engine, name="pdf")
router = RouterQueryEngine.from_defaults([sql_tool, pdf_tool])
用户问“上季度销售额”,自动路由到 SQL 引擎;问“产品说明书”,走 PDF 引擎。不仅速度快,还解决了混合数据源互相干扰的问题。
CitationQueryEngine 让 LLM 输出带原文引用RAG 最怕幻觉,而 LlamaIndex 的 CitationQueryEngine 能强制 LLM 在回答时附上原文段落。这不是简单的“参考来源”,而是把原文片段嵌入回答结构。
from llama_index.core.query_engine import CitationQueryEngine
engine = CitationQueryEngine.from_args(
index,
citation_chunk_size=512,
citation_chunk_overlap=20
)
response = engine.query("公司的退款政策是什么?")
print(response.source_nodes) # 直接拿到引用的原文节点
对于法律、医疗、金融等合规要求高的场景,这一招能大幅降低风险。用户看到回答下方直接附上原文,信任度也更高。
AgentRunner + 自定义工具链,让 LlamaIndex 主动干活别只做被动问答。用 AgentRunner 把 LlamaIndex 变成能主动操作数据的智能体。比如让它先检索文档,再调用 Python 工具做计算,最后生成报告。
from llama_index.core.agent import AgentRunner
from llama_index.core.tools import FunctionTool
def calculate_avg(numbers):
return sum(numbers) / len(numbers)
avg_tool = FunctionTool.from_defaults(fn=calculate_avg)
agent = AgentRunner.from_defaults(
tools=[avg_tool, query_tool],
verbose=True
)
agent.chat("从销售报告中找出Q3的月均销售额")
这个智能体会自动拆解任务:先检索 Q3 销售数据,提取数字,再调用计算函数,最后返回结果。适合自动化报表、数据分析等复杂工作流。
以上五个技巧覆盖了从数据预处理、检索优化到智能体构建的全流程。LlamaIndex 的潜力远不止“搭个 RAG”,关键是理解它的组件化设计,把每个模块用到极致。下次遇到性能瓶颈或回答质量差,先别急着换模型,试试这些方法。