第56篇:LangChain快速入门与应用示例
——构建你的第一个AI代理系统
📌 摘要
在大模型(LLM)应用开发领域,LangChain 是当前最主流、功能最强大的框架之一。它不仅提供了模块化的设计思想,还支持多种语言模型、提示工程、记忆机制、检索增强生成(RAG)、智能代理等功能。
本文将带你从零开始,逐步掌握 LangChain 的核心概念和组件使用方式,并通过多个实战案例帮助你构建实际可用的 AI 应用系统,如知识库问答助手、数据分析代理、多轮对话客服机器人等。
✅ 适合对象:AI初中级开发者
🧪 实战内容:Prompt模板、RAG实现、代理系统搭建、流式输出
🛠️ 工具链完整:OpenAI、本地模型、工具调用、回调函数
🎯 场景覆盖:企业知识库、客户服务、数据处理
🔍 核心概念与知识点
1. LangChain基础架构【实战部分】
1.1 最新版本(0.1.x)核心概念:从旧版到新版架构变化
LangChain 自 v0.1.x 版本起进行了重大重构,引入了:
- LCEL(LangChain Expression Language):声明式链构建语法;
- 更清晰的
Runnable
接口; - 支持异步、流式、并行处理;
- 新的
langchain_core
、langchain_community
和langchain_openai
等模块拆分。
📌 安装最新版 LangChain:
pip install langchain langchain-openai langchain-anthropic langchain-community
1.2 LangChain表达式语言(LCEL):声明式链构建语法
LCEL 是一种类似函数管道的语法,可以轻松组合 Prompt、模型、解析器等组件。
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role},擅长{skill}。"),
("human", "{query}")
])
llm = ChatOpenAI(model="gpt-4o")
chain = prompt | llm | StrOutputParser()
response = chain.invoke({
"role": "翻译官",
"skill": "中英互译",
"query": "请把'你好吗?'翻译成英文"
})
print(response)
# 输出: How are you?
📌 解释说明:
|
表示链式调用;prompt
构建输入;llm
执行推理;StrOutputParser
将输出转为字符串。
1.3 核心组件体系:Models、Prompts、Memory等组件解析
组件 | 功能 | 示例 |
---|---|---|
Models | LLM / ChatModel | OpenAI、Anthropic、本地模型 |
Prompts | 提示模板 | ChatPromptTemplate |
Memory | 对话历史管理 | ConversationBufferMemory |
Tools | 外部功能集成 | Search API、数据库查询 |
Chains | 链式调用 | SequentialChain、RetrievalQA |
Agents | 智能代理 | ReAct Agent |
1.4 运行时环境:Tracing与调试工具配置
推荐使用 LangSmith 进行追踪和调试:
export LANGCHAIN_API_KEY=your_langsmith_api_key
export LANGCHAIN_PROJECT=default
然后在代码中启用 Tracing:
import langchain
langchain.debug = True
2. 关键组件实战应用【实战部分】
2.1 模型集成:OpenAI、Anthropic、本地模型适配代码
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_ollama import ChatOllama # 使用本地模型(如Llama3)
openai_llm = ChatOpenAI(model="gpt-4o")
anthropic_llm = ChatAnthropic(model="claude-3-opus-20240229")
local_llm = ChatOllama(model="llama3:8b") # 假设已安装 Ollama 并运行 llama3
📌 解释说明:
- 可根据需求切换不同模型;
- 本地模型适合离线场景或降低成本;
- 所有模型接口统一,便于替换。
2.2 提示模板:PromptTemplate与聊天提示的最佳实践
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的{role},专长于{expertise}。"),
("human", "{query}")
])
messages = prompt.invoke({"role": "金融分析师", "expertise": "市场预测", "query": "分析2024年股市趋势"})
print(messages)
输出示例:
[
SystemMessage(content='你是一位专业的金融分析师,专长于市场预测。'),
HumanMessage(content='分析2024年股市趋势')
]
📌 解释说明:
ChatPromptTemplate
支持多消息类型;- 可动态填充变量;
- 适用于对话系统、多轮交互。
2.3 记忆机制:对话历史管理与持久化存储
from langchain.memory import ConversationBufferMemory
from langchain.chains import LLMChain
memory = ConversationBufferMemory()
chain = LLMChain(llm=openai_llm, prompt=prompt, memory=memory)
# 第一次对话
response = chain.invoke({"role": "医生", "expertise": "营养学", "query": "早餐应该吃什么?"})
print(response['text'])
# 第二次对话
response = chain.invoke({"role": "医生", "expertise": "营养学", "query": "那午餐呢?"})
print(response['text'])
📌 解释说明:
ConversationBufferMemory
自动记录对话历史;- 支持
RedisMemory
、SQLMemory
等持久化方式; - 可用于构建持续对话的客服系统。
2.4 检索增强实现:完整RAG系统构建代码
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import TextLoader
# 加载文档
loader = TextLoader("data/sample.txt")
docs = loader.load()
# 分块处理
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
# 构建向量数据库
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
# 构建检索器
retriever = vectorstore.as_retriever()
# 构建RAG链
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| openai_llm
| StrOutputParser()
)
result = rag_chain.invoke("什么是量子计算的基本原理?")
print(result)
📌 解释说明:
RecursiveCharacterTextSplitter
保证语义连贯;Chroma
是轻量级向量数据库;- 支持 FAISS、Pinecone、Weaviate 等高级方案。
3. LangChain应用架构【实战部分】
3.1 Chains构建:Sequential和Router链的实现示例
from langchain.schema.runnable import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 定义路由逻辑
def route(info):
if "数学" in info["topic"]:
return math_chain
elif "文学" in info["topic"]:
return literature_chain
else:
return general_chain
router_chain = RunnablePassthrough.assign(topic=lambda x: x["topic"]) | route
# 示例调用
response = router_chain.invoke({"topic": "数学", "query": "解方程x² + 2x + 1 = 0"})
print(response)
📌 解释说明:
RunnablePassthrough
允许保留原始输入;route()
函数决定走哪条子链;- 适用于多任务、多模型调度。
3.2 Agents实现:ReAct代理与工具使用完整代码
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain.tools import Tool
from langchain.prompts import MessagesPlaceholder
from langchain_core.messages import HumanMessage
# 自定义工具
def search_internet(query):
# 模拟搜索
return f"搜索结果:{query}"
tools = [
Tool.from_function(
func=search_internet,
name="SearchInternet",
description="搜索最新的互联网信息"
)
]
# 创建代理
agent_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个智能代理,可以使用工具完成任务。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
agent = create_openai_functions_agent(openai_llm, tools, agent_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 执行代理
response = agent_executor.invoke({"input": "2024年奥运会举办地是哪里?"})
print(response["output"])
📌 解释说明:
create_openai_functions_agent
支持函数调用;AgentExecutor
负责执行流程控制;- 支持流式输出、工具自动选择。
3.3 自定义回调:流式处理与进度监控实现
from langchain.callbacks.base import BaseCallbackHandler
class MyCustomHandler(BaseCallbackHandler):
def on_llm_new_token(self, token: str, **kwargs) -> None:
print(f"Token: {token}")
handler = MyCustomHandler()
response = chain.invoke({"query": "请写一篇关于气候变化的文章"}, config={"callbacks": [handler]})
📌 解释说明:
on_llm_new_token
实现流式输出;- 可用于前端实时显示;
- 支持自定义日志、性能监控等。
3.4 并行处理策略:高性能应用架构设计
from langchain.schema.runnable import RunnableParallel
parallel_chain = RunnableParallel(
summary=prompt | llm | StrOutputParser(),
sentiment=prompt | sentiment_model | StrOutputParser()
)
results = parallel_chain.invoke({"query": "用户对我们的产品评价如何?"})
print(results)
📌 解释说明:
RunnableParallel
实现并行执行;- 适用于多任务同时处理;
- 显著提升复杂系统的响应速度。
🧩 垂直应用开发【实战部分】
4.1 文档问答系统:完整知识库应用架构
- 使用 RAG 技术;
- 支持 PDF/Word/TXT 文档;
- 构建可部署的 Web 应用(FastAPI + Gradio);
4.2 对话式代理:持久化对话状态管理
- 使用 Redis 存储记忆;
- 支持多用户并发;
- 构建客服机器人原型。
4.3 数据分析助手:结构化数据处理流程
- 集成 Pandas;
- 使用 SQLDatabaseTool 查询数据库;
- 生成可视化图表建议。
4.4 多模型协作系统:模型路由与任务分发
- 使用 Router Chain;
- 动态选择 GPT、Claude 或本地模型;
- 构建高性价比的企业级系统。
🧩 案例与实例
5.1 企业知识库:完整RAG应用的LangChain实现
见上文“检索增强实现”部分。
5.2 客户服务助手:多轮对话系统的生产级代码
- 使用
ConversationSummaryBufferMemory
; - 支持上下文压缩;
- 支持工具调用(如订单查询)。
5.3 数据分析工作流:结合pandas的数据处理代理
from langchain_experimental.agents import create_pandas_dataframe_agent
import pandas as pd
df = pd.read_csv("data/sales.csv")
agent = create_pandas_dataframe_agent(openai_llm, df, verbose=True)
response = agent.invoke("2023年销售额最高的产品是什么?")
print(response["output"])
🛠️ 实战代码与模板
6.1 项目脚手架:生产级LangChain应用模板
GitHub 示例模板地址(假设):https://github.com/yourname/langchain-starter-kit
6.2 自定义组件:扩展LangChain功能的示例代码
- 自定义 LLM 类;
- 自定义 Prompt Template;
- 自定义 Callback Handler。
6.3 性能优化指南:大规模应用的最佳实践
- 使用
RunnableConfig
控制超时; - 启用缓存(
langchain.cache.RedisCache
); - 使用异步模式提高吞吐量。
6.4 调试与监控:LangSmith与追踪工具使用示例
- 登录 LangSmith:https://smith.langchain.com/
- 设置 API Key;
- 查看调用链、耗时、错误信息。
🧠 总结与扩展思考
7.1 LangChain与竞争框架的对比与选择
框架 | 优势 | 缺点 |
---|---|---|
LangChain | 插件丰富、社区活跃、生态强大 | 初学者学习曲线陡峭 |
LlamaIndex | 简洁易用、专注 RAG | 社区相对较小 |
AutoGPT | 自主决策能力强 | 不稳定、资源消耗大 |
7.2 企业级应用的架构设计考量
- 安全性:密钥管理、访问控制;
- 可靠性:重试机制、熔断机制;
- 可观测性:日志、监控、报警;
- 成本控制:模型选型、缓存策略。
7.3 LangChain生态系统的未来发展方向
- 更强的 Agent 能力;
- 更完善的可视化工具;
- 更多本地模型支持;
- 与 LangGraph、LangServe 深度整合。
📚 参考资料
- LangChain官方文档:https://python.langchain.com/docs/
- LangSmith官网:https://smith.langchain.com/
- LangChain中文社区:https://langchain.cn/
- GitHub仓库:https://github.com/langchain-ai/langchain
🧑💻 结语
LangChain 是构建现代大模型应用的核心工具之一。本文不仅介绍了其核心组件与架构,还通过多个实战代码帮助你快速上手,构建真实可用的 AI 应用。
💬 如果你想了解某个平台的深度评测、定制化训练或私有化部署方案,欢迎留言,我们将安排专题深入讲解!
✅ 关注《AI大模型应知应会100篇》专栏,持续更新前沿技术干货!