一、LangChain 简介
LangChain 是目前最主流的大语言模型(LLM)应用开发框架,核心作用是简化大模型应用开发,解决原生大模型单次对话、无记忆、无法联网、无法调用工具、无法对接私有数据的痛点。
核心能力:
- ✅ 统一对接所有大模型(OpenAI、DeepSeek、通义千问、Anthropic等)
- ✅ 支持对话记忆,实现多轮连续对话
- ✅ 链式编排,自由组合Prompt、模型、解析器、工具
- ✅ 私有知识库问答(RAG检索增强生成)
- ✅ 智能Agent,自主思考、调用工具、完成复杂任务
二、开发环境搭建
2.1 环境准备
推荐 Python 3.9+ 版本,新建虚拟环境隔离依赖,避免版本冲突。
bash
# 创建虚拟环境
python -m venv .venv
# 激活虚拟环境
# Windows
.venv\Scripts\activate
# Mac/Linux
source .venv/bin/activate
2.2 安装核心依赖
LangChain 新版采用按需安装策略,核心包+模型适配包分离,推荐安装全套基础依赖:
bash
# 安装LangChain核心库+OpenAI适配包(兼容DeepSeek、智谱等OpenAI接口模型)
pip install langchain "langchain[openai]" langchain-community langchain-core python-dotenv
2.3 密钥环境配置
项目根目录新建 .env 文件,统一管理模型密钥,避免硬编码泄露。本教程优先使用DeepSeek(免费好用、兼容OpenAI接口),也可替换为OpenAI、通义千问等模型。
.env 文件内容:
ini
# DeepSeek密钥(自行官网申请)
DEEPSEEK_API_KEY=你的DeepSeek密钥
# 模型接口地址
OPENAI_API_BASE=https://api.deepseek.com/v1
三、LangChain 五大核心组件(必懂)
所有LangChain应用,均由以下5个核心组件组合而成,掌握即可搭建90%的LLM应用:
- Models(模型) :大模型本体,分为聊天模型(ChatModel)、文本模型(LLM)
- Prompts(提示词模板) :统一格式化输入,批量生成规范提示词
- Output Parsers(输出解析器) :将模型自由文本输出,解析为JSON、列表、对象等结构化数据
- Memory(记忆) :存储对话历史,实现多轮上下文关联
- Chains/Agent(链式/智能体) :串联所有组件,实现复杂逻辑自动化执行
四、基础实战:最简LLM链式调用
新版LangChain 核心语法为管道符 | 链式写法,替代老旧的 SequentialChain,代码更简洁、可读性更强。
实现功能:提示词模板 + 大模型 + 结构化输出解析
ini
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 加载环境变量
load_dotenv()
# 1. 初始化大模型(兼容DeepSeek/OpenAI)
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base=os.getenv("OPENAI_API_BASE"),
temperature=0.7 # 随机性 0-1,越低越严谨
)
# 2. 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一名专业的Python技术助教,回答简洁易懂,适合新手"),
("human", "请简单讲解:{question}")
])
# 3. 定义输出解析器(统一输出字符串格式)
parser = StrOutputParser()
# 4. 链式组合:prompt -> llm -> parser
chain = prompt | llm | parser
# 5. 调用链执行任务
if __name__ == "__main__":
res = chain.invoke({"question": "什么是LangChain?"})
print(res)
执行逻辑:输入问题 → 模板格式化提示词 → 大模型推理 → 解析输出结果
五、进阶1:多轮对话记忆功能
原生大模型无记忆,每次对话独立。通过 LangChain Memory 组件,实现上下文关联多轮对话。
ini
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_message_histories import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
load_dotenv()
# 初始化模型
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base=os.getenv("OPENAI_API_BASE"),
temperature=0.7
)
# 定义带历史记录的提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是贴心的AI助手,记住用户的对话历史,连贯回答问题"),
MessagesPlaceholder(variable_name="chat_history"), # 插入对话历史
("human", "{input}")
])
# 构建基础链
chain = prompt | llm | StrOutputParser()
# 内存存储对话历史
store = {}
def get_session_history(session_id: str):
if session_id not in store:
store[session_id] = InMemoryChatMessageHistory()
return store[session_id]
# 包装记忆链
chat_chain = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="input",
history_messages_key="chat_history"
)
# 多轮对话测试
if __name__ == "__main__":
session_id = "test_001"
# 第一轮对话
print(chat_chain.invoke({"input": "我叫小明"}, config={"configurable": {"session_id": session_id}}))
# 第二轮对话(带上下文)
print(chat_chain.invoke({"input": "我叫什么名字?"}, config={"configurable": {"session_id": session_id}}))
运行后模型可记住上一轮用户输入,实现连续对话,适合聊天机器人场景。
六、进阶2:结构化输出解析(固定格式返回)
默认模型返回自由文本,无法用于程序逻辑处理。通过Pydantic输出解析器,强制模型返回固定JSON结构化数据。
ini
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List
load_dotenv()
# 1. 定义输出数据结构
class StudyPlan(BaseModel):
title: str = Field(description="学习主题")
difficulty: str = Field(description="难度等级:简单/中等/困难")
steps: List[str] = Field(description="学习步骤列表")
# 2. 初始化解析器
parser = PydanticOutputParser(pydantic_object=StudyPlan)
# 3. 构建提示词(带入格式要求)
prompt = ChatPromptTemplate.from_messages([
("system", "你是学习规划师,根据用户问题生成学习计划,严格按照指定格式输出。\n{format_instructions}"),
("human", "帮我制定{subject}的7天入门学习计划")
])
# 4. 初始化模型 & 构建链
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base=os.getenv("OPENAI_API_BASE"),
temperature=0.3
)
chain = prompt | llm | parser
# 调用测试
if __name__ == "__main__":
res = chain.invoke({
"subject": "LangChain开发",
"format_instructions": parser.get_format_instructions()
})
print("主题:", res.title)
print("难度:", res.difficulty)
print("学习步骤:", res.steps)
七、进阶3:RAG私有知识库问答(核心实战)
RAG(检索增强生成)是LangChain最核心的落地场景,实现私有文档问答,让大模型学习本地PDF、TXT、网页数据,解决模型知识滞后、私有数据无法问答的问题。
7.1 安装RAG依赖
arduino
pip install faiss-cpu langchain-text-splitters
7.2 极简RAG完整代码
ini
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
load_dotenv()
# 1. 加载本地文档(提前新建test.txt写入自定义内容)
loader = TextLoader("test.txt", encoding="utf-8")
docs = loader.load()
# 2. 文档切块(防止上下文溢出)
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
split_docs = text_splitter.split_documents(docs)
# 3. 初始化嵌入模型 & 构建向量数据库
embeddings = OpenAIEmbeddings(
openai_api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base="https://env.OPENAI_API_BASE"
)
vector_store = FAISS.from_documents(split_docs, embeddings)
# 4. 创建检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 3})
# 5. 构建RAG提示词
prompt = ChatPromptTemplate.from_messages([
("system", "基于以下上下文回答用户问题,只使用上下文内容,不要编造:\n{context}"),
("human", "{question}")
])
# 6. 初始化模型 & 构建RAG链
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base=os.getenv("OPENAI_API_BASE"),
temperature=0.3
)
# RAG核心链路:检索文档 -> 带入提示词 -> 模型回答 -> 解析输出
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 问答测试
if __name__ == "__main__":
res = rag_chain.invoke("你的文档核心内容是什么?")
print(res)
八、进阶4:智能Agent工具调用
Agent 是具备自主思考、决策、调用工具能力的智能体,可完成联网查询、计算、代码执行等复杂任务,无需人工定义固定链路。
8.1 最简自定义工具+Agent实战
python
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate
load_dotenv()
# 1. 自定义工具:计算器工具
@tool
def calculator(num: str) -> str:
"""
用于计算数学表达式结果
:param num: 数学表达式字符串,例如:1+2*3
:return: 计算结果
"""
return str(eval(num))
# 工具列表
tools = [calculator]
# 2. 初始化模型
llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
openai_api_base=os.getenv("OPENAI_API_BASE"),
temperature=0
)
# 3. 定义Agent提示词
prompt = ChatPromptTemplate.from_messages([
("system", "你是智能助手,可调用工具完成数学计算任务"),
("user", "{input}"),
("agent_scratchpad", "{agent_scratchpad}")
])
# 4. 创建Agent & 执行器
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 5. 测试Agent自动调用工具
if __name__ == "__main__":
res = agent_executor.invoke({"input": "计算 128*56+98 等于多少?"})
print("最终结果:", res["output"])
开启 verbose=True 可查看Agent思考全过程:判断是否需要工具 → 调用对应工具 → 获取结果 → 整理回答。
九、常用调试与优化技巧
9.1 开启调试日志
查看链式执行每一步的输入输出,快速排错:
ini
import langchain
langchain.debug = True
9.2 流式输出(实时打字机效果)
适配对话机器人实时回复场景:
lua
for chunk in chain.stream({"question": "LangChain的优势"}):
print(chunk, end="", flush=True)
十、学习总结与进阶方向
10.1 核心学习链路
基础链式调用 → 对话记忆 → 结构化输出 → RAG知识库 → 智能Agent → 多工具协同 → 项目部署
10.2 进阶学习方向
- 高级RAG:分片优化、重排序、向量数据库优化(Chroma、Milvus)
- 多Agent协作:多个智能体分工完成复杂任务
- 工具拓展:联网搜索、代码解释器、API调用
- 工程落地:异步调用、批量处理、接口封装、线上部署
十一、常见问题避坑
- 模型调用失败:检查密钥、接口地址是否正确,确认模型余额充足
- 上下文溢出:调整文档分片大小(chunk_size),开启检索压缩
- 输出格式混乱:优先使用Pydantic解析器,严格约束输出结构
- Agent不调用工具:优化工具描述文案,让模型清晰工具适用场景