你是否遇到过这样的困扰——想让大模型回答公司内部文件里的问题,它却只会一本正经地胡说八道?
LlamaIndex就是来解决这个痛点的。
它像一座桥梁,把散落的文档、数据库和API连接起来,让大语言模型能读懂你的私有数据,给出靠谱又精准的回答。
📥 第一步:把文档“喂”给索引
想让AI读懂你的文档,得先把数据组织成它理解的格式。
下面这段代码展示了最基础的文档加载和索引构建过程。
我们用SimpleDirectoryReader一口气读入文件夹里所有txt或pdf文件,然后调用VectorStoreIndex把文档切成小块,转换成向量存进索引里。
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
documents = SimpleDirectoryReader("./my_docs").load_data()
index = VectorStoreIndex.from_documents(documents)
print(f"成功索引了 {len(documents)} 个文档")
执行后,终端会吐出这样的提示:
成功索引了 5 个文档
这些文档现在已经被切碎、编码,安静地躺在向量库里,等着被提问唤醒。
🔎 第二步:像搜索引擎一样查询
构建好索引后,就能向它提问了。index.as_query_engine()会把你的问题也转成向量,去索引里做相似度匹配,找到最相关的文档片段,再交给大模型总结回答。
query_engine = index.as_query_engine()
response = query_engine.query("公司年假政策是什么?")
print(response)
运行结果会直接输出一段自然语言回答:
根据公司手册,入职满一年的员工享有5天带薪年假。
这就好比有个不知疲倦的实习生,把厚厚的员工手册从头翻到尾,只花了不到两秒。
🧩 第三步:给引擎装上“记忆”
默认的查询引擎每次提问都是独立的,不记得上一句说过什么。
想让对话连贯起来,得用ChatEngine,它会把聊天记录一并送入上下文,让AI知道你在追问。
chat_engine = index.as_chat_engine()
res1 = chat_engine.chat("苹果最新的财报毛利率是多少?")
res2 = chat_engine.chat("那比去年同期涨了多少?")
print(res2)
输出结果会准确理解“那”指代的是毛利率:
与去年同期相比,毛利率上涨了1.8个百分点。
没有记忆的话,第二个问题大概率会得到一句“请问您指的是什么”的茫然回复。
🏗️ 第四步:给数据装上“路由器”
实际业务中,数据往往散落在不同地方——产品文档在本地,用户评论在数据库里。
这时候可以用RouterQueryEngine,它像一个智能接线员,自动判断问题该分发给哪个查询引擎。
from llama_index.core.tools import QueryEngineTool
tool1 = QueryEngineTool.from_defaults(engine1, description="产品文档")
tool2 = QueryEngineTool.from_defaults(engine2, description="用户评价")
router = RouterQueryEngine.from_defaults([tool1, tool2])
result = router.query("用户对续航最集中的吐槽是什么?")
print(result)
引擎会识别出“吐槽”这个关键词,把问题精准路由到管理“用户评价”的引擎上,返回相关差评摘要,而不是去产品文档里瞎翻。
⚖️ 优势对比:不止LlamaIndex这一个选择
跟直接拼接提示词的方案比,LlamaIndex把数据索引和检索抽象得干净利落,省去大量样板代码。
和LangChain相比,它更专注在RAG这一件事上,学习曲线平缓不少,但要构建涉及复杂代理推理的链路,生态丰富度暂时稍逊一筹。
建议做企业知识库、文档问答类项目时优先考虑,追求极致灵活度再去看LangChain。
💬 写在最后
LlamaIndex让私有数据接入大模型这件事变得前所未有的简单。
从搭建内部知识库到开发智能客服,它都是值得放进工具箱的利器。
你在项目中用过它吗?踩过哪些坑,又有哪些独门心得?欢迎在评论区畅所欲言,我们一起把这条路走得更顺。