一、 核心概念:LangChain 到底是什么?
你可以把 LangChain 想象成一套 乐高积木。
- 大模型(LLM) 是积木里的动力马达。
- 提示词(Prompt) 是控制马达的指令。
- LangChain 则是各种接口,让你能把马达、齿轮、传感器(工具)轻松地拼在一起。
1. 现代生态系统划分
langchain-core: 核心说明书(接口定义)。langchain-openai/langchain-anthropic: 特定品牌的零件(厂商集成)。langgraph: (重点) 复杂的自动化流水线控制中心(状态机)。
二、 基础构建:从对话开始
在基础中,我们几乎只使用 Chat Models。
1. 消息模型 (Messages)
对话不再是简单的字符串,而是由不同角色构成的列表:
- SystemMessage: 给 AI 设定人设(比如你是数学老师)。
- HumanMessage: 你说的话。
- AIMessage: AI 的回答。
2. 实践代码:基础调用
python
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 1. 初始化模型
model = ChatOpenAI(model="gpt-4o")
# 2. 准备消息
messages = [
SystemMessage(content="你是一位幽默的编程助手"),
HumanMessage(content="什么是递归?")
]
# 3. 调用
response = model.invoke(messages)
print(response.content)
三、 LCEL:神奇的管道操作符 |
LCEL 是 LangChain 的灵魂。它让你可以像拼水管一样连接组件。
逻辑流: 用户输入 -> 提示词模板 -> 模型 -> 输出解析器
实践代码:构建一条简单的链
python
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 1. 定义模板 (使用占位符 {topic})
prompt = ChatPromptTemplate.from_template("讲一个关于 {topic} 的冷笑话")
# 2. 定义解析器 (把 AI 返回的消息对象转为纯字符串)
output_parser = StrOutputParser()
# 3. 使用 | 符号连接 (这就是 LCEL)
chain = prompt | model | output_parser
# 4. 运行
result = chain.invoke({"topic": "冰淇淋"})
print(result)
四、 进阶:结构化输出 (Structured Output)
以前我们需要教 AI 怎么写 JSON,现在不需要了!我们定义一个 Python 类(Pydantic),AI 就会乖乖填空。
实践代码:让 AI 返回标准 JSON
python
from typing import List
from pydantic import BaseModel, Field
# 1. 定义你想要的数据结构
class Joke(BaseModel):
setup: str = Field(description="笑话的铺垫")
punchline: str = Field(description="笑话的梗")
tags: List[str] = Field(description="笑话的标签")
# 2. 使用structured_output 方法
structured_llm = model.with_structured_output(Joke)
# 3. 直接调用
joke = structured_llm.invoke("讲一个关于程序员的笑话")
print(joke.setup)
print(joke.tags) # 输出将是一个 Python 列表
五、 现代 Agent 的核心:工具调用 (Tool Calling)
这是 AI 能够"执行任务"的关键。比如让 AI 调用搜索接口或计算器。
工具调用的三步走:
- 定义工具 : 使用
@tool装饰器。 - 绑定工具: 让 AI 知道有这些工具可用。
- 解析调用: AI 决定是否需要用工具。
python
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""将两个整数相乘。"""
return a * b
# 绑定工具到模型
model_with_tools = model.bind_tools([multiply])
# AI 会发现它需要调用乘法工具
res = model_with_tools.invoke("3乘5等于多少?")
print(res.tool_calls) # 这里会显示 AI 想要调用 multiply 的意图
六、 架构升级:从 Chain 到 LangGraph
当你的程序变得复杂(比如:AI 写代码 -> 运行报错 -> 自动修复 -> 再运行),简单的线性 | 就不够用了。
- Chain (LCEL): 像单向传送带,从 A 到 B 。
- LangGraph: 像交通环岛,可以循环、判断、回退 。
新手建议: 先学好 LCEL,当你发现逻辑里有大量的 if-else 和"循环"时,立刻转向学习 LangGraph。
在基础的 LangChain 中,我们用 | 构造的是线性链。
- Chain (线性链):A ➔ B ➔ C。像是一条单向死胡同,跑完就结束了。AI 如果在 B 环节出错了,它没法跳回 A 重新来。
- LangGraph (有状态图) :A ➔ B ➔ C ➔ (判断) ➔ 回到 B。它允许循环。AI 可以反复思考、修改错误,直到满意为止。
核心价值: 赋予 AI "持久化记忆" 和 "纠错能力"。
我们来写一个流程:AI 翻译一段话 -> 检查是否有语法错误 -> 如果有错就重写。
- 定义状态 (State)
python
from typing import TypedDict, Annotated
# 定义我们要在图中传递的"账本"
class GraphState(TypedDict):
input_text: str # 用户输入的原文
translation: str # 翻译结果
error_count: int # 错误次数
- 定义节点 (Nodes/函数)
python
# 节点 1: 翻译
def translate_node(state: GraphState):
print("--- 正在执行翻译 ---")
# 模拟 AI 翻译逻辑
return {"translation": "Hello Word", "error_count": state.get("error_count", 0)}
# 节点 2: 检查
def check_node(state: GraphState):
print("--- 正在检查语法 ---")
translation = state["translation"]
# 发现 Word 应该是 World,标记错误
if "Word" in translation:
return "retry" # 告诉边:我们需要重试
return "end"
- 构建图 (The Graph)
python
from langgraph.graph import StateGraph, END
workflow = StateGraph(GraphState)
# 添加节点
workflow.add_node("translator", translate_node)
# 设置入口
workflow.set_entry_point("translator")
# 添加条件边:根据检查结果决定去向
workflow.add_conditional_edges(
"translator",
check_node,
{
"retry": "translator", # 如果 check 结果是 retry,回到翻译节点
"end": END # 如果结果 OK,结束
}
)
# 编译成可运行的应用
app = workflow.compile()
LangGraph 的杀手锏功能
- 检查点 (Checkpoints / "存档"功能)
LangGraph 可以自动保存每一步的状态。
- 应用场景:如果 AI 运行到一半断电了,或者你需要让用户确认后再继续(Human-in-the-loop),你可以直接从"存档点"恢复。
- 人类介入 (Human-in-the-loop)
你可以设置在某个节点前暂停。
- 例子:AI 准备执行"转账"操作,LangGraph 会停下来,等待人类在后台点一下"同意",AI 才会继续执行。
七、 调试与监控:LangSmith
这是最重要的一点: 如果你看不见 AI 内部发生了什么,你永远调不好程序。
-
去 smith.langchain.com 注册账号。
-
在代码运行前设置环境变量:
bashexport LANGCHAIN_TRACING_V2="true" export LANGCHAIN_API_KEY="你的API密钥" -
神奇的事情发生了: 你的每一次
invoke都会变成一个可视化的流程图,你可以清楚地看到 AI 在哪一步耗时最长,或者哪一步的 Prompt 写得不好。