目录
[2.Runable interface--运行界面](#2.Runable interface--运行界面)
[3.1 概述](#3.1 概述)
[3.2 核心特性](#3.2 核心特性)
1.LCEL--表达式语言
LCEL(LangChain Expression Language)是一种强大的工作流编排工具,可以从基本组件构建复杂任务链条(chain),并支持诸如流式处理、并行处理和日志记录等开箱即用的功能。
LCEL 从第一天起就被设计为支持将原型投入生产,无需更改代码,从最简单的"提示 + LLM"链到最复杂的链(我们已经看到有人成功地在生产中运行了包含数百步的 LCEL 链)。以下是您可能想要使用 LCEL 的一些原因的几个亮点:
- 一流的流式支持 当您使用 LCEL 构建链时,您将获得可能的最佳时间到第一个标记(直到输出的第一块内容出现所经过的时间)。对于某些链,这意味着我们直接从 LLM 流式传输标记到流式输出解析器,您将以与 LLM 提供程序输出原始标记的速率相同的速度获得解析的增量输出块。
- 异步支持 使用 LCEL 构建的任何链都可以使用同步 API(例如,在您的 Jupyter 笔记本中进行原型设计)以及异步 API(例如,在 LangServe 服务器中)进行调用。这使得可以在原型和生产中使用相同的代码,具有出色的性能,并且能够在同一服务器中处理许多并发请求。
- 优化的并行执行 每当您的 LCEL 链具有可以并行执行的步骤时(例如,如果您从多个检索器中获取文档),我们会自动执行,无论是在同步接口还是异步接口中,以获得可能的最小延迟。
- 重试和回退 为 LCEL 链的任何部分配置重试和回退。这是使您的链在规模上更可靠的好方法。我们目前正在努力为重试/回退添加流式支持,这样您就可以获得额外的可靠性而无需任何延迟成本。
- 访问中间结果 对于更复杂的链,访问中间步骤的结果通常非常有用,即使在生成最终输出之前。这可以用于让最终用户知道正在发生的事情,甚至只是用于调试您的链。您可以流式传输中间结果,并且在每个 LangServe 服务器上都可以使用。
- 输入和输出模式 输入和输出模式为每个 LCEL 链提供了从链的结构推断出的 Pydantic 和 JSONSchema 模式。这可用于验证输入和输出,并且是 LangServe 的一个组成部分。
举个例子:
python
from langchain.agents import create_agent
from langchain_community.chat_models import ChatTongyi
from langchain.messages import HumanMessage
import os
from langchain_core.tools import tool
from langchain.messages import SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
os.environ["DASHSCOPE_API_KEY"] = "sk-"
# 初始化大语言模型:使用 qwen-max 模型,温度设为 0(输出更确定),关闭流式响应
llm = ChatTongyi(
model="qwen-max",
temperature=0,
streaming=False,
)
# 1. 定义提示词模板
# 使用 ChatPromptTemplate 创建一个模板,"{topic}" 是占位符,稍后会被实际值替换
prompt = ChatPromptTemplate.from_template(f"讲一个笑话关于 {话题}")
# 2. 定义输出解析器
# StrOutputParser() 的作用是将大模型返回的复杂对象(如 AIMessage)提取为纯文本字符串(str)
output_parser = StrOutputParser()
# 3. 编排工作流(构建链)
# 使用 LCEL(LangChain Expression Language)的管道符 "|" 将三个组件串联起来:
# 提示词模板 -> 大语言模型 (llm) -> 输出解析器
# 数据会自动按顺序流经这三个组件
chain = prompt | llm | output_parser
# 4. 执行工作流
# 调用 chain,并传入输入参数(将 {topic} 替换为 "ice cream")
# 最终返回处理后的字符串结果
chain.invoke({"话题": "冰淇凌"})

请注意这行代码,我们使用LCEL将不同的组件组合成一个单一的链条:
chain = prompt | model | output_parser
| 符号类似于 unix 管道操作符,它将不同的组件链接在一起,将一个组件的输出作为下一个组件的输入。
在这个链条中,用户输入被传递给提示模板,然后提示模板的输出被传递给模型,然后模型的输出被传递给输出解析器。让我们逐个组件地看一下,以真正理解发生了什么。
2.Runable interface--运行界面
Runable interface:可运行界面
为了尽可能简化创建自定义链的过程,我们实现了一个 "Runnable" 协议。Runnable 协议已为大多数组件实现。 这是一个标准接口,可以轻松定义自定义链并以标准方式调用它们。 标准接口包括:
这些方法也有对应的异步方法:
- astream: 异步流式返回响应的块
- ainvoke: 异步在输入上调用链
- abatch: 异步在输入列表上调用链
- astream_log: 异步流式返回中间步骤,以及最终响应
- astream_events: beta 异步流式返回链中发生的事件(在
langchain-core0.1.14 中引入)
输入类型 和输出类型因组件而异:
| 组件 | 输入类型 | 输出类型 |
|---|---|---|
| Prompt | 字典 | PromptValue |
| ChatModel | 单个字符串、聊天消息列表或 PromptValue | ChatMessage |
| LLM | 单个字符串、聊天消息列表或 PromptValue | 字符串 |
| OutputParser | LLM 或 ChatModel 的输出 | 取决于解析器 |
| Retriever | 单个字符串 | 文档列表 |
| Tool | 单个字符串或字典,取决于工具 | 取决于工具 |
所有可运行对象都公开输入和输出的模式以检查输入和输出:
- input_schema: 从 Runnable 的结构动态生成的输入 Pydantic 模型
- output_schema: 从 Runnable 的结构动态生成的输出 Pydantic 模型
让我们来看看这些方法。为此,我们将创建一个超级简单的 PromptTemplate + ChatModel 链。 %pip install --upgrade --quiet langchain-core langchain-community langchain-openai
python
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")
chain = prompt | model
2.1.输入和输出
python
print(chain.input_schema.model_json_schema())
print(prompt.input_schema.model_json_schema())
print(llm.input_schema.model_json_schema())

python
chain.output_schema.model_json_schema()

2.2.Stream
流式返回响应的块,也就是像网页那样,一个字一个字打出来:
所有 Runnable 对象都实现了一个名为 stream 的同步方法和一个名为 astream 的异步变体。 这些方法旨在以块的形式流式传输最终输出,尽快返回每个块。 只有在程序中的所有步骤都知道如何处理输入流时,才能进行流式传输;即,逐个处理输入块,并产生相应的输出块。 这种处理的复杂性可以有所不同,从简单的任务,如发出 LLM 生成的令牌,到更具挑战性的任务,如在整个 JSON 完成之前流式传输 JSON 结果的部分。 开始探索流式传输的最佳方法是从 LLM 应用程序中最重要的组件开始------LLM 本身!
python
for s in chain.stream({"话题": "bears"}):
print(s, end="", flush=True)

2.3.Invoke
在输入上调用链,输入参数-->构建提示词-->LLM回答-->结构化输出

2.4.batch
就是输入参数列表

3.服务部署与链路监控
3.1 概述
LangServe 是 LangChain 生态系统中的核心部署工具,它允许开发者将 Python 中的 LangChain 可运行对象(Runnables) (如 LLM、Prompt、Chain、Agent 等)快速转化为生产级的 REST API。
其底层集成了业界领先的 FastAPI 框架,并利用 Pydantic 进行数据验证与序列化。Pydantic 作为 Python 中主流的数据验证库,利用 Python 的类型提示(Type Hints)来定义数据模型,不仅保证了数据的可靠性,还极大地提升了代码的可读性和可维护性。
LangServe 不仅提供了标准的 API 端点,还内置了强大的监控与调试能力,帮助开发者在生产环境中观察和优化 AI 应用的性能。
3.2 核心特性
LangServe 为 AI 应用提供了开箱即用的 Web 服务功能:
- 🔍 自动模式推断与验证
自动从 LangChain 对象推断输入(Input)和输出(Output)的 Pydantic 模型模式。在每次 API 调用时强制执行数据验证,并返回详细的错误信息,确保接口的健壮性。 - 📄 自动生成文档
提供基于 JSON Schema 和 Swagger(OpenAPI)的交互式 API 文档页面,方便前后端联调及第三方集成。 - ⚡ 高效的多模式端点
开箱即支持多种高性能端点,支持单服务器处理高并发请求:/invoke: 同步调用,获取最终结果。/batch: 批量处理多个输入,提高吞吐量。/stream: 流式传输最终输出,提供类似 ChatGPT 的打字机体验。
- 📊 链路监控与流式日志
/stream_log: 流式传输链(Chain)或代理(Agent)执行过程中的所有(或部分)中间步骤,便于实时观察 AI 的"思考"过程。/stream_events(新特性): 自 0.0.40 版本起引入,提供了比/stream_log更加简洁的事件流接口,无需复杂的解析逻辑即可获取on_chain_start、on_llm_end等事件。
- 🛠️ 构建于成熟生态之上
基于经过严格测试的开源库构建(FastAPI、Pydantic、uvloop、asyncio),保证了服务的高性能与稳定性。 - 🌐 多语言客户端支持
提供 Python 和 JavaScript 客户端 SDK,允许你像调用本地对象一样调用远程部署的 LangServe 服务。
虽然 LangServe 功能强大,但在实际使用中仍需注意以下限制:
- 回调机制限制: 目前不支持通过客户端回调(Callback)直接从服务器端发起事件通知。
- Pydantic 版本兼容性(重要修正):
- 原文提示: "当使用 Pydantic V2 时,将不会生成 OpenAPI 文档。"
- 实际情况: 经过社区和 FastAPI 的迭代,目前的 FastAPI 已经支持 Pydantic V2。但在某些特定的旧版本组合中,确实可能出现 OpenAPI 文档生成失败或依赖冲突的问题。
- 建议: 如果遇到文档无法生成或依赖冲突(如
pydantic与langchain的版本约束),建议统一升级依赖,或在FastAPI中启用 V2 兼容模式。若问题依旧,可临时降级 Pydantic 至 V1 版本(pip install "pydantic<2.0")作为解决方案。
3.3.安装
python
pip install --upgrade "langserve[all]"
或者对于客户端代码,pip install "langserve[client]";对于服务器代码,pip install "langserve[server]"。
使用 LangChain CLI 快速启动 LangServe 项目。
要使用 langchain CLI,请确保已安装最新版本的 langchain-cli。
python
pip install -U langchain-cli
访问以下地址查看效果:
- API 文档: http://localhost:8000/docs
- 交互式 Playground: http://localhost:8000/joke/playground