这两个东西干嘛
它们是 LLM 应用的抽象层:把 RAG / Agent / Memory 这些常见模式封装成"乐高积木"。
- LangChain:覆盖最广,组件最多,复杂度最高
- LlamaIndex:专注 RAG / 文档索引,更聚焦
LangChain 简单例子
pip install langchain langchain-anthropic
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
llm = ChatAnthropic(model="claude-sonnet-4-6")
prompt = ChatPromptTemplate.from_messages([
("system", "你是 Python 老师"),
("human", "{question}"),
])
chain = prompt | llm
result = chain.invoke({"question": "装饰器是什么?"})
print(result.content)
prompt | llm 这种"管道"语法是 LangChain 的核心——把组件串起来。
LangChain 做 RAG(简化版)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.document_loaders import TextLoader
# 加载 + 切块
docs = TextLoader("doc.md").load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=80)
chunks = splitter.split_documents(docs)
# 向量化 + 存储
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 检索 + 生成
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt | llm
)
answer = chain.invoke("Python 装饰器是什么?")
10 行做完上一篇 80 行干的事——当组件需求标准时,LangChain 真省力。
LlamaIndex:专注文档检索
pip install llama-index llama-index-llms-anthropic
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.anthropic import Anthropic
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
Settings.llm = Anthropic(model="claude-sonnet-4-6")
Settings.embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-large-zh-v1.5")
# 一行搞定整个索引
docs = SimpleDirectoryReader("./docs").load_data()
index = VectorStoreIndex.from_documents(docs)
# 一行搞定查询引擎
engine = index.as_query_engine(similarity_top_k=5)
response = engine.query("装饰器是什么?")
print(response)
# 看看引用了哪些来源
for node in response.source_nodes:
print(node.metadata, node.score)
更简洁。
抽象层的代价
- 学习曲线:要学库的概念(Runnable / Chain / Tool / Agent / ...)
- 调试难:错误嵌套很深,traceback 不友好
- 版本变动大:LangChain 半年大改一次 API
- 黑盒:不容易精确控制每个 prompt
我的建议
| 场景 | 选 |
|---|---|
| 简单脚本 / 一次性任务 | 直接调 SDK,别用框架 |
| 标准 RAG(文档→问答) | LlamaIndex |
| 复杂 Agent / 多工具 / 自定义流程 | 看情况:LangChain 或自己写 |
| 大型产品 / 长期维护 | 自己封装薄薄一层(不依赖框架) |
一个折中策略:极薄封装
不靠任何框架,自己写 200 行:
class Retriever:
def search(self, query, k=5): ...
class LLM:
def chat(self, messages): ...
class RAGPipeline:
def __init__(self, retriever, llm):
self.retriever = retriever
self.llm = llm
def ask(self, q):
ctx = self.retriever.search(q)
return self.llm.chat([...])
代价:自己写 200 行;收益:完全可控、好调试、不被框架绑架。
生产代码我推荐这条路——只在原型快速验证时用框架。
下一篇讲 AI Agent。