LangChain 从0入门:模型、消息、Prompt、Tools、记忆、Agent与LangSmith实战

目录

前言

一、认识LangChain

[二、快速入门 & Agent原理](#二、快速入门 & Agent原理)

Agent是什么?

Agent循环流程(核心)

[三、初始化模型 & 调用模型](#三、初始化模型 & 调用模型)

安装依赖

基础初始化代码

四、Message(消息对象)

[五、提示词工程 & ChatPromptTemplate](#五、提示词工程 & ChatPromptTemplate)

[六、Tools 工具基础](#六、Tools 工具基础)

七、预定义工具:Tavily搜索工具

[八、短期记忆(Short-term Memory)](#八、短期记忆(Short-term Memory))

九、短期记忆:持久存储

十、记忆管理策略

[十一、对接 LangSmith(链路追踪)](#十一、对接 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核心思想:把大模型当成一个可编排的服务,串联各类外部能力。 核心组件清单(本文依次讲解):

  1. Chat Model:聊天大模型(LLM封装)
  2. Message:结构化消息(System / Human / AI / ToolMessage)
  3. PromptTemplate:提示词模板,提示词工程载体
  4. Tools:工具,给模型调用外部能力(搜索、接口、数据库)
  5. Agent:智能体,由LLM自主判断什么时候调用哪个工具,循环执行直到任务完成
  6. Memory:记忆,维持多轮对话上下文;分短期会话记忆、持久化记忆
  7. LangSmith:LangChain官方链路追踪、调试、评估平台,用于排查Agent、链路耗时、Prompt效果

早期LangChain以Chain(链)为主,新版架构转向 LangGraph状态图 + Agent,更适合复杂循环逻辑(Agent反复调用工具)。

二、快速入门 & Agent原理

Agent是什么?

Agent = LLM推理引擎 + 工具列表 + 提示词 + 状态记忆。 和固定Chain最大区别:Chain是硬编码顺序执行;Agent让大模型自己做决策:判断当前任务是否需要调用工具、选哪个工具、传什么参数;拿到工具返回结果后,再次交给模型继续推理,直到任务可以直接回答用户。

Agent循环流程(核心)

  1. 用户输入 + 历史消息 送入LLM
  2. LLM判断:直接回答,还是需要调用工具
  3. 如果选择调用工具:输出结构化tool_call(工具名、参数)
  4. 框架捕获tool_call,执行对应Tool,拿到工具返回内容,包装为ToolMessage
  5. ToolMessage追加到消息列表,再次丢回LLM
  6. 循环往复,直到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种最常用消息类型:

  1. SystemMessage:系统角色设定,告诉模型身份、规则、约束
  2. HumanMessage:用户输入消息
  3. AIMessage:大模型输出消息(包含tool_calls工具调用字段)
  4. 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膨胀、上下文超限,所以必须做记忆裁剪策略:

  1. Buffer策略(原始缓存):全量保存消息,最简单,适合短对话;长对话容易爆token(老版ConversationBufferMemory)
  2. Token Buffer策略:设置最大token上限,超出后丢弃最早消息,保留最近N条消息
  3. Summary 摘要策略:每次轮次后调用LLM,把旧对话压缩成一段摘要,只保留摘要+最近几条消息,大幅节约token(ConversationSummaryMemory)
  4. SummaryBuffer混合策略:保留最近消息+历史摘要,兼顾细节和长度控制,生产Agent最常用
  5. 向量检索记忆:把历史对话向量化存入向量库,只检索相关历史,适合超长会话、用户长期知识库

新版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的基础骨架。

十三、总结

  1. LangChain本质是LLM应用编排框架,核心不是模型本身,而是标准化组件串联外部能力
  2. Message是底层基础,所有对话、Agent流转都是消息列表;不要手动拼接字符串Prompt
  3. Agent核心是循环决策:模型判断是否调用工具 → 执行工具 → 结果回传模型,循环直到输出答案
  4. Tools给模型赋予外部能力,Tavily是入门最常用搜索工具,工具描述词直接决定模型会不会正确调用
  5. 记忆分短期会话记忆、持久化存储;必须做好token裁剪策略,避免上下文溢出
  6. LangSmith是开发Agent必备调试工具,打开追踪后可视化每一步调用,大幅降低Agent排错成本
  7. 新版架构优先学习LangGraph状态图,老版Chain、Memory API逐步迁移

掌握这套链路之后,你就可以基于这个骨架扩展RAG知识库Agent、业务接口Agent、多工具复杂工作流。

相关推荐
刘胡子大叔3 小时前
评测驱动优化:失败样本回流 Prompt 的闭环
人工智能·prompt
后台模板学习4 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
GISer_Jing8 小时前
SuperAgent
ai·langchain
前端精髓9 小时前
langchain 短期记忆(状态)动态运行时上下文
python·langchain
在努力的前端小白1 天前
基于FastAPI+LangChain+LangGraph+Agent+多模态的AI Agent 有渔渔具网站
人工智能·langchain·vue·fastapi
IT古董1 天前
《Agent开发工程师成长指南》- 第4章 第2节:Prompt设计五要素——任务、角色、上下文、约束与输出格式
大数据·人工智能·prompt
吴名氏.1 天前
Java转AI Agent教程(第五周)Prompt工程
java·人工智能·prompt·ai agent
用户9421812761341 天前
两条线:LangGraph 如何把状态流和控制流拆开(AI 生成)
langchain
gugugu.1 天前
同一个 ReAct,两种手写方式:LangChain 文本协议 vs LangGraph 状态图
ai·langchain