LangChain 从0入门:模型、消息、Prompt、Tools、记忆、Agent与LangSmith实战
目录
十二、完整Agent整合Demo(工具+记忆+LangSmith追踪)
适合后端/AI开发新手,全部配套可直接运行Python代码,聚焦核心组件,避开复杂底层,快速建立对LangChain完整链路认知
前言
大模型原生能力只支持单次问答、没有记忆、无法联网、不能调用外部接口。LangChain 是一套LLM应用编排开源框架,它把模型调用、提示词、会话记忆、工具调用、Agent智能体、链路观测能力封装成标准化组件,让开发者可以快速搭建对话机器人、知识库RAG、联网搜索Agent、自动化工作流等应用,而不用从零处理消息拼接、工具解析、上下文管理等重复逻辑。
本文环境:Python、langchain-core / langchain-openai / langchain-community / langgraph、OpenAI ChatModel(GPT3.5/GPT4),所有代码兼容新版LangChain(推荐0.2+)
一、认识LangChain
LangChain核心思想:把大模型当成一个可编排的服务,串联各类外部能力。 核心组件清单(本文依次讲解):
- Chat Model:聊天大模型(LLM封装)
- Message:结构化消息(System / Human / AI / ToolMessage)
- PromptTemplate:提示词模板,提示词工程载体
- Tools:工具,给模型调用外部能力(搜索、接口、数据库)
- Agent:智能体,由LLM自主判断什么时候调用哪个工具,循环执行直到任务完成
- Memory:记忆,维持多轮对话上下文;分短期会话记忆、持久化记忆
- LangSmith:LangChain官方链路追踪、调试、评估平台,用于排查Agent、链路耗时、Prompt效果
早期LangChain以Chain(链)为主,新版架构转向 LangGraph状态图 + Agent,更适合复杂循环逻辑(Agent反复调用工具)。
二、快速入门 & Agent原理
Agent是什么?
Agent = LLM推理引擎 + 工具列表 + 提示词 + 状态记忆。 和固定Chain最大区别:Chain是硬编码顺序执行;Agent让大模型自己做决策:判断当前任务是否需要调用工具、选哪个工具、传什么参数;拿到工具返回结果后,再次交给模型继续推理,直到任务可以直接回答用户。
Agent循环流程(核心)
- 用户输入 + 历史消息 送入LLM
- LLM判断:直接回答,还是需要调用工具
- 如果选择调用工具:输出结构化tool_call(工具名、参数)
- 框架捕获tool_call,执行对应Tool,拿到工具返回内容,包装为ToolMessage
- ToolMessage追加到消息列表,再次丢回LLM
- 循环往复,直到LLM决定不再调用工具,直接输出最终答案给用户
这个循环就是Agent最核心的闭环,LangGraph负责维护循环状态、分支跳转、检查点持久化。
三、初始化模型 & 调用模型
安装依赖
pip install langchain langchain-core langchain-openai python-dotenv
基础初始化代码
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
load_dotenv()
# 初始化聊天模型(ChatModel,区别于老式文本LLM)
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0, # 0=确定性强,适合Agent/工具调用;越大越发散
api_key=os.getenv("OPENAI_API_KEY")
)
# 直接调用模型,传入字符串
resp = llm.invoke("简单介绍LangChain")
print(resp.content)
temperature:生成随机性,做Agent、工具调用、问答检索强烈建议设置0,减少幻觉和乱调用工具- ChatOpenAI返回的不是字符串,是AIMessage对象,
.content取文本内容
四、Message(消息对象)
LangChain不推荐手动拼接字符串prompt,而是使用结构化消息,这是所有对话、Agent的基础。 4种最常用消息类型:
SystemMessage:系统角色设定,告诉模型身份、规则、约束HumanMessage:用户输入消息AIMessage:大模型输出消息(包含tool_calls工具调用字段)ToolMessage:工具执行返回结果,必须绑定tool_call_id,回传给模型
代码示例:
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
messages = [
SystemMessage(content="你是专业的LangChain讲师,回答简洁易懂"),
HumanMessage(content="Agent和Chain有什么区别?")
]
res = llm.invoke(messages)
print(type(res))
print(res.content)
# 如果是工具调用场景,res.additional_kwargs["tool_calls"] 存放工具调用信息
流式输出消息:
for chunk in llm.stream(messages):
print(chunk.content, end="")
关键点:整个Agent、记忆、Prompt体系底层都是在维护一个
List[BaseMessage]消息数组。
五、提示词工程 & ChatPromptTemplate
PromptTemplate 作用:模板化提示词,支持变量占位、消息组组装,避免硬编码字符串。
PromptTemplate:纯文本模板ChatPromptTemplate:消息列表模板(Agent、对话机器人首选)
from langchain_core.prompts import ChatPromptTemplate
# 构建消息模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是{role},回答控制在{words}字以内"),
("human", "{query}")
])
# 填充变量
input_msg = prompt.invoke({
"role": "AI框架工程师",
"words": "100",
"query": "什么是LangChain Agent"
})
# 和模型链式调用 | Runnable语法(LangChain核心:| 管道符)
chain = prompt | llm
result = chain.invoke({
"role": "AI框架工程师",
"words": "100",
"query": "什么是LangChain Agent"
})
print(result.content)
Runnable | 管道:前一个组件输出作为后一个输入,是LangChain链式编排的基础写法。
六、Tools 工具基础
Tool 是给模型调用的能力单元,每个工具必须包含:
- name:工具名称(模型识别)
- description:工具描述(非常重要,模型靠描述判断要不要调用这个工具)
- args schema:入参结构(pydantic,大模型按schema输出参数)
两种定义方式:@tool装饰器(最简单)、继承BaseTool。
from langchain_core.tools import tool
@tool
def add(a: int, b: int) -> int:
"""两个数字相加
Args:
a: 第一个整数
b: 第二个整数
"""
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""两个数字相乘
Args:
a: 第一个整数
b: 第二个整数
"""
return a * b
tools = [add, multiply]
# 把工具绑定到模型,模型就具备输出tool_call的能力
llm_with_tools = llm.bind_tools(tools)
query = "3加5再乘以2等于多少?"
res = llm_with_tools.invoke([HumanMessage(content=query)])
print(res.tool_calls)
bind_tools:把工具描述、schema注入给大模型,让模型知道可以调用哪些工具、参数格式是什么。
七、预定义工具:Tavily搜索工具
Tavily 是LangChain生态最常用的面向LLM的搜索引擎,专门为Agent优化,返回精简摘要,适合联网实时信息查询(新闻、最新资料)。
安装:
pip install langchain-community tavily-python
代码示例:
from langchain_community.tools.tavily_search import TavilySearchResults
import os
from dotenv import load_dotenv
load_dotenv()
# 环境变量 TAVILY_API_KEY
search_tool = TavilySearchResults(max_results=3)
tools = [search_tool]
llm_with_tools = llm.bind_tools(tools)
resp = llm_with_tools.invoke([HumanMessage("2026年LangChain最新版本是多少?")])
print(resp.tool_calls)
Tavily需要去官网申请API Key,写入环境变量
TAVILY_API_KEY
八、短期记忆(Short-term Memory)
短期记忆 = 单会话(thread)内的对话历史,同一个会话id下,多轮问答自动带上之前所有消息;不同会话隔离上下文。 新版推荐基于 LangGraph + Checkpointer 实现会话记忆,替代老版ConversationBufferMemory。
简单带记忆对话示例(内存版短期记忆):
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import MessagesState, StateGraph, START
from langchain_core.messages import HumanMessage
# 1. 构建图
builder = StateGraph(MessagesState)
def chat_node(state: MessagesState):
return {"messages": llm.invoke(state["messages"])}
builder.add_node("chat", chat_node)
builder.add_edge(START, "chat")
# 内存检查点,开启短期记忆
checkpointer = MemorySaver()
graph = builder.compile(checkpointer=checkpointer)
# config里thread_id代表会话ID,同一个id共享记忆
config = {"configurable": {"thread_id": "session_001"}}
res1 = graph.invoke({"messages": [HumanMessage("我叫小明")]}, config=config)
print(res1["messages"][-1].content)
res2 = graph.invoke({"messages": [HumanMessage("我叫什么名字?")]}, config=config)
print(res2["messages"][-1].content)
更换
thread_id="session_002"就是全新会话,不知道你叫小明。
九、短期记忆:持久存储
上面MemorySaver是内存存储,程序重启记忆丢失。生产环境需要持久化Checkpointer,LangGraph支持:
- SqliteSaver(本地sqlite,单机轻量持久化,入门首选)
- PostgresSaver(线上生产,分布式会话存储)
Sqlite持久化代码:
from langgraph.checkpoint.sqlite import SqliteSaver
# 写入本地sqlite文件,重启程序仍然保留会话历史
conn = sqlite3.connect("chat_memory.db", check_same_thread=False)
checkpointer = SqliteSaver(conn)
graph = builder.compile(checkpointer=checkpointer)
config = {"configurable": {"thread_id": "session_001"}}
十、记忆管理策略
直接无脑保存全部历史会带来2个致命问题:token膨胀、上下文超限,所以必须做记忆裁剪策略:
- Buffer策略(原始缓存):全量保存消息,最简单,适合短对话;长对话容易爆token(老版ConversationBufferMemory)
- Token Buffer策略:设置最大token上限,超出后丢弃最早消息,保留最近N条消息
- Summary 摘要策略:每次轮次后调用LLM,把旧对话压缩成一段摘要,只保留摘要+最近几条消息,大幅节约token(ConversationSummaryMemory)
- SummaryBuffer混合策略:保留最近消息+历史摘要,兼顾细节和长度控制,生产Agent最常用
- 向量检索记忆:把历史对话向量化存入向量库,只检索相关历史,适合超长会话、用户长期知识库
新版LangGraph不推荐老Memory类硬耦合,推荐在graph节点里自己实现裁剪、摘要逻辑,灵活性更高。
十一、对接 LangSmith(链路追踪)
基础概念
LangSmith 是LangChain官方可观测平台,核心能力:
- Trace追踪:每一次LLM调用、tool调用、prompt、子步骤耗时、入参出参全部可视化
- Debug:Agent调用失败、幻觉、工具传参错误时,直接看每一步原始消息
- Evaluation:批量评测Prompt、Agent效果
- Prompt Hub:在线管理、版本化提示词
接入方式(只需要配置环境变量,代码几乎不用改动)
import os
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "你的key"
os.environ["LANGSMITH_PROJECT"] = "langchain-demo"
# 国内区域用户按需配置 LANGSMITH_ENDPOINT
配置完成后,你前面所有llm.invoke、graph.invoke、tool调用都会自动上报Trace到LangSmith网页控制台,打开网页就可以看到完整执行链路,非常适合排查Agent为什么乱调用工具、为什么回答异常。
接入LangSmith后,之前所有Agent、记忆、工具代码不需要修改一行,自动埋点追踪。
十二、完整Agent整合Demo(工具+记忆+LangSmith追踪)
import os
import sqlite3
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langgraph.checkpoint.sqlite import SqliteSaver
from langgraph.graph import MessagesState, StateGraph, START
from langgraph.prebuilt import ToolNode, tools_condition
load_dotenv()
# LangSmith自动追踪
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_PROJECT"] = "agent-demo"
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
search_tool = TavilySearchResults(max_results=3)
tools = [search_tool]
llm_with_tools = llm.bind_tools(tools)
# 节点:模型推理
def agent_node(state: MessagesState):
return {"messages": [llm_with_tools.invoke(state["messages"])]}
builder = StateGraph(MessagesState)
builder.add_node("agent", agent_node)
builder.add_node("tools", ToolNode(tools))
# 分支:模型输出tool_call就进入tools节点,否则直接结束
builder.add_conditional_edges("agent", tools_condition)
builder.add_edge("tools", "agent")
builder.add_edge(START, "agent")
# Sqlite持久记忆
conn = sqlite3.connect("agent_memory.db", check_same_thread=False)
checkpointer = SqliteSaver(conn)
agent_graph = builder.compile(checkpointer=checkpointer)
# 同一个thread_id维持会话记忆
config = {"configurable": {"thread_id": "agent_session_001"}}
if __name__ == "__main__":
while True:
user_input = input("用户:")
if user_input in ["exit", "quit"]:
break
res = agent_graph.invoke(
{"messages": [("human", user_input)]},
config=config
)
print("Agent:", res["messages"][-1].content)
这个Demo就是一个带联网搜索、会话持久记忆、LangSmith全链路追踪的标准Agent,是绝大多数业务Agent的基础骨架。
十三、总结
- LangChain本质是LLM应用编排框架,核心不是模型本身,而是标准化组件串联外部能力
- Message是底层基础,所有对话、Agent流转都是消息列表;不要手动拼接字符串Prompt
- Agent核心是循环决策:模型判断是否调用工具 → 执行工具 → 结果回传模型,循环直到输出答案
- Tools给模型赋予外部能力,Tavily是入门最常用搜索工具,工具描述词直接决定模型会不会正确调用
- 记忆分短期会话记忆、持久化存储;必须做好token裁剪策略,避免上下文溢出
- LangSmith是开发Agent必备调试工具,打开追踪后可视化每一步调用,大幅降低Agent排错成本
- 新版架构优先学习LangGraph状态图,老版Chain、Memory API逐步迁移
掌握这套链路之后,你就可以基于这个骨架扩展RAG知识库Agent、业务接口Agent、多工具复杂工作流。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)