1. 什么是 LangChain?
LangChain 是一个用于开发由语言模型驱动的应用程序的开源框架。如果说 LLM(大语言模型)是“大脑”,那么 LangChain 就是“四肢”和“感官”,它让大脑能够与外部数据交互、采取行动并保持记忆。
💡 核心价值
LangChain 让你可以在几小时内构建出一个功能完善的 AI 应用,而不是花费数周从零开始开发。
它的核心目标是解决以下两个主要问题:
- 数据感知 (Data-aware):将语言模型与外部数据源连接起来,包括数据库、API、文档等。
- 代理性 (Agentic):允许语言模型与其环境进行交互,自主决策并执行操作。
主要组件生态
| 组件 | 说明 | 用途 |
|---|---|---|
| langchain-core | 核心抽象和 LCEL | 基础接口和表达式语言 |
| langchain | 链、代理和检索策略 | 构建应用的认知架构 |
| langchain-community | 第三方集成 | 连接外部服务和工具 |
| LangServe | REST API 部署 | 将链部署为服务 |
| LangSmith | 调试与监控平台 | 追踪、评估和优化应用 |
2. 核心组成模块
LangChain 提供了一套标准化的接口和组件,就像乐高积木一样,可以灵活组合。
图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 基于你的私有数据回答问题。
图2:文档检索增强生成 (RAG) 流程示意图
4.2 智能代理 (Agents)
代理不仅仅是回答问题,它还能使用工具(如搜索、计算器、API)来解决复杂任务。Agent 会自主决定使用哪些工具以及以什么顺序执行。
⚠️ 代理注意事项
Agent 具有自主性,可能产生意外行为。在生产环境中使用时,建议设置适当的权限边界和审计日志。
图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 都是最佳的起点。
📚 学习资源
- 官方文档:python.langchain.com
- LangSmith:smith.langchain.com
- GitHub:github.com/langchain-ai/langchain