【日常学习-理解Langchain】从问题出发,我理解了LangChain为什么必须这么设计
最近在深入学习大模型应用开发,不可避免地要研究LangChain这个框架。一开始我并没有直接去看文档,而是尝试了一种不同的方法:从第一性原理出发,先想象一个理想的大模型应用应该什么样,再思考实现它会遇到哪些坎,最后推测一个框架需要提供什么能力来填平这些坎。
这篇文章,就是我这个思考过程的完整记录。让我惊喜的是,当最后再对照LangChain的官方文档时,发现我的推论和它的核心模块几乎完全吻合。这种通过自己推理获得的理解,远比死记硬背要深刻得多。
🔍 第一步:从最基础的“模型调用”开始想
我的思考:
想象一下,现在有一个LLM,他很聪明,什么都懂。但第一个现实问题马上就来了:市面上有OpenAI、Anthropic、国内各家厂商的模型。它们各有各的API接口、认证方式、请求和返回的格式。
如果我的代码里到处写满了针对某个厂商的特定代码,将来想切换模型简直是一场灾难。所以,框架需要具备的第一个能力就很明确了: 必须能把各种不同的模型接口抽象成一个统一的标准接口,让开发者可以快速配置和自由切换LLM,而无需改动核心业务逻辑。
(补充说明)
这一点非常基础且关键。LangChain的Models
模块正是负责这件事,它提供了LLMs和ChatModels的抽象层,让开发者不再被供应商绑定。
💥 第二步:直面大模型自身的“先天缺陷"
光有一个聪明的“大脑”还不够,这个大脑有几个明显的弱点。我的思考就围绕着如何弥补这些弱点展开。
📚 缺陷A:知识是静态和有限的
我的思考:
大模型训练完成的那一刻,它的知识就定格了。它不知道最新的新闻,也不了解我公司内部的私有文档。那么,它就必须有 “感知外部信息” 的能力。框架需要能方便地接入外部数据源,比如加载各种格式的文档(PDF、Word)、与MCP之类的工具协议通信,甚至接入多模态信息。简单说,就是得给它装上“眼睛”和“耳朵”。
(补充说明)
你准确地抓住了 “检索增强生成(RAG)” 的核心动机。在LangChain中,这一整套能力被系统地拆解在Indexes
模块中,包括:
- 文档加载器(Document Loaders): 对应你说的“加载文档”。
- 文本分割器(Text Splitters): 把长文档切块,方便处理。
- 向量存储(Vectorstores): 将文本转化为向量并存储,实现高效检索。
这整套流程就是为了让模型能“上网”、能“读资料”。
✨ 缺陷B:沟通需要技巧(提示词工程)
我的思考:
如何与这个大模型沟通是一门学问。同样的需求,不同的问法,得到的结果天差地别。所以,框架必须支持良好的 提示词管理 功能,比如允许用户自定义提示词模板,方便地调整和优化给模型的指令。
(补充说明)
完全正确。LangChain的Prompts
模块就是干这个的,它提供了模板、少量示例提示等功能,让提示词工程变得可管理和可复用。
🧠 缺陷C:记忆力短暂(有限的上下文窗口)
我的思考:
模型的上下文窗口是有限的,它无法记住太长的对话历史。比如在一个多轮聊天中,它可能忘了你最开始说了什么。因此,框架必须内置 上下文管理的记忆能力,来帮助它记住关键的对话信息。
(补充说明)
这正是LangChain的Memory
模块解决的问题。它提供了多种记忆方案,从简单的“记住上几轮对话”到复杂的“将历史总结后存入数据库”,从而管理短期和长期记忆。
🌐 第三步:从单次问答到复杂流程——工程化的必然
在解决了模型本身的问题后,我开始思考更复杂的现实场景。
我的思考:
我们来做一道“应用题”。假设用户问:“帮我查询一下未来15天深圳的天气如何,然后告诉我。”
这个任务就不是简单问答了。它需要一个流程:
- 理解意图:解析用户问题,明白需要“查询天气”。
- 寻找工具:找到能查询天气的API或工具。
- 执行动作:调用这个工具,获取真实数据。
- 组织回答:把数据整理成自然语言回复给用户。
你会发现,几乎所有有用的AI应用,背后都是类似这样的一个或多个步骤的串联。这个 标准化的流程 是工程上的必然需求。所以,框架必须有一层更高的抽象,来定义和执行这种流程。我管它叫
Chain
,也就是“链”。
(补充说明)
你的这个推论直接命中了LangChain的灵魂!Chain
确实是核心概念,用于组合多个步骤。但你的“查询天气”例子,实际上引出了一个更强大的概念——Agent
(代理)。
Chain
(链):是预定好的、确定性的步骤序列(先做A,再做B,最后做C)。Agent
(代理):是动态的、由LLM决定的行动序列。LLM作为“大脑”,会自己推理:“要回答这个问题,我需要先调用天气查询工具,拿到结果后再总结给用户。” 你举的例子,正是一个典型的Agent
场景!它是更智能的Chain
。
我的推论总结 vs. LangChain的现实
回顾我的整个思考过程,我推导出了一个优秀的大模型框架应该具备的核心能力:
- 🔄 模型的快速方便切换 -> LangChain的
Models
。 - 📚 感知和获取外部数据的能力 -> LangChain的
Indexes
(RAG核心)。 - ✨ 输入层的提示词管理 -> LangChain的
Prompts
。 - 🧠 上下文和会话管理的记忆功能 -> LangChain的
Memory
。 - ⛓️ 统一和标准化复杂流程的能力 -> LangChain的
Chains
和Agents
。
📊 (最后补充一个我遗漏的工程化要点)
在实际开发中,还有一个至关重要的能力是我当时没想到的:可观测性(Observability)。一个好的框架必须提供日志、追踪和评估功能,让开发者能清晰地看到每个环节发生了什么(比如检索到了什么文档?LLM的输入输出是什么?),否则调试和优化将无比困难。这是LangChain作为一个成熟框架提供的强大工程支持。
💫 结语
通过这次从问题出发的推理,我不仅学会了LangChain,更深刻地理解了它为什么要这样设计。它的每一个模块都不是凭空产生的,而是为了解决大模型应用落地过程中一个个具体、棘手的实际问题。
这种“先自己思考,再验证学习”的方式,让我对知识的掌握更加牢固。如果你也在学习新技术,不妨试试这种方法,或许会有意想不到的收获。