LangChain 学习与拆解(1)Agent 最小系统
LangChain智能体最小系统由四大核心要素构成:1)大语言模型作为"大脑"处理逻辑思考;2)系统提示词定义角色和行为规范;3)工具集提供外部交互能力;4)记忆存储管理对话上下文。系统通过ModelRequest组织请求数据,ModelResponse处理模型输出,ToolCallRequest执行工具调用。AgentMiddleware提供生命周期钩子,支持在运行各阶段进行
LangChain文档教程
https://docs.langchain.org.cn/oss/python/langchain/overview
详细教程请参照上述链接。下述内容仅为个人理解,无法保证即时性。
一个完整的 LangChain 智能体最小系统(最小系统的结构是完善的,但是实现是简易的、静态的。能跑通,但是无法应对复杂场景),通常由以下四大核心要素构成:
-
大语言模型(Model)—— 智能体的“大脑”
负责理解用户指令、进行逻辑思考与规划,生成文本回复
-
系统提示词(System Prompt)—— 智能体的“人设与准则 ”
用于定义 Agent 的角色身份、行为边界及输出规范。它决定了 Agent 的沟通语气、思考角度以及任务执行的约束条件。 -
工具集(Tools)—— 智能体的“手脚”
赋予 Agent 与外部世界交互的能力。通过调用预定义的函数或 API(如网页搜索、数据查询、发送通知等),弥补大模型在实时信息和物理操作上的短板。 -
记忆存储(Checkpointer)—— 智能体的“记忆中枢”
负责持久化存储多轮对话的上下文状态。- 无记忆系统:每次调用都是独立的,Agent 无法感知历史交互。
- 有记忆系统:通过 Checkpointer 记录状态,使 Agent 能够基于历史上下文进行连贯的推理与回复。
代码示例
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.tools import tool
from langgraph.checkpoint.memory import InMemorySaver
# 配置模型
model = init_chat_model(
# 模型名称,可以带厂商前缀(如 "openai:gpt-5.4"),也可以不带
"openai:gpt-5.4",
# --- 🎨 生成控制参数 ---
temperature=0.5, # 控制输出的随机性(0-1之间,越低越严谨,越高越有创意)
max_tokens=25000, # 限制模型单次回复生成的最大 Token 数量
# --- 🌐 网络与请求配置 ---
timeout=300, # 设置 API 请求的最大等待时长(秒),超时会自动终止
max_retries=3, # 请求失败时的最大自动重试次数,提升网络波动时的稳定性
# base_url="https://api.openai.com/v1", # 自定义 API 请求地址(对接中转站或本地模型时常用)
# api_key="sk-xxxxxxxx", # 直接传入 API 密钥(不传则默认读取系统环境变量)
# stop=["\n"], # 设置“停止词”,遇到指定字符时模型会立刻停止生成
)
# 系统提示词
SYSTEM_PROMPT = """按需撰写系统提示词
你是一个XXX
必须遵守xxx
输出格式为XXX
"""
# 工具定义
@tool
def tool_name(param1: str, param2: int = 10) -> str:
"""这里写工具的详细描述。
这是 AI 判断是否调用该工具的最核心依据。建议清晰地说明:
1. 这个工具具体是做什么的?
2. 在什么场景或条件下应该使用它?
Args:
param1: 参数1的详细说明(例如:这是必填项,代表xxx)。
param2: 参数2的详细说明(例如:这是选填项,默认为10,代表xxx)。
"""
# 具体的业务逻辑实现写在这里...
# 注意:最终返回给 AI 的内容,必须是字符串(str)格式!
return "执行结果字符串"
# 记忆工具
checkpointer = InMemorySaver()
# 智能体定义
agent = create_agent(
model=model,
tools=[tool_name],
system_prompt=SYSTEM_PROMPT,
checkpointer=checkpointer,
)
# 智能体调用
# 智能体调用
agent_result = agent.invoke(
{"messages": [{"role": "user", "content": "这里填入用户的指令或问题"}]},
# config 用于配置运行时的动态参数
# thread_id 是会话的唯一标识符(类似于微信的聊天窗口ID)
# 只要保持 thread_id 相同,Agent 就能记住之前的对话历史,实现多轮交互
config={"configurable": {"thread_id": "user_session_001"}},
)
# 打印 AI 的最终回复
print("🤖 AI 回复:", agent_result["messages"][-1].content)
调用流程

ModelRequest
ModelRequest是由Agent组织的数据对象,用来存储调用大模型的请求信息。ModelRequest对象的属性包括模型配置、消息(由系统提示词、历史信息、用户指令组成)、工具集等,简单定义如下:
@dataclass
class ModelRequest:
"""单次模型调用的输入参数封装"""
# 核心属性
model: Any # 当前要调用的大模型实例 (如 ChatOpenAI 对象)
messages: List[Dict[str, str]] # 发送给模型的消息历史列表 (包含 role 和 content)
tools: List[Any] # 允许模型调用的工具清单 (BaseTool 对象列表)
state: Dict[str, Any] # Agent 的全局状态容器 (包含完整的对话历史等持久化数据)
runtime: Any # 运行时上下文对象 (包含 context 等本次调用的全局信息)
# 核心方法
def override(self, **kwargs) -> "ModelRequest":
"""
生成一个带着新配置的全新 ModelRequest 对象。
底层调用了 dataclasses.replace,保证了对象的不可变性。
"""
return dataclasses.replace(self, **kwargs)
ModelResponse
ModelResponse是由大模型响应的数据对象。ModelResponse中带有模型响应的文本内容、工具调用信息和元数据(如 Token 使用量 Usage、请求 ID 等)等。ModelResponse简单定义如下:
@dataclass
class ModelResponse:
"""单次模型调用的输出结果封装"""
# 核心属性
message: Any # 模型生成的单条消息 (通常是 AIMessage 对象)
messages: List[Any] # 模型生成的消息列表 (兼容批量或流式场景)
usage: Optional[Dict[str, int]] # 本次调用的 Token 消耗统计 (如 prompt_tokens, completion_tokens)
metadata: Dict[str, Any] # 模型返回的额外元数据 (如模型名称、生成时间戳等)
# 核心方法
def override(self, **kwargs) -> "ModelResponse":
"""
生成一个带着新配置的全新 ModelResponse 对象。
常用于在中间件中拦截并修改模型的返回结果。
"""
return dataclasses.replace(self, **kwargs)
ToolCallRequest
ToolCallRequest是工具调用对象。大模型会根据用户指令在ModelRequest的工具集中选择具体的工具,并提供参数。Agent收到模型输出的工具信息(ModelResponse.Message.ToolCall)后,将其解析并封装为 ToolCallRequest,以便执行器调用。
@dataclass
class ToolCallRequest:
"""单次工具调用的输入参数封装"""
# 核心属性
tool_call: Dict[str, Any] # 模型发出的原始调用指令(包含工具名 name、参数 arguments 和唯一ID)
tool: Optional[Callable] = None # (中间件核心) 绑定的真实 Python 函数对象,默认为 None
state: Dict[str, Any] = field(default_factory=dict) # Agent 的全局状态容器
runtime: Any = None # 运行时上下文对象
# 核心方法
def override(self, **kwargs) -> "ToolCallRequest":
"""
生成一个带着新配置的全新 ToolCallRequest 对象。
底层同样调用了 dataclasses.replace,保证了对象的不可变性。
"""
return dataclasses.replace(self, **kwargs)
更多推荐



所有评论(0)