📑 目录
- 一、复杂场景下,LLM 嵌入应用面临的问题
- 二、LangChain 介绍
- LangChain 的核心设计理念
- LangChain 的标准模块与接口
- 三、6 步构建第一个 LangChain 应用
- 四、引出 LangChain 相关概念
- Runnable 接口
- LangChain Expression Language(LCEL)
- 五、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 的标准模块与接口
| 模块 | 功能 |
|---|---|
| 统一的模型调用 | 通过抽象化接口支持多种 LLM(OpenAI 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# 定义聊天模型model=ChatOpenAI(model="gpt-5-mini")ChatOpenAI是 LangChain 为 OpenAI 聊天模型提供的具体实现类,常用初始化参数包括:
model:模型名称temperature:采样温度(0~1),越高回答越天马行空,越低越保守靠谱max_tokens:生成的最大令牌数timeout:请求超时时间max_retries:最大重试次数
步骤3:定义消息列表
fromlangchain_core.messagesimportHumanMessage,SystemMessage messages=[SystemMessage(content="Translate the following from English into Chinese"),HumanMessage(content="hi!"),]消息类型说明:
SystemMessage:系统消息,用于设定 AI 的行为和角色HumanMessage:用户消息,代表用户的输入
步骤4:调用模型
model 是LangChainRunnable(可运行)接口的实例,这意味着 model 提供了⼀个标准接口供我们与之交互。要简单地调用模型,我们可以将消息列表传递给 .invoke 方法。
result=model.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', ...} id='run--777ef0be-55c2-411a-a4ab-104a45c22f20-0' usage_metadata={'input_tokens': 20, 'output_tokens': 2, 'total_tokens': 22, ...}AIMessage(来自AI的消息。从聊天模型返回,最为对提示(输入)的响应) 关键属性:
content:AI 生成的消息内容(最重要的字段)additional_kwargs:与消息关联的其他有效负载数据。对于来⾃AI的消息,可能包括模型提供程序编码的工具调⽤。response_metadata:响应元数据。例如:响应标头、logprobs、令牌计数、模型名称。
▪ 侧重于“响应”本⾝的信息,比如这次请求的ID、使用的模型版本、以及服务提供商返回的所有原始元数据。它主要用于调试、日志记录和获取请求的上下文信息。usage_metadata:消息的使用元数据,例如令牌计数。
▪ 侧重于“资源消耗”的量化信息,即这次请求消耗了多少Token。它主要用于成本计算、监控和预算控制。
步骤5:使用输出解析器
若只想输出聊天模型返回的结果字符串,可以使用StrOutputParser输出解析器组件,将 AIMessage 对象转换为纯字符串,方便后续处理。
fromlangchain_core.output_parsersimportStrOutputParser parser=StrOutputParser()print(parser.invoke(result))# 输出:你好!步骤6:使用 LCEL 构建链并执行链
通过上述步骤,无论是调用大模型,还是输出解析,我们发现,每次都调⽤了⼀个invoke()⽅法,最终才会得到我们想要的结果。
对于LangChain,它给我们提供了链式执行的能力,即我们只需要定义各个“组件”,将它们“链起来”,⼀次性执行即可得到最终效果。
# 使用 | 管道操作符将组件串联chain=model|parser# 等价于:# from langchain_core.runnables import RunnableSequence# chain = RunnableSequence(first=model, last=parser)result=chain.invoke(messages)print(result)#输出:你好!完整代码
fromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,SystemMessagefromlangchain_core.output_parsersimportStrOutputParser# 定义大模型model=ChatOpenAI(model="gpt-5-mini")# 定义消息列表messages=[SystemMessage(content="Translate the following from English into Chinese"),HumanMessage(content="hi!"),]# 定义输出解析器parser=StrOutputParser()# 定义链chain=model|parser# 执行链result=chain.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 接口实例model=ChatOpenAI(model="gpt-5-mini")result=model.invoke(messages)# invoke 调用# 输出解析器(StrOutputParser)也是 Runnable 接口实例parser=StrOutputParser()parser.invoke(result)# invoke 调用LangChain Expression Language(LCEL)
LCEL采用声明性方法,从现有 Runnable 对象构建新的 Runnable 对象。通过 LCEL 构建出的新 Runnable 对象被称为RunnableSequence(可运行序列)。RunnableSequence就是一种链(参考快速上手步骤六)。
它也是Runable接口的实例,它实现了完整的Runnable接口,因此它可以使用与任何其他Runnable相同的姿势。
chain=model|parser chain.invoke(messages)# 链也是 Runnable 接口实例,允许 invoke 调用LCEL 的三种等价写法:
# 方式1:使用 | 管道操作符(最常用)chain=model|parser# 方式2:显式创建 RunnableSequencefromlangchain_core.runnablesimportRunnableSequence chain=RunnableSequence(first=model,last=parser)# 方式3:使用 .pipe() 方法chain=model.pipe(parser)📌 在 Unix/Linux 系统中,
pipe()系统调用和|管道操作符都用于实现进程间通信,LangChain 迁移了这种用法。
现在回头再看我们的 6 步 demo,你会发现每一行代码背后都有 Runnable 和 LCEL 的影子:model是 Runnable → 所以可以.invoke();parser是 Runnable → 所以可以用|和 model 串成chain;chain本身也是 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 框架对比
| 语言 | 框架 | 核心特点 |
|---|---|---|
| Python | LangChain | 生态最丰富,灵活性极高,社区活跃 |
| Python | LlamaIndex | 专注于 RAG 和数据连接,文档索引、查询、检索性能优异 |
| JS/TS | LangChain.js | Python LangChain 的官方 JS/TS 移植版本 |
| JS/TS | LlamaIndex.TS | TypeScript 生态中的 RAG 应用框架 |
| Java | LangChain4j | 受 LangChain 启发,为 JVM 设计的社区项目 |
| Java | Spring AI | Spring 官方项目,与 Spring 生态无缝集成 |
| Java | Spring AI Alibaba | 阿里云官方支持,深度集成通义千问等模型 |
| C++ | llama.cpp | 高性能推理引擎,支撑消费级硬件运行大模型 |
选择建议:Python(LangChain)适合大多数项目;RAG 为核心则选 LlamaIndex;全栈 Web 应用选 LangChain.js;企业级 Java 后端选 Spring AI;极致性能需求选 C++ llama.cpp 作底层推理引擎。