LangChain
LangChain
LangChain 是一个 LLM 应用开发框架。它本身不是模型,也不是向量数据库,而是把模型调用、Prompt、输出解析、工具调用、Embedding、VectorStore、Retriever、Agent 等能力包装成统一组件,方便开发者快速组合 LLM 应用。
可以把 LangChain 理解成一个“编排层”:
1 | 用户输入 |
如果是 RAG 应用,则会多出文档加载、切分、向量化、检索和上下文组装:
1 | 离线索引: |
1. LangChain 主要解决什么问题
统一模型调用接口
不同模型厂商的 API 格式不同,LangChain 把它们统一成invoke()、stream()、batch()等接口。统一 Prompt 和链式编排
使用ChatPromptTemplate管理 system/user 消息模板,再通过管道方式把 prompt、model、parser 串起来。快速搭建 RAG
提供 DocumentLoader、TextSplitter、Embeddings、VectorStore、Retriever 等组件,降低搭建检索增强生成应用的样板代码量。支持工具调用和 Agent
可以把搜索、数据库查询、计算函数等能力包装成 tool,让模型根据任务决定是否调用工具。生态集成丰富
LangChain 对 OpenAI、Anthropic、HuggingFace、Ollama、FAISS、Chroma、Milvus、Qdrant、PGVector 等都有集成,适合快速验证方案。
2. 入门应用:用 LangChain 搭一个本地 RAG 文档问答
这个例子和我当前的 RAG 项目思路一致:文档切分、Embedding、FAISS 检索、Prompt 组装、调用本地 vLLM 的 OpenAI-compatible 接口。
安装依赖:
1 | pip install -U langchain langchain-core langchain-community langchain-openai langchain-text-splitters langchain-huggingface faiss-cpu sentence-transformers |
准备一个本地知识文件:
1 | data/knowledge.txt |
示例代码:
1 | from langchain_community.document_loaders import TextLoader |
如果要流式输出:
1 | for token in rag_chain.stream("RAG 为什么需要 rerank?"): |
这个入门应用实际做了这些事:
1 | knowledge.txt |
3. LangChain 写法和普通手写写法的对比
3.1 LangChain 写法
LangChain 更强调组件封装和链式组合:
1 | rag_chain = ( |
这里的 retriever、prompt、llm、parser 都是 LangChain 组件。调用者只需要执行:
1 | rag_chain.invoke("问题") |
LangChain 会在内部依次执行检索、格式化上下文、构造 prompt、调用模型、解析输出。
3.2 我当前项目的写法
我当前采用的是自己组合链路,而不是把核心流程交给 LangChain 包装:
1 | 用户问题 |
也就是说,我不是不用“链”,而是把链路显式写在业务服务里。LangChain 帮开发者封装了链路;我的项目则把链路拆开,自己控制每一步。
4. 我当前自组合方案的优点
链路更透明,方便面试讲清楚
自己写 Embedding、FAISS 检索、rerank、prompt 组装、vLLM 调用和 SSE 返回,更能体现我理解 RAG 每个环节,而不是只会调用框架。可控性更强
chunk schema、metadata、citation 编号、token budget、rerank fallback、错误处理、超时重试、日志字段都可以按项目需要定制,不受框架默认抽象限制。更适合工程化服务
我的项目包含 C++ Drogon Gateway、FastAPI、Celery、Redis、MySQL、FAISS、vLLM 和 SSE 流式代理。LangChain 主要解决 LLM 编排问题,不能替代网关、异步任务、数据库事务、权限控制、任务状态追踪和监控。性能优化空间更明确
可以针对具体环节调优,例如 batch embedding、FAISS top_k、rerank top_k、prompt token 长度、vLLM 参数、SSE flush 策略等。框架封装越多,定位性能瓶颈时反而可能需要绕回底层。依赖更少,稳定性更好
LangChain 生态更新较快,版本变化可能导致 API 调整。自己基于标准 HTTP API、FAISS、SQLAlchemy/Celery 等组件实现,核心链路更稳定,也更容易排查线上问题。更容易做强 citation
citation 不只是“返回几个 source document”,还要和数据库里的 document、chunk、message、prompt_context 建立关系。自己实现可以保证引用编号、chunk ID、消息 ID、任务 ID 的一致性。
5. LangChain 的优点
LangChain 也有很明显的价值,尤其适合快速原型:
开发速度快
几十行代码就能搭出一个 RAG demo,适合验证模型、向量库、切分策略和 prompt 效果。集成丰富
换模型、换向量库、换 document loader 的成本较低。Agent 和 tool calling 方便
如果业务需要让模型自主决定查数据库、调用搜索、调用计算函数,LangChain 的 tool/agent 抽象能减少很多样板代码。调试和观测生态
配合 LangSmith,可以看到 chain 或 agent 的执行轨迹,适合调试复杂 LLM 应用。适合教学和方案验证
对初学者来说,LangChain 可以先把 RAG 主流程跑通,再逐步理解每个组件内部做了什么。
6. 面试表达
可以这样回答:
我了解 LangChain,它可以把 Prompt、Retriever、LLM、OutputParser 等组件封装成一条 chain,非常适合快速搭建 RAG demo。
但我的项目不是只做 demo,而是希望体现完整的工程链路,所以没有直接用 LangChain 包装核心流程,而是自己实现文档解析、chunk、Embedding、FAISS 召回、Cross-Encoder rerank、prompt 组装、vLLM 调用、SSE 流式返回、citation 落库和任务状态管理。
这样做的好处是链路透明、可控性强、便于性能调优,也更容易和 Gateway、Celery、MySQL、监控等工程模块结合。
如果只是快速验证 RAG 方案,LangChain 很合适;如果要做一个可控、可追踪、能解释每个中间状态的后端系统,我更倾向于自己组合核心链路。
一句话总结:
1 | LangChain 的优势是快速组合和生态集成; |
参考资料
- LangChain RAG 官方教程:https://docs.langchain.com/oss/python/langchain/rag
- LangChain ChatOpenAI 官方参考:https://reference.langchain.com/python/langchain-openai/chat_models/base
- LangChain ChatPromptTemplate 官方参考:https://reference.langchain.com/python/langchain-core/prompts/chat/ChatPromptTemplate
- https://zhuanlan.zhihu.com/p/1919781127339620246