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

发布时间:2026/10/15 4:03:08

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 源码入门
延伸阅读

更多相关文章

2026/10/15 4:03:08

Android 计算器开发实战:从界面设计到核心逻辑

摘要:本文手把手带你从零构建一个基于 Android 的计算器应用。内容涵盖项目环境搭建与分层架构规划、界面布局与组件设计、核心状态变量管理、按钮事件监听、屏幕显示更新、输入合法性校验、用户提示机制,以及独立计算类的封装与联调测试。通过完整流程,你将掌握 Android 开…

2026/10/15 4:03:08

Java 项目实战: 交友项目 - 开工任务书

概述 我们开工前要准备 “继续往下写代码的资格”:把一个空目录变成能跑起来的多模块微服务工程,并在上面跑通手机号加验证码登录。 纲要 本章目标:从空工程到可运行的微服务骨架与登录闭环五个板块的任务书:认识项目 / 工程准…

2026/10/15 5:18:12

河北工业大学Java期末复习题:25道选择题考点剖析

简介:河北工业大学Java期末考试复习题(部分答案)是一份面向该校Java课程本科生的期末备考资料,适用于考前集中复习、常见题型演练和查漏补缺,也可供任课教师出题或备课参考。资源包共包含1个doc文档,整体约…

2026/10/15 5:18:12

FileChannel深度解析:零拷贝与内存映射实战指南

在Java的NIO体系里,FileChannel是很多人学完Buffer之后第一个真正上手的通道类。它解决的问题很朴素:让文件的读写不再像传统IO那样一边读一边频繁拷贝,而是把文件抽象成一个可定位、可映射、可高效搬移的通道。作为整个NIO中唯一和本地文件系…

2026/10/15 5:18:12

分数阶Calderón问题贝叶斯反演:MCMC与MATLAB实现全解析

做反问题这些年,我发现一个特别有意思的共识:只要把经典算子换成分数阶,问题难度往往会跳一个台阶,但能解释的物理现象也瞬间丰富很多。分数阶Caldern问题就是这个方向的典型代表——它既要处理边界测量反演内部参数的经典难点&am…

2026/10/15 5:18:12

LLM推理性能测试指南:并发压测与指标归因实战

性能测试这件事,最怕的不是结果不好看,而是结果说不出为什么,换个环境就崩。上个月我把 vLLM 和 SGLang 两个推理引擎拉到一起做并发实验,前前后后折腾了两周,最后发现坑全不在引擎本身,而在实验设计和指标…

2026/10/15 5:18:12

一文搞懂分类问题:算法选型、评估指标与实战避坑

1. 分类问题到底在解决什么:先想清楚边界在哪很多人一上来就背模型:逻辑回归、决策树、SVM、随机森林……但真到项目里,第一个卡住的往往不是模型不会调,而是"这个问题到底该不该当成分类来做"。我见过不少同学把回归问…

2026/10/15 5:13:12

PostgreSQL生产库备份方案:Barman全量备份与WAL归档实战

很多DBA做PostgreSQL备份,第一反应就是写个 cron 脚本,定时调 pg_dump。这套逻辑在几十 GB 的小库上确实够用,但当你手里管着几百 GB 甚至上 TB 的生产库,还要回答“我能恢复到什么时间点”“备份到底能不能用”这两个问题时&…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑