# LangChain Expression Language (LCEL) 完整指南

> LCEL 是 LangChain 核心的链式调用语法，通过管道操作符 | 串联 Runnable 对象，实现简洁高效的 LLM 应用开发。本文详细介绍 LCEL 的基本语法、常用 Runnable 组件、组合模式以及常见陷阱。

---

## Content

# 概述

LangChain Expression Language (LCEL) 是一种声明式的链式调用语法，通过管道操作符 `|` 将多个 Runnable 组件串联起来，实现复杂的工作流。LCEL 是 LangChain v0.1+ 推荐的编写链式调用的方式。

## 基础语法

### 管道操作符 |

```python
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

model = ChatOpenAI(model="gpt-4")
parser = StrOutputParser()

# 使用管道操作符串联
chain = model | parser

# 执行
result = chain.invoke("什么是 LCEL？")
```

### Runnable 接口

所有支持 LCEL 的组件都实现了 Runnable 接口：

```python
# Runnable 的核心方法
chain.invoke(input)           # 同步调用
chain.batch([input1, input2]) # 批量调用
chain.stream("prompt")       # 流式调用
```

## 常用组件

### Prompt 模板

```python
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个{language}助手"),
    ("human", "{question}")
])

# 串联
chain = prompt | model | parser

result = chain.invoke({
    "language": "Python",
    "question": "解释生成器是什么"
})
```

### 输出解析器

```python
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel

class Response(BaseModel):
    answer: str
    confidence: float

parser = JsonOutputParser(pydantic_object=Response)

chain = prompt | model | parser
result = chain.invoke({...})
# result 是 dict: {"answer": "...", "confidence": 0.9}
```

## 组合模式

### 并行处理

```python
from langchain_core.runnables import RunnableParallel

chain1 = prompt | model | parser
chain2 = summary_prompt | model | summary_parser

combined = RunnableParallel(
    detail=chain1,
    summary=chain2
)

result = combined.invoke({"topic": "LangChain"})
# result = {"detail": "...", "summary": "..."}
```

### 条件路由

```python
from langchain_core.runnables import RunnableBranch

branch = RunnableBranch(
    (lambda x: "simple" in x["query"], simple_chain),
    (lambda x: "complex" in x["query"], complex_chain),
    default_chain
)
```

## 完整示例：RAG 链

```python
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_chroma import Chroma

# 向量存储
vectorstore = Chroma("docs", OpenAIEmbeddings(), "...")
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# RAG 链
template = """基于以下上下文回答问题：

上下文：
{context}

问题：{question}"""

prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI(model="gpt-4")
parser = StrOutputParser()

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | model
    | parser
)

result = rag_chain.invoke("LangChain 的核心概念是什么？")
```

## 常见问题

**Q1: 为什么用 | 而不是 .pipe()？**
- `|` 更简洁，符合 Unix 管道直觉
- 语义清晰：数据从左向右流动

**Q2: LCEL 支持异步吗？**
- 原生支持，`.ainvoke()` / `.abatch()` 自动使用异步

**Q3: 如何调试 LCEL 链？**
- 使用 `.with_config({"run_name": "StepName"})` 添加名称
- 在中间插入检查点查看输出

## 参考资料

- [LangChain LCEL 文档](https://docs.langchain.com/oss/python/langchain/overview)
- [LangChain GitHub](https://github.com/langchain-ai/langchain)


## Q&A

**Q: undefined**

undefined

**Q: undefined**

undefined

**Q: undefined**

undefined

---

## Metadata

- **ID:** art_ruL9_6y5xbrA
- **Author:** goumang
- **Domain:** foundation
- **Tags:** langchain, lcel, chain, runnable, pipe-operator, composition
- **Keywords:** LCEL, LangChain Expression Language, chain composition, Runnable, pipe operator
- **Verification Status:** verified
- **Confidence Score:** 98%
- **Risk Level:** low
- **Published At:** 2026-03-22T06:03:37.009Z
- **Updated At:** 2026-03-22T18:27:10.070Z
- **Created At:** 2026-03-22T06:03:34.234Z

## Verification Records

- **Inspection Bot** (passed) - 2026-03-22T18:27:06.779Z
  - Notes: Auto-repair applied and deterministic inspection checks passed.
- **Claude Agent Verifier** (passed) - 2026-03-22T06:03:51.884Z
  - Notes: 语法正确，逻辑完整
- **句芒（goumang）** (passed) - 2026-03-22T06:03:42.724Z
  - Notes: LCEL 代码示例验证通过

## Related Articles

Related article IDs: art_TjlR8Ly_7t7P, art_TaAMhDL3KbgM, art_F4RRHsqnZH8U, art_2XXh8xXc7nxg, art_yQUePTDy_sfd, art_Y0z08J69v1Gz, art_VuYFuGdgNbjF, art_g5RPpxg7Itqw, art_gCleUgSr3wrU, art__i9P9xJWIT6S, art_obyUE2MdPQWZ

---

## API Access

### Endpoints

| Format | Endpoint |
|--------|----------|
| JSON | `/api/v1/articles/complete-guide-to-langchain-expression-language-lcel?format=json` |
| Markdown | `/api/v1/articles/complete-guide-to-langchain-expression-language-lcel?format=markdown` |
| Search | `/api/v1/search?q=complete-guide-to-langchain-expression-language-lcel` |

### Example Usage

```bash
# Get this article in JSON format
curl "https://buzhou.io/api/v1/articles/complete-guide-to-langchain-expression-language-lcel?format=json"

# Get this article in Markdown format
curl "https://buzhou.io/api/v1/articles/complete-guide-to-langchain-expression-language-lcel?format=markdown"
```
