LangChain 源码入门 01:从模型 SDK 到 AI 应用框架——LangChain 解决什么问题?

📅 发布时间:2026/10/15 4:03:13
LangChain 源码入门 01:从模型 SDK 到 AI 应用框架——LangChain 解决什么问题?
1. 先从一个普通函数开始假设应用要把问题发给模型。直接用某个供应商 SDK 时业务代码必须知道该 SDK 的客户端类型、参数格式、响应对象和错误类型。这个方式并没有错当需求只是一次简单调用时直接 SDK 往往更轻。# 伪代码展示直接依赖供应商 SDK 的形态并非可直接运行代码。defanswer_with_vendor_sdk(client,question:str)-str:responseclient.chat.completions.create(modelreplace-with-provider-model,messages[{role:user,content:question}],)returnresponse.choices[0].message.content一旦需要替换供应商、加提示词模板、批处理、流式输出或重试应用就会逐渐充满供应商专属的调用逻辑。框架尝试把这些共性整理成约定。2. 框架的四个词约定组件使用共同的执行入口例如invoke、batch、stream不同实现可按自身能力提供原生或默认行为。适配每个供应商包把自己的 API 翻译成通用消息和模型接口。组合把模型、提示词、解析器和自定义函数组合成流程。扩展在稳定边界上加入工具、重试、监听器或 Agent 中间件。框架不替你决定所有业务也不会消除供应商功能差异。它提供的是“让异构组件协作”的骨架。3. 第一个可运行示例把函数包装成 Runnable环境准备课程代码面向 Python 3.10。先创建或选择一个 Python 项目环境并安装 LangChain。根据你使用的工具和操作系统选择一种方式不需要把两种方式都执行。方式一使用 uvuv init langchain-course-democdlangchain-course-demo uvaddlangchain方式二使用 pipmacOS / Linuxmkdirlangchain-course-democdlangchain-course-demo python-mvenv .venvsource.venv/bin/activate python-mpipinstalllangchain方式二使用 pipWindows PowerShellmkdir langchain-course-demo cd langchain-course-demo python-m venv.venv.venv\Scripts\Activate.ps1 python-m pip install langchain如果你已经有项目和虚拟环境只需在该环境中安装langchain不必重复初始化。langchain会带上运行本例所需的langchain-core。之后若要调用在线模型再安装所选 provider 集成包、配置 API Key 并联网没有 Key 时仍可完成本地示例。密钥应放环境变量或安全的密钥管理系统不要写进源码或提交到版本库。运行示例把以下代码保存为lesson01.py并执行python lesson01.py使用 uv 的用户也可以运行uv run python lesson01.py。本例不需要 API Key也不会联网。fromlangchain_core.runnablesimportRunnableLambdadefnormalize(question:str)-str:把用户问题首尾空格去掉。returnquestion.strip()clean_questionRunnableLambda(normalize)print(clean_question.invoke( LangChain 是什么 ))# LangChain 是什么这里RunnableLambda并没有调用模型。它只是把一个普通 Python 函数包装进 LangChain 的组件约定中因此之后可以像组合其他 Runnable 一样把它接入本篇展示的流程。4. 用本地组件模拟两步流程fromlangchain_core.runnablesimportRunnableLambdadefadd_prefix(text:str)-str:returnf请回答{text}deffake_model(prompt:str)-str:# 这是本地演示函数不是真正的大语言模型。returnf[模拟模型收到]{prompt}pipelineRunnableLambda(add_prefix)|RunnableLambda(fake_model)print(pipeline.invoke(什么是 Runnable))|让左边的输出成为右边的输入。这里两个步骤都是本地函数但接下来替换成真实模型时流程的概念结构仍然相同。5. 源码设计解析普通函数怎样进入 LangChain 流程前面的RunnableLambda(normalize)不是只给函数换了一个名字。LangChain Core 以泛型Runnable[Input, Output]表示“输入一种类型、输出另一种类型”的工作单元并为它们约定invoke、batch、stream、异步调用和配置等统一入口。不同子类按支持情况实现或继承这些操作业务函数只需专注自己的转换逻辑Runnable 负责把它接入共同执行体系。最关键的适配逻辑可概括为ifisinstance(thing,Runnable):returnthingifcallable(thing):returnRunnableLambda(thing)ifisinstance(thing,dict):returnRunnableParallel(thing)这就是coerce_to_runnable的核心判断省略了异步生成器和异常分支。因此写some_runnable | normalize时普通 callable 会自动变成RunnableLambda写some_runnable | {a: step_a, b: step_b}时字典会变成RunnableParallel。统一接口来自适配而不是要求每个人把所有业务代码都重写成框架类。|运算符接着把左右两侧包成RunnableSequence。Sequence 依次把每一步的输出传给下一步组合后的整体仍然是 Runnable可以继续调用invoke或嵌套到其他组合中。这个“组合结果和基础组件遵守同一接口”的设计是框架能渐进扩展的关键。# Runnable.__or__ 的核心逻辑省略类型转换注解returnRunnableSequence(self,coerce_to_runnable(other))包的边界也服务于这个目标langchain-core放消息、Runnable 等底层合同高层langchain提供 Agent 等应用能力不同供应商 SDK 由独立集成包承接按需安装。这样只用本地 Runnable 的人不必预装所有厂商 SDK直接使用某一家 SDK 的项目也不必为了简单调用而强行采用整个框架。源码位置以下路径相对 LangChain 仓库根目录libs/core/langchain_core/runnables/base.py定义Runnable执行接口coerce_to_runnable将函数、映射等适配成 RunnableRunnable.__or__则构造RunnableSequence。libs/langchain_v1/pyproject.toml声明高层langchain包及 provider 集成相关依赖。libs/core/README.md介绍langchain-core的包定位与基础抽象范围。这个设计不是让所有模型或工具变得完全相同而是统一它们参与流程的入口。供应商特有参数、工具调用能力和错误类型仍由各自集成包处理通用边界则让应用的组合部分少依赖这些差异。6. 哪些时候值得用框架需求可考虑的方案一次简单模型调用完全依赖某家 API直接用供应商 SDK可能切换模型需要统一消息或工具调用LangChain 模型抽象与集成包多步处理、并行、重试、流式或追踪Runnable 组合带状态、循环、人工审批的 agentic workflowLangChain Agent 或更底层 LangGraph思考提示不要为“用了框架”而使用框架。先列出你希望统一或复用的变化点再判断抽象是否帮你减少重复复杂度。小结框架并不是魔法 API 集合。它通过可复用的约定和适配边界让各自独立的组件能进入一条共同流程。理解 LangChain 时值得关注的主线是统一接口如何让组件能够组合。本系列导航下一篇02 消息、ChatPromptTemplate 与 Chat Model 调用链全系列LangChain 源码入门