logo

LangChain Chains 链

Chains 是 LangChain 的核心概念,让你可以将多个组件串联起来,构建复杂的 LLM 工作流。

什么是 Chain?

Chain 是将多个组件(LLM、Prompt、Parser 等)组合在一起的方式:

输入 → Prompt → LLM → Parser → 输出

LCEL 基础

管道操作符 |

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 组件
prompt = ChatPromptTemplate.from_template("将 {text} 翻译成 {language}")
llm = ChatOpenAI()
parser = StrOutputParser()

# 使用 | 组合
chain = prompt | llm | parser

# 调用
result = chain.invoke({
    "text": "Hello, world!",
    "language": "中文"
})
print(result)  # 你好,世界!

链的方法

# 单次调用
result = chain.invoke({"text": "Hello"})

# 流式输出
for chunk in chain.stream({"text": "Hello"}):
    print(chunk, end="")

# 批量处理
results = chain.batch([
    {"text": "Hello"},
    {"text": "Goodbye"}
])

# 异步调用
result = await chain.ainvoke({"text": "Hello"})

常用 Chain 模式

顺序链

# 翻译 → 总结
translate_prompt = ChatPromptTemplate.from_template(
    "将以下文本翻译成英文:\n{text}"
)

summarize_prompt = ChatPromptTemplate.from_template(
    "用一句话总结:\n{translated}"
)

# 组合
translate_chain = translate_prompt | llm | StrOutputParser()
summarize_chain = summarize_prompt | llm | StrOutputParser()

# 顺序执行
full_chain = (
    {"translated": translate_chain}
    | summarize_chain
)

result = full_chain.invoke({"text": "这是一段很长的中文文本..."})

并行链

from langchain_core.runnables import RunnableParallel

# 同时执行多个任务
parallel_chain = RunnableParallel(
    summary=ChatPromptTemplate.from_template("总结:{text}") | llm | StrOutputParser(),
    keywords=ChatPromptTemplate.from_template("提取关键词:{text}") | llm | StrOutputParser(),
    sentiment=ChatPromptTemplate.from_template("分析情感:{text}") | llm | StrOutputParser()
)

result = parallel_chain.invoke({"text": "这是一篇关于人工智能的文章..."})
print(result["summary"])
print(result["keywords"])
print(result["sentiment"])

条件链

from langchain_core.runnables import RunnableBranch

# 根据条件选择不同的处理路径
branch_chain = RunnableBranch(
    # (条件, 执行的链)
    (lambda x: x["type"] == "code", code_review_chain),
    (lambda x: x["type"] == "text", text_analysis_chain),
    # 默认分支
    default_chain
)

result = branch_chain.invoke({"type": "code", "content": "def hello(): pass"})

传递数据

from langchain_core.runnables import RunnablePassthrough

# RunnablePassthrough 传递原始输入
chain = (
    {
        "original": RunnablePassthrough(),  # 保留原始输入
        "processed": some_processing_chain   # 处理后的结果
    }
    | final_chain
)

实用 Chain 示例

问答 Chain

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手。基于以下上下文回答问题。\n\n上下文:{context}"),
    ("human", "{question}")
])

qa_chain = prompt | ChatOpenAI() | StrOutputParser()

result = qa_chain.invoke({
    "context": "LangChain 是一个用于构建 LLM 应用的框架...",
    "question": "LangChain 是什么?"
})

多步推理 Chain

# 步骤 1: 理解问题
understand_prompt = ChatPromptTemplate.from_template(
    "分析这个问题的关键点:{question}"
)

# 步骤 2: 查找相关信息
search_prompt = ChatPromptTemplate.from_template(
    "基于分析 '{analysis}',我需要查找什么信息?"
)

# 步骤 3: 生成答案
answer_prompt = ChatPromptTemplate.from_template(
    "问题:{question}\n分析:{analysis}\n信息:{info}\n\n请回答问题。"
)

# 组合
reasoning_chain = (
    {"analysis": understand_prompt | llm | StrOutputParser(), "question": RunnablePassthrough()}
    | {"info": search_prompt | llm | StrOutputParser(), "analysis": lambda x: x["analysis"], "question": lambda x: x["question"]}
    | answer_prompt | llm | StrOutputParser()
)

带验证的 Chain

from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, validator

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

    @validator('confidence')
    def check_confidence(cls, v):
        if not 0 <= v <= 1:
            raise ValueError('Confidence must be between 0 and 1')
        return v

parser = JsonOutputParser(pydantic_object=Answer)

chain = (
    prompt
    | llm
    | parser  # 自动验证输出格式
)

带重试的 Chain

from langchain_core.runnables import RunnableWithFallbacks

# 主 Chain
main_chain = prompt | ChatOpenAI(model="gpt-4o") | StrOutputParser()

# 备用 Chain
fallback_chain = prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser()

# 带回退的 Chain
robust_chain = main_chain.with_fallbacks([fallback_chain])

调试和监控

添加日志

from langchain_core.runnables import RunnableLambda

def log_input(x):
    print(f"输入: {x}")
    return x

def log_output(x):
    print(f"输出: {x}")
    return x

chain = (
    RunnableLambda(log_input)
    | prompt
    | llm
    | parser
    | RunnableLambda(log_output)
)

使用 LangSmith

import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"

# 所有 Chain 调用都会被追踪
result = chain.invoke({"text": "Hello"})

自定义组件

自定义 Runnable

from langchain_core.runnables import RunnableLambda

def custom_transform(text: str) -> str:
    """自定义转换函数"""
    return text.upper()

# 转换为 Runnable
custom_runnable = RunnableLambda(custom_transform)

# 在 Chain 中使用
chain = prompt | llm | StrOutputParser() | custom_runnable

异步自定义组件

async def async_transform(text: str) -> str:
    # 异步操作
    await some_async_operation()
    return text

custom_async = RunnableLambda(func=sync_transform, afunc=async_transform)

最佳实践

1. 保持 Chain 简单

# ❌ 过于复杂的单个 Chain
mega_chain = step1 | step2 | step3 | step4 | step5 | step6

# ✅ 分解为多个可复用的 Chain
preprocess_chain = step1 | step2
process_chain = step3 | step4
postprocess_chain = step5 | step6

full_chain = preprocess_chain | process_chain | postprocess_chain

2. 错误处理

from langchain_core.runnables import RunnableWithFallbacks

chain = main_chain.with_fallbacks(
    [fallback_chain],
    exceptions_to_handle=(Exception,)
)

3. 类型安全

from langchain_core.runnables import RunnableSerializable

class MyChain(RunnableSerializable[dict, str]):
    """类型化的自定义 Chain"""

    def invoke(self, input: dict) -> str:
        # 实现逻辑
        return "result"

下一步


提示:LCEL 是 LangChain 的推荐方式,比旧版 Chain 类更灵活、更高效。

LangChain 框架指南
AI Engineer

LangChain 框架指南

LangChain 是构建 LLM 应用的流行框架,提供了链式调用、Agent、RAG 等丰富的功能模块。

LangChain 框架指南Chains 链

LangChain Chains 链

Chains 是 LangChain 的核心概念,让你可以将多个组件串联起来,构建复杂的 LLM 工作流。

#什么是 Chain?

Chain 是将多个组件(LLM、Prompt、Parser 等)组合在一起的方式:

输入 → Prompt → LLM → Parser → 输出

#LCEL 基础

#管道操作符 |

python
from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser # 组件 prompt = ChatPromptTemplate.from_template("将 {text} 翻译成 {language}") llm = ChatOpenAI() parser = StrOutputParser() # 使用 | 组合 chain = prompt | llm | parser # 调用 result = chain.invoke({ "text": "Hello, world!", "language": "中文" }) print(result) # 你好,世界!

#链的方法

python
# 单次调用 result = chain.invoke({"text": "Hello"}) # 流式输出 for chunk in chain.stream({"text": "Hello"}): print(chunk, end="") # 批量处理 results = chain.batch([ {"text": "Hello"}, {"text": "Goodbye"} ]) # 异步调用 result = await chain.ainvoke({"text": "Hello"})

#常用 Chain 模式

#顺序链

python
# 翻译 → 总结 translate_prompt = ChatPromptTemplate.from_template( "将以下文本翻译成英文:\n{text}" ) summarize_prompt = ChatPromptTemplate.from_template( "用一句话总结:\n{translated}" ) # 组合 translate_chain = translate_prompt | llm | StrOutputParser() summarize_chain = summarize_prompt | llm | StrOutputParser() # 顺序执行 full_chain = ( {"translated": translate_chain} | summarize_chain ) result = full_chain.invoke({"text": "这是一段很长的中文文本..."})

#并行链

python
from langchain_core.runnables import RunnableParallel # 同时执行多个任务 parallel_chain = RunnableParallel( summary=ChatPromptTemplate.from_template("总结:{text}") | llm | StrOutputParser(), keywords=ChatPromptTemplate.from_template("提取关键词:{text}") | llm | StrOutputParser(), sentiment=ChatPromptTemplate.from_template("分析情感:{text}") | llm | StrOutputParser() ) result = parallel_chain.invoke({"text": "这是一篇关于人工智能的文章..."}) print(result["summary"]) print(result["keywords"]) print(result["sentiment"])

#条件链

python
from langchain_core.runnables import RunnableBranch # 根据条件选择不同的处理路径 branch_chain = RunnableBranch( # (条件, 执行的链) (lambda x: x["type"] == "code", code_review_chain), (lambda x: x["type"] == "text", text_analysis_chain), # 默认分支 default_chain ) result = branch_chain.invoke({"type": "code", "content": "def hello(): pass"})

#传递数据

python
from langchain_core.runnables import RunnablePassthrough # RunnablePassthrough 传递原始输入 chain = ( { "original": RunnablePassthrough(), # 保留原始输入 "processed": some_processing_chain # 处理后的结果 } | final_chain )

#实用 Chain 示例

#问答 Chain

python
from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个有帮助的助手。基于以下上下文回答问题。\n\n上下文:{context}"), ("human", "{question}") ]) qa_chain = prompt | ChatOpenAI() | StrOutputParser() result = qa_chain.invoke({ "context": "LangChain 是一个用于构建 LLM 应用的框架...", "question": "LangChain 是什么?" })

#多步推理 Chain

python
# 步骤 1: 理解问题 understand_prompt = ChatPromptTemplate.from_template( "分析这个问题的关键点:{question}" ) # 步骤 2: 查找相关信息 search_prompt = ChatPromptTemplate.from_template( "基于分析 '{analysis}',我需要查找什么信息?" ) # 步骤 3: 生成答案 answer_prompt = ChatPromptTemplate.from_template( "问题:{question}\n分析:{analysis}\n信息:{info}\n\n请回答问题。" ) # 组合 reasoning_chain = ( {"analysis": understand_prompt | llm | StrOutputParser(), "question": RunnablePassthrough()} | {"info": search_prompt | llm | StrOutputParser(), "analysis": lambda x: x["analysis"], "question": lambda x: x["question"]} | answer_prompt | llm | StrOutputParser() )

#带验证的 Chain

python
from langchain_core.output_parsers import JsonOutputParser from pydantic import BaseModel, validator class Answer(BaseModel): answer: str confidence: float @validator('confidence') def check_confidence(cls, v): if not 0 <= v <= 1: raise ValueError('Confidence must be between 0 and 1') return v parser = JsonOutputParser(pydantic_object=Answer) chain = ( prompt | llm | parser # 自动验证输出格式 )

#带重试的 Chain

python
from langchain_core.runnables import RunnableWithFallbacks # 主 Chain main_chain = prompt | ChatOpenAI(model="gpt-4o") | StrOutputParser() # 备用 Chain fallback_chain = prompt | ChatOpenAI(model="gpt-4o-mini") | StrOutputParser() # 带回退的 Chain robust_chain = main_chain.with_fallbacks([fallback_chain])

#调试和监控

#添加日志

python
from langchain_core.runnables import RunnableLambda def log_input(x): print(f"输入: {x}") return x def log_output(x): print(f"输出: {x}") return x chain = ( RunnableLambda(log_input) | prompt | llm | parser | RunnableLambda(log_output) )

#使用 LangSmith

python
import os os.environ["LANGCHAIN_TRACING_V2"] = "true" os.environ["LANGCHAIN_API_KEY"] = "your-api-key" # 所有 Chain 调用都会被追踪 result = chain.invoke({"text": "Hello"})

#自定义组件

#自定义 Runnable

python
from langchain_core.runnables import RunnableLambda def custom_transform(text: str) -> str: """自定义转换函数""" return text.upper() # 转换为 Runnable custom_runnable = RunnableLambda(custom_transform) # 在 Chain 中使用 chain = prompt | llm | StrOutputParser() | custom_runnable

#异步自定义组件

python
async def async_transform(text: str) -> str: # 异步操作 await some_async_operation() return text custom_async = RunnableLambda(func=sync_transform, afunc=async_transform)

#最佳实践

#1. 保持 Chain 简单

python
# ❌ 过于复杂的单个 Chain mega_chain = step1 | step2 | step3 | step4 | step5 | step6 # ✅ 分解为多个可复用的 Chain preprocess_chain = step1 | step2 process_chain = step3 | step4 postprocess_chain = step5 | step6 full_chain = preprocess_chain | process_chain | postprocess_chain

#2. 错误处理

python
from langchain_core.runnables import RunnableWithFallbacks chain = main_chain.with_fallbacks( [fallback_chain], exceptions_to_handle=(Exception,) )

#3. 类型安全

python
from langchain_core.runnables import RunnableSerializable class MyChain(RunnableSerializable[dict, str]): """类型化的自定义 Chain""" def invoke(self, input: dict) -> str: # 实现逻辑 return "result"

#下一步


提示:LCEL 是 LangChain 的推荐方式,比旧版 Chain 类更灵活、更高效。

System Design

系统设计必备:核心概念 + 经典案例

快速掌握取舍与设计套路,备战系统设计面试。

进入 System Design →

相关路线图