LangChain

构建下一代 LLM 智能应用的操作系统

连接大语言模型与现实世界的桥梁,让 AI 不再是孤岛。

开始探索

1. 什么是 LangChain?

LangChain 是一个用于开发由语言模型驱动的应用程序的开源框架。如果说 LLM(大语言模型)是“大脑”,那么 LangChain 就是“四肢”和“感官”,它让大脑能够与外部数据交互、采取行动并保持记忆。

💡 核心价值

LangChain 让你可以在几小时内构建出一个功能完善的 AI 应用,而不是花费数周从零开始开发。

它的核心目标是解决以下两个主要问题:

  • 数据感知 (Data-aware):将语言模型与外部数据源连接起来,包括数据库、API、文档等。
  • 代理性 (Agentic):允许语言模型与其环境进行交互,自主决策并执行操作。

主要组件生态

组件 说明 用途
langchain-core 核心抽象和 LCEL 基础接口和表达式语言
langchain 链、代理和检索策略 构建应用的认知架构
langchain-community 第三方集成 连接外部服务和工具
LangServe REST API 部署 将链部署为服务
LangSmith 调试与监控平台 追踪、评估和优化应用

2. 核心组成模块

LangChain 提供了一套标准化的接口和组件,就像乐高积木一样,可以灵活组合。

LangChain Models Prompts Memory Indexes Chains Agents

图1:LangChain 核心架构概览

Models (模型)

对各种大语言模型(如 GPT-4, Claude, Llama)的标准化接口。支持 Chat Models 和 LLMs。

Prompts (提示词)

用于管理、优化和序列化提示词的工具。包含 Prompt Templates 和 Output Parsers。

Chains (链)

将多个组件(如提示词+模型+解析器)链接在一起,形成一个完整的调用序列。

Memory (记忆)

在链或代理的多次调用之间持久化状态,让 AI 记住之前的对话上下文。

Indexes (索引)

用于结构化文档,以便 LLM 能够与之交互。包含文档加载器、向量数据库等。

Agents (代理)

使用 LLM 作为推理引擎,决定采取什么行动以及行动的顺序。

3. LCEL 表达式语言 v0.1+

LangChain Expression Language (LCEL) 是 LangChain 最新的核心特性,提供了一种声明式的方式来组合链。它让代码更简洁、更易读,同时支持开箱即用的流式处理、异步执行和并行处理。

🚀 LCEL 核心优势

通过 | 管道操作符将组件串联,支持异步流式、批处理、并行执行、自动重试等特性。

LCEL 基本语法

# LCEL 使用管道操作符将组件串联
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

# 创建组件
prompt = ChatPromptTemplate.from_template("翻译以下内容到{language}: {text}")
model = ChatOpenAI(model="gpt-4")
parser = StrOutputParser()

# 使用 | 组合成链
chain = prompt | model | parser

# 调用链
result = chain.invoke({"language": "日语", "text": "你好世界"})
# 输出: "こんにちは世界"

LCEL 与传统写法对比

特性 传统 LLMChain LCEL
流式输出 需要额外配置 开箱即用
异步执行 需要单独实现 原生支持
并行处理 手动管理 自动优化
重试机制 需要封装 内置支持

4. 主要应用场景

4.1 文档问答 (RAG)

检索增强生成 (Retrieval-Augmented Generation) 是 LangChain 最流行的应用之一。它允许 AI 基于你的私有数据回答问题。

User Retrieval Vector DB Augment Prompt + Context LLM Answer

图2:文档检索增强生成 (RAG) 流程示意图

4.2 智能代理 (Agents)

代理不仅仅是回答问题,它还能使用工具(如搜索、计算器、API)来解决复杂任务。Agent 会自主决定使用哪些工具以及以什么顺序执行。

⚠️ 代理注意事项

Agent 具有自主性,可能产生意外行为。在生产环境中使用时,建议设置适当的权限边界和审计日志。

Agent (LLM) Thought Action Observation Input

图3:代理决策循环 (ReAct 模式)

4.3 对话机器人

构建具备上下文记忆的对话机器人是 LangChain 的另一个核心场景。通过 Memory 组件,AI 可以记住之前的对话内容,提供更自然的交互体验。

ConversationBufferMemory

存储所有对话历史,适用于短对话场景。

ConversationSummaryMemory

使用 LLM 总结对话历史,适合长对话。

ConversationBufferWindowMemory

保留最近 K 轮对话,平衡上下文与成本。

5. 向量数据库集成

向量数据库是 RAG 应用的核心组件,LangChain 支持广泛的向量数据库集成。

数据库 特点 适用场景
Chroma 轻量级、开源、易于入门 开发、原型、小型项目
Pinecone 全托管、高可用、易扩展 生产环境、企业级应用
Milvus 高性能、分布式、开源 大规模数据、高并发
Weaviate 混合搜索、内置向量化 多模态搜索
FAISS Facebook 开源、本地运行 离线应用、研究

向量存储基本流程

# 文档分割与向量存储
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

# 1. 加载和分割文档
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
docs = text_splitter.split_documents(documents)

# 2. 创建向量数据库
vectorstore = Chroma.from_documents(
    documents=docs,
    embedding=OpenAIEmbeddings()
)

# 3. 创建检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})

6. 快速入门示例

6.1 基础链示例

下面是一个使用 LCEL 的现代写法示例:创建一个提示词模板,连接到 LLM,并执行它。

# 现代 LCEL 写法
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1. 创建组件
prompt = ChatPromptTemplate.from_template(
    "为生产 {product} 的公司起一个好听的名字是什么?"
)
model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.9)
parser = StrOutputParser()

# 2. 使用 LCEL 组合成链
chain = prompt | model | parser

# 3. 调用链
result = chain.invoke({"product": "彩色袜子"})
print(result)
# 输出: "彩虹足迹有限公司"

6.2 RAG 示例

完整的检索增强生成示例:

# RAG 完整示例
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 1. 创建向量数据库
vectorstore = Chroma.from_texts(
    texts=["你的文档内容..."],
    embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()

# 2. 创建提示词模板
template = """\n根据以下上下文回答问题:
{context}

问题: {question}"""
prompt = ChatPromptTemplate.from_template(template)

# 3. 构建 RAG 链
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | ChatOpenAI()
    | StrOutputParser()
)

# 4. 查询
result = rag_chain.invoke("你的问题")

6.3 Agent 示例

创建一个具备工具能力的智能代理:

# Agent 示例
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.tools import DuckDuckGoSearchRun

# 1. 定义工具
search = DuckDuckGoSearchRun()
tools = [search]

# 2. 创建提示词
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有帮助的助手"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}")
])

# 3. 创建 Agent
llm = ChatOpenAI(model="gpt-4")
agent = create_tool_calling_agent(llm, tools, prompt)

# 4. 创建执行器并运行
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input": "今天天气怎么样?"})

7. LangServe 部署

LangServe 是 LangChain 官方提供的部署工具,可以将你的链快速部署为 REST API。

快速部署

几行代码即可将链发布为生产级 API

自动文档

自动生成 OpenAPI 文档和 Playground

流式支持

原生支持 SSE 流式响应

部署示例

# server.py
from fastapi import FastAPI
from langserve import add_routes
from your_chain import chain

app = FastAPI(title="LangChain Server")

# 添加链路由
add_routes(app, chain, path="/chain")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

💡 快速启动

使用 langchain app new my-app 可以快速创建一个 LangServe 项目模板。

8. LangSmith 监控

LangSmith 是 LangChain 的可观测性和评估平台,帮助你调试、测试和监控 LLM 应用。

功能 说明
追踪 (Tracing) 记录每次调用的完整执行过程,包括输入、输出、延迟和 Token 消耗
评估 (Evaluation) 对模型输出进行自动化评估,支持自定义评估器
数据集 (Datasets) 管理测试用例,支持回归测试
提示词管理 版本控制和协作管理提示词

启用 LangSmith

# 设置环境变量
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="your-api-key"
export LANGCHAIN_PROJECT="my-project"

# 然后正常运行你的链,追踪会自动上报

9. 最佳实践

🎯 提示词工程

  • 使用 Few-shot 示例提高准确性
  • 明确输出格式要求
  • 使用 Output Parser 解析结果

⚡ 性能优化

  • 合理设置 chunk_size 和 overlap
  • 使用流式输出提升用户体验
  • 缓存高频访问的检索结果

🔒 安全建议

  • 不要在代码中硬编码 API Key
  • 限制 Agent 的工具权限
  • 对用户输入进行验证和清理

📊 监控运维

  • 使用 LangSmith 追踪所有调用
  • 设置费用预警
  • 定期评估模型输出质量

10. 常见问题

Q: LangChain 和直接调用 OpenAI API 有什么区别?

A: LangChain 提供了更高层的抽象,让你可以轻松切换不同的模型(如从 GPT-4 切换到 Claude),同时提供了 RAG、Memory、Agent 等复杂功能的开箱即用实现。

Q: LCEL 和传统的 Chain 应该用哪个?

A: 推荐使用 LCEL。它是 LangChain 的未来方向,提供更好的流式支持、异步执行和调试体验。传统的 LLMChain 等已经被标记为废弃。

Q: 如何减少 Token 消耗和成本?

A: 1) 使用 ConversationSummaryMemory 而不是 BufferMemory;2) 优化 chunk_size 减少检索内容;3) 使用更便宜的模型处理简单任务;4) 实现缓存机制。

Q: LangChain 支持哪些模型?

A: 支持几乎所有主流模型,包括 OpenAI (GPT-3.5/4)、Anthropic (Claude)、Google (Gemini)、Meta (Llama)、Mistral、以及通过 Ollama 运行的本地模型等。

11. 总结与生态

LangChain 已经成为 AI 应用开发的标准中间件。它的优势在于:

  • 组件化:易于替换和升级模型,降低供应商锁定风险。
  • 生态丰富:集成了数百种工具、数据库和 API。
  • LCEL:声明式语法让链的构建更简洁、更强大。
  • LangSmith:提供了强大的调试、测试和监控能力。
  • LangServe:一键部署为生产级 API。

无论你是想构建一个简单的聊天机器人,还是一个复杂的自主代理系统,LangChain 都是最佳的起点。

📚 学习资源