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)

Logo

更多推荐