0Pricing
AI Engineering Academy · 课时

LangChain 架构与核心抽象

了解 LangChain 的组件模型,包括 LLM、ChatModels、PromptTemplates、OutputParsers 和 Runnable,以及它们如何组合成流程。

LangChain 架构与核心抽象 是 CoddyKit 上的免费 AI Engineering Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Engineering Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Engineering Academy 课程共包含 4 节课。

LangChain 究竟是什么

LangChain 是一个用于构建语言模型驱动应用的框架。您不必亲自编写原始 API 调用和胶水代码,LangChain 提供了可以组合成流水线的可复用组件。它通过统一接口支持多个 LLM 提供商(OpenAI、Anthropic、Cohere 和本地模型),因此切换提供商只需进行极少的代码修改。

组件模型概览

LangChain 将构建模块组织成不同的组件类别。LLM 和 ChatModels 封装模型提供商。PromptTemplates 管理动态提示词构建。OutputParsers 将模型的原始文本转换为结构化的 Python 对象。Runnable 是将所有内容组合成可组合流水线的通用接口。

LLM 与 ChatModels 的区别

LangChain 区分两种模型接口。LLM 接收字符串提示词并返回字符串补全结果,这是较早的文本补全风格。ChatModel 接收消息列表(系统消息、人类消息、AI 消息),并返回消息对象。现代的 OpenAI、Anthropic 和 Gemini 模型都属于 ChatModels。对于新应用,您应优先使用 ChatModel。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

llm = ChatOpenAI(model='gpt-4o-mini')
response = llm.invoke([
    SystemMessage(content='You are a helpful assistant.'),
    HumanMessage(content='What is LangChain?')
])
print(response.content)

PromptTemplates:动态提示词

PromptTemplate 允许您定义包含占位变量的提示词,这些变量会在运行时填入。ChatPromptTemplate 对聊天风格的提示词执行相同的操作,并支持多条消息。模板将提示词结构与运行时值分离,使提示词可复用、易于测试,也便于进行版本控制。

from langchain_core.prompts import ChatPromptTemplate

template = ChatPromptTemplate.from_messages([
    ('system', 'You are an expert in {domain}.'),
    ('human', 'Explain {concept} in simple terms.')
])

# Fill in variables at runtime
messages = template.invoke({'domain': 'machine learning', 'concept': 'embeddings'})
print(messages)

OutputParsers:塑造模型输出

OutputParsers 会将模型返回的原始字符串输出转换为结构化的 Python 类型。StrOutputParser 只提取内容字符串。JsonOutputParser 会解析 JSON。PydanticOutputParser 会根据 Pydantic 架构进行验证。解析器还会生成格式说明,您可以将其注入提示词,引导模型输出预期格式。

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

class MovieReview(BaseModel):
    title: str
    rating: int
    summary: str

parser = JsonOutputParser(pydantic_object=MovieReview)
# parser.get_format_instructions() returns JSON schema instructions
print(parser.get_format_instructions()[:200])

可运行对象接口

每个 LangChain 组件都实现了可运行对象接口,该接口定义了三个关键方法:invoke() 用于同步单次调用,stream() 用于逐个令牌进行流式传输,batch() 用于并行处理多个输入。由于每个组件都是可运行对象,因此都可以使用管道运算符以统一方式组合。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model='gpt-4o-mini')

# Single call
result = llm.invoke('What is 2+2?')

# Streaming tokens
for chunk in llm.stream('Tell me a joke.'):
    print(chunk.content, end='', flush=True)

# Batch processing
results = llm.batch(['What is Paris?', 'What is Rome?'])

使用管道运算符进行组合

管道运算符(|)是创建 RunnableSequence 对象的语法糖。当您编写 prompt | llm | parser 时,LangChain 会创建一个链,使每个步骤的输出流入下一步的输入。这是 LCEL(LangChain 表达式语言)的核心,并取代了早期冗长的链类。

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

prompt = ChatPromptTemplate.from_template('Summarize this in one sentence: {text}')
llm = ChatOpenAI(model='gpt-4o-mini')
parser = StrOutputParser()

# Chain composed with pipe operator
chain = prompt | llm | parser

result = chain.invoke({'text': 'LangChain is a framework for LLM applications...'})
print(result)

文档加载器与文本分割器

对于 RAG 应用,LangChain 提供了文档加载器,可以读取各种格式的文件(PDF、Word、HTML、CSV),并返回一个 Document 对象列表;每个对象包含 page_content 和 metadata 字段。随后,文本分割器会将长文档拆分为较小的文本块,以便进行嵌入和检索。

from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

loader = PyPDFLoader('report.pdf')
docs = loader.load()  # List of Document objects

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = splitter.split_documents(docs)
print(f'Split {len(docs)} pages into {len(chunks)} chunks')

作为可运行对象的向量存储

LangChain 会将向量数据库(Chroma、Pinecone、pgvector)封装为 VectorStore 对象,并提供 similarity_search() 方法。您可以使用 .as_retriever() 将任意 VectorStore 转换为检索器可运行对象,使其能够组合到 LCEL 链中。检索器接收查询字符串,并返回相关性最高的前 k 个文档。

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)

# Convert to Retriever Runnable
retriever = vectorstore.as_retriever(
    search_type='similarity',
    search_kwargs={'k': 5}
)

results = retriever.invoke('How does LangChain work?')
for doc in results:
    print(doc.page_content[:100])

回调与可观测性

LangChain 的回调系统允许您接入链执行过程中的每个事件:LLM 开始运行、令牌进行流式传输、链完成运行,以及工具被调用。内置回调包括用于控制台日志记录的 StdOutCallbackHandler。LangSmith 等第三方集成可以通过环境变量自动接入,在无需修改代码的情况下捕获完整的执行轨迹。

from langchain.callbacks import StdOutCallbackHandler
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model='gpt-4o-mini',
    callbacks=[StdOutCallbackHandler()]
)
# Now every call logs input/output automatically

# Or enable LangSmith tracing globally:
import os
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_API_KEY'] = 'your-key'

链中的记忆与状态

默认情况下,LangChain 链是无状态的,每次调用彼此独立。要添加对话记忆,您可以用一个存储并注入对话历史记录的记忆组件包装链。RunnableWithMessageHistory 是在 LCEL 中添加记忆的原生方式,它接收 get_session_history 函数,并通过会话 ID 加载历史记录。

from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory

store = {}  # session_id -> ChatMessageHistory

def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

with_history = RunnableWithMessageHistory(chain, get_session_history)
response = with_history.invoke(
    {'input': 'Hi, my name is Alice'},
    config={'configurable': {'session_id': 'user-1'}}
)

快速检查

测试您对 LangChain 架构和核心抽象的理解。

课程回顾

本课中,您学习了以下内容:LangChain 的组件模型将 LLM、PromptTemplates、OutputParsers 和检索器组织为具有统一接口的可运行对象;管道运算符(|)通过 LCEL 将可运行对象组合成顺序链;回调则可以在不改变业务逻辑的情况下,实现每个步骤的可观测性。接下来,我们将深入学习如何使用 LCEL 构建链。

常见问题解答

「LangChain 架构与核心抽象」课时是免费的吗?

是的 — 「LangChain 架构与核心抽象」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Engineering Academy 课程的其余内容,请升级到 CoddyKit PRO。 AI Engineering Academy 课程共包含 4 节课。

「LangChain 架构与核心抽象」这节课中我会学到什么?

了解 LangChain 的组件模型,包括 LLM、ChatModels、PromptTemplates、OutputParsers 和 Runnable,以及它们如何组合成流程。 你通过在浏览器中直接运行的动手代码来练习 AI Engineering Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AI Engineering Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AI Engineering Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「LangChain 架构与核心抽象」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AI Engineering Academy 课中编写并运行代码吗?

能。每节 AI Engineering Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. LangChain 架构与核心抽象
  2. 使用 LCEL 构建链
  3. 分支链与并行链
  4. 在 LangChain 中流式输出
← 返回 AI Engineering Academy