LangChain 引入和快速上手 目录一、复杂场景下LLM 嵌入应用面临的问题二、LangChain 介绍LangChain 的核心设计理念LangChain 的标准模块与接口三、6 步构建第一个 LangChain 应用四、引出 LangChain 相关概念Runnable 接口LangChain Expression LanguageLCEL五、LangChain 生态全景六、各语言生态的 LLM 框架对比一、复杂场景下LLM 嵌入应用面临的问题尽管大语言模型LLM在某些方面表现振奋人心但将 LLM 嵌入应用程序时却会遭遇全新难题幻觉问题简单提示词得到的答案经常出现幻觉在生产环境中这种错误无法接受提示词混乱没有统一的规范导致应用行为不可预测、难以调试模型切换困难切换模型几乎等于重写所有与 LLM 交互的代码非结构化输出程序无法直接解析自然语言文本必须编写复杂的解析代码知识陈旧LLM 训练数据有截止日期无法获取最新信息无法连接外部工具让 LLM 自发地决定何时、如何调用哪个外部工具是一个极其复杂的系统设计问题举个例子我们要开发一个智能医疗咨询助手用户可以向其描述症状例如“我最近头痛、发热还有些咳嗽”助手能提供初步的疾病可能性分析、建议和日常护理方法并提醒是否需要立即就医。场景1用户向咨询“我三岁的孩子吞下一枚纽扣电池怎么办”问题分析这个建议完全是错误且致命的。纽扣电池会卡在食道并快速泄漏化学物质灼烧内脏必须立即就医。模型基于训练数据中的“吞食异物”相关文本进行了错误生成产生了“幻觉”。在产生环境中这种错误是无法接受的。场景2开发团队需要为“疾病诊断”、“药物咨询”、“急救建议”等不同功能编写提示词。问题分析提示词的质量和风格直接决定输出结果的准确性和安全性。没有统一的规范会导致应用行为不可预测、难以调试且无法规模化地优化效果。问题3项目开始时使用GPT-3.5 Turbo进行原型开发成本较低。后期为了提升准确性希望切换到更强大的GPT-5。问题分析发现切换成本极高。这意味着一旦选定一个模型整个应用程序的代码就与该模型的API强耦合。切换模型几乎等于重写所有与LLM交互的代码严重阻碍了技术选型的灵活性。场景4非结构化输出难以与程序接口交互。应用程序需要将模型分析的“可能疾病”结果结构化地展示在前端UI的列表里。问题分析程序无法直接解析这段自然语言文本来提取“疾病名称”和“可信度“。必须编写复杂且脆弱的正则表达式或再用一个模型来解析第一个模型的输出极大增加了复杂度和出错概率。场景5用户咨询“针对奥密克戎XBB.1.5变种最新的加强针效果如何”问题分析主流大模型的训练数据截止于某个特定的时间点。对于该时间点之后的情况他一无所知要么拒绝回答要么基于过时信息给出错误答案。医疗信息的实时性至关重要模型的滞后性是巨大缺陷。场景6用户问“布洛芬和阿司匹林可以同时吃吗”问题分析这是一个非常专业的药物相互作用问题。模型的内在知识可能不准确或不全。理想的流程是模型识别出这是一个需要查询专业数据库的任务调用一个权威的药物相互作用API将API返回的结构化数据翻译成用户能听懂的语言所以我们目前的问题是如何让LLM自发地、可靠地决定在何时、如何调用哪个外部工具并正确解析工具返回的结果是一个极其复杂的系统设计问题。上述这个医疗助手例子集中体现了所有描述中的难题。为了解决它们业界正在形成⼀整套称为“LLM应用工程”的最佳实践和技术栈针对幻觉、提示词规范采用“提示词工程”和“检索增强生成RAG”。为医疗助手设计严谨、系统的提示词模板并强制模型在回答前先从权威、实时的医疗知识库中检索信息而不是仅凭记忆回答。针对模型切换使⽤ LLM API抽象层LangChain。这些中间件统⼀了不同模型的接口让开发者通过配置而非修改代码来切换模型。针对非结构化输出采用“输出解析”技术。强制要求模型以 JSON 等格式输出并在提示词中严格定义 JSON 的 Schema 。⼀些框架如 LangChain可以自动将模型输出解析为预定义的 Pydantic 对象。针对知识陈旧主要依靠RAG来注入实时、外部的知识。针对连接外部工具采用“智能体Agent”框架。让 LLM 作为大脑根据用户请求规划步骤、选择工具如计算器、数据库API、搜索引擎并执行任务。最终⼀个成熟的“智能医疗咨询助手”不会是直接调用原生大模型而是⼀个由精心设计的提示词、RAG系统、外部工具API、输出解析器等共同组成的复杂系统。原生大模型只是这个系统的核心引擎之一而非全部。二、LangChain 介绍LangChain是⼀个用于开发由大语言模型LLM驱动的应用程序的框架。它通过将自然语言处理NLP流程拆解为标准化组件让开发者能够自由组合并高效定制工作流。LangChain 的核心设计理念LangChain 框架的设计精髓在于以链式Chain的方式整合多个组件从而构建出功能丰富的大语言模型应用。链式表示 LangChain 允许将多个步骤或多个组件串联起来无需各个组件各自完成其能力而是一次性执行这个链上的所有流程一个最简单的例子若想借助提示词完成一次对于 LLM 的提问在 LangChain 中至少需要定义两个组件提示词模板组件大模型组件这相当于提示词模版组件执行了一次大模型组件也执行了一次。而对于链式执行来说只需执行一次链即可。LangChain 的标准模块与接口模块功能统一的模型调用通过抽象化接口支持多种 LLMOpenAI GPT-4/5、Anthropic Claude 等和嵌入模型使开发者可以灵活切换不同模型供应商。灵活的提示词管理提供提示词模板Prompt Templates支持动态生成输入内容并可管理少样本示例与提示选择策略以提升模型响应质量。可组合的任务链Chains允许多个步骤串联成完整流程如先检索文档再生成回复或组合多次模型调用。开发者能够通过自定义链实现复杂的任务编排。上下文记忆机制Memory存储多轮对话中的状态信息注该功能目前已由 LangGraph 支持检索与向量存储集成支持从外部加载文档经分割和向量化处理后存储至向量数据库在查询时检索相关信息并输入大语言模型帮助构建检索增强生成RAG类应用兼容 FAISS、Pinecone、Chroma 等向量数据库和文档加载工具简化知识库应用和开发流程 对于上述技术内容LangChain 的开源组件和第三⽅集成可以轻松⽀持快速上手帮助我们构建应用程序。除此之外使用LangGraph可以构建支持人机交互的有状态代理。LangChain 公司也在围绕框架构建完整的生态系统包括推出LangSmith⼀个⽤于调试、监控和评估LLM应用的平台以及LangGraphPlatform用于LangChain应用的部署、运维等为开发者提供从开发到生产的一站式支持。三、6 步构建第一个 LangChain 应用我们来实现一个简单的翻译应用 ——将英文翻译成中文。以OpenAI 为例步骤1申请API Key并配置环境变量去官网申请完API Key后保存申请到的API key然后直接配置到本机的环境变量中。变量名OPENAI_API_KEY变量值输入申请好的API Key步骤2定义大模型1.安装OpenAI库pip install-U langchain-openai2.定义大模型fromlangchain_openaiimportChatOpenAI# 定义聊天模型modelChatOpenAI(modelgpt-5-mini)ChatOpenAI是 LangChain 为 OpenAI 聊天模型提供的具体实现类常用初始化参数包括model模型名称temperature采样温度0~1越高回答越天马行空越低越保守靠谱max_tokens生成的最大令牌数timeout请求超时时间max_retries最大重试次数步骤3定义消息列表fromlangchain_core.messagesimportHumanMessage,SystemMessage messages[SystemMessage(contentTranslate the following from English into Chinese),HumanMessage(contenthi!),]消息类型说明SystemMessage系统消息用于设定 AI 的行为和角色HumanMessage用户消息代表用户的输入步骤4调用模型model 是LangChainRunnable可运行接口的实例这意味着 model 提供了⼀个标准接口供我们与之交互。要简单地调用模型我们可以将消息列表传递给 .invoke 方法。resultmodel.invoke(messages)print(result)输出结果是一个AIMessage对象content你好! additional_kwargs{refusal: None} response_metadata {token_usage: {completion_tokens: 2, prompt_tokens: 20, total_tokens: 22, ...}, model_name: gpt-5-mini-2024-07-18, ...} idrun--777ef0be-55c2-411a-a4ab-104a45c22f20-0 usage_metadata{input_tokens: 20, output_tokens: 2, total_tokens: 22, ...}AIMessage来自AI的消息。从聊天模型返回最为对提示输入的响应 关键属性contentAI 生成的消息内容最重要的字段additional_kwargs与消息关联的其他有效负载数据。对于来⾃AI的消息可能包括模型提供程序编码的工具调⽤。response_metadata响应元数据。例如响应标头、logprobs、令牌计数、模型名称。▪ 侧重于“响应”本⾝的信息比如这次请求的ID、使用的模型版本、以及服务提供商返回的所有原始元数据。它主要用于调试、日志记录和获取请求的上下文信息。usage_metadata消息的使用元数据例如令牌计数。▪ 侧重于“资源消耗”的量化信息即这次请求消耗了多少Token。它主要用于成本计算、监控和预算控制。步骤5使用输出解析器若只想输出聊天模型返回的结果字符串可以使用StrOutputParser输出解析器组件将 AIMessage 对象转换为纯字符串方便后续处理。fromlangchain_core.output_parsersimportStrOutputParser parserStrOutputParser()print(parser.invoke(result))# 输出你好!步骤6使用 LCEL 构建链并执行链通过上述步骤无论是调用大模型还是输出解析我们发现每次都调⽤了⼀个invoke()⽅法最终才会得到我们想要的结果。对于LangChain它给我们提供了链式执行的能力即我们只需要定义各个“组件”将它们“链起来”⼀次性执行即可得到最终效果。# 使用 | 管道操作符将组件串联chainmodel|parser# 等价于# from langchain_core.runnables import RunnableSequence# chain RunnableSequence(firstmodel, lastparser)resultchain.invoke(messages)print(result)#输出你好完整代码fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,SystemMessagefromlangchain_core.output_parsersimportStrOutputParser# 定义大模型modelChatOpenAI(modelgpt-5-mini)# 定义消息列表messages[SystemMessage(contentTranslate the following from English into Chinese),HumanMessage(contenthi!),]# 定义输出解析器parserStrOutputParser()# 定义链chainmodel|parser# 执行链resultchain.invoke(messages)print(result)# 输出你好!四、引出 LangChain 相关概念Runnable 接口Runnable 接口是使用 LangChain Components组件的基础。所有 LangChain 组件语言模型、输出解析器、检索器、编译的 LangGraph 图等都实现了 Runnable 接口。Runnable 定义了一个标准接口允许组件具备以下能力能力方法说明Invoked调用.invoke()单个输入转换为输出Batched批处理.batch()多个输入被高效转换为输出Streamed流式传输.stream()输出在生成时进行流式传输Inspected检查.get_input_schema()等访问有关Runnable 的输入、输出和配置的原理图信息Composed组合|管道符可以把多个 Runnable 组合在一起让它们并行执行、协同工作以此构建复杂任务链。………因此在之前快速上手中我们定义的语言模型model、输出解析器StrOutputParser都是Runnable接口的实例它们都使用了Invoke调用的能力# 语言模型model是 Runnable 接口实例modelChatOpenAI(modelgpt-5-mini)resultmodel.invoke(messages)# invoke 调用# 输出解析器StrOutputParser也是 Runnable 接口实例parserStrOutputParser()parser.invoke(result)# invoke 调用LangChain Expression LanguageLCELLCEL采用声明性方法从现有 Runnable 对象构建新的 Runnable 对象。通过 LCEL 构建出的新 Runnable 对象被称为RunnableSequence可运行序列。RunnableSequence就是一种链参考快速上手步骤六。它也是Runable接口的实例它实现了完整的Runnable接口因此它可以使用与任何其他Runnable相同的姿势。chainmodel|parser chain.invoke(messages)# 链也是 Runnable 接口实例允许 invoke 调用LCEL 的三种等价写法# 方式1使用 | 管道操作符最常用chainmodel|parser# 方式2显式创建 RunnableSequencefromlangchain_core.runnablesimportRunnableSequence chainRunnableSequence(firstmodel,lastparser)# 方式3使用 .pipe() 方法chainmodel.pipe(parser) 在 Unix/Linux 系统中pipe()系统调用和|管道操作符都用于实现进程间通信LangChain 迁移了这种用法。现在回头再看我们的 6 步 demo你会发现每一行代码背后都有 Runnable 和 LCEL 的影子model是 Runnable → 所以可以.invoke()parser是 Runnable → 所以可以用|和 model 串成chainchain本身也是 Runnable → 所以也可以.invoke()。“一切皆 Runnable万物可串联”——这就是 LangChain 整个框架的基石也是后续学习工具调用、结构化输出、LangGraph 编排的基础。五、LangChain 生态全景学完上面的内容你可能会问LangChain 到底包含哪些东西它和大名鼎鼎的 LangGraph、LangSmith 又是什么关系下面这张官方架构图给出了清晰的答案。整个生态从底层到顶层可以拆解为四个层次① langchain-core地基提供最稳定的底层抽象——Runnable 接口、LCEL 表达式语言、消息类型SystemMessage / HumanMessage / AIMessage等。你在本文 6 步 demo 中用到的每一个类都出自这里。② LangChain LangGraph两大框架LangChain是本文的主角擅长用链串联组件适合线性任务一次问答、一次翻译、一次文档检索→生成。LangGraph聚焦图式编排支持循环、分支、状态持久化和人工介入适合多轮对话、复杂的 Agent 工作流。③ LangGraph Platform部署与运维生产环境用。提供 API Server、任务队列、状态持久化等基础设施把 LangGraph 构建的 Agent 直接部署上线。④ LangSmith调试与监控开发期间用。可以追踪每一次 LLM 调用、查看中间状态、评估效果——类似于后端的日志和 APM 系统但专门为 LLM 应用设计。记忆口诀langchain-core是地基LangChain是盖好的楼LangGraph是隔壁更复杂的大厦LangSmith是监控摄像头LangGraph Platform是物业管理系统。六、各语言生态的 LLM 框架对比语言框架核心特点PythonLangChain生态最丰富灵活性极高社区活跃PythonLlamaIndex专注于 RAG 和数据连接文档索引、查询、检索性能优异JS/TSLangChain.jsPython LangChain 的官方 JS/TS 移植版本JS/TSLlamaIndex.TSTypeScript 生态中的 RAG 应用框架JavaLangChain4j受 LangChain 启发为 JVM 设计的社区项目JavaSpring AISpring 官方项目与 Spring 生态无缝集成JavaSpring AI Alibaba阿里云官方支持深度集成通义千问等模型Cllama.cpp高性能推理引擎支撑消费级硬件运行大模型选择建议PythonLangChain适合大多数项目RAG 为核心则选 LlamaIndex全栈 Web 应用选 LangChain.js企业级 Java 后端选 Spring AI极致性能需求选 C llama.cpp 作底层推理引擎。